diff --git a/CHANGELOG b/CHANGELOG index c3942c184..08d5b8e6c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -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 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 b7e8f6735..2f6dc107f 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -46,6 +46,7 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.view.GravityCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat +import androidx.core.view.isVisible import androidx.drawerlayout.widget.DrawerLayout import androidx.recyclerview.widget.RecyclerView import com.kunzisoft.keepass.R @@ -102,6 +103,7 @@ class GroupActivity : DatabaseLockActivity(), private var lockView: View? = null private var toolbar: Toolbar? = null private var databaseNameContainer: ViewGroup? = null + private var databaseModifiedView: ImageView? = null private var databaseColorView: ImageView? = null private var databaseNameView: TextView? = null private var searchView: SearchView? = null @@ -237,6 +239,7 @@ class GroupActivity : DatabaseLockActivity(), addNodeButtonView = findViewById(R.id.add_node_button) toolbar = findViewById(R.id.toolbar) databaseNameContainer = findViewById(R.id.database_name_container) + databaseModifiedView = findViewById(R.id.database_modified) databaseColorView = findViewById(R.id.database_color) databaseNameView = findViewById(R.id.database_name) searchFiltersView = findViewById(R.id.search_filters) @@ -575,13 +578,29 @@ class GroupActivity : DatabaseLockActivity(), mRootGroup = database?.rootGroup loadGroup() - // Search suggestion + // Update view database?.let { + mBreadcrumbAdapter?.iconDrawableFactory = it.iconDrawableFactory + } + databaseNavView?.apply { + if (!mMergeDataAllowed) { + menu.findItem(R.id.menu_merge_from)?.isVisible = false + } + } + refreshDatabaseViews() + invalidateOptionsMenu() + } + + private fun refreshDatabaseViews() { + mDatabase?.let { val databaseName = it.name.ifEmpty { getString(R.string.database) } databaseNavView?.setDatabaseName(databaseName) databaseNameView?.text = databaseName databaseNavView?.setDatabasePath(it.fileUri?.toString()) databaseNavView?.setDatabaseVersion(it.version) + val modified = it.dataModifiedSinceLastLoading + databaseNavView?.setDatabaseModifiedSinceLastLoading(modified) + databaseModifiedView?.isVisible = modified val customColor = it.customColor databaseNavView?.setDatabaseColor(customColor) if (customColor != null) { @@ -593,16 +612,7 @@ class GroupActivity : DatabaseLockActivity(), } else { databaseColorView?.visibility = View.GONE } - mBreadcrumbAdapter?.iconDrawableFactory = it.iconDrawableFactory } - - databaseNavView?.apply { - if (!mMergeDataAllowed) { - menu.findItem(R.id.menu_merge_from)?.isVisible = false - } - } - - invalidateOptionsMenu() } override fun onDatabaseActionFinished( @@ -750,6 +760,7 @@ class GroupActivity : DatabaseLockActivity(), } else { // Add breadcrumb setBreadcrumbNode(group) + refreshDatabaseViews() invalidateOptionsMenu() } initAddButton(group) diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt index 435bcb848..18468a863 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt @@ -358,12 +358,8 @@ class DatabaseTaskProvider { fun startDatabaseMerge(fromDatabaseUri: Uri? = null, mainCredential: MainCredential? = null) { start(Bundle().apply { - if (fromDatabaseUri != null) { - putParcelable(DatabaseTaskNotificationService.DATABASE_URI_KEY, fromDatabaseUri) - } - if (mainCredential != null) { - putParcelable(DatabaseTaskNotificationService.MAIN_CREDENTIAL_KEY, mainCredential) - } + putParcelable(DatabaseTaskNotificationService.DATABASE_URI_KEY, fromDatabaseUri) + putParcelable(DatabaseTaskNotificationService.MAIN_CREDENTIAL_KEY, mainCredential) } , ACTION_DATABASE_MERGE_TASK) } @@ -701,9 +697,7 @@ class DatabaseTaskProvider { fun startDatabaseSave(save: Boolean, saveToUri: Uri? = null) { start(Bundle().apply { putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save) - if (saveToUri != null) { - putParcelable(DatabaseTaskNotificationService.DATABASE_URI_KEY, saveToUri) - } + putParcelable(DatabaseTaskNotificationService.DATABASE_URI_KEY, saveToUri) } , ACTION_DATABASE_SAVE) } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt index 9c17215e5..004906cdf 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt @@ -748,9 +748,15 @@ class Database { } databaseToMerge.mDatabaseKDB?.let { databaseKDBToMerge -> databaseMerger.merge(databaseKDBToMerge) + if (databaseToMergeUri != null) { + this.dataModifiedSinceLastLoading = true + } } databaseToMerge.mDatabaseKDBX?.let { databaseKDBXToMerge -> databaseMerger.merge(databaseKDBXToMerge) + if (databaseToMergeUri != null) { + this.dataModifiedSinceLastLoading = true + } } } } else { @@ -903,9 +909,10 @@ class Database { } @Throws(DatabaseOutputException::class) - fun saveData(uri: Uri?, contentResolver: ContentResolver) { + fun saveData(databaseCopyUri: Uri?, contentResolver: ContentResolver) { try { - (uri ?: this.fileUri)?.let { saveUri -> + val saveUri = databaseCopyUri ?: this.fileUri + if (saveUri != null) { if (saveUri.scheme == "file") { saveUri.path?.let { filename -> val tempFile = File("$filename.tmp") @@ -954,7 +961,9 @@ class Database { outputStream?.close() } } - this.dataModifiedSinceLastLoading = false + if (databaseCopyUri == null) { + this.dataModifiedSinceLastLoading = false + } } } catch (e: Exception) { Log.e(TAG, "Unable to save database", e) diff --git a/app/src/main/java/com/kunzisoft/keepass/view/NavigationDatabaseView.kt b/app/src/main/java/com/kunzisoft/keepass/view/NavigationDatabaseView.kt index 2335c2767..63475e7e5 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/NavigationDatabaseView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/NavigationDatabaseView.kt @@ -7,6 +7,7 @@ import android.widget.ImageView import android.widget.TextView import androidx.core.graphics.BlendModeColorFilterCompat import androidx.core.graphics.BlendModeCompat +import androidx.core.view.isVisible import com.google.android.material.navigation.NavigationView import com.kunzisoft.keepass.R @@ -17,6 +18,7 @@ class NavigationDatabaseView @JvmOverloads constructor(context: Context, private var databaseNavContainerView: View? = null private var databaseNavIconView: ImageView? = null + private var databaseNavModifiedView: ImageView? = null private var databaseNavColorView: ImageView? = null private var databaseNavNameView: TextView? = null private var databaseNavPathView: TextView? = null @@ -25,6 +27,7 @@ class NavigationDatabaseView @JvmOverloads constructor(context: Context, init { inflateHeaderView(R.layout.nav_header_database) databaseNavIconView = databaseNavContainerView?.findViewById(R.id.nav_database_icon) + databaseNavModifiedView = databaseNavContainerView?.findViewById(R.id.nav_database_modified) databaseNavColorView = databaseNavContainerView?.findViewById(R.id.nav_database_color) databaseNavNameView = databaseNavContainerView?.findViewById(R.id.nav_database_name) databaseNavPathView = databaseNavContainerView?.findViewById(R.id.nav_database_path) @@ -54,6 +57,10 @@ class NavigationDatabaseView @JvmOverloads constructor(context: Context, databaseNavVersionView?.text = version } + fun setDatabaseModifiedSinceLastLoading(modified: Boolean) { + databaseNavModifiedView?.isVisible = modified + } + fun setDatabaseColor(color: Int?) { if (color != null) { databaseNavColorView?.drawable?.colorFilter = BlendModeColorFilterCompat diff --git a/app/src/main/res/drawable/ic_database_white_48dp.xml b/app/src/main/res/drawable/ic_database_white_36dp.xml similarity index 95% rename from app/src/main/res/drawable/ic_database_white_48dp.xml rename to app/src/main/res/drawable/ic_database_white_36dp.xml index d866cf79d..3d0e57c7c 100644 --- a/app/src/main/res/drawable/ic_database_white_48dp.xml +++ b/app/src/main/res/drawable/ic_database_white_36dp.xml @@ -1,7 +1,7 @@ + + + \ 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 70a53feca..b4b590f84 100644 --- a/app/src/main/res/layout/activity_group.xml +++ b/app/src/main/res/layout/activity_group.xml @@ -60,16 +60,31 @@ - + android:layout_marginStart="50dp" + android:layout_marginLeft="50dp"> + + + + android:layout_height="wrap_content" + android:background="?android:attr/windowBackground" /> diff --git a/app/src/main/res/layout/nav_header_database.xml b/app/src/main/res/layout/nav_header_database.xml index 9ba09d40c..236fbf3c3 100644 --- a/app/src/main/res/layout/nav_header_database.xml +++ b/app/src/main/res/layout/nav_header_database.xml @@ -27,10 +27,10 @@ android:paddingLeft="8dp" android:paddingEnd="8dp" android:paddingRight="8dp" - style="@style/KeepassDXStyle.TextAppearance.Info" - android:textSize="10sp" + style="@style/KeepassDXStyle.TextAppearance.Secondary.TextOnPrimary" + android:textSize="11sp" tools:text="version" - tools:ignore="SmallSp" /> + android:textIsSelectable="true" /> + app:srcCompat="@drawable/ic_database_white_36dp" + style="@style/KeepassDXStyle.Icon" + app:tint="?attr/colorAccent" /> + + + app:layout_constraintEnd_toEndOf="parent" /> @@ -73,5 +89,6 @@ android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" android:textSize="11sp" - android:text="@string/path"/> + android:text="@string/path" + android:textIsSelectable="true"/> \ No newline at end of file diff --git a/app/src/main/res/layout/view_main_credentials.xml b/app/src/main/res/layout/view_main_credentials.xml index 73b2cdbc3..254b53e01 100644 --- a/app/src/main/res/layout/view_main_credentials.xml +++ b/app/src/main/res/layout/view_main_credentials.xml @@ -12,7 +12,6 @@ android:paddingRight="12dp" android:paddingEnd="12dp" android:paddingBottom="12dp" - android:background="?android:attr/windowBackground" tools:targetApi="lollipop"> diff --git a/art/ic_modified.svg b/art/ic_modified.svg new file mode 100644 index 000000000..9c9bf7aef --- /dev/null +++ b/art/ic_modified.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/fastlane/metadata/android/en-US/changelogs/98.txt b/fastlane/metadata/android/en-US/changelogs/98.txt index 094cef6f5..c38e60152 100644 --- a/fastlane/metadata/android/en-US/changelogs/98.txt +++ b/fastlane/metadata/android/en-US/changelogs/98.txt @@ -2,4 +2,5 @@ * Keep search context #1141 * Add searchable groups #905 #1006 * Search with regular expression #175 - * Fix styles \ No newline at end of file + * Merge from file and save as copy #1221 #1204 #840 + * New UI and fix styles \ No newline at end of file diff --git a/fastlane/metadata/android/fr-FR/changelogs/98.txt b/fastlane/metadata/android/fr-FR/changelogs/98.txt index 0a2b8cfb4..2d0347f30 100644 --- a/fastlane/metadata/android/fr-FR/changelogs/98.txt +++ b/fastlane/metadata/android/fr-FR/changelogs/98.txt @@ -2,4 +2,5 @@ * Garde le contexte de recherche #1141 * Ajout des groupes cherchables #905 #1006 * Recherche avec expression régulière #175 - * Correction des styles \ No newline at end of file + * Fusion depuis un fichier et sauvegarde de copie #1221 #1204 #840 + * Nouvelle interface utilisateur et correction des styles \ No newline at end of file