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