diff --git a/lawnchair/AndroidManifest.xml b/lawnchair/AndroidManifest.xml
index 940d229acf..c8877a468b 100644
--- a/lawnchair/AndroidManifest.xml
+++ b/lawnchair/AndroidManifest.xml
@@ -1,5 +1,4 @@
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/lawnchair/res/values/strings.xml b/lawnchair/res/values/strings.xml
index 4888bcaf94..95e7ad3466 100644
--- a/lawnchair/res/values/strings.xml
+++ b/lawnchair/res/values/strings.xml
@@ -35,4 +35,5 @@
Allow Empty Pages
Make Colored Backgrounds
For generated Adaptive icons.
+ Notification Dots
diff --git a/lawnchair/src/ch/deletescape/lawnchair/settings/activities/GridSettingsActivity.kt b/lawnchair/src/ch/deletescape/lawnchair/settings/activities/GridSettingsActivity.kt
deleted file mode 100644
index 8fb82529f6..0000000000
--- a/lawnchair/src/ch/deletescape/lawnchair/settings/activities/GridSettingsActivity.kt
+++ /dev/null
@@ -1,192 +0,0 @@
-package ch.deletescape.lawnchair.settings.activities
-
-import android.os.Bundle
-import androidx.activity.compose.setContent
-import androidx.appcompat.app.AppCompatActivity
-import androidx.compose.animation.Crossfade
-import androidx.compose.animation.core.animateDp
-import androidx.compose.animation.core.updateTransition
-import androidx.compose.foundation.BorderStroke
-import androidx.compose.foundation.border
-import androidx.compose.foundation.clickable
-import androidx.compose.foundation.layout.*
-import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.material.*
-import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.outlined.ArrowBack
-import androidx.compose.runtime.*
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.clip
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.tooling.preview.Preview
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.zIndex
-import ch.deletescape.lawnchair.compose.ui.theme.LawnchairTheme
-
-private enum class TabPage {
- HomeScreen, Dock, AppDrawer
-}
-
-class GridSettingsActivity : AppCompatActivity() {
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContent {
- LawnchairTheme {
- Surface(
- color = MaterialTheme.colors.background,
- modifier = Modifier.fillMaxHeight()
- ) {
- Root()
- }
- }
- }
- }
-
- @Composable
- fun Root() {
- var tabPage by remember { mutableStateOf(TabPage.HomeScreen) }
-
- Column {
- TopAppBar(
- title = { Text(text = "Grid") },
- backgroundColor = MaterialTheme.colors.background,
- navigationIcon = {
- Box(
- modifier = Modifier
- .padding(start = 4.dp)
- .height(40.dp)
- .width(40.dp)
- .clip(shape = RoundedCornerShape(20.dp))
- .clickable { finish() },
- contentAlignment = Alignment.Center
- ) {
- Icon(
- Icons.Outlined.ArrowBack,
- "Back",
- modifier = Modifier,
- MaterialTheme.colors.onBackground
- )
- }
- }
- )
- TabBar(tabPage = tabPage, onTabSelected = { tabPage = it })
- Crossfade(targetState = tabPage) { tabPage ->
- when (tabPage) {
- TabPage.HomeScreen -> HomeScreenGridSettings()
- TabPage.Dock -> Text("tab 2")
- TabPage.AppDrawer -> Text("tab 3")
- }
- }
- }
- }
-
- @Composable
- fun HomeScreenGridSettings() {
- SliderSetting()
- }
-
- @Composable
- private fun TabBar(
- tabPage: TabPage,
- onTabSelected: (tabPage: TabPage) -> Unit
- ) {
- Box(modifier = Modifier
- .padding(16.dp)
- .fillMaxWidth()
- .height(36.dp).zIndex(1f)) {
- TabRow(
- selectedTabIndex = tabPage.ordinal,
- modifier = Modifier
- .fillMaxSize().zIndex(2f),
- divider = {},
- backgroundColor = Color.Transparent,
- indicator = { tabPositions -> TabIndicator(tabPositions, tabPage) }) {
- Tab(
- title = "Home",
- onClick = { onTabSelected(TabPage.HomeScreen) }
- )
- Tab(
- title = "Dock",
- onClick = { onTabSelected(TabPage.Dock) }
- )
- Tab(
- title = "Drawer",
- onClick = { onTabSelected(TabPage.AppDrawer) }
- )
- }
- Box(
- modifier = Modifier
- .fillMaxSize()
- .border(BorderStroke(1.dp, Color.LightGray), RoundedCornerShape(8.dp))
- )
- }
- }
-
- @Composable
- private fun TabIndicator(
- tabPositions: List,
- tabPage: TabPage
- ) {
- val transition = updateTransition(tabPage)
- val indicatorLeft by transition.animateDp { page -> tabPositions[page.ordinal].left }
- val indicatorRight by transition.animateDp { page -> tabPositions[page.ordinal].right }
- Box(
- Modifier
- .fillMaxSize()
- .wrapContentSize(align = Alignment.BottomStart)
- .offset(x = indicatorLeft)
- .width(indicatorRight - indicatorLeft)
- .fillMaxSize()
- .border(
- BorderStroke(1.dp, MaterialTheme.colors.primary),
- RoundedCornerShape(8.dp)
- )
- )
- }
-
- @Composable
- private fun Tab(
- title: String,
- onClick: () -> Unit,
- modifier: Modifier = Modifier
- ) {
- Row(
- modifier = modifier
- .clip(RoundedCornerShape(8.dp))
- .clickable(onClick = onClick),
- horizontalArrangement = Arrangement.Center,
- verticalAlignment = Alignment.CenterVertically
- ) {
- Text(text = title)
- }
- }
-
- @Preview
- @Composable
- fun SliderSetting() {
- Column(
- modifier = Modifier
- .fillMaxWidth()
- .padding(start = 16.dp, end = 16.dp)
- ) {
- Text(text = "Test")
- Slider(value = 50F, onValueChange = {}, modifier = Modifier.fillMaxWidth())
- }
- }
-
- @Preview
- @Composable
- fun Preview() {
- LawnchairTheme {
- Surface(
- color = MaterialTheme.colors.background,
- modifier = Modifier.fillMaxHeight()
- ) {
- Root()
- }
- }
- }
-
-}
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/settings/activities/IconPackSettingsActivity.kt b/lawnchair/src/ch/deletescape/lawnchair/settings/activities/IconPackSettingsActivity.kt
deleted file mode 100644
index abac04d7a7..0000000000
--- a/lawnchair/src/ch/deletescape/lawnchair/settings/activities/IconPackSettingsActivity.kt
+++ /dev/null
@@ -1,166 +0,0 @@
-package ch.deletescape.lawnchair.settings.activities
-
-import android.content.Intent
-import android.content.SharedPreferences
-import android.content.pm.ResolveInfo
-import android.graphics.drawable.Drawable
-import android.os.Bundle
-import androidx.activity.compose.setContent
-import androidx.appcompat.app.AppCompatActivity
-import androidx.appcompat.content.res.AppCompatResources
-import androidx.compose.foundation.Image
-import androidx.compose.foundation.clickable
-import androidx.compose.foundation.layout.*
-import androidx.compose.foundation.lazy.LazyColumn
-import androidx.compose.foundation.lazy.items
-import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.material.*
-import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.outlined.ArrowBack
-import androidx.compose.runtime.*
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.clip
-import androidx.compose.ui.graphics.asImageBitmap
-import androidx.compose.ui.unit.dp
-import androidx.core.graphics.drawable.toBitmap
-import ch.deletescape.lawnchair.compose.ui.theme.LawnchairTheme
-import ch.deletescape.lawnchair.sharedprefs.LawnchairPreferences
-import com.android.launcher3.R
-import com.android.launcher3.Utilities
-
-class IconPackSettingsActivity : AppCompatActivity() {
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContent {
- LawnchairTheme {
- Surface(
- color = MaterialTheme.colors.background,
- modifier = Modifier.fillMaxHeight()
- ) {
- IconPackSettings()
- }
- }
- }
- }
-
- data class IconPackInfo(val name: String, val packageName: String, val icon: Drawable)
-
- private fun getIconPacks(): MutableMap {
- val pm = this.packageManager
- val iconPacks: MutableMap = HashMap()
- val list: MutableList = pm.queryIntentActivities(Intent("com.novalauncher.THEME"), 0)
-
- list.addAll(pm.queryIntentActivities(Intent("org.adw.launcher.icons.ACTION_PICK_ICON"), 0))
- list.addAll(pm.queryIntentActivities(Intent("com.dlto.atom.launcher.THEME"), 0))
- list.addAll(pm.queryIntentActivities(Intent("android.intent.action.MAIN").addCategory("com.anddoes.launcher.THEME"), 0))
-
- iconPacks["system"] = IconPackInfo(
- "System Icons",
- "",
- AppCompatResources.getDrawable(this, R.drawable.ic_launcher_home)!!
- )
-
- for (info in list) {
- iconPacks[info.activityInfo.packageName] = IconPackInfo(
- info.loadLabel(pm).toString(),
- info.activityInfo.packageName,
- info.loadIcon(pm)
- )
- }
-
- return iconPacks
- }
-
- private val sharedPref: SharedPreferences by lazy { Utilities.getPrefs(this) }
- private val dbSelectedIconPackPackageName by lazy { sharedPref.getString(LawnchairPreferences.ICON_PACK_PACKAGE, "")!! }
-
- @Composable
- fun IconPackSettings() {
- var selectedIconPackPackageName by remember { mutableStateOf(dbSelectedIconPackPackageName) }
-
- Column {
- TopAppBar(
- title = { Text(text = "Icon Packs") },
- backgroundColor = MaterialTheme.colors.background,
- navigationIcon = {
- Box(
- modifier = Modifier
- .padding(start = 4.dp)
- .height(40.dp)
- .width(40.dp)
- .clip(shape = RoundedCornerShape(20.dp))
- .clickable { finish() },
- contentAlignment = Alignment.Center
- ) {
- Icon(
- Icons.Outlined.ArrowBack,
- "Back",
- modifier = Modifier,
- MaterialTheme.colors.onBackground
- )
- }
- }
- )
- IconPackList(
- getIconPacks(),
- selectedIconPackPackageName,
- onSelectionChange = { selectedIconPackPackageName = it })
- }
- }
-
- @Composable
- fun IconPackList(
- iconPacks: MutableMap,
- selectedIconPackPackageName: String,
- modifier: Modifier = Modifier,
- onSelectionChange: (String) -> Unit
- ) {
- Box(modifier) {
- LazyColumn(Modifier.fillMaxWidth()) {
- items(iconPacks.values.toList()) { iconPack ->
- IconPackListItem(iconPack, selectedIconPackPackageName, onSelectionChange)
- }
- }
- }
- }
-
- @Composable
- fun IconPackListItem(
- iconPack: IconPackInfo,
- selectedIconPackPackageName: String,
- onSelectionChange: (String) -> Unit
- ) {
- fun select() {
- onSelectionChange(iconPack.packageName)
- sharedPref.edit().putString(LawnchairPreferences.ICON_PACK_PACKAGE, iconPack.packageName).apply()
- }
- Row(
- verticalAlignment = Alignment.CenterVertically,
- modifier = Modifier
- .fillMaxWidth()
- .height(56.dp)
- .clickable { select() }
- .padding(start = 16.dp)
- ) {
- RadioButton(
- selected = iconPack.packageName == selectedIconPackPackageName,
- { select() })
- Image(
- iconPack.icon.toBitmap().asImageBitmap(),
- iconPack.name,
- modifier = Modifier
- .padding(start = 32.dp)
- .width(36.dp)
- .height(36.dp)
- )
- Text(
- modifier = Modifier.padding(start = 16.dp),
- text = iconPack.name,
- style = MaterialTheme.typography.body1
- )
- }
- }
-
-}
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/settings/activities/SettingsActivity.kt b/lawnchair/src/ch/deletescape/lawnchair/settings/activities/SettingsActivity.kt
deleted file mode 100644
index a4317bc9f4..0000000000
--- a/lawnchair/src/ch/deletescape/lawnchair/settings/activities/SettingsActivity.kt
+++ /dev/null
@@ -1,68 +0,0 @@
-package ch.deletescape.lawnchair.settings.activities
-
-import android.os.Bundle
-import android.view.View
-import androidx.appcompat.app.AppCompatActivity
-import androidx.core.content.ContextCompat
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.FragmentManager
-import androidx.preference.Preference
-import androidx.preference.PreferenceFragmentCompat
-import ch.deletescape.lawnchair.settings.fragments.SettingsFragment
-import ch.deletescape.lawnchair.settings.interfaces.TitledFragment
-import com.android.launcher3.R
-import com.google.android.material.appbar.MaterialToolbar
-
-class SettingsActivity : AppCompatActivity(),
- PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
- private lateinit var topAppBar: MaterialToolbar
- private val context = this
-
- private val fragmentListener = object : FragmentManager.FragmentLifecycleCallbacks() {
- override fun onFragmentViewCreated(
- fm: FragmentManager,
- fragment: Fragment,
- v: View,
- savedInstanceState: Bundle?
- ) {
- if (fragment is SettingsFragment) {
- topAppBar.navigationIcon = null
- } else if (topAppBar.navigationIcon == null) {
- topAppBar.navigationIcon = ContextCompat.getDrawable(context, R.drawable.ic_back)
- }
- topAppBar.title = (fragment as? TitledFragment)?.title
- }
- }
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.settings_activity)
- topAppBar = findViewById(R.id.top_app_bar)
- topAppBar.setNavigationOnClickListener {
- supportFragmentManager.popBackStack()
- }
- supportFragmentManager.registerFragmentLifecycleCallbacks(fragmentListener, false)
- supportFragmentManager
- .beginTransaction()
- .replace(R.id.content, SettingsFragment())
- .commit()
- }
-
- override fun onPreferenceStartFragment(
- caller: PreferenceFragmentCompat,
- pref: Preference
- ): Boolean {
- val args = pref.extras
- val fragment = supportFragmentManager.fragmentFactory.instantiate(
- classLoader,
- pref.fragment
- )
- fragment.arguments = args
- fragment.setTargetFragment(caller, 0)
- supportFragmentManager.beginTransaction()
- .replace(R.id.content, fragment)
- .addToBackStack(null)
- .commit()
- return true
- }
-}
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/settings/fragments/AppDrawerSettingsFragment.kt b/lawnchair/src/ch/deletescape/lawnchair/settings/fragments/AppDrawerSettingsFragment.kt
deleted file mode 100644
index 4c8b92e300..0000000000
--- a/lawnchair/src/ch/deletescape/lawnchair/settings/fragments/AppDrawerSettingsFragment.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package ch.deletescape.lawnchair.settings.fragments
-
-import com.android.launcher3.R
-
-class AppDrawerSettingsFragment : BasePreferenceFragment(R.xml.app_drawer_settings, false, true) {
- override val title: String
- get() = "App Drawer"
-}
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/settings/fragments/BasePreferenceFragment.kt b/lawnchair/src/ch/deletescape/lawnchair/settings/fragments/BasePreferenceFragment.kt
deleted file mode 100644
index 0f2920cf76..0000000000
--- a/lawnchair/src/ch/deletescape/lawnchair/settings/fragments/BasePreferenceFragment.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-package ch.deletescape.lawnchair.settings.fragments
-
-import android.os.Bundle
-import androidx.preference.PreferenceFragmentCompat
-import ch.deletescape.lawnchair.settings.interfaces.TitledFragment
-import com.android.launcher3.LauncherFiles
-import com.google.android.material.transition.MaterialSharedAxis
-
-abstract class BasePreferenceFragment(
- var preferenceResource: Int,
- var hasChild: Boolean,
- var hasParent: Boolean
-) : PreferenceFragmentCompat(),
- TitledFragment {
-
- override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
- setPreferencesFromResource(preferenceResource, rootKey)
- preferenceManager.sharedPreferencesName = LauncherFiles.SHARED_PREFERENCES_KEY
-
- if (hasChild) {
- exitTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true)
- reenterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false)
- }
-
- if (hasParent) {
- enterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true)
- returnTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false)
- }
- }
-
-}
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/settings/fragments/DockSettingsFragment.kt b/lawnchair/src/ch/deletescape/lawnchair/settings/fragments/DockSettingsFragment.kt
deleted file mode 100644
index 6ec081b96d..0000000000
--- a/lawnchair/src/ch/deletescape/lawnchair/settings/fragments/DockSettingsFragment.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package ch.deletescape.lawnchair.settings.fragments
-
-import com.android.launcher3.R
-
-class DockSettingsFragment : BasePreferenceFragment(R.xml.dock_settings, false, true) {
- override val title: String
- get() = "Dock"
-}
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/settings/fragments/GeneralSettingsFragment.kt b/lawnchair/src/ch/deletescape/lawnchair/settings/fragments/GeneralSettingsFragment.kt
deleted file mode 100644
index 5805ff80db..0000000000
--- a/lawnchair/src/ch/deletescape/lawnchair/settings/fragments/GeneralSettingsFragment.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package ch.deletescape.lawnchair.settings.fragments
-
-import com.android.launcher3.R
-
-class GeneralSettingsFragment : BasePreferenceFragment(R.xml.general_settings, true, true) {
- override val title: String
- get() = "General"
-}
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/settings/fragments/HomeScreenSettingsFragment.kt b/lawnchair/src/ch/deletescape/lawnchair/settings/fragments/HomeScreenSettingsFragment.kt
deleted file mode 100644
index b4bcde41c6..0000000000
--- a/lawnchair/src/ch/deletescape/lawnchair/settings/fragments/HomeScreenSettingsFragment.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package ch.deletescape.lawnchair.settings.fragments
-
-import com.android.launcher3.R
-
-class HomeScreenSettingsFragment : BasePreferenceFragment(R.xml.home_screen_settings, false, true) {
- override val title: String
- get() = "Home Screen"
-}
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/settings/fragments/SettingsFragment.kt b/lawnchair/src/ch/deletescape/lawnchair/settings/fragments/SettingsFragment.kt
deleted file mode 100644
index f49dbf911a..0000000000
--- a/lawnchair/src/ch/deletescape/lawnchair/settings/fragments/SettingsFragment.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package ch.deletescape.lawnchair.settings.fragments
-
-import com.android.launcher3.R
-
-class SettingsFragment : BasePreferenceFragment(R.xml.settings, true, false) {
- override val title: String
- get() = "Settings"
-}
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/settings/interfaces/TitledFragment.kt b/lawnchair/src/ch/deletescape/lawnchair/settings/interfaces/TitledFragment.kt
deleted file mode 100644
index fbfa942334..0000000000
--- a/lawnchair/src/ch/deletescape/lawnchair/settings/interfaces/TitledFragment.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package ch.deletescape.lawnchair.settings.interfaces
-
-interface TitledFragment {
- val title: String
-}
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/settings/ui/SettingsActivity.java b/lawnchair/src/ch/deletescape/lawnchair/settings/ui/SettingsActivity.java
deleted file mode 100644
index c7d4c3b7f0..0000000000
--- a/lawnchair/src/ch/deletescape/lawnchair/settings/ui/SettingsActivity.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.deletescape.lawnchair.settings.ui;
-
-import static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS;
-
-import static com.android.launcher3.SessionCommitReceiver.ADD_ICON_PREFERENCE_KEY;
-import static com.android.launcher3.states.RotationHelper.ALLOW_ROTATION_PREFERENCE_KEY;
-import static com.android.launcher3.states.RotationHelper.getAllowRotationDefaultValue;
-import static com.android.launcher3.util.SecureSettingsObserver.newNotificationSettingsObserver;
-
-import android.content.SharedPreferences;
-import android.os.Bundle;
-import android.provider.Settings;
-import android.text.TextUtils;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.DialogFragment;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-import androidx.fragment.app.FragmentManager;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceFragmentCompat;
-import androidx.preference.PreferenceFragmentCompat.OnPreferenceStartFragmentCallback;
-import androidx.preference.PreferenceFragmentCompat.OnPreferenceStartScreenCallback;
-import androidx.preference.PreferenceGroup.PreferencePositionCallback;
-import androidx.preference.PreferenceScreen;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.android.launcher3.LauncherFiles;
-import com.android.launcher3.R;
-import com.android.launcher3.Utilities;
-import com.android.launcher3.config.FeatureFlags;
-import com.android.launcher3.settings.NotificationDotsPreference;
-import com.android.launcher3.settings.PreferenceHighlighter;
-import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper;
-import com.android.launcher3.util.SecureSettingsObserver;
-
-/**
- * Settings activity for Launcher. Currently implements the following setting: Allow rotation
- */
-public class SettingsActivity extends FragmentActivity
- implements OnPreferenceStartFragmentCallback, OnPreferenceStartScreenCallback,
- SharedPreferences.OnSharedPreferenceChangeListener{
-
- private static final String DEVELOPER_OPTIONS_KEY = "pref_developer_options";
- private static final String FLAGS_PREFERENCE_KEY = "flag_toggler";
-
- private static final String NOTIFICATION_DOTS_PREFERENCE_KEY = "pref_icon_badging";
- /** Hidden field Settings.Secure.ENABLED_NOTIFICATION_LISTENERS */
- private static final String NOTIFICATION_ENABLED_LISTENERS = "enabled_notification_listeners";
-
- public static final String EXTRA_FRAGMENT_ARG_KEY = ":settings:fragment_args_key";
- public static final String EXTRA_SHOW_FRAGMENT_ARGS = ":settings:show_fragment_args";
- private static final int DELAY_HIGHLIGHT_DURATION_MILLIS = 600;
- public static final String SAVE_HIGHLIGHTED_KEY = "android:preference_highlighted";
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- if (savedInstanceState == null) {
- Bundle args = new Bundle();
- String prefKey = getIntent().getStringExtra(EXTRA_FRAGMENT_ARG_KEY);
- if (!TextUtils.isEmpty(prefKey)) {
- args.putString(EXTRA_FRAGMENT_ARG_KEY, prefKey);
- }
-
- final FragmentManager fm = getSupportFragmentManager();
- final Fragment f = fm.getFragmentFactory().instantiate(getClassLoader(),
- getString(R.string.settings_fragment_name));
- f.setArguments(args);
- // Display the fragment as the main content.
- fm.beginTransaction().replace(android.R.id.content, f).commit();
- }
- Utilities.getPrefs(getApplicationContext()).registerOnSharedPreferenceChangeListener(this);
- }
-
- @Override
- public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { }
-
- private boolean startFragment(String fragment, Bundle args, String key) {
- if (Utilities.ATLEAST_P && getSupportFragmentManager().isStateSaved()) {
- // Sometimes onClick can come after onPause because of being posted on the handler.
- // Skip starting new fragments in that case.
- return false;
- }
- final FragmentManager fm = getSupportFragmentManager();
- final Fragment f = fm.getFragmentFactory().instantiate(getClassLoader(), fragment);
- f.setArguments(args);
- if (f instanceof DialogFragment) {
- ((DialogFragment) f).show(getSupportFragmentManager(), key);
- } else {
- fm.beginTransaction().replace(android.R.id.content, f).addToBackStack(key).commit();
- }
- return true;
- }
-
- @Override
- public boolean onPreferenceStartFragment(
- PreferenceFragmentCompat preferenceFragment, Preference pref) {
- return startFragment(pref.getFragment(), pref.getExtras(), pref.getKey());
- }
-
- @Override
- public boolean onPreferenceStartScreen(PreferenceFragmentCompat caller, PreferenceScreen pref) {
- Bundle args = new Bundle();
- args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, pref.getKey());
- return startFragment(getString(R.string.settings_fragment_name), args, pref.getKey());
- }
-
- /**
- * This fragment shows the launcher preferences.
- */
- public static class LauncherSettingsFragment extends PreferenceFragmentCompat {
-
- private SecureSettingsObserver mNotificationDotsObserver;
-
- private String mHighLightKey;
- private boolean mPreferenceHighlighted = false;
-
- @Override
- public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
- final Bundle args = getArguments();
- mHighLightKey = args == null ? null : args.getString(EXTRA_FRAGMENT_ARG_KEY);
- if (rootKey == null && !TextUtils.isEmpty(mHighLightKey)) {
- rootKey = getParentKeyForPref(mHighLightKey);
- }
-
- if (savedInstanceState != null) {
- mPreferenceHighlighted = savedInstanceState.getBoolean(SAVE_HIGHLIGHTED_KEY);
- }
-
- getPreferenceManager().setSharedPreferencesName(LauncherFiles.SHARED_PREFERENCES_KEY);
- setPreferencesFromResource(R.xml.settings, rootKey);
-
- PreferenceScreen screen = getPreferenceScreen();
- for (int i = screen.getPreferenceCount() - 1; i >= 0; i--) {
- Preference preference = screen.getPreference(i);
- if (!initPreference(preference)) {
- screen.removePreference(preference);
- }
- }
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putBoolean(SAVE_HIGHLIGHTED_KEY, mPreferenceHighlighted);
- }
-
- protected String getParentKeyForPref(String key) {
- return null;
- }
-
- /**
- * Initializes a preference. This is called for every preference. Returning false here
- * will remove that preference from the list.
- */
- protected boolean initPreference(Preference preference) {
- switch (preference.getKey()) {
- case NOTIFICATION_DOTS_PREFERENCE_KEY:
- if (!Utilities.ATLEAST_OREO ||
- !getResources().getBoolean(R.bool.notification_dots_enabled)) {
- return false;
- }
-
- // Listen to system notification dot settings while this UI is active.
- mNotificationDotsObserver = newNotificationSettingsObserver(
- getActivity(), (NotificationDotsPreference) preference);
- mNotificationDotsObserver.register();
- // Also listen if notification permission changes
- mNotificationDotsObserver.getResolver().registerContentObserver(
- Settings.Secure.getUriFor(NOTIFICATION_ENABLED_LISTENERS), false,
- mNotificationDotsObserver);
- mNotificationDotsObserver.dispatchOnChange();
- return true;
-
- case ADD_ICON_PREFERENCE_KEY:
- return Utilities.ATLEAST_OREO;
-
- case ALLOW_ROTATION_PREFERENCE_KEY:
- if (getResources().getBoolean(R.bool.allow_rotation)) {
- // Launcher supports rotation by default. No need to show this setting.
- return false;
- }
- // Initialize the UI once
- preference.setDefaultValue(getAllowRotationDefaultValue());
- return true;
-
- case FLAGS_PREFERENCE_KEY:
- // Only show flag toggler UI if this build variant implements that.
- return FeatureFlags.showFlagTogglerUi(getContext());
-
- case DEVELOPER_OPTIONS_KEY:
- // Show if plugins are enabled or flag UI is enabled.
- return FeatureFlags.showFlagTogglerUi(getContext()) ||
- PluginManagerWrapper.hasPlugins(getContext());
- }
-
- return true;
- }
-
- @Override
- public void onResume() {
- super.onResume();
-
- if (isAdded() && !mPreferenceHighlighted) {
- PreferenceHighlighter highlighter = createHighlighter();
- if (highlighter != null) {
- getView().postDelayed(highlighter, DELAY_HIGHLIGHT_DURATION_MILLIS);
- mPreferenceHighlighted = true;
- } else {
- requestAccessibilityFocus(getListView());
- }
- }
- }
-
- private PreferenceHighlighter createHighlighter() {
- if (TextUtils.isEmpty(mHighLightKey)) {
- return null;
- }
-
- PreferenceScreen screen = getPreferenceScreen();
- if (screen == null) {
- return null;
- }
-
- RecyclerView list = getListView();
- PreferencePositionCallback callback = (PreferencePositionCallback) list.getAdapter();
- int position = callback.getPreferenceAdapterPosition(mHighLightKey);
- return position >= 0 ? new PreferenceHighlighter(list, position) : null;
- }
-
- private void requestAccessibilityFocus(@NonNull final RecyclerView rv) {
- rv.post(() -> {
- if (!rv.hasFocus() && rv.getChildCount() > 0) {
- rv.getChildAt(0)
- .performAccessibilityAction(ACTION_ACCESSIBILITY_FOCUS, null);
- }
- });
- }
-
- @Override
- public void onDestroy() {
- if (mNotificationDotsObserver != null) {
- mNotificationDotsObserver.unregister();
- mNotificationDotsObserver = null;
- }
- super.onDestroy();
- }
- }
-}
diff --git a/lawnchair/src/ch/deletescape/lawnchair/settings/ui/preferences/CustomSeekBarPreference.kt b/lawnchair/src/ch/deletescape/lawnchair/settings/ui/preferences/CustomSeekBarPreference.kt
deleted file mode 100644
index 75b559cb28..0000000000
--- a/lawnchair/src/ch/deletescape/lawnchair/settings/ui/preferences/CustomSeekBarPreference.kt
+++ /dev/null
@@ -1,68 +0,0 @@
-package ch.deletescape.lawnchair.settings.ui.preferences
-
-import android.content.Context
-import android.os.Build
-import android.util.AttributeSet
-import android.util.Log
-import android.widget.SeekBar
-import android.widget.TextView
-import androidx.annotation.RequiresApi
-import androidx.preference.Preference
-import androidx.preference.PreferenceViewHolder
-import androidx.preference.SeekBarPreference
-import com.android.launcher3.R
-
-class CustomSeekBarPreference(context: Context, attrs: AttributeSet? = null) : Preference(context, attrs), Preference.OnPreferenceChangeListener {
-
- private val minValue: Int
- private val maxValue: Int
- private val snapEvery: Int
- private val asPercentages: Boolean
-
- private var displayedValue: Int = 0
- private var realValue: Double = 0.0
-
- init {
- widgetLayoutResource = R.layout.custom_seek_bar_preference
- layoutResource = R.layout.custom_seek_bar_preference
- context.obtainStyledAttributes(attrs, R.styleable.CustomSeekBarPreference).apply {
- minValue = this.getInt(R.styleable.CustomSeekBarPreference_minValue, 0)
- maxValue = this.getInt(R.styleable.CustomSeekBarPreference_maxValue, 100)
- snapEvery = this.getInt(R.styleable.CustomSeekBarPreference_snapEvery, 1)
- asPercentages = this.getBoolean(R.styleable.CustomSeekBarPreference_asPercentages, false)
- recycle()
- }
- }
-
- override fun onBindViewHolder(view: PreferenceViewHolder?) {
- super.onBindViewHolder(view)
- onPreferenceChangeListener = this
-
- val seekBar: SeekBar = view?.findViewById(R.id.seek_bar) as SeekBar
- val valueView: TextView = view.findViewById(R.id.value_view) as TextView
-
- seekBar.max = (maxValue - minValue) / snapEvery
-
- seekBar.setOnSeekBarChangeListener(object: SeekBar.OnSeekBarChangeListener {
- override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
- displayedValue = progress * snapEvery + minValue
- realValue = if (asPercentages) displayedValue.toDouble() / 100 else displayedValue.toDouble()
- valueView.text = if (asPercentages) "$displayedValue%" else "$displayedValue"
- }
-
- override fun onStartTrackingTouch(seekBar: SeekBar?) {
-
- }
-
- override fun onStopTrackingTouch(seekBar: SeekBar?) {
-
- }
-
- })
- }
-
- override fun onPreferenceChange(preference: Preference?, newValue: Any?): Boolean {
- return true
- }
-
-}
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/sharedprefs/PrefManager.kt b/lawnchair/src/ch/deletescape/lawnchair/sharedprefs/PrefManager.kt
deleted file mode 100644
index 8c6790336e..0000000000
--- a/lawnchair/src/ch/deletescape/lawnchair/sharedprefs/PrefManager.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-package ch.deletescape.lawnchair.sharedprefs
-
-import android.content.Context
-import android.content.SharedPreferences
-import com.android.launcher3.Utilities
-
-class PrefManager(context: Context) {
- val sp: SharedPreferences = Utilities.getPrefs(context)
- private val lp = LawnchairPreferences
- var iconPackPackage by StringPrefDelegate(lp.ICON_PACK_PACKAGE, "")
- var allowRotation by BoolPrefDelegate("pref_allowRotation", true)
- var wrapAdaptiveIcons by BoolPrefDelegate(lp.WRAP_ADAPTIVE_ICONS, false)
- var addIconToHome by BoolPrefDelegate("pref_add_icon_to_home", true)
- var hotseatColumns by FloatPrefDelegate(lp.HOTSEAT_COLUMNS, 5F)
- var workspaceColumns by FloatPrefDelegate(lp.WORKSPACE_COLUMNS, 5F)
- var workspaceRows by FloatPrefDelegate(lp.WORKSPACE_ROWS, 7F)
- var folderColumns by FloatPrefDelegate(lp.FOLDER_COLUMNS, 3F)
- var folderRows by FloatPrefDelegate(lp.FOLDER_ROWS, 4F)
- var iconSizeFactor by FloatPrefDelegate(lp.ICON_SIZE_FACTOR, 1F)
- var textSizeFactor by FloatPrefDelegate(lp.TEXT_SIZE_FACTOR, 1F)
- var allAppsIconSizeFactor by FloatPrefDelegate(lp.ALL_APPS_ICON_SIZE_FACTOR, 1F)
- var allAppsTextSizeFactor by FloatPrefDelegate(lp.ALL_APPS_TEXT_SIZE_FACTOR, 1F)
- var allAppsColumns by FloatPrefDelegate(lp.ALL_APPS_COLUMNS, 5F)
- var allowEmptyPages by BoolPrefDelegate(lp.ALLOW_EMPTY_PAGES, false)
- var makeColoredBackgrounds by BoolPrefDelegate(lp.MAKE_COLORED_BACKGROUNDS, false)
-}
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/LawnchairApp.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/LawnchairApp.kt
similarity index 96%
rename from lawnchair/src/ch/deletescape/lawnchair/LawnchairApp.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/LawnchairApp.kt
index d5795ddb11..01557498ec 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/LawnchairApp.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/LawnchairApp.kt
@@ -15,7 +15,7 @@
* along with Lawnchair Launcher. If not, see .
*/
-package ch.deletescape.lawnchair
+package ch.deletescape.lawnchair.ui
import android.app.Activity
import android.app.Application
@@ -36,7 +36,8 @@ class LawnchairApp : Application() {
val recentsEnabled by lazy { checkRecentsComponent() }
val TAG = "LawnchairApp"
- init {}
+ init {
+ }
fun onLauncherAppStateCreated() {
registerActivityLifecycleCallbacks(activityHandler)
@@ -50,10 +51,6 @@ class LawnchairApp : Application() {
}*/
}
- override fun onConfigurationChanged(newConfig: Configuration) {
- super.onConfigurationChanged(newConfig)
- }
-
class ActivityHandler : ActivityLifecycleCallbacks {
val activities = HashSet()
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/AppDrawerPreferences.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/AppDrawerPreferences.kt
similarity index 91%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/AppDrawerPreferences.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/preferences/AppDrawerPreferences.kt
index c3efbe62f5..d02a16d36a 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/AppDrawerPreferences.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/AppDrawerPreferences.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.compose.ui.preferences
+package ch.deletescape.lawnchair.ui.preferences
import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.Composable
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/DockPreferences.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/DockPreferences.kt
similarity index 91%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/DockPreferences.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/preferences/DockPreferences.kt
index 19b0bce046..52311d80ed 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/DockPreferences.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/DockPreferences.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.compose.ui.preferences
+package ch.deletescape.lawnchair.ui.preferences
import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.Composable
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/FolderPreferences.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/FolderPreferences.kt
similarity index 93%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/FolderPreferences.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/preferences/FolderPreferences.kt
index 92b6e4b152..2ed00d9c0f 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/FolderPreferences.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/FolderPreferences.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.compose.ui.preferences
+package ch.deletescape.lawnchair.ui.preferences
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/GeneralPreferences.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/GeneralPreferences.kt
similarity index 95%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/GeneralPreferences.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/preferences/GeneralPreferences.kt
index cbd8fa9c6b..d153379d63 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/GeneralPreferences.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/GeneralPreferences.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.compose.ui.preferences
+package ch.deletescape.lawnchair.ui.preferences
import android.os.Build
import androidx.compose.animation.AnimatedVisibility
@@ -19,6 +19,7 @@ fun GeneralPreferences(navController: NavController, interactor: PreferenceInter
label = stringResource(id = R.string.home_screen_rotation_label),
description = stringResource(id = R.string.home_screen_rotaton_description)
)
+ NotificationDotsPreference(interactor)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
SwitchPreference(
checked = interactor.wrapAdaptiveIcons.value,
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/HomeScreenPreferences.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/HomeScreenPreferences.kt
similarity index 97%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/HomeScreenPreferences.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/preferences/HomeScreenPreferences.kt
index f7e1aa2f11..478abca1f9 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/HomeScreenPreferences.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/HomeScreenPreferences.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.compose.ui.preferences
+package ch.deletescape.lawnchair.ui.preferences
import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.Composable
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/IconPackPreferences.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/IconPackPreference.kt
similarity index 94%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/IconPackPreferences.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/preferences/IconPackPreference.kt
index 1fccc909f4..b3e2d5a847 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/IconPackPreferences.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/IconPackPreference.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.compose.ui.preferences
+package ch.deletescape.lawnchair.ui.preferences
import android.graphics.drawable.Drawable
import androidx.compose.foundation.Image
@@ -19,7 +19,7 @@ import androidx.core.graphics.drawable.toBitmap
data class IconPackInfo(val name: String, val packageName: String, val icon: Drawable)
@Composable
-fun IconPackPreferences(interactor: PreferenceInteractor) {
+fun IconPackPreference(interactor: PreferenceInteractor) {
Box {
LazyColumn(Modifier.fillMaxWidth()) {
items(interactor.getIconPacks().values.toList()) { iconPack ->
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/NavActionPreference.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/NavActionPreference.kt
similarity index 96%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/NavActionPreference.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/preferences/NavActionPreference.kt
index 8d2e9ebb11..35c438d75f 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/NavActionPreference.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/NavActionPreference.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.compose.ui.preferences
+package ch.deletescape.lawnchair.ui.preferences
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
diff --git a/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/NotificationDotsPreference.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/NotificationDotsPreference.kt
new file mode 100644
index 0000000000..a24b8a32cd
--- /dev/null
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/NotificationDotsPreference.kt
@@ -0,0 +1,55 @@
+package ch.deletescape.lawnchair.ui.preferences
+
+import android.content.ComponentName
+import android.content.Intent
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.*
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.unit.dp
+import androidx.core.os.bundleOf
+import com.android.launcher3.R
+import com.android.launcher3.notification.NotificationListener
+import android.provider.Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS as actionNotificationListenerSettings
+
+@Composable
+fun NotificationDotsPreference(interactor: PreferenceInteractor) {
+ val context = LocalContext.current
+ val extraFragmentArgKey = ":settings:fragment_args_key"
+ val extraShowFragmentArgs = ":settings:show_fragment_args"
+
+ fun onClick() {
+ val intent = if (interactor.notificationDotsEnabled.value) {
+ Intent("android.settings.NOTIFICATION_SETTINGS")
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ .putExtra(extraFragmentArgKey, "notification_badging")
+ } else {
+ val cn = ComponentName(context, NotificationListener::class.java)
+ val showFragmentArgs = bundleOf(extraFragmentArgKey to cn.flattenToString())
+ Intent(actionNotificationListenerSettings)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ .putExtra(extraFragmentArgKey, cn.flattenToString())
+ .putExtra(extraShowFragmentArgs, showFragmentArgs)
+ }
+ context.startActivity(intent)
+ }
+
+ Column(
+ verticalArrangement = Arrangement.Center,
+ modifier = Modifier
+ .height(48.dp)
+ .fillMaxWidth()
+ .clickable { onClick() }
+ .padding(start = 16.dp, end = 16.dp),
+ ) {
+ Text(
+ text = stringResource(id = R.string.notification_dots),
+ style = MaterialTheme.typography.subtitle1,
+ color = MaterialTheme.colors.onBackground
+ )
+ }
+}
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceActivity.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/PreferenceActivity.kt
similarity index 79%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceActivity.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/preferences/PreferenceActivity.kt
index 4ef68e1c2c..0677b300b0 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceActivity.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/PreferenceActivity.kt
@@ -1,10 +1,10 @@
-package ch.deletescape.lawnchair.compose.ui.preferences
+package ch.deletescape.lawnchair.ui.preferences
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.animation.ExperimentalAnimationApi
-import ch.deletescape.lawnchair.compose.ui.theme.LawnchairTheme
+import ch.deletescape.lawnchair.ui.theme.LawnchairTheme
class PreferenceActivity : ComponentActivity() {
@ExperimentalAnimationApi
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceCategoryLink.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/PreferenceCategoryLink.kt
similarity index 93%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceCategoryLink.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/preferences/PreferenceCategoryLink.kt
index 7be13b19f1..b4e2a652c3 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceCategoryLink.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/PreferenceCategoryLink.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.compose.ui.preferences
+package ch.deletescape.lawnchair.ui.preferences
import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
@@ -8,11 +8,9 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
-import kotlin.random.Random
@Composable
fun PreferenceCategoryLink(titleResId: Int, onClick: () -> Unit, subtitleResId: Int?, iconResId: Int?) {
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceCategoryList.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/PreferenceCategoryList.kt
similarity index 91%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceCategoryList.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/preferences/PreferenceCategoryList.kt
index cf1e8e07c7..851bae9f89 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceCategoryList.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/PreferenceCategoryList.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.compose.ui.preferences
+package ch.deletescape.lawnchair.ui.preferences
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceGroup.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/PreferenceGroup.kt
similarity index 95%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceGroup.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/preferences/PreferenceGroup.kt
index 95d91102cb..ac2c44ae77 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceGroup.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/PreferenceGroup.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.compose.ui.preferences
+package ch.deletescape.lawnchair.ui.preferences
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceInteractor.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/PreferenceInteractor.kt
similarity index 94%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceInteractor.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/preferences/PreferenceInteractor.kt
index 3227d54240..099eacbd64 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceInteractor.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/PreferenceInteractor.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.compose.ui.preferences
+package ch.deletescape.lawnchair.ui.preferences
import androidx.compose.runtime.State
@@ -19,6 +19,7 @@ interface PreferenceInteractor {
val allAppsColumns: State
val allowEmptyPages: State
val makeColoredBackgrounds: State
+ val notificationDotsEnabled: State
fun setIconPackPackage(iconPackPackage: String)
fun setAllowRotation(allowRotation: Boolean)
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/Preferences.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/Preferences.kt
similarity index 92%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/Preferences.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/preferences/Preferences.kt
index 27660624da..9ca7bf6874 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/Preferences.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/Preferences.kt
@@ -1,8 +1,10 @@
-package ch.deletescape.lawnchair.compose.ui.preferences
+package ch.deletescape.lawnchair.ui.preferences
import android.app.Application
+import android.content.ComponentName
import android.content.Intent
import android.content.pm.ResolveInfo
+import android.provider.Settings.Secure.getString
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import androidx.appcompat.content.res.AppCompatResources
@@ -20,11 +22,19 @@ import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
-import ch.deletescape.lawnchair.sharedprefs.PrefManager
+import ch.deletescape.lawnchair.util.preferences.PrefManager
import com.android.launcher3.R
+import com.android.launcher3.notification.NotificationListener
class PreferenceViewModel(application: Application) : AndroidViewModel(application), PreferenceInteractor {
private val pm = PrefManager(application)
+ private val enabledNotificationListeners: String? by lazy {
+ getString(
+ application.contentResolver,
+ "enabled_notification_listeners"
+ )
+ }
+ private val lawnchairNotificationListener = ComponentName(application, NotificationListener::class.java)
override val iconPackPackage: MutableState = mutableStateOf(pm.iconPackPackage)
override val allowRotation: MutableState = mutableStateOf(pm.allowRotation)
@@ -42,6 +52,8 @@ class PreferenceViewModel(application: Application) : AndroidViewModel(applicati
override val allAppsColumns: MutableState = mutableStateOf(pm.allAppsColumns)
override val allowEmptyPages: MutableState = mutableStateOf(pm.allowEmptyPages)
override val makeColoredBackgrounds: MutableState = mutableStateOf(pm.makeColoredBackgrounds)
+ override val notificationDotsEnabled: MutableState =
+ mutableStateOf(enabledNotificationListeners?.contains(lawnchairNotificationListener.flattenToString()) == true)
override fun setIconPackPackage(iconPackPackage: String) {
pm.iconPackPackage = iconPackPackage
@@ -220,7 +232,7 @@ fun Settings(interactor: PreferenceInteractor = viewModel()
NavHost(navController = navController, startDestination = Screen.Top.route) {
composable(route = Screen.Top.route) { PreferenceCategoryList(navController) }
composable(route = Screen.HomeScreenSettings.route) { HomeScreenPreferences(interactor = interactor) }
- composable(route = Screen.IconPackSettings.route) { IconPackPreferences(interactor = interactor) }
+ composable(route = Screen.IconPackSettings.route) { IconPackPreference(interactor = interactor) }
composable(route = Screen.DockSettings.route) { DockPreferences(interactor = interactor) }
composable(route = Screen.AppDrawerSettings.route) { AppDrawerPreferences(interactor = interactor) }
composable(route = Screen.FolderSettings.route) { FolderPreferences(interactor = interactor) }
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/SliderPreference.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/SliderPreference.kt
similarity index 97%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/SliderPreference.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/preferences/SliderPreference.kt
index 5b57e0fcda..585b602227 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/SliderPreference.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/SliderPreference.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.compose.ui.preferences
+package ch.deletescape.lawnchair.ui.preferences
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/SwitchPreference.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/SwitchPreference.kt
similarity index 96%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/SwitchPreference.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/preferences/SwitchPreference.kt
index 1bfc8be98a..efddfc4b30 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/SwitchPreference.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/SwitchPreference.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.compose.ui.preferences
+package ch.deletescape.lawnchair.ui.preferences
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/TopBar.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/TopBar.kt
similarity index 98%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/TopBar.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/preferences/TopBar.kt
index b732cafa19..21e6cf637a 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/TopBar.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/preferences/TopBar.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.compose.ui.preferences
+package ch.deletescape.lawnchair.ui.preferences
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.ExperimentalAnimationApi
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/theme/Color.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/theme/Color.kt
similarity index 74%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/theme/Color.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/theme/Color.kt
index 7e6d2cf88b..e06b55077a 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/theme/Color.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/theme/Color.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.compose.ui.theme
+package ch.deletescape.lawnchair.ui.theme
import androidx.compose.ui.graphics.Color
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/theme/Shape.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/theme/Shape.kt
similarity index 100%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/theme/Shape.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/theme/Shape.kt
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/theme/Theme.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/theme/Theme.kt
similarity index 95%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/theme/Theme.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/theme/Theme.kt
index 323d6dca21..b21bbeb8cf 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/theme/Theme.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/theme/Theme.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.compose.ui.theme
+package ch.deletescape.lawnchair.ui.theme
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material.MaterialTheme
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/theme/Type.kt b/lawnchair/src/ch/deletescape/lawnchair/ui/theme/Type.kt
similarity index 98%
rename from lawnchair/src/ch/deletescape/lawnchair/compose/ui/theme/Type.kt
rename to lawnchair/src/ch/deletescape/lawnchair/ui/theme/Type.kt
index 32bc2911e7..9357101a4a 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/theme/Type.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/ui/theme/Type.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.compose.ui.theme
+package ch.deletescape.lawnchair.ui.theme
import androidx.compose.material.Typography
import androidx.compose.ui.text.TextStyle
diff --git a/lawnchair/src/ch/deletescape/lawnchair/sharedprefs/Delegates.kt b/lawnchair/src/ch/deletescape/lawnchair/util/preferences/Delegates.kt
similarity index 97%
rename from lawnchair/src/ch/deletescape/lawnchair/sharedprefs/Delegates.kt
rename to lawnchair/src/ch/deletescape/lawnchair/util/preferences/Delegates.kt
index c8ced87d56..b64d8b6e0d 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/sharedprefs/Delegates.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/util/preferences/Delegates.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.sharedprefs
+package ch.deletescape.lawnchair.util.preferences
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
diff --git a/lawnchair/src/ch/deletescape/lawnchair/sharedprefs/LawnchairPreferences.kt b/lawnchair/src/ch/deletescape/lawnchair/util/preferences/LawnchairPreferences.kt
similarity index 98%
rename from lawnchair/src/ch/deletescape/lawnchair/sharedprefs/LawnchairPreferences.kt
rename to lawnchair/src/ch/deletescape/lawnchair/util/preferences/LawnchairPreferences.kt
index 14a62b963a..0f867dbb6b 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/sharedprefs/LawnchairPreferences.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/util/preferences/LawnchairPreferences.kt
@@ -1,4 +1,4 @@
-package ch.deletescape.lawnchair.sharedprefs
+package ch.deletescape.lawnchair.util.preferences
import android.content.Context
import android.content.SharedPreferences
diff --git a/lawnchair/src/ch/deletescape/lawnchair/util/preferences/PrefManager.kt b/lawnchair/src/ch/deletescape/lawnchair/util/preferences/PrefManager.kt
new file mode 100644
index 0000000000..70517d4bb5
--- /dev/null
+++ b/lawnchair/src/ch/deletescape/lawnchair/util/preferences/PrefManager.kt
@@ -0,0 +1,26 @@
+package ch.deletescape.lawnchair.util.preferences
+
+import android.content.Context
+import android.content.SharedPreferences
+import com.android.launcher3.Utilities
+
+class PrefManager(context: Context) {
+ val sp: SharedPreferences = Utilities.getPrefs(context)
+ private val lp = LawnchairPreferences
+ var iconPackPackage by StringPrefDelegate(LawnchairPreferences.ICON_PACK_PACKAGE, "")
+ var allowRotation by BoolPrefDelegate("pref_allowRotation", true)
+ var wrapAdaptiveIcons by BoolPrefDelegate(LawnchairPreferences.WRAP_ADAPTIVE_ICONS, false)
+ var addIconToHome by BoolPrefDelegate("pref_add_icon_to_home", true)
+ var hotseatColumns by FloatPrefDelegate(LawnchairPreferences.HOTSEAT_COLUMNS, 5F)
+ var workspaceColumns by FloatPrefDelegate(LawnchairPreferences.WORKSPACE_COLUMNS, 5F)
+ var workspaceRows by FloatPrefDelegate(LawnchairPreferences.WORKSPACE_ROWS, 7F)
+ var folderColumns by FloatPrefDelegate(LawnchairPreferences.FOLDER_COLUMNS, 3F)
+ var folderRows by FloatPrefDelegate(LawnchairPreferences.FOLDER_ROWS, 4F)
+ var iconSizeFactor by FloatPrefDelegate(LawnchairPreferences.ICON_SIZE_FACTOR, 1F)
+ var textSizeFactor by FloatPrefDelegate(LawnchairPreferences.TEXT_SIZE_FACTOR, 1F)
+ var allAppsIconSizeFactor by FloatPrefDelegate(LawnchairPreferences.ALL_APPS_ICON_SIZE_FACTOR, 1F)
+ var allAppsTextSizeFactor by FloatPrefDelegate(LawnchairPreferences.ALL_APPS_TEXT_SIZE_FACTOR, 1F)
+ var allAppsColumns by FloatPrefDelegate(LawnchairPreferences.ALL_APPS_COLUMNS, 5F)
+ var allowEmptyPages by BoolPrefDelegate(LawnchairPreferences.ALLOW_EMPTY_PAGES, false)
+ var makeColoredBackgrounds by BoolPrefDelegate(LawnchairPreferences.MAKE_COLORED_BACKGROUNDS, false)
+}
\ No newline at end of file
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index afc97f94c2..7ae9ed2d68 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -62,7 +62,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
-import ch.deletescape.lawnchair.sharedprefs.LawnchairPreferences;
+import ch.deletescape.lawnchair.util.preferences.LawnchairPreferences;
public class InvariantDeviceProfile {
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 25fa25633f..86816e18ee 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -200,7 +200,7 @@ import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Stream;
-import ch.deletescape.lawnchair.sharedprefs.LawnchairPreferences;
+import ch.deletescape.lawnchair.util.preferences.LawnchairPreferences;
/**
* Default launcher application.
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index d96f5db605..621e737c47 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -118,7 +118,7 @@ import java.util.ArrayList;
import java.util.HashSet;
import java.util.function.Predicate;
-import ch.deletescape.lawnchair.sharedprefs.LawnchairPreferences;
+import ch.deletescape.lawnchair.util.preferences.LawnchairPreferences;
/**
* The workspace is a wide area with a wallpaper and a finite number of pages.