From 22e44ca9f2abf3a4f5f50c6194c233d93c22bc8b Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Mon, 12 May 2025 15:01:33 +0200 Subject: [PATCH] fix #160 - consistent position of widget container --- app/src/main/AndroidManifest.xml | 1 + .../launcher/preferences/legacy/Version4.kt | 2 - .../jrpie/android/launcher/ui/HomeActivity.kt | 10 +-- .../de/jrpie/android/launcher/ui/UIObject.kt | 11 ++- .../ui/widgets/WidgetPanelActivity.kt | 19 ++++- .../widgets/manage/ManageWidgetsActivity.kt | 70 ++++++++++++------- .../res/layout/activity_manage_widgets.xml | 7 +- 7 files changed, 77 insertions(+), 43 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e60a85b..1b10784 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -27,6 +27,7 @@ android:exported="false" /> .onCreate(savedInstanceState) super.onCreate() - widgetPanelId = intent.getIntExtra(EXTRA_PANEL_ID, WidgetPanel.Companion.HOME.id) + widgetPanelId = intent.getIntExtra(EXTRA_PANEL_ID, WidgetPanel.HOME.id) val binding = ActivityWidgetPanelBinding.inflate(layoutInflater) setContentView(binding.root) + + // The widget container should extend below the status and navigation bars, + // so let's set an empty WindowInsetsListener to prevent it from being moved. + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets -> + windowInsets + } + binding.widgetPanelWidgetContainer.widgetPanelId = widgetPanelId binding.widgetPanelWidgetContainer.updateWidgets( this, @@ -38,6 +46,13 @@ class WidgetPanelActivity : Activity(), UIObject { return mTheme } + override fun onWindowFocusChanged(hasFocus: Boolean) { + super.onWindowFocusChanged(hasFocus) + + if (hasFocus && LauncherPreferences.display().hideNavigationBar()) { + hideNavigationBar() + } + } override fun onStart() { super.onStart() diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/ManageWidgetsActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/ManageWidgetsActivity.kt index a841919..6fec855 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/ManageWidgetsActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/ManageWidgetsActivity.kt @@ -8,14 +8,14 @@ import android.content.res.Resources import android.graphics.Rect import android.os.Bundle import android.util.Log +import android.view.ViewGroup import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat -import com.google.android.material.floatingactionbutton.FloatingActionButton +import androidx.core.view.updateLayoutParams import de.jrpie.android.launcher.Application -import de.jrpie.android.launcher.R +import de.jrpie.android.launcher.databinding.ActivityManageWidgetsBinding import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.ui.UIObject -import de.jrpie.android.launcher.ui.widgets.WidgetContainerView import de.jrpie.android.launcher.widgets.AppWidget import de.jrpie.android.launcher.widgets.WidgetPanel import de.jrpie.android.launcher.widgets.WidgetPosition @@ -30,14 +30,16 @@ const val REQUEST_PICK_APPWIDGET = 2 const val EXTRA_PANEL_ID = "widgetPanelId" // We can't use AppCompatActivity, since some AppWidgets don't work there. -class ManageWidgetsActivity : Activity(), UIObject { +class ManageWidgetsActivity : UIObject, Activity() { private var panelId: Int = WidgetPanel.HOME.id + private lateinit var binding: ActivityManageWidgetsBinding private var sharedPreferencesListener = SharedPreferences.OnSharedPreferenceChangeListener { _, prefKey -> if (prefKey == LauncherPreferences.widgets().keys().widgets()) { - findViewById(R.id.manage_widgets_container).updateWidgets(this, + binding.manageWidgetsContainer.updateWidgets( + this, LauncherPreferences.widgets().widgets() ) } @@ -46,21 +48,33 @@ class ManageWidgetsActivity : Activity(), UIObject { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) super.onCreate() - setContentView(R.layout.activity_manage_widgets) + binding = ActivityManageWidgetsBinding.inflate(layoutInflater) + setContentView(binding.root) panelId = intent.extras?.getInt(EXTRA_PANEL_ID, WidgetPanel.HOME.id) ?: WidgetPanel.HOME.id - findViewById(R.id.manage_widgets_button_add).setOnClickListener { + binding.manageWidgetsButtonAdd.setOnClickListener { selectWidget() } - ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> - val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) - insets + // The widget container should extend below the status and navigation bars, + // so let's set an empty WindowInsetsListener to prevent it from being moved. + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets -> + windowInsets } - findViewById(R.id.manage_widgets_container).let { + // The button must not be placed under the navigation bar + ViewCompat.setOnApplyWindowInsetsListener(binding.manageWidgetsButtonAdd) { v, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.updateLayoutParams { + leftMargin = insets.left + bottomMargin = insets.bottom + rightMargin = insets.right + } + WindowInsetsCompat.CONSUMED + } + + binding.manageWidgetsContainer.let { it.widgetPanelId = panelId it.updateWidgets(this, LauncherPreferences.widgets().widgets()) } @@ -77,20 +91,23 @@ class ManageWidgetsActivity : Activity(), UIObject { override fun onResume() { super.onResume() - findViewById(R.id.manage_widgets_container).updateWidgets(this, + binding.manageWidgetsContainer.updateWidgets( + this, LauncherPreferences.widgets().widgets() ) } + + override fun onWindowFocusChanged(hasFocus: Boolean) { + super.onWindowFocusChanged(hasFocus) + + if (hasFocus && LauncherPreferences.display().hideNavigationBar()) { + hideNavigationBar() + } + } + override fun getTheme(): Resources.Theme { - val mTheme = modifyTheme(super.getTheme()) - mTheme.applyStyle(R.style.backgroundWallpaper, true) - LauncherPreferences.clock().font().applyToTheme(mTheme) - LauncherPreferences.theme().colorTheme().applyToTheme( - mTheme, - LauncherPreferences.theme().textShadow() - ) - return mTheme + return modifyTheme(super.getTheme()) } override fun onDestroy() { @@ -100,7 +117,7 @@ class ManageWidgetsActivity : Activity(), UIObject { } - fun selectWidget() { + private fun selectWidget() { val appWidgetHost = (application as Application).appWidgetHost startActivityForResult( Intent(this, SelectWidgetActivity::class.java).also { @@ -117,7 +134,7 @@ class ManageWidgetsActivity : Activity(), UIObject { } - fun createWidget(data: Intent) { + private fun createWidget(data: Intent) { Log.i("Launcher", "creating widget") val appWidgetManager = (application as Application).appWidgetManager val appWidgetId = data.extras?.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID) ?: return @@ -127,9 +144,10 @@ class ManageWidgetsActivity : Activity(), UIObject { val display = windowManager.defaultDisplay val position = WidgetPosition.fromAbsoluteRect( - Rect(0,0, - min(400, appWidgetManager.getAppWidgetInfo(appWidgetId).minWidth), - min(400, appWidgetManager.getAppWidgetInfo(appWidgetId).minHeight) + Rect( + 0, 0, + min(400, appWidgetManager.getAppWidgetInfo(appWidgetId).minWidth), + min(400, appWidgetManager.getAppWidgetInfo(appWidgetId).minHeight) ), display.width, display.height diff --git a/app/src/main/res/layout/activity_manage_widgets.xml b/app/src/main/res/layout/activity_manage_widgets.xml index c77f0e3..66404ee 100644 --- a/app/src/main/res/layout/activity_manage_widgets.xml +++ b/app/src/main/res/layout/activity_manage_widgets.xml @@ -1,5 +1,6 @@ - + - \ No newline at end of file + +