From 24dab9b00521adec52dcbc6e2ef1c4ae1eba4af6 Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Mon, 18 Dec 2023 20:42:08 +0700 Subject: [PATCH 1/6] Update security policy (#3882) --- SECURITY.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 807537150f0..7d8f728d1d2 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,7 +1,8 @@ # Security Policy ## Supported Versions -Important note: Lawnchair v2 (Play Store version) is **unsupported**. Use the newer alphas instead. See [this FAQ page](https://lawnchair.app/faq#do-you-still-support-the-play-store-version) for additional information. +> [!NOTE] +> Lawnchair v2 (Play Store version) is **unsupported**. Use the newer alphas instead. See [this FAQ page](https://lawnchair.app/faq#do-you-still-support-the-play-store-version) for additional information. The latest version of Lawnchair is the only supported version. | Version | Supported | @@ -17,6 +18,6 @@ The latest version of Lawnchair is the only supported version. ## Reporting Security issues We appreciate your efforts to responsibly disclose your findings and will make every effort to acknowledge your contributions. -To report an issue, please contact a developer (can be found in the about page of the app) in Telegram or Discord and state your security vunerability starting with the words "SECURITY". +To report an issue, please contact a developer (can be found in the about page of the app) in Telegram or Discord and state your security vulnerability starting with the words "SECURITY". We'll endeavour to respond quickly, and will keep you updated throughout the process. From 577084d62bdf7b7f8e563aa3ca11cd1faa499719 Mon Sep 17 00:00:00 2001 From: Suphon T <8080853+suphon-t@users.noreply.github.com> Date: Tue, 19 Dec 2023 06:16:53 +0700 Subject: [PATCH 2/6] Fix work mode switch inflation (#3878) * Revert "Fixed App crashes when leaving search in A9 (#3876) (#3877)" This reverts commit 54ee1a0e924536b54121d1320037302865150b96. * Fix work mode switch inflation on Pie * Also change the color in dark mode --- quickstep/res/values-night/colors.xml | 4 ++-- quickstep/res/values/colors.xml | 4 ++-- src/com/android/launcher3/allapps/WorkProfileManager.java | 3 +-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/quickstep/res/values-night/colors.xml b/quickstep/res/values-night/colors.xml index 23ece7b2f58..623a1655edc 100644 --- a/quickstep/res/values-night/colors.xml +++ b/quickstep/res/values-night/colors.xml @@ -27,5 +27,5 @@ ?attr/colorAccentPrimary ?attr/materialColorPrimaryFixedDim - ?attr/materialColorOnPrimaryFixed - \ No newline at end of file + @color/material_color_on_primary_fixed + diff --git a/quickstep/res/values/colors.xml b/quickstep/res/values/colors.xml index f799d72b158..9ca66bb8d3a 100644 --- a/quickstep/res/values/colors.xml +++ b/quickstep/res/values/colors.xml @@ -95,5 +95,5 @@ ?attr/colorAccentPrimary ?attr/materialColorPrimaryFixedDim - ?attr/materialColorOnPrimaryFixed - \ No newline at end of file + @color/material_color_on_primary_fixed + diff --git a/src/com/android/launcher3/allapps/WorkProfileManager.java b/src/com/android/launcher3/allapps/WorkProfileManager.java index c4e03cc7744..958680962dc 100644 --- a/src/com/android/launcher3/allapps/WorkProfileManager.java +++ b/src/com/android/launcher3/allapps/WorkProfileManager.java @@ -166,8 +166,7 @@ private void updateCurrentState(@WorkProfileState int currentState) { */ public boolean attachWorkModeSwitch() { if (!mAllApps.getAppsStore().hasModelFlag( - FLAG_HAS_SHORTCUT_PERMISSION | FLAG_QUIET_MODE_CHANGE_PERMISSION) - || !Utilities.ATLEAST_Q) { + FLAG_HAS_SHORTCUT_PERMISSION | FLAG_QUIET_MODE_CHANGE_PERMISSION)) { Log.e(TAG, "unable to attach work mode switch; Missing required permissions"); return false; } From d15e14367511c2c909608d0215505b226c70623a Mon Sep 17 00:00:00 2001 From: MrSluffy Date: Tue, 19 Dec 2023 10:15:06 +0800 Subject: [PATCH 3/6] Fixed preview in home screen and backup in A13+ --- .../lawnchair/backup/ui/CreateBackupScreen.kt | 16 +++++++++++++--- .../preferences/components/WallpaperPreview.kt | 16 +++++++++++++--- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/lawnchair/src/app/lawnchair/backup/ui/CreateBackupScreen.kt b/lawnchair/src/app/lawnchair/backup/ui/CreateBackupScreen.kt index 60af753d6fb..5e5572cc27b 100644 --- a/lawnchair/src/app/lawnchair/backup/ui/CreateBackupScreen.kt +++ b/lawnchair/src/app/lawnchair/backup/ui/CreateBackupScreen.kt @@ -5,6 +5,7 @@ import android.app.Activity import android.app.WallpaperManager import android.content.Intent import android.content.res.Configuration +import android.os.Build import android.provider.DocumentsContract import android.util.Log import android.widget.Toast @@ -39,6 +40,7 @@ import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavGraphBuilder import app.lawnchair.backup.LawnchairBackup +import app.lawnchair.preferences.PreferenceManager import app.lawnchair.ui.preferences.LocalNavController import app.lawnchair.ui.preferences.components.DummyLauncherBox import app.lawnchair.ui.preferences.components.WallpaperPreview @@ -47,6 +49,8 @@ import app.lawnchair.ui.preferences.components.layout.PreferenceGroup import app.lawnchair.ui.preferences.components.layout.PreferenceLayout import app.lawnchair.ui.preferences.preferenceGraph import app.lawnchair.util.BackHandler +import app.lawnchair.util.checkAndRequestFilesPermission +import app.lawnchair.util.filesAndStorageGranted import app.lawnchair.util.hasFlag import app.lawnchair.util.removeFlag import com.android.launcher3.R @@ -73,8 +77,14 @@ fun CreateBackupScreen( val context = LocalContext.current val hasLiveWallpaper = remember { WallpaperManager.getInstance(context).wallpaperInfo != null } - val permissionState = rememberPermissionState(Manifest.permission.READ_EXTERNAL_STORAGE) - val hasStoragePermission = permissionState.status.isGranted + val permissionState = rememberPermissionState( + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + Manifest.permission.MANAGE_EXTERNAL_STORAGE + } else { + Manifest.permission.READ_EXTERNAL_STORAGE + }, + ) + val hasStoragePermission = permissionState.status.isGranted || filesAndStorageGranted(context) val scope = rememberCoroutineScope() var creatingBackup by remember { mutableStateOf(false) } @@ -155,7 +165,7 @@ fun CreateBackupScreen( flags = contents, setFlags = { if (it.hasFlag(LawnchairBackup.INCLUDE_WALLPAPER) && !hasStoragePermission) { - permissionState.launchPermissionRequest() + checkAndRequestFilesPermission(context, PreferenceManager.getInstance(context)) } else { viewModel.setBackupContents(it) } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/WallpaperPreview.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/WallpaperPreview.kt index 60d99623106..67a8ce2391b 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/WallpaperPreview.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/WallpaperPreview.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.app.WallpaperManager import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable +import android.os.Build import android.util.Size import androidx.compose.foundation.Image import androidx.compose.runtime.Composable @@ -15,6 +16,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.core.graphics.drawable.toBitmap +import app.lawnchair.preferences.PreferenceManager +import app.lawnchair.util.checkAndRequestFilesPermission +import app.lawnchair.util.filesAndStorageGranted import app.lawnchair.util.scaleDownToDisplaySize import com.google.accompanist.drawablepainter.rememberDrawablePainter import com.google.accompanist.permissions.ExperimentalPermissionsApi @@ -43,11 +47,17 @@ fun wallpaperDrawable(): Drawable? { val context = LocalContext.current val wallpaperManager = remember { WallpaperManager.getInstance(context) } val wallpaperInfo = wallpaperManager.wallpaperInfo - val permissionState = rememberPermissionState(android.Manifest.permission.READ_EXTERNAL_STORAGE) + val permissionState = rememberPermissionState( + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + android.Manifest.permission.MANAGE_EXTERNAL_STORAGE + } else { + android.Manifest.permission.READ_EXTERNAL_STORAGE + }, + ) val wallpaperDrawable by produceState(initialValue = null) { value = when { wallpaperInfo != null -> wallpaperInfo.loadThumbnail(context.packageManager) - permissionState.status.isGranted -> { + filesAndStorageGranted(context) -> { withContext(Dispatchers.IO) { wallpaperManager.drawable?.let { val size = Size(it.intrinsicWidth, it.intrinsicHeight).scaleDownToDisplaySize(context) @@ -62,7 +72,7 @@ fun wallpaperDrawable(): Drawable? { if (!permissionState.status.isGranted) { SideEffect { - permissionState.launchPermissionRequest() + checkAndRequestFilesPermission(context, PreferenceManager.getInstance(context)) } } From a09ffdcf759526c11dbd563445b33401f4033db8 Mon Sep 17 00:00:00 2001 From: MrSluffy Date: Tue, 19 Dec 2023 10:34:02 +0800 Subject: [PATCH 4/6] Add null check Lawnchair (Debug) bug report Dec 19, 2023 7:07:10 AM version: 14 Dev (#171) (14) commit: 577084d build.brand: motorola build.device: rhode build.display: S1SRS32.38-132-15 build.fingerprint: motorola/rhode_g/rhode:12/S1SRS32.38-132-15/dac4a3-3e3fe:user/release-keys build.hardware: qcom build.id: S1SRS32.38-132-15 build.manufacturer: motorola build.model: moto g52 build.security.level: 2023-09-01 build.product: rhode_g build.type: user version.codename: REL version.incremental: dac4a3-3e3fe version.release: 12 version.sdk_int: 31 display.density_dpi: 446 isRecentsEnabled: false error: Uncaught exception java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getScrollX()' on a null object reference at com.android.launcher3.Utilities.mapCoordInSelfToDescendant(Utilities.java:335) at com.android.launcher3.Workspace.updateIsBeingDraggedOnTouchDown(Workspace.java:1236) at com.android.launcher3.PagedView.onInterceptTouchEvent(PagedView.java:1081) at com.android.launcher3.Workspace.onInterceptTouchEvent(Workspace.java:1168) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2652) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3120) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2744) at com.android.launcher3.views.BaseDragLayer.dispatchTouchEvent(BaseDragLayer.java:303) at com.android.launcher3.dragndrop.DragLayer.dispatchTouchEvent(DragLayer.java:225) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3120) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2744) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3120) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2744) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3120) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2744) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3120) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2744) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:535) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1925) at android.app.Activity.dispatchTouchEvent(Activity.java:4298) at com.android.launcher3.Launcher.dispatchTouchEvent(Launcher.java:2189) at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:493) at android.view.View.dispatchPointerEvent(View.java:14884) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6595) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6396) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5874) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5931) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5897) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:6062) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5905) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:6119) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5878) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5931) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5897) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5905) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5878) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8891) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8807) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:8776) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:9027) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:266) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:342) at android.os.Looper.loopOnce(Looper.java:182) at android.os.Looper.loop(Looper.java:357) at android.app.ActivityThread.main(ActivityThread.java:8089) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1026) --- src/com/android/launcher3/views/BaseDragLayer.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/views/BaseDragLayer.java b/src/com/android/launcher3/views/BaseDragLayer.java index e4df413489f..c83ac67a910 100644 --- a/src/com/android/launcher3/views/BaseDragLayer.java +++ b/src/com/android/launcher3/views/BaseDragLayer.java @@ -433,8 +433,10 @@ public void mapCoordInSelfToDescendant(View descendant, float[] coord) { public void mapCoordInSelfToDescendant(View descendant, int[] coord) { mTmpXY[0] = coord[0]; mTmpXY[1] = coord[1]; - Utilities.mapCoordInSelfToDescendant(descendant, this, mTmpXY); - Utilities.roundArray(mTmpXY, coord); + if (descendant != null) { + Utilities.mapCoordInSelfToDescendant(descendant, this, mTmpXY); + Utilities.roundArray(mTmpXY, coord); + } } public void getViewRectRelativeToSelf(View v, Rect r) { From 4b85d7d7e5e118c3660292873a73b40960e753ca Mon Sep 17 00:00:00 2001 From: MrSluffy Date: Tue, 19 Dec 2023 10:38:14 +0800 Subject: [PATCH 5/6] Move direct null check in util Lawnchair (Debug) bug report Dec 19, 2023 7:07:10 AM version: 14 Dev (#171) (14) commit: 577084d build.brand: motorola build.device: rhode build.display: S1SRS32.38-132-15 build.fingerprint: motorola/rhode_g/rhode:12/S1SRS32.38-132-15/dac4a3-3e3fe:user/release-keys build.hardware: qcom build.id: S1SRS32.38-132-15 build.manufacturer: motorola build.model: moto g52 build.security.level: 2023-09-01 build.product: rhode_g build.type: user version.codename: REL version.incremental: dac4a3-3e3fe version.release: 12 version.sdk_int: 31 display.density_dpi: 446 isRecentsEnabled: false error: Uncaught exception java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getScrollX()' on a null object reference at com.android.launcher3.Utilities.mapCoordInSelfToDescendant(Utilities.java:335) at com.android.launcher3.Workspace.updateIsBeingDraggedOnTouchDown(Workspace.java:1236) at com.android.launcher3.PagedView.onInterceptTouchEvent(PagedView.java:1081) at com.android.launcher3.Workspace.onInterceptTouchEvent(Workspace.java:1168) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2652) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3120) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2744) at com.android.launcher3.views.BaseDragLayer.dispatchTouchEvent(BaseDragLayer.java:303) at com.android.launcher3.dragndrop.DragLayer.dispatchTouchEvent(DragLayer.java:225) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3120) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2744) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3120) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2744) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3120) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2744) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3120) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2744) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:535) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1925) at android.app.Activity.dispatchTouchEvent(Activity.java:4298) at com.android.launcher3.Launcher.dispatchTouchEvent(Launcher.java:2189) at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:493) at android.view.View.dispatchPointerEvent(View.java:14884) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6595) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6396) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5874) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5931) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5897) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:6062) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5905) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:6119) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5878) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5931) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5897) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5905) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5878) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8891) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8807) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:8776) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:9027) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:266) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:342) at android.os.Looper.loopOnce(Looper.java:182) at android.os.Looper.loop(Looper.java:357) at android.app.ActivityThread.main(ActivityThread.java:8089) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1026) --- src/com/android/launcher3/Utilities.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 0c916d1284e..a81b25f3374 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -331,15 +331,17 @@ public static void mapRectInSelfToDescendant(View descendant, View root, Rect re public static void mapCoordInSelfToDescendant(View descendant, View root, float[] coord) { sMatrix.reset(); View v = descendant; - while (v != root) { + if (v != null) { + while (v != root) { + sMatrix.postTranslate(-v.getScrollX(), -v.getScrollY()); + sMatrix.postConcat(v.getMatrix()); + sMatrix.postTranslate(v.getLeft(), v.getTop()); + v = (View) v.getParent(); + } sMatrix.postTranslate(-v.getScrollX(), -v.getScrollY()); - sMatrix.postConcat(v.getMatrix()); - sMatrix.postTranslate(v.getLeft(), v.getTop()); - v = (View) v.getParent(); + sMatrix.invert(sInverseMatrix); + sInverseMatrix.mapPoints(coord); } - sMatrix.postTranslate(-v.getScrollX(), -v.getScrollY()); - sMatrix.invert(sInverseMatrix); - sInverseMatrix.mapPoints(coord); } /** From 0d64cd3055e337e2c56c33d0743b7ad885448d20 Mon Sep 17 00:00:00 2001 From: SuperDragonXD <70206496+SuperDragonXD@users.noreply.github.com> Date: Tue, 19 Dec 2023 15:42:24 +0800 Subject: [PATCH 6/6] Uncomment Home Screen Rotation preference Fixes #3886 --- .../ui/preferences/destinations/GeneralPreferences.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/GeneralPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/GeneralPreferences.kt index de0d42eb06e..a1d01cd5f46 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/GeneralPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/GeneralPreferences.kt @@ -96,11 +96,11 @@ fun GeneralPreferences() { PreferenceLayout(label = stringResource(id = R.string.general_label)) { PreferenceGroup { -// SwitchPreference( -// adapter = prefs.allowRotation.getAdapter(), -// label = stringResource(id = R.string.home_screen_rotation_label), -// description = stringResource(id = R.string.home_screen_rotaton_description), -// ) + SwitchPreference( + adapter = prefs.allowRotation.getAdapter(), + label = stringResource(id = R.string.home_screen_rotation_label), + description = stringResource(id = R.string.home_screen_rotaton_description), + ) val enableFontSelection = prefs2.enableFontSelection.asState().value if (enableFontSelection) { FontPreference(