diff --git a/lawnchair/res/values/strings.xml b/lawnchair/res/values/strings.xml
index cc7f515900..26cc2511cc 100644
--- a/lawnchair/res/values/strings.xml
+++ b/lawnchair/res/values/strings.xml
@@ -166,6 +166,8 @@
Home screen
Feed, grid, icons
+ Home screen actions
+
Dock
Search bar, icon count
@@ -262,6 +264,9 @@
Reset custom icons
All custom icons will be reset. Do you want to continue?
+ Clear home screen
+ Home screen will be cleared. Do you want to continue?
+
Icons
Reset to default
@@ -892,4 +897,6 @@
Grant permissions
Permissions needed
Tap to grant permissions
+
+ Home screen cleared
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/HomeScreenPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/HomeScreenPreferences.kt
index bc72c6d685..5cbd6e6a20 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/HomeScreenPreferences.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/HomeScreenPreferences.kt
@@ -45,6 +45,7 @@ import app.lawnchair.ui.preferences.components.layout.PreferenceGroup
import app.lawnchair.ui.preferences.components.layout.PreferenceLayout
import app.lawnchair.ui.preferences.navigation.HomeScreenGrid
import app.lawnchair.util.collectAsStateBlocking
+import com.android.launcher3.LauncherAppState
import com.android.launcher3.R
import com.android.launcher3.Utilities
import kotlinx.coroutines.launch
@@ -68,6 +69,7 @@ fun HomeScreenPreferences(
) {
val lockHomeScreenAdapter = prefs2.lockHomeScreen.getAdapter()
val showDeckLayout = prefs2.showDeckLayout.getAdapter().state.value
+ val context = LocalContext.current
if (showDeckLayout) {
HomeLayoutSettings()
@@ -95,6 +97,17 @@ fun HomeScreenPreferences(
description = stringResource(id = R.string.infinite_scrolling_description),
)
}
+ PreferenceGroup(heading = stringResource(id = R.string.home_screen_actions)) {
+ ClickablePreference(
+ label = stringResource(id = R.string.remove_all_views_from_home_screen),
+ confirmationText = stringResource(id = R.string.remove_all_views_from_home_screen_desc),
+ onClick = {
+ scope.launch {
+ LauncherAppState.getInstance(context).clearAllViewsFromHomeScreen()
+ }
+ },
+ )
+ }
PreferenceGroup(heading = stringResource(id = R.string.minus_one)) {
val feedAvailable = OverlayCallbackImpl.minusOneAvailable(LocalContext.current)
val enableFeedAdapter = prefs2.enableFeed.getAdapter()
diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java
index e0a4283456..d8dbd3f1cc 100644
--- a/src/com/android/launcher3/LauncherAppState.java
+++ b/src/com/android/launcher3/LauncherAppState.java
@@ -39,6 +39,7 @@ import android.content.pm.LauncherApps;
import android.content.pm.LauncherApps.ArchiveCompatibilityParams;
import android.os.UserHandle;
import android.util.Log;
+import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.core.os.BuildCompat;
@@ -220,6 +221,19 @@ public class LauncherAppState implements SafeCloseable {
refreshAndReloadLauncher();
}
+ public void clearAllViewsFromHomeScreen() {
+ final boolean isViewsRemoved =
+ mLauncher.getModelWriter().clearAllHomeScreenViewsByType(
+ LauncherSettings.Favorites.CONTAINER_DESKTOP);
+ if (isViewsRemoved) {
+ Toast.makeText(
+ mLauncher,
+ R.string.home_screen_all_views_removed_msg,
+ Toast.LENGTH_SHORT
+ ).show();
+ }
+ }
+
private void refreshAndReloadLauncher() {
LauncherIcons.clearPool(mContext);
mIconCache.updateIconParams(
diff --git a/src/com/android/launcher3/model/ModelWriter.java b/src/com/android/launcher3/model/ModelWriter.java
index 4170c2b53a..bbf555443c 100644
--- a/src/com/android/launcher3/model/ModelWriter.java
+++ b/src/com/android/launcher3/model/ModelWriter.java
@@ -154,6 +154,35 @@ public class ModelWriter {
throw e;
}
}
+
+ /**
+ * Clears all views from the home screen.
+ */
+ public boolean clearAllHomeScreenViewsByType(int type) {
+ final ArrayList itemsToRemove = new ArrayList<>();
+
+ for (ItemInfo item : mBgDataModel.itemsIdMap) {
+ if (item.container == type) {
+ itemsToRemove.add(item);
+ }
+ }
+
+ if (itemsToRemove.isEmpty()) {
+ return false;
+ }
+
+ enqueueDeleteRunnable(newModelTask(() -> {
+ final ModelDbController db = mModel.getModelDbController();
+
+ for (ItemInfo item : itemsToRemove) {
+ db.delete(TABLE_NAME, itemIdMatch(item.id), null);
+ mBgDataModel.removeItem(mContext, item);
+ }
+ }));
+
+ mModel.forceReload();
+ return true;
+ }
/**
* Move an item in the DB to a new