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 5f51927e6..02f11f3ea 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -23,6 +23,7 @@ import android.app.SearchManager import android.content.ComponentName import android.content.Context import android.content.Intent +import android.graphics.Color import android.graphics.PorterDuff import android.net.Uri import android.os.Build @@ -35,6 +36,7 @@ import android.util.Log import android.view.Menu import android.view.MenuItem import android.view.View +import android.view.ViewGroup import android.widget.ImageView import android.widget.ProgressBar import android.widget.TextView @@ -49,6 +51,7 @@ import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.Toolbar import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.view.GravityCompat +import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat import androidx.core.view.isVisible @@ -105,6 +108,8 @@ import com.kunzisoft.keepass.view.AddNodeButtonView import com.kunzisoft.keepass.view.NavigationDatabaseView import com.kunzisoft.keepass.view.SearchFiltersView import com.kunzisoft.keepass.view.ToolbarAction +import com.kunzisoft.keepass.view.WindowInsetPosition +import com.kunzisoft.keepass.view.applyWindowInsets import com.kunzisoft.keepass.view.hideByFading import com.kunzisoft.keepass.view.showActionErrorIfNeeded import com.kunzisoft.keepass.view.updateLockPaddingLeft @@ -121,6 +126,8 @@ class GroupActivity : DatabaseLockActivity(), MainCredentialDialogFragment.AskMainCredentialDialogListener { // Views + private var header: ViewGroup? = null + private var footer: ViewGroup? = null private var drawerLayout: DrawerLayout? = null private var databaseNavView: NavigationDatabaseView? = null private var coordinatorLayout: CoordinatorLayout? = null @@ -267,6 +274,8 @@ class GroupActivity : DatabaseLockActivity(), setContentView(layoutInflater.inflate(R.layout.activity_group, null)) // Initialize views + header = findViewById(R.id.activity_group_header) + footer = findViewById(R.id.activity_group_footer) drawerLayout = findViewById(R.id.drawer_layout) databaseNavView = findViewById(R.id.database_nav_view) coordinatorLayout = findViewById(R.id.group_coordinator) @@ -283,6 +292,15 @@ class GroupActivity : DatabaseLockActivity(), lockView = findViewById(R.id.lock_button) loadingView = findViewById(R.id.loading) + // To apply fit window with transparency + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { + WindowCompat.setDecorFitsSystemWindows(window, false) + this.window.navigationBarColor = Color.TRANSPARENT + header?.applyWindowInsets(WindowInsetPosition.TOP) + coordinatorLayout?.applyWindowInsets(WindowInsetPosition.LEGIT_TOP) + footer?.applyWindowInsets(WindowInsetPosition.BOTTOM) + } + lockView?.setOnClickListener { lockAndExit() } diff --git a/app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt b/app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt index f5ad2e75d..2065b0578 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt @@ -44,7 +44,10 @@ import androidx.appcompat.widget.ActionMenuView import androidx.appcompat.widget.Toolbar import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.graphics.drawable.DrawableCompat +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.core.view.isVisible +import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import com.google.android.material.appbar.CollapsingToolbarLayout import com.google.android.material.snackbar.Snackbar @@ -287,3 +290,40 @@ fun CollapsingToolbarLayout.changeTitleColor(color: Int) { setExpandedTitleColor(color) invalidate() } + +/** + * Apply a margin to a view to fix the window inset + */ +fun View.applyWindowInsets(position: WindowInsetPosition = WindowInsetPosition.BOTTOM) { + ViewCompat.setOnApplyWindowInsetsListener(this) { view, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + when (position) { + WindowInsetPosition.TOP -> { + if (view.layoutParams is ViewGroup.MarginLayoutParams) { + view.updateLayoutParams { + topMargin = insets.top + } + } + } + WindowInsetPosition.LEGIT_TOP -> { + if (view.layoutParams is ViewGroup.MarginLayoutParams) { + view.updateLayoutParams { + topMargin = 0 + } + } + } + WindowInsetPosition.BOTTOM -> { + if (view.layoutParams is ViewGroup.MarginLayoutParams) { + view.updateLayoutParams { + bottomMargin = insets.bottom + } + } + } + } + WindowInsetsCompat.CONSUMED + } +} + +enum class WindowInsetPosition { + TOP, BOTTOM, LEGIT_TOP +} diff --git a/app/src/main/res/color/surface_selector.xml b/app/src/main/res/color/surface_selector.xml new file mode 100644 index 000000000..4629570fa --- /dev/null +++ b/app/src/main/res/color/surface_selector.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_entry.xml b/app/src/main/res/layout/activity_entry.xml index 43297b716..219c8dd28 100644 --- a/app/src/main/res/layout/activity_entry.xml +++ b/app/src/main/res/layout/activity_entry.xml @@ -144,8 +144,8 @@ android:layout_height="wrap_content" android:minWidth="180dp" android:background="@drawable/background_item_selection" - android:backgroundTint="?attr/colorSurfaceContainerLow" - android:layout_marginBottom="@dimen/button_margin" + android:backgroundTint="@color/surface_selector" + android:layout_marginBottom="12dp" android:layout_gravity="bottom|center_horizontal" app:tabMode="fixed" tools:targetApi="lollipop"> diff --git a/app/src/main/res/layout/activity_entry_edit.xml b/app/src/main/res/layout/activity_entry_edit.xml index dd1994e9f..bc6fe156c 100644 --- a/app/src/main/res/layout/activity_entry_edit.xml +++ b/app/src/main/res/layout/activity_entry_edit.xml @@ -94,6 +94,7 @@ app:fabCustomSize="@dimen/button_small_size" app:layout_constraintTop_toTopOf="@+id/entry_edit_bottom_bar" app:layout_constraintBottom_toTopOf="@+id/screenshot_mode_banner" + android:layout_marginBottom="6dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> diff --git a/app/src/main/res/layout/activity_group.xml b/app/src/main/res/layout/activity_group.xml index e98fc1338..9073e584c 100644 --- a/app/src/main/res/layout/activity_group.xml +++ b/app/src/main/res/layout/activity_group.xml @@ -31,62 +31,68 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - - - + - + app:layout_constraintTop_toTopOf="parent" /> - - - - + + + + + + + + + + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@+id/activity_group_header"> + + + + + - - + + + + + + + android:layout_height="match_parent" + app:layout_constraintBottom_toTopOf="@+id/screenshot_mode_banner"/> - - - - - - - 0dp + + + diff --git a/app/src/main/res/values-v27/styles.xml b/app/src/main/res/values-v27/styles.xml index e0d3a8db2..99132928a 100644 --- a/app/src/main/res/values-v27/styles.xml +++ b/app/src/main/res/values-v27/styles.xml @@ -21,9 +21,11 @@