From 6aa95eedf2cb5622532fdf834b144b177c91b168 Mon Sep 17 00:00:00 2001 From: Luke Wass Date: Sat, 10 May 2025 12:30:23 -0500 Subject: [PATCH 1/6] add clipboard function to version number --- .../launcher/ui/settings/meta/SettingsFragmentMeta.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/settings/meta/SettingsFragmentMeta.kt b/app/src/main/java/de/jrpie/android/launcher/ui/settings/meta/SettingsFragmentMeta.kt index dea0bcf..759d8cd 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/settings/meta/SettingsFragmentMeta.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/settings/meta/SettingsFragmentMeta.kt @@ -132,7 +132,12 @@ class SettingsFragmentMeta : Fragment(), UIObject { startActivity(Intent(this.context, LegalInfoActivity::class.java)) } + // version binding.settingsMetaTextVersion.text = BuildConfig.VERSION_NAME + binding.settingsMetaTextVersion.setOnClickListener { + val deviceInfo = getDeviceInfo() + copyToClipboard(requireContext(), deviceInfo) + } } } From 4d61557a70a36151287752b9b1f65e63e93e91cf Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Mon, 12 May 2025 13:03:54 +0200 Subject: [PATCH 2/6] fix #155 - close button not working in SelectWidgetActivity --- .../launcher/ui/widgets/manage/SelectWidgetActivity.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/SelectWidgetActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/SelectWidgetActivity.kt index a1bd3b5..0efdb43 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/SelectWidgetActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/SelectWidgetActivity.kt @@ -95,6 +95,11 @@ class SelectWidgetActivity : AppCompatActivity(), UIObject { layoutManager = viewManager adapter = viewAdapter } + + binding.selectWidgetClose.setOnClickListener { + setResult(RESULT_CANCELED) + finish() + } } override fun getTheme(): Resources.Theme { From b5b65a4c42abf50aae9ed6a96846828c50e4cb2d Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Mon, 12 May 2025 13:42:04 +0200 Subject: [PATCH 3/6] catch IllegalArgumentException when accessing torch --- .../java/de/jrpie/android/launcher/actions/TorchManager.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/TorchManager.kt b/app/src/main/java/de/jrpie/android/launcher/actions/TorchManager.kt index 7e694c6..6768116 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/TorchManager.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/TorchManager.kt @@ -78,7 +78,8 @@ class TorchManager(context: Context) { cameraManager.setTorchMode(camera, !torchEnabled) } - } catch (e: CameraAccessException) { + } catch (e: Exception) { + // CameraAccessException, IllegalArgumentException Toast.makeText( context, context.getString(R.string.alert_torch_access_exception), From 1ba747946982a8849d5ebbee035d97cfb855b992 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Mon, 12 May 2025 13:46:45 +0200 Subject: [PATCH 4/6] fix #156 - show popup over widget --- .../launcher/ui/widgets/manage/WidgetOverlayView.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/WidgetOverlayView.kt b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/WidgetOverlayView.kt index 1b8a2d2..bb2a9da 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/WidgetOverlayView.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/WidgetOverlayView.kt @@ -2,11 +2,13 @@ package de.jrpie.android.launcher.ui.widgets.manage import android.content.Context import android.graphics.Canvas +import android.graphics.Color import android.graphics.Paint import android.graphics.Rect import android.graphics.drawable.Drawable import android.util.AttributeSet import android.view.View +import android.view.ViewGroup import android.widget.PopupMenu import androidx.core.graphics.toRectF import de.jrpie.android.launcher.R @@ -20,8 +22,9 @@ private const val HANDLE_EDGE_SIZE = (1.2 * HANDLE_SIZE).toInt() /** * An overlay to show configuration options for a widget in [WidgetManagerView] */ -class WidgetOverlayView : View { +class WidgetOverlayView : ViewGroup { + private val popupAnchor = View(context) val paint = Paint() val handlePaint = Paint() @@ -29,6 +32,8 @@ class WidgetOverlayView : View { var mode: WidgetManagerView.EditMode? = null class Handle(val mode: WidgetManagerView.EditMode, val position: Rect) init { + addView(popupAnchor) + setWillNotDraw(false) handlePaint.style = Paint.Style.STROKE handlePaint.setARGB(255, 255, 255, 255) @@ -84,12 +89,13 @@ class WidgetOverlayView : View { //preview?.bounds = bounds //preview?.draw(canvas) - + override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) { + popupAnchor.layout(0,0,0,0) } fun showPopupMenu() { val widget = Widget.byId(context, widgetId)?: return - val menu = PopupMenu(context, this) + val menu = PopupMenu(context, popupAnchor) menu.menu.let { it.add( context.getString(R.string.widget_menu_remove) From 23bc58806c487581baa866800d04a7445afa14c7 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Mon, 12 May 2025 13:47:21 +0200 Subject: [PATCH 5/6] fix #161 - draw shadow around widget control elements --- .../ui/widgets/manage/WidgetOverlayView.kt | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/WidgetOverlayView.kt b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/WidgetOverlayView.kt index bb2a9da..61006b8 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/WidgetOverlayView.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/WidgetOverlayView.kt @@ -24,24 +24,30 @@ private const val HANDLE_EDGE_SIZE = (1.2 * HANDLE_SIZE).toInt() */ 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 + class Handle(val mode: WidgetManagerView.EditMode, val position: Rect) init { addView(popupAnchor) setWillNotDraw(false) 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.setARGB(100, 255, 255, 255) + handlePaint.setShadowLayer(10f,0f,0f, Color.BLACK) 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 @@ -80,14 +86,15 @@ class WidgetOverlayView : ViewGroup { } } val bounds = getBounds() + canvas.drawRoundRect(bounds.toRectF(), 5f, 5f, paint) if (mode == null) { return } - //preview?.bounds = bounds //preview?.draw(canvas) + } override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) { popupAnchor.layout(0,0,0,0) From 22e44ca9f2abf3a4f5f50c6194c233d93c22bc8b Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Mon, 12 May 2025 15:01:33 +0200 Subject: [PATCH 6/6] 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 + +