Skip to content

Commit

Permalink
Merge branch 'feature/Merge_from' into develop #1221 #1204 #840
Browse files Browse the repository at this point in the history
  • Loading branch information
J-Jamet committed Feb 12, 2022
2 parents c2705ff + 6ade91d commit 8b7bb36
Show file tree
Hide file tree
Showing 38 changed files with 1,066 additions and 355 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ KeePassDX(3.3.0)
* Keep search context #1141
* Add searchable groups #905 #1006
* Search with regular expression #175
* Fix styles
* Merge from file and save as copy #1221 #1204 #840
* New UI and fix styles

KeePassDX(3.2.0)
* Manage data merge #840 #977
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.tasks.AttachmentFileBinderManager
import com.kunzisoft.keepass.timeout.TimeoutHelper
import com.kunzisoft.keepass.utils.MenuUtil
import com.kunzisoft.keepass.utils.UriUtil
import com.kunzisoft.keepass.utils.UuidUtil
import com.kunzisoft.keepass.view.changeControlColor
Expand Down Expand Up @@ -370,7 +369,6 @@ class EntryActivity : DatabaseLockActivity() {
super.onCreateOptionsMenu(menu)
if (mEntryLoaded) {
val inflater = menuInflater
MenuUtil.contributionMenuInflater(inflater, menu)

inflater.inflate(R.menu.entry, menu)
inflater.inflate(R.menu.database, menu)
Expand Down Expand Up @@ -443,10 +441,6 @@ class EntryActivity : DatabaseLockActivity() {

override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.menu_contribute -> {
MenuUtil.onContributionItemSelected(this)
return true
}
R.id.menu_edit -> {
mDatabase?.let { database ->
mMainEntryId?.let { entryId ->
Expand Down
104 changes: 95 additions & 9 deletions app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.graphics.PorterDuff
import android.net.Uri
import android.os.*
import android.util.Log
import android.view.Menu
Expand All @@ -36,18 +37,22 @@ import android.widget.*
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.viewModels
import androidx.annotation.RequiresApi
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode
import androidx.appcompat.widget.SearchView
import androidx.appcompat.widget.Toolbar
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.view.GravityCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import androidx.drawerlayout.widget.DrawerLayout
import androidx.recyclerview.widget.RecyclerView
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.dialogs.*
import com.kunzisoft.keepass.activities.fragments.GroupFragment
import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper
import com.kunzisoft.keepass.activities.helpers.ExternalFileHelper
import com.kunzisoft.keepass.activities.helpers.SpecialMode
import com.kunzisoft.keepass.activities.legacy.DatabaseLockActivity
import com.kunzisoft.keepass.adapters.BreadcrumbAdapter
Expand All @@ -61,31 +66,37 @@ import com.kunzisoft.keepass.database.search.SearchHelper
import com.kunzisoft.keepass.database.search.SearchParameters
import com.kunzisoft.keepass.education.GroupActivityEducation
import com.kunzisoft.keepass.model.GroupInfo
import com.kunzisoft.keepass.model.MainCredential
import com.kunzisoft.keepass.model.RegisterInfo
import com.kunzisoft.keepass.model.SearchInfo
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_UPDATE_ENTRY_TASK
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_UPDATE_GROUP_TASK
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.NEW_NODES_KEY
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.getListNodesFromBundle
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.settings.SettingsActivity
import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.timeout.TimeoutHelper
import com.kunzisoft.keepass.utils.MenuUtil
import com.kunzisoft.keepass.utils.UriUtil
import com.kunzisoft.keepass.view.*
import com.kunzisoft.keepass.viewmodels.GroupEditViewModel
import com.kunzisoft.keepass.viewmodels.GroupViewModel
import org.joda.time.DateTime


class GroupActivity : DatabaseLockActivity(),
DatePickerDialog.OnDateSetListener,
TimePickerDialog.OnTimeSetListener,
GroupFragment.NodeClickListener,
GroupFragment.NodesActionMenuListener,
GroupFragment.OnScrollListener,
GroupFragment.GroupRefreshedListener,
SortDialogFragment.SortSelectionListener {
SortDialogFragment.SortSelectionListener,
AskMainCredentialDialogFragment.AskMainCredentialDialogListener {

// Views
private var drawerLayout: DrawerLayout? = null
private var databaseNavView: NavigationDatabaseView? = null
private var rootContainerView: ViewGroup? = null
private var coordinatorLayout: CoordinatorLayout? = null
private var lockView: View? = null
Expand Down Expand Up @@ -116,6 +127,9 @@ class GroupActivity : DatabaseLockActivity(),

private var actionNodeMode: ActionMode? = null

// Manage merge
private var mExternalFileHelper: ExternalFileHelper? = null

// Manage group
private var mSearchState: SearchState? = null
private var mMainGroupState: GroupState? = null // Group state, not a search
Expand Down Expand Up @@ -215,6 +229,8 @@ class GroupActivity : DatabaseLockActivity(),
setContentView(layoutInflater.inflate(R.layout.activity_group, null))

// Initialize views
drawerLayout = findViewById(R.id.drawer_layout)
databaseNavView = findViewById(R.id.database_nav_view)
rootContainerView = findViewById(R.id.activity_group_container_view)
coordinatorLayout = findViewById(R.id.group_coordinator)
numberChildrenView = findViewById(R.id.group_numbers)
Expand All @@ -236,6 +252,55 @@ class GroupActivity : DatabaseLockActivity(),

toolbar?.title = ""
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
val toggle = ActionBarDrawerToggle(
this, drawerLayout, toolbar,
R.string.navigation_drawer_open, R.string.navigation_drawer_close
)
drawerLayout?.addDrawerListener(toggle)
toggle.syncState()

// Manage 'merge from" and "save to"
mExternalFileHelper = ExternalFileHelper(this)
mExternalFileHelper?.buildOpenDocument { uri ->
launchDialogToAskMainCredential(uri)
}
mExternalFileHelper?.buildCreateDocument("application/x-keepass") { uri ->
uri?.let {
saveDatabaseTo(it)
}
}

// Menu in drawer
databaseNavView?.apply {
inflateMenu(R.menu.settings)
inflateMenu(R.menu.database_extra)
inflateMenu(R.menu.about)
setNavigationItemSelectedListener { menuItem ->
when (menuItem.itemId) {
R.id.menu_app_settings -> {
// To avoid flickering when launch settings in a LockingActivity
SettingsActivity.launch(this@GroupActivity, true)
}
R.id.menu_merge_from -> {
mExternalFileHelper?.openDocument()
}
R.id.menu_save_copy_to -> {
mExternalFileHelper?.createDocument(
getString(R.string.database_file_name_default) +
getString(R.string.database_file_name_copy) +
mDatabase?.defaultFileExtension)
}
R.id.menu_contribute -> {
UriUtil.gotoUrl(this@GroupActivity, R.string.contribution_url)
}
R.id.menu_about -> {
startActivity(Intent(this@GroupActivity, AboutActivity::class.java))
}
}
false
}
}

searchFiltersView?.closeAdvancedFilters()

Expand Down Expand Up @@ -512,8 +577,12 @@ class GroupActivity : DatabaseLockActivity(),

// Search suggestion
database?.let {
databaseNameView?.text = if (it.name.isNotEmpty()) it.name else getString(R.string.database)
val databaseName = it.name.ifEmpty { getString(R.string.database) }
databaseNavView?.setDatabaseName(databaseName)
databaseNameView?.text = databaseName
databaseNavView?.setDatabaseVersion(it.version)
val customColor = it.customColor
databaseNavView?.setDatabaseColor(customColor)
if (customColor != null) {
databaseColorView?.visibility = View.VISIBLE
databaseColorView?.setColorFilter(
Expand All @@ -526,6 +595,12 @@ class GroupActivity : DatabaseLockActivity(),
mBreadcrumbAdapter?.iconDrawableFactory = it.iconDrawableFactory
}

databaseNavView?.apply {
if (!mMergeDataAllowed) {
menu.findItem(R.id.menu_merge_from)?.isVisible = false
}
}

invalidateOptionsMenu()
}

Expand Down Expand Up @@ -967,6 +1042,11 @@ class GroupActivity : DatabaseLockActivity(),
.show(supportFragmentManager, GroupEditDialogFragment.TAG_CREATE_GROUP)
}

private fun launchDialogToAskMainCredential(uri: Uri?) {
AskMainCredentialDialogFragment.getInstance(uri)
.show(supportFragmentManager, AskMainCredentialDialogFragment.TAG_ASK_MAIN_CREDENTIAL)
}

override fun onCopyMenuClick(
database: Database,
nodes: List<Node>
Expand Down Expand Up @@ -1022,6 +1102,16 @@ class GroupActivity : DatabaseLockActivity(),
return true
}

override fun onAskMainCredentialDialogPositiveClick(databaseUri: Uri?,
mainCredential: MainCredential) {
databaseUri?.let {
mergeDatabaseFrom(it, mainCredential)
}
}

override fun onAskMainCredentialDialogNegativeClick(databaseUri: Uri?,
mainCredential: MainCredential) { }

override fun onResume() {
super.onResume()

Expand Down Expand Up @@ -1060,9 +1150,7 @@ class GroupActivity : DatabaseLockActivity(),
if (!mMergeDataAllowed) {
menu.findItem(R.id.menu_merge_database)?.isVisible = false
}
if (mSpecialMode == SpecialMode.DEFAULT) {
MenuUtil.defaultMenuInflater(inflater, menu)
} else {
if (mSpecialMode != SpecialMode.DEFAULT) {
menu.findItem(R.id.menu_merge_database)?.isVisible = false
menu.findItem(R.id.menu_reload_database)?.isVisible = false
}
Expand Down Expand Up @@ -1174,7 +1262,7 @@ class GroupActivity : DatabaseLockActivity(),
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
android.R.id.home -> {
// TODO change database
drawerLayout?.openDrawer(GravityCompat.START)
return true
}
R.id.menu_search -> {
Expand Down Expand Up @@ -1203,8 +1291,6 @@ class GroupActivity : DatabaseLockActivity(),
return true
}
else -> {
// Check the time lock before launching settings
MenuUtil.onDefaultMenuOptionsItemSelected(this, item, true)
return super.onOptionsItemSelected(item)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
/*
* Copyright 2022 Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePassDX.
*
* KeePassDX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePassDX is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with KeePassDX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kunzisoft.keepass.activities.dialogs

import android.app.Dialog
import android.content.Context
import android.net.Uri
import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import com.kunzisoft.keepass.activities.helpers.ExternalFileHelper
import com.kunzisoft.keepass.model.MainCredential
import com.kunzisoft.keepass.utils.UriUtil
import com.kunzisoft.keepass.view.MainCredentialView

class AskMainCredentialDialogFragment : DatabaseDialogFragment() {

private var mainCredentialView: MainCredentialView? = null

private var mListener: AskMainCredentialDialogListener? = null

private var mExternalFileHelper: ExternalFileHelper? = null

interface AskMainCredentialDialogListener {
fun onAskMainCredentialDialogPositiveClick(databaseUri: Uri?, mainCredential: MainCredential)
fun onAskMainCredentialDialogNegativeClick(databaseUri: Uri?, mainCredential: MainCredential)
}

override fun onAttach(activity: Context) {
super.onAttach(activity)
try {
mListener = activity as AskMainCredentialDialogListener
} catch (e: ClassCastException) {
throw ClassCastException(activity.toString()
+ " must implement " + AskMainCredentialDialogListener::class.java.name)
}
}

override fun onDetach() {
mListener = null
super.onDetach()
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
activity?.let { activity ->

var databaseUri: Uri? = null
arguments?.apply {
if (containsKey(KEY_ASK_CREDENTIAL_URI))
databaseUri = getParcelable(KEY_ASK_CREDENTIAL_URI)
}

val builder = AlertDialog.Builder(activity)

mainCredentialView = MainCredentialView(activity)
databaseUri?.let {
builder.setTitle(UriUtil.getFileData(requireContext(), it)?.name)
}
builder.setView(mainCredentialView)
// Add action buttons
.setPositiveButton(android.R.string.ok) { _, _ ->
mListener?.onAskMainCredentialDialogPositiveClick(
databaseUri,
retrieveMainCredential()
)
}
.setNegativeButton(android.R.string.cancel) { _, _ ->
mListener?.onAskMainCredentialDialogNegativeClick(
databaseUri,
retrieveMainCredential()
)
}


mExternalFileHelper = ExternalFileHelper(this)
mExternalFileHelper?.buildOpenDocument { uri ->
if (uri != null) {
mainCredentialView?.populateKeyFileTextView(uri)
}
}
mainCredentialView?.setOpenKeyfileClickListener(mExternalFileHelper)

return builder.create()
}

return super.onCreateDialog(savedInstanceState)
}

private fun retrieveMainCredential(): MainCredential {
return mainCredentialView?.getMainCredential() ?: MainCredential()
}

companion object {

private const val KEY_ASK_CREDENTIAL_URI = "KEY_ASK_CREDENTIAL_URI"
const val TAG_ASK_MAIN_CREDENTIAL = "TAG_ASK_MAIN_CREDENTIAL"

fun getInstance(uri: Uri?): AskMainCredentialDialogFragment {
val fragment = AskMainCredentialDialogFragment()
val args = Bundle()
args.putParcelable(KEY_ASK_CREDENTIAL_URI, uri)
fragment.arguments = args
return fragment
}
}
}
Loading

0 comments on commit 8b7bb36

Please sign in to comment.