Merge branch 'jrpie:master' into master

This commit is contained in:
Luke Wass 2025-05-12 08:41:57 -05:00 committed by GitHub
commit 7a32289ec5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 106 additions and 53 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

@ -78,7 +78,8 @@ class TorchManager(context: Context) {
cameraManager.setTorchMode(camera, !torchEnabled) cameraManager.setTorchMode(camera, !torchEnabled)
} }
} catch (e: CameraAccessException) { } catch (e: Exception) {
// CameraAccessException, IllegalArgumentException
Toast.makeText( Toast.makeText(
context, context,
context.getString(R.string.alert_torch_access_exception), context.getString(R.string.alert_torch_access_exception),

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

@ -95,6 +95,11 @@ class SelectWidgetActivity : AppCompatActivity(), UIObject {
layoutManager = viewManager layoutManager = viewManager
adapter = viewAdapter adapter = viewAdapter
} }
binding.selectWidgetClose.setOnClickListener {
setResult(RESULT_CANCELED)
finish()
}
} }
override fun getTheme(): Resources.Theme { override fun getTheme(): Resources.Theme {

View file

@ -2,11 +2,13 @@ package de.jrpie.android.launcher.ui.widgets.manage
import android.content.Context import android.content.Context
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint import android.graphics.Paint
import android.graphics.Rect import android.graphics.Rect
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.util.AttributeSet import android.util.AttributeSet
import android.view.View import android.view.View
import android.view.ViewGroup
import android.widget.PopupMenu import android.widget.PopupMenu
import androidx.core.graphics.toRectF import androidx.core.graphics.toRectF
import de.jrpie.android.launcher.R import de.jrpie.android.launcher.R
@ -20,23 +22,32 @@ private const val HANDLE_EDGE_SIZE = (1.2 * HANDLE_SIZE).toInt()
/** /**
* An overlay to show configuration options for a widget in [WidgetManagerView] * An overlay to show configuration options for a widget in [WidgetManagerView]
*/ */
class WidgetOverlayView : View { class WidgetOverlayView : ViewGroup {
private val paint = Paint()
private val handlePaint = Paint()
private val selectedHandlePaint = Paint()
private val popupAnchor = View(context)
val paint = Paint()
val handlePaint = Paint()
val selectedHandlePaint = Paint()
var mode: WidgetManagerView.EditMode? = null var mode: WidgetManagerView.EditMode? = null
class Handle(val mode: WidgetManagerView.EditMode, val position: Rect) class Handle(val mode: WidgetManagerView.EditMode, val position: Rect)
init { init {
addView(popupAnchor)
setWillNotDraw(false)
handlePaint.style = Paint.Style.STROKE handlePaint.style = Paint.Style.STROKE
handlePaint.setARGB(255, 255, 255, 255) handlePaint.color = Color.WHITE
handlePaint.strokeWidth = 2f
handlePaint.setShadowLayer(10f,0f,0f, Color.BLACK)
selectedHandlePaint.style = Paint.Style.FILL_AND_STROKE selectedHandlePaint.style = Paint.Style.FILL_AND_STROKE
selectedHandlePaint.setARGB(100, 255, 255, 255) selectedHandlePaint.setARGB(100, 255, 255, 255)
handlePaint.setShadowLayer(10f,0f,0f, Color.BLACK)
paint.style = Paint.Style.STROKE paint.style = Paint.Style.STROKE
paint.setARGB(255, 255, 255, 255) paint.color = Color.WHITE
paint.setShadowLayer(10f,0f,0f, Color.BLACK)
} }
private var preview: Drawable? = null private var preview: Drawable? = null
@ -75,21 +86,23 @@ class WidgetOverlayView : View {
} }
} }
val bounds = getBounds() val bounds = getBounds()
canvas.drawRoundRect(bounds.toRectF(), 5f, 5f, paint) canvas.drawRoundRect(bounds.toRectF(), 5f, 5f, paint)
if (mode == null) { if (mode == null) {
return return
} }
//preview?.bounds = bounds //preview?.bounds = bounds
//preview?.draw(canvas) //preview?.draw(canvas)
}
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
popupAnchor.layout(0,0,0,0)
} }
fun showPopupMenu() { fun showPopupMenu() {
val widget = Widget.byId(context, widgetId)?: return val widget = Widget.byId(context, widgetId)?: return
val menu = PopupMenu(context, this) val menu = PopupMenu(context, popupAnchor)
menu.menu.let { menu.menu.let {
it.add( it.add(
context.getString(R.string.widget_menu_remove) context.getString(R.string.widget_menu_remove)

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>