fix #160 - consistent position of widget container

This commit is contained in:
Josia Pietsch 2025-05-12 15:01:33 +02:00
parent 23bc58806c
commit 22e44ca9f2
Signed by: jrpie
GPG key ID: E70B571D66986A2D
7 changed files with 77 additions and 43 deletions

View file

@ -27,6 +27,7 @@
android:exported="false" /> android:exported="false" />
<activity <activity
android:name=".ui.widgets.manage.ManageWidgetsActivity" android:name=".ui.widgets.manage.ManageWidgetsActivity"
android:configChanges="orientation|screenSize"
android:exported="false" android:exported="false"
android:theme="@style/launcherHomeTheme" /> android:theme="@style/launcherHomeTheme" />
<activity <activity

View file

@ -21,7 +21,5 @@ fun migratePreferencesFromVersion4(context: Context) {
) )
) )
) )
LauncherPreferences.internal().versionCode(100) LauncherPreferences.internal().versionCode(100)
} }

View file

@ -129,15 +129,7 @@ class HomeActivity : UIObject, Activity() {
} }
override fun getTheme(): Resources.Theme { override fun getTheme(): Resources.Theme {
val mTheme = modifyTheme(super.getTheme()) return modifyTheme(super.getTheme())
mTheme.applyStyle(R.style.backgroundWallpaper, true)
LauncherPreferences.clock().font().applyToTheme(mTheme)
LauncherPreferences.theme().colorTheme().applyToTheme(
mTheme,
LauncherPreferences.theme().textShadow()
)
return mTheme
} }
override fun onResume() { override fun onResume() {

View file

@ -10,6 +10,7 @@ import android.view.WindowInsets
import android.view.WindowInsetsController import android.view.WindowInsetsController
import android.view.WindowManager import android.view.WindowManager
import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.preferences.theme.Background
/** /**
* An interface implemented by every [Activity], Fragment etc. in Launcher. * An interface implemented by every [Activity], Fragment etc. in Launcher.
@ -65,8 +66,14 @@ interface UIObject {
theme, theme,
LauncherPreferences.theme().textShadow() LauncherPreferences.theme().textShadow()
) )
LauncherPreferences.theme().background().applyToTheme(theme)
LauncherPreferences.theme().font().applyToTheme(theme) if (isHomeScreen()) {
Background.TRANSPARENT.applyToTheme(theme)
LauncherPreferences.clock().font().applyToTheme(theme)
} else {
LauncherPreferences.theme().background().applyToTheme(theme)
LauncherPreferences.theme().font().applyToTheme(theme)
}
return theme return theme
} }

View file

@ -3,6 +3,7 @@ package de.jrpie.android.launcher.ui.widgets
import android.app.Activity import android.app.Activity
import android.content.res.Resources import android.content.res.Resources
import android.os.Bundle import android.os.Bundle
import androidx.core.view.ViewCompat
import de.jrpie.android.launcher.R import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.databinding.ActivityWidgetPanelBinding import de.jrpie.android.launcher.databinding.ActivityWidgetPanelBinding
import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.preferences.LauncherPreferences
@ -12,13 +13,20 @@ import de.jrpie.android.launcher.widgets.WidgetPanel
class WidgetPanelActivity : Activity(), UIObject { class WidgetPanelActivity : Activity(), UIObject {
lateinit var binding: ActivityWidgetPanelBinding lateinit var binding: ActivityWidgetPanelBinding
var widgetPanelId: Int = WidgetPanel.Companion.HOME.id private var widgetPanelId: Int = WidgetPanel.HOME.id
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super<Activity>.onCreate(savedInstanceState) super<Activity>.onCreate(savedInstanceState)
super<UIObject>.onCreate() super<UIObject>.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) val binding = ActivityWidgetPanelBinding.inflate(layoutInflater)
setContentView(binding.root) 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.widgetPanelId = widgetPanelId
binding.widgetPanelWidgetContainer.updateWidgets( binding.widgetPanelWidgetContainer.updateWidgets(
this, this,
@ -38,6 +46,13 @@ class WidgetPanelActivity : Activity(), UIObject {
return mTheme return mTheme
} }
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if (hasFocus && LauncherPreferences.display().hideNavigationBar()) {
hideNavigationBar()
}
}
override fun onStart() { override fun onStart() {
super<Activity>.onStart() super<Activity>.onStart()

View file

@ -8,14 +8,14 @@ import android.content.res.Resources
import android.graphics.Rect import android.graphics.Rect
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.ViewGroup
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat 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.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.preferences.LauncherPreferences
import de.jrpie.android.launcher.ui.UIObject 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.AppWidget
import de.jrpie.android.launcher.widgets.WidgetPanel import de.jrpie.android.launcher.widgets.WidgetPanel
import de.jrpie.android.launcher.widgets.WidgetPosition import de.jrpie.android.launcher.widgets.WidgetPosition
@ -30,14 +30,16 @@ const val REQUEST_PICK_APPWIDGET = 2
const val EXTRA_PANEL_ID = "widgetPanelId" const val EXTRA_PANEL_ID = "widgetPanelId"
// We can't use AppCompatActivity, since some AppWidgets don't work there. // 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 var panelId: Int = WidgetPanel.HOME.id
private lateinit var binding: ActivityManageWidgetsBinding
private var sharedPreferencesListener = private var sharedPreferencesListener =
SharedPreferences.OnSharedPreferenceChangeListener { _, prefKey -> SharedPreferences.OnSharedPreferenceChangeListener { _, prefKey ->
if (prefKey == LauncherPreferences.widgets().keys().widgets()) { if (prefKey == LauncherPreferences.widgets().keys().widgets()) {
findViewById<WidgetContainerView>(R.id.manage_widgets_container).updateWidgets(this, binding.manageWidgetsContainer.updateWidgets(
this,
LauncherPreferences.widgets().widgets() LauncherPreferences.widgets().widgets()
) )
} }
@ -46,21 +48,33 @@ class ManageWidgetsActivity : Activity(), UIObject {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super<Activity>.onCreate(savedInstanceState) super<Activity>.onCreate(savedInstanceState)
super<UIObject>.onCreate() super<UIObject>.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 panelId = intent.extras?.getInt(EXTRA_PANEL_ID, WidgetPanel.HOME.id) ?: WidgetPanel.HOME.id
findViewById<FloatingActionButton>(R.id.manage_widgets_button_add).setOnClickListener { binding.manageWidgetsButtonAdd.setOnClickListener {
selectWidget() selectWidget()
} }
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> // The widget container should extend below the status and navigation bars,
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) // so let's set an empty WindowInsetsListener to prevent it from being moved.
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->
insets windowInsets
} }
findViewById<WidgetContainerView>(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<ViewGroup.MarginLayoutParams> {
leftMargin = insets.left
bottomMargin = insets.bottom
rightMargin = insets.right
}
WindowInsetsCompat.CONSUMED
}
binding.manageWidgetsContainer.let {
it.widgetPanelId = panelId it.widgetPanelId = panelId
it.updateWidgets(this, LauncherPreferences.widgets().widgets()) it.updateWidgets(this, LauncherPreferences.widgets().widgets())
} }
@ -77,20 +91,23 @@ class ManageWidgetsActivity : Activity(), UIObject {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
findViewById<WidgetContainerView>(R.id.manage_widgets_container).updateWidgets(this, binding.manageWidgetsContainer.updateWidgets(
this,
LauncherPreferences.widgets().widgets() LauncherPreferences.widgets().widgets()
) )
} }
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if (hasFocus && LauncherPreferences.display().hideNavigationBar()) {
hideNavigationBar()
}
}
override fun getTheme(): Resources.Theme { override fun getTheme(): Resources.Theme {
val mTheme = modifyTheme(super.getTheme()) return modifyTheme(super.getTheme())
mTheme.applyStyle(R.style.backgroundWallpaper, true)
LauncherPreferences.clock().font().applyToTheme(mTheme)
LauncherPreferences.theme().colorTheme().applyToTheme(
mTheme,
LauncherPreferences.theme().textShadow()
)
return mTheme
} }
override fun onDestroy() { override fun onDestroy() {
@ -100,7 +117,7 @@ class ManageWidgetsActivity : Activity(), UIObject {
} }
fun selectWidget() { private fun selectWidget() {
val appWidgetHost = (application as Application).appWidgetHost val appWidgetHost = (application as Application).appWidgetHost
startActivityForResult( startActivityForResult(
Intent(this, SelectWidgetActivity::class.java).also { 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") Log.i("Launcher", "creating widget")
val appWidgetManager = (application as Application).appWidgetManager val appWidgetManager = (application as Application).appWidgetManager
val appWidgetId = data.extras?.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID) ?: return val appWidgetId = data.extras?.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID) ?: return
@ -127,9 +144,10 @@ class ManageWidgetsActivity : Activity(), UIObject {
val display = windowManager.defaultDisplay val display = windowManager.defaultDisplay
val position = WidgetPosition.fromAbsoluteRect( val position = WidgetPosition.fromAbsoluteRect(
Rect(0,0, Rect(
min(400, appWidgetManager.getAppWidgetInfo(appWidgetId).minWidth), 0, 0,
min(400, appWidgetManager.getAppWidgetInfo(appWidgetId).minHeight) min(400, appWidgetManager.getAppWidgetInfo(appWidgetId).minWidth),
min(400, appWidgetManager.getAppWidgetInfo(appWidgetId).minHeight)
), ),
display.width, display.width,
display.height display.height

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main" android:id="@+id/main"
@ -7,6 +8,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
tools:context=".ui.widgets.manage.ManageWidgetsActivity"> tools:context=".ui.widgets.manage.ManageWidgetsActivity">
<de.jrpie.android.launcher.ui.widgets.manage.WidgetManagerView <de.jrpie.android.launcher.ui.widgets.manage.WidgetManagerView
android:id="@+id/manage_widgets_container" android:id="@+id/manage_widgets_container"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -22,4 +24,5 @@
android:src="@drawable/baseline_add_24" android:src="@drawable/baseline_add_24"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" /> app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>