diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/hybridhotseat/HotseatEduController.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/hybridhotseat/HotseatEduController.java index d68c3f5e07..dd3802bd5b 100644 --- a/quickstep/recents_ui_overrides/src/com/android/launcher3/hybridhotseat/HotseatEduController.java +++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/hybridhotseat/HotseatEduController.java @@ -26,6 +26,7 @@ import android.view.View; import androidx.core.app.NotificationCompat; +import com.android.launcher3.ArrowTipView; import com.android.launcher3.CellLayout; import com.android.launcher3.FolderInfo; import com.android.launcher3.Hotseat; @@ -42,6 +43,7 @@ import com.android.launcher3.util.ActivityTracker; import com.android.launcher3.util.GridOccupancy; import com.android.launcher3.util.IntArray; import com.android.launcher3.util.Themes; +import com.android.launcher3.views.Snackbar; import java.util.ArrayDeque; import java.util.ArrayList; @@ -56,6 +58,9 @@ public class HotseatEduController { private static final String NOTIFICATION_CHANNEL_ID = "launcher_onboarding"; private static final int ONBOARDING_NOTIFICATION_ID = 7641; + private static final String SETTINGS_ACTION = + "android.settings.ACTION_CONTENT_SUGGESTIONS_SETTINGS"; + private final Launcher mLauncher; private final NotificationManager mNotificationManager; private final Notification mNotification; @@ -65,9 +70,11 @@ public class HotseatEduController { private ArrayList mNewItems = new ArrayList<>(); private IntArray mNewScreens = null; private Runnable mOnOnboardingComplete; + private Hotseat mHotseat; HotseatEduController(Launcher launcher, Runnable runnable) { mLauncher = launcher; + mHotseat = launcher.getHotseat(); mOnOnboardingComplete = runnable; mNotificationManager = mLauncher.getSystemService(NotificationManager.class); createNotificationChannel(); @@ -98,7 +105,7 @@ public class HotseatEduController { //separate folders and items that can get in folders for (int i = 0; i < mLauncher.getDeviceProfile().inv.numHotseatIcons; i++) { - View view = mLauncher.getHotseat().getChildAt(i, 0); + View view = mHotseat.getChildAt(i, 0); if (view == null) continue; ItemInfo info = (ItemInfo) view.getTag(); if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_FOLDER) { @@ -178,7 +185,6 @@ public class HotseatEduController { */ private int migrateHotseatWhole() { Workspace workspace = mLauncher.getWorkspace(); - Hotseat hotseatVG = mLauncher.getHotseat(); int pageId = -1; int toRow = 0; @@ -196,7 +202,7 @@ public class HotseatEduController { .getInt(LauncherSettings.Settings.EXTRA_VALUE); } for (int i = 0; i < mLauncher.getDeviceProfile().inv.numHotseatIcons; i++) { - View child = hotseatVG.getChildAt(i, 0); + View child = mHotseat.getChildAt(i, 0); if (child == null || child.getTag() == null) continue; ItemInfo tag = (ItemInfo) child.getTag(); mLauncher.getModelWriter().moveItemInDatabase(tag, @@ -211,8 +217,8 @@ public class HotseatEduController { mNotificationManager.cancel(ONBOARDING_NOTIFICATION_ID); } - void finishOnboarding() { - mLauncher.getHotseat().removeAllViewsInLayout(); + void moveHotseatItems() { + mHotseat.removeAllViewsInLayout(); if (!mNewItems.isEmpty()) { int lastPage = mNewItems.get(mNewItems.size() - 1).screenId; ArrayList animated = new ArrayList<>(); @@ -227,11 +233,25 @@ public class HotseatEduController { } mLauncher.bindAppsAdded(mNewScreens, nonAnimated, animated); } + } + + void finishOnboarding() { mOnOnboardingComplete.run(); destroy(); mLauncher.getSharedPrefs().edit().putBoolean(KEY_HOTSEAT_EDU_SEEN, true).apply(); } + void showDimissTip() { + if (mHotseat.getShortcutsAndWidgets().getChildCount() + < mLauncher.getDeviceProfile().inv.numHotseatIcons) { + Snackbar.show(mLauncher, R.string.hotseat_tip_gaps_filled, R.string.hotseat_turn_off, + null, () -> mLauncher.startActivity(new Intent(SETTINGS_ACTION))); + } else { + new ArrowTipView(mLauncher).show( + mLauncher.getString(R.string.hotseat_tip_no_empty_slots), mHotseat.getTop()); + } + } + void setPredictedApps(List predictedApps) { mPredictedApps = predictedApps; if (!mPredictedApps.isEmpty() @@ -278,6 +298,17 @@ public class HotseatEduController { } } + void showEdu() { + // hotseat is already empty and does not require migration. show edu tip + if (mHotseat.getShortcutsAndWidgets().getChildCount() == 0) { + new ArrowTipView(mLauncher).show(mLauncher.getString(R.string.hotseat_auto_enrolled), + mHotseat.getTop()); + finishOnboarding(); + } else { + showDialog(); + } + } + void showDialog() { if (mPredictedApps == null || mPredictedApps.isEmpty()) { return; @@ -294,7 +325,7 @@ public class HotseatEduController { ActivityTracker.SchedulerCallback { @Override public boolean init(QuickstepLauncher activity, boolean alreadyOnHome) { - activity.getHotseatPredictionController().showEduDialog(); + activity.getHotseatPredictionController().showEdu(); return true; } } diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/hybridhotseat/HotseatEduDialog.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/hybridhotseat/HotseatEduDialog.java index f7db9eaa5b..3569c7155b 100644 --- a/quickstep/recents_ui_overrides/src/com/android/launcher3/hybridhotseat/HotseatEduDialog.java +++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/hybridhotseat/HotseatEduDialog.java @@ -16,7 +16,8 @@ package com.android.launcher3.hybridhotseat; import static com.android.launcher3.logging.LoggerUtils.newLauncherEvent; -import static com.android.launcher3.userevent.nano.LauncherLogProto.ControlType.HYBRID_HOTSEAT_CANCELED; +import static com.android.launcher3.userevent.nano.LauncherLogProto.ControlType + .HYBRID_HOTSEAT_CANCELED; import android.animation.PropertyValuesHolder; import android.content.Context; @@ -27,9 +28,7 @@ import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.TextView; -import android.widget.Toast; -import com.android.launcher3.ArrowTipView; import com.android.launcher3.CellLayout; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Insettable; @@ -108,18 +107,16 @@ public class HotseatEduDialog extends AbstractSlideInView implements Insettable private void onAccept(View v) { mHotseatEduController.migrate(); handleClose(true); + + mHotseatEduController.moveHotseatItems(); mHotseatEduController.finishOnboarding(); //TODO: pass actual page index here. // Temporarily we're passing 1 for folder migration and 2 for page migration logUserAction(true, FeatureFlags.HOTSEAT_MIGRATE_TO_FOLDER.get() ? 1 : 2); - int toastStringRes = !FeatureFlags.HOTSEAT_MIGRATE_TO_FOLDER.get() - ? R.string.hotseat_items_migrated : R.string.hotseat_items_migrated_alt; - Toast.makeText(mLauncher, toastStringRes, Toast.LENGTH_LONG).show(); } private void onDismiss(View v) { - int top = mLauncher.getHotseat().getTop(); - new ArrowTipView(mLauncher).show(mLauncher.getString(R.string.hotseat_no_migration), top); + mHotseatEduController.showDimissTip(); mHotseatEduController.finishOnboarding(); logUserAction(false, -1); handleClose(true); diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/hybridhotseat/HotseatPredictionController.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/hybridhotseat/HotseatPredictionController.java index 801408f488..7eb82a9428 100644 --- a/quickstep/recents_ui_overrides/src/com/android/launcher3/hybridhotseat/HotseatPredictionController.java +++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/hybridhotseat/HotseatPredictionController.java @@ -147,12 +147,12 @@ public class HotseatPredictionController implements DragController.DragListener, } /** - * Transitions to NORMAL workspace mode and shows edu dialog + * Transitions to NORMAL workspace mode and shows edu */ - public void showEduDialog() { + public void showEdu() { if (mHotseatEduController == null) return; mLauncher.getStateManager().goToState(LauncherState.NORMAL, true, - () -> mHotseatEduController.showDialog()); + () -> mHotseatEduController.showEdu()); } @Override diff --git a/quickstep/res/values/strings.xml b/quickstep/res/values/strings.xml index b55b042dda..31a9bdf47b 100644 --- a/quickstep/res/values/strings.xml +++ b/quickstep/res/values/strings.xml @@ -78,16 +78,21 @@ Easily access your most-used apps right on the Home screen. Suggestions will change based on your routines. Apps on the bottom row will move up to your Home screen. Easily access your most-used apps, right on the Home screen. Suggestions will change based on your routines. Apps on the bottom row will move to a new folder. - - Your hotseat items have been moved up to your homescreen - Your hotseat items have been moved to a folder - - Drag apps off the bottom row to see app suggestions Get app suggestions No thanks + + Settings + + + Most-used apps appear here, and change based on routines + + Drag apps off the bottom row to get app suggestions + + App suggestions added to empty space. + Try the back gesture