From 17c26e2a96fedf9cb5efac5da5228d84e58d9641 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Fri, 11 Feb 2022 15:24:59 +0100 Subject: [PATCH] Add navigation drawer --- .../keepass/activities/EntryActivity.kt | 6 - .../keepass/activities/GroupActivity.kt | 73 ++++- .../NestedDatabaseSettingsFragment.kt | 13 +- .../com/kunzisoft/keepass/utils/MenuUtil.kt | 17 +- .../res/drawable/ic_database_white_48dp.xml | 11 + app/src/main/res/layout/activity_group.xml | 270 ++++++++++-------- app/src/main/res/layout/nav_header_main.xml | 63 ++++ .../res/menu/{default_menu.xml => about.xml} | 26 +- app/src/main/res/menu/database_extra.xml | 36 +++ app/src/main/res/menu/open_file.xml | 2 +- .../menu/{contribution.xml => settings.xml} | 18 +- app/src/main/res/values/strings.xml | 5 + art/ic_database.svg | 102 +++++++ 13 files changed, 464 insertions(+), 178 deletions(-) create mode 100644 app/src/main/res/drawable/ic_database_white_48dp.xml create mode 100644 app/src/main/res/layout/nav_header_main.xml rename app/src/main/res/menu/{default_menu.xml => about.xml} (60%) create mode 100644 app/src/main/res/menu/database_extra.xml rename app/src/main/res/menu/{contribution.xml => settings.xml} (70%) create mode 100644 art/ic_database.svg diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt index 10edbbba9..990f2fcc5 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt @@ -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 @@ -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) @@ -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 -> diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt index edf58593b..129d89b29 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -36,14 +36,21 @@ 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.graphics.BlendModeColorFilterCompat +import androidx.core.graphics.BlendModeCompat +import androidx.core.view.GravityCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat +import androidx.drawerlayout.widget.DrawerLayout +import androidx.navigation.ui.AppBarConfiguration import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.navigation.NavigationView import com.kunzisoft.keepass.R import com.kunzisoft.keepass.activities.dialogs.* import com.kunzisoft.keepass.activities.fragments.GroupFragment @@ -68,14 +75,16 @@ import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion. 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, @@ -86,6 +95,13 @@ class GroupActivity : DatabaseLockActivity(), SortDialogFragment.SortSelectionListener { // Views + private var drawerLayout: DrawerLayout? = null + private var databaseNavView: NavigationView? = null + private var databaseNavContainerView: View? = null + private var databaseNavIconView: ImageView? = null + private var databaseNavColorView: ImageView? = null + private var databaseNavNameView: TextView? = null + private var databaseNavVersionView: TextView? = null private var rootContainerView: ViewGroup? = null private var coordinatorLayout: CoordinatorLayout? = null private var lockView: View? = null @@ -102,6 +118,8 @@ class GroupActivity : DatabaseLockActivity(), private var breadcrumbListView: RecyclerView? = null private var loadingView: ProgressBar? = null + private lateinit var appBarConfiguration: AppBarConfiguration + private val mGroupViewModel: GroupViewModel by viewModels() private val mGroupEditViewModel: GroupEditViewModel by viewModels() @@ -215,6 +233,13 @@ 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) + databaseNavContainerView = databaseNavView?.getHeaderView(0) + databaseNavIconView = databaseNavContainerView?.findViewById(R.id.nav_database_icon) + databaseNavColorView = databaseNavContainerView?.findViewById(R.id.nav_database_color) + databaseNavNameView = databaseNavContainerView?.findViewById(R.id.nav_database_name) + databaseNavVersionView = databaseNavContainerView?.findViewById(R.id.nav_database_version) rootContainerView = findViewById(R.id.activity_group_container_view) coordinatorLayout = findViewById(R.id.group_coordinator) numberChildrenView = findViewById(R.id.group_numbers) @@ -236,6 +261,35 @@ 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() + + // 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_contribute -> { + UriUtil.gotoUrl(this@GroupActivity, R.string.contribution_url) + } + R.id.menu_about -> { + startActivity(Intent(this@GroupActivity, AboutActivity::class.java)) + } + } + false + } + } searchFiltersView?.closeAdvancedFilters() @@ -512,15 +566,22 @@ 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) } + databaseNavNameView?.text = databaseName + databaseNameView?.text = databaseName + databaseNavVersionView?.text = it.version val customColor = it.customColor if (customColor != null) { + databaseNavColorView?.drawable?.colorFilter = BlendModeColorFilterCompat + .createBlendModeColorFilterCompat(customColor, BlendModeCompat.SRC_IN) + databaseNavColorView?.visibility = View.VISIBLE databaseColorView?.visibility = View.VISIBLE databaseColorView?.setColorFilter( customColor, PorterDuff.Mode.SRC_IN ) } else { + databaseNavColorView?.visibility = View.GONE databaseColorView?.visibility = View.GONE } mBreadcrumbAdapter?.iconDrawableFactory = it.iconDrawableFactory @@ -1060,9 +1121,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 } @@ -1174,7 +1233,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 -> { @@ -1203,8 +1262,6 @@ class GroupActivity : DatabaseLockActivity(), return true } else -> { - // Check the time lock before launching settings - MenuUtil.onDefaultMenuOptionsItemSelected(this, item, true) return super.onOptionsItemSelected(item) } } diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt b/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt index 53ecdab5d..66d33a0bd 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt @@ -43,7 +43,6 @@ import com.kunzisoft.keepass.services.DatabaseTaskNotificationService import com.kunzisoft.keepass.settings.preference.* import com.kunzisoft.keepass.settings.preferencedialogfragment.* import com.kunzisoft.keepass.tasks.ActionRunnable -import com.kunzisoft.keepass.utils.MenuUtil import com.kunzisoft.keepass.viewmodels.DatabaseViewModel class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetrieval { @@ -673,19 +672,21 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev } R.id.menu_merge_database -> { mergeDatabase() - return true + true } R.id.menu_reload_database -> { reloadDatabase() - return true + true } - - else -> { + R.id.menu_app_settings -> { // Check the time lock before launching settings // TODO activity menu (activity as SettingsActivity?)?.let { - MenuUtil.onDefaultMenuOptionsItemSelected(it, item, true) + SettingsActivity.launch(it, true) } + true + } + else -> { super.onOptionsItemSelected(item) } } diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/MenuUtil.kt b/app/src/main/java/com/kunzisoft/keepass/utils/MenuUtil.kt index 73013862e..c7233968d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/utils/MenuUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/utils/MenuUtil.kt @@ -32,18 +32,11 @@ import com.kunzisoft.keepass.settings.SettingsActivity object MenuUtil { - fun contributionMenuInflater(inflater: MenuInflater, menu: Menu) { - if (!(BuildConfig.FULL_VERSION && BuildConfig.CLOSED_STORE)) - inflater.inflate(R.menu.contribution, menu) - } - fun defaultMenuInflater(inflater: MenuInflater, menu: Menu) { - contributionMenuInflater(inflater, menu) - inflater.inflate(R.menu.default_menu, menu) - } - - fun onContributionItemSelected(context: Context) { - UriUtil.gotoUrl(context, R.string.contribution_url) + inflater.inflate(R.menu.settings, menu) + inflater.inflate(R.menu.about, menu) + if (!(BuildConfig.FULL_VERSION && BuildConfig.CLOSED_STORE)) + menu.findItem(R.id.menu_contribute)?.isVisible = false } /* @@ -54,7 +47,7 @@ object MenuUtil { timeoutEnable: Boolean = false) { when (item.itemId) { R.id.menu_contribute -> { - onContributionItemSelected(activity) + UriUtil.gotoUrl(activity, R.string.contribution_url) } R.id.menu_app_settings -> { // To avoid flickering when launch settings in a LockingActivity diff --git a/app/src/main/res/drawable/ic_database_white_48dp.xml b/app/src/main/res/drawable/ic_database_white_48dp.xml new file mode 100644 index 000000000..d866cf79d --- /dev/null +++ b/app/src/main/res/drawable/ic_database_white_48dp.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_group.xml b/app/src/main/res/layout/activity_group.xml index 4a673834a..1e5a50f50 100644 --- a/app/src/main/res/layout/activity_group.xml +++ b/app/src/main/res/layout/activity_group.xml @@ -17,139 +17,161 @@ You should have received a copy of the GNU General Public License along with KeePassDX. If not, see . --> - + android:layout_height="match_parent" + android:fitsSystemWindows="true"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + android:layout_alignParentBottom="true"/> - + + + android:layout_height="match_parent" + android:layout_gravity="start" + app:headerLayout="@layout/nav_header_main" + app:itemTextColor="?android:attr/textColor" + app:subheaderColor="?attr/colorAccent" + android:fitsSystemWindows="true" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/nav_header_main.xml b/app/src/main/res/layout/nav_header_main.xml new file mode 100644 index 000000000..91b6599e2 --- /dev/null +++ b/app/src/main/res/layout/nav_header_main.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/default_menu.xml b/app/src/main/res/menu/about.xml similarity index 60% rename from app/src/main/res/menu/default_menu.xml rename to app/src/main/res/menu/about.xml index 6e2628794..319474231 100644 --- a/app/src/main/res/menu/default_menu.xml +++ b/app/src/main/res/menu/about.xml @@ -19,16 +19,18 @@ --> - - + + + + diff --git a/app/src/main/res/menu/database_extra.xml b/app/src/main/res/menu/database_extra.xml new file mode 100644 index 000000000..49981447a --- /dev/null +++ b/app/src/main/res/menu/database_extra.xml @@ -0,0 +1,36 @@ + + + + + + + + diff --git a/app/src/main/res/menu/open_file.xml b/app/src/main/res/menu/open_file.xml index 11f3ee674..695b37dae 100644 --- a/app/src/main/res/menu/open_file.xml +++ b/app/src/main/res/menu/open_file.xml @@ -22,7 +22,7 @@ \ No newline at end of file diff --git a/app/src/main/res/menu/contribution.xml b/app/src/main/res/menu/settings.xml similarity index 70% rename from app/src/main/res/menu/contribution.xml rename to app/src/main/res/menu/settings.xml index 535de0089..c37ad7367 100644 --- a/app/src/main/res/menu/contribution.xml +++ b/app/src/main/res/menu/settings.xml @@ -1,7 +1,7 @@ - - \ No newline at end of file + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a552c65ea..59c993e87 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -61,6 +61,9 @@ Database color Entry foreground color Entry background color + Navigation header + Navigation drawer open + Navigation drawer close Validate Discard changes? Discard @@ -242,6 +245,8 @@ Save data Merge data Reload data + Merge from file + Save to file Open Search Show password diff --git a/art/ic_database.svg b/art/ic_database.svg new file mode 100644 index 000000000..30cf139e0 --- /dev/null +++ b/art/ic_database.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + +