diff options
Diffstat (limited to 'com/android/systemui/recents/RecentsActivity.java')
-rw-r--r-- | com/android/systemui/recents/RecentsActivity.java | 151 |
1 files changed, 112 insertions, 39 deletions
diff --git a/com/android/systemui/recents/RecentsActivity.java b/com/android/systemui/recents/RecentsActivity.java index b75a1428..86b77900 100644 --- a/com/android/systemui/recents/RecentsActivity.java +++ b/com/android/systemui/recents/RecentsActivity.java @@ -17,6 +17,7 @@ package com.android.systemui.recents; import android.app.Activity; +import android.app.ActivityManager; import android.app.ActivityOptions; import android.app.TaskStackBuilder; import android.app.WallpaperManager; @@ -28,10 +29,10 @@ import android.content.res.Configuration; import android.net.Uri; import android.os.Bundle; import android.os.Handler; -import android.os.Looper; import android.os.SystemClock; import android.os.UserHandle; import android.provider.Settings; +import android.provider.Settings.Secure; import android.util.Log; import android.view.KeyEvent; import android.view.View; @@ -41,7 +42,6 @@ import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import com.android.internal.colorextraction.ColorExtractor; -import com.android.internal.content.PackageMonitor; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.keyguard.LatencyTracker; @@ -53,6 +53,7 @@ import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.recents.events.EventBus; import com.android.systemui.recents.events.activity.CancelEnterRecentsWindowAnimationEvent; import com.android.systemui.recents.events.activity.ConfigurationChangedEvent; +import com.android.systemui.recents.events.activity.DebugFlagsChangedEvent; import com.android.systemui.recents.events.activity.DismissRecentsToHomeAnimationStarted; import com.android.systemui.recents.events.activity.DockedFirstAnimationFrameEvent; import com.android.systemui.recents.events.activity.DockedTopTaskEvent; @@ -60,10 +61,10 @@ import com.android.systemui.recents.events.activity.EnterRecentsWindowAnimationC import com.android.systemui.recents.events.activity.EnterRecentsWindowLastAnimationFrameEvent; import com.android.systemui.recents.events.activity.ExitRecentsWindowFirstAnimationFrameEvent; import com.android.systemui.recents.events.activity.HideRecentsEvent; +import com.android.systemui.recents.events.activity.IterateRecentsEvent; import com.android.systemui.recents.events.activity.LaunchTaskFailedEvent; import com.android.systemui.recents.events.activity.LaunchTaskSucceededEvent; import com.android.systemui.recents.events.activity.MultiWindowStateChangedEvent; -import com.android.systemui.recents.events.activity.PackagesChangedEvent; import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent; import com.android.systemui.recents.events.activity.ToggleRecentsEvent; import com.android.systemui.recents.events.component.ActivityUnpinnedEvent; @@ -78,24 +79,28 @@ import com.android.systemui.recents.events.ui.ShowApplicationInfoEvent; import com.android.systemui.recents.events.ui.ShowIncompatibleAppOverlayEvent; import com.android.systemui.recents.events.ui.StackViewScrolledEvent; import com.android.systemui.recents.events.ui.TaskViewDismissedEvent; +import com.android.systemui.recents.events.ui.UpdateFreeformTaskViewVisibilityEvent; import com.android.systemui.recents.events.ui.UserInteractionEvent; import com.android.systemui.recents.events.ui.focus.DismissFocusedTaskViewEvent; import com.android.systemui.recents.events.ui.focus.FocusNextTaskViewEvent; import com.android.systemui.recents.events.ui.focus.FocusPreviousTaskViewEvent; import com.android.systemui.recents.events.ui.focus.NavigateTaskViewEvent; import com.android.systemui.recents.events.ui.focus.NavigateTaskViewEvent.Direction; +import com.android.systemui.recents.misc.DozeTrigger; import com.android.systemui.recents.misc.SystemServicesProxy; -import com.android.systemui.shared.recents.utilities.Utilities; -import com.android.systemui.shared.recents.model.RecentsTaskLoadPlan; -import com.android.systemui.shared.recents.model.RecentsTaskLoader; -import com.android.systemui.shared.recents.model.Task; -import com.android.systemui.shared.recents.model.TaskStack; +import com.android.systemui.recents.misc.Utilities; +import com.android.systemui.recents.model.RecentsPackageMonitor; +import com.android.systemui.recents.model.RecentsTaskLoadPlan; +import com.android.systemui.recents.model.RecentsTaskLoader; +import com.android.systemui.recents.model.Task; +import com.android.systemui.recents.model.TaskStack; import com.android.systemui.recents.views.RecentsView; import com.android.systemui.recents.views.SystemBarScrimViews; import com.android.systemui.statusbar.phone.StatusBar; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.List; /** * The main Recents activity that is started from RecentsComponent. @@ -109,23 +114,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD public final static int EVENT_BUS_PRIORITY = Recents.EVENT_BUS_PRIORITY + 1; public final static int INCOMPATIBLE_APP_ALPHA_DURATION = 150; - private PackageMonitor mPackageMonitor = new PackageMonitor() { - @Override - public void onPackageRemoved(String packageName, int uid) { - RecentsActivity.this.onPackageChanged(packageName, getChangingUserId()); - } - - @Override - public boolean onPackageChanged(String packageName, int uid, String[] components) { - RecentsActivity.this.onPackageChanged(packageName, getChangingUserId()); - return true; - } - - @Override - public void onPackageModified(String packageName) { - RecentsActivity.this.onPackageChanged(packageName, getChangingUserId()); - } - }; + private RecentsPackageMonitor mPackageMonitor; private Handler mHandler = new Handler(); private long mLastTabKeyEventTime; private boolean mFinishedOnStartup; @@ -144,6 +133,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD // The trigger to automatically launch the current task private int mFocusTimerDuration; + private DozeTrigger mIterateTrigger; private final UserInteractionEvent mUserInteractionEvent = new UserInteractionEvent(); // Theme and colors @@ -198,6 +188,41 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD } else if (action.equals(Intent.ACTION_USER_SWITCHED)) { // When switching users, dismiss Recents to Home similar to screen off finish(); + } else if (action.equals(Intent.ACTION_TIME_CHANGED)) { + // If the time shifts but the currentTime >= lastStackActiveTime, then that boundary + // is still valid. Otherwise, we need to reset the lastStackactiveTime to the + // currentTime and remove the old tasks in between which would not be previously + // visible, but currently would be in the new currentTime + int currentUser = SystemServicesProxy.getInstance(RecentsActivity.this) + .getCurrentUser(); + long oldLastStackActiveTime = Settings.Secure.getLongForUser(getContentResolver(), + Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME, -1, currentUser); + if (oldLastStackActiveTime != -1) { + long currentTime = System.currentTimeMillis(); + if (currentTime < oldLastStackActiveTime) { + // We are only removing tasks that are between the new current time + // and the old last stack active time, they were not visible and in the + // TaskStack so we don't need to remove any associated TaskViews but we do + // need to load the task id's from the system + RecentsTaskLoader loader = Recents.getTaskLoader(); + RecentsTaskLoadPlan loadPlan = loader.createLoadPlan(ctx); + loader.preloadRawTasks(loadPlan, false /* includeFrontMostExcludedTask */); + List<ActivityManager.RecentTaskInfo> tasks = loadPlan.getRawTasks(); + for (int i = tasks.size() - 1; i >= 0; i--) { + ActivityManager.RecentTaskInfo task = tasks.get(i); + if (currentTime <= task.lastActiveTime && task.lastActiveTime < + oldLastStackActiveTime) { + Recents.getSystemServices().removeTask(task.persistentId); + } + } + Recents.getSystemServices().updateOverviewLastStackActiveTimeAsync( + currentTime, currentUser); + + // Clear the last PiP task time, it's an edge case and we'd rather it + // not relaunch the PiP task if the user double taps + RecentsImpl.clearLastPipTime(); + } + } } } }; @@ -315,8 +340,8 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD EventBus.getDefault().register(this, EVENT_BUS_PRIORITY); // Initialize the package monitor - mPackageMonitor.register(this, Looper.getMainLooper(), UserHandle.ALL, - true /* externalStorage */); + mPackageMonitor = new RecentsPackageMonitor(); + mPackageMonitor.register(this); // Select theme based on wallpaper colors mColorExtractor = Dependency.get(SysuiColorExtractor.class); @@ -338,6 +363,13 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD } mLastConfig = new Configuration(Utilities.getAppConfiguration(this)); + mFocusTimerDuration = getResources().getInteger(R.integer.recents_auto_advance_duration); + mIterateTrigger = new DozeTrigger(mFocusTimerDuration, new Runnable() { + @Override + public void run() { + dismissRecentsToFocusedTask(MetricsEvent.OVERVIEW_SELECT_TIMEOUT); + } + }); // Set the window background mRecentsView.updateBackgroundScrim(getWindow(), isInMultiWindowMode()); @@ -351,6 +383,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD // Register the broadcast receiver to handle messages when the screen is turned off IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_OFF); + filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_USER_SWITCHED); registerReceiver(mSystemBroadcastReceiver, filter); @@ -427,21 +460,22 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD RecentsTaskLoader loader = Recents.getTaskLoader(); RecentsTaskLoadPlan loadPlan = RecentsImpl.consumeInstanceLoadPlan(); if (loadPlan == null) { - loadPlan = new RecentsTaskLoadPlan(this); + loadPlan = loader.createLoadPlan(this); } // Start loading tasks according to the load plan RecentsConfiguration config = Recents.getConfiguration(); RecentsActivityLaunchState launchState = config.getLaunchState(); if (!loadPlan.hasTasks()) { - loader.preloadTasks(loadPlan, launchState.launchedToTaskId); + loader.preloadTasks(loadPlan, launchState.launchedToTaskId, + !launchState.launchedFromHome && !launchState.launchedViaDockGesture); } RecentsTaskLoadPlan.Options loadOpts = new RecentsTaskLoadPlan.Options(); loadOpts.runningTaskId = launchState.launchedToTaskId; loadOpts.numVisibleTasks = launchState.launchedNumVisibleTasks; loadOpts.numVisibleTaskThumbnails = launchState.launchedNumVisibleThumbnails; - loader.loadTasks(loadPlan, loadOpts); + loader.loadTasks(this, loadPlan, loadOpts); TaskStack stack = loadPlan.getTaskStack(); mRecentsView.onReload(stack, mIsVisible); @@ -506,6 +540,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD super.onPause(); mIgnoreAltTabRelease = false; + mIterateTrigger.stopDozing(); } @Override @@ -608,7 +643,8 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD if (backward) { EventBus.getDefault().send(new FocusPreviousTaskViewEvent()); } else { - EventBus.getDefault().send(new FocusNextTaskViewEvent()); + EventBus.getDefault().send( + new FocusNextTaskViewEvent(0 /* timerIndicatorDuration */)); } mLastTabKeyEventTime = SystemClock.elapsedRealtime(); @@ -666,10 +702,38 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD } } + public final void onBusEvent(IterateRecentsEvent event) { + final RecentsDebugFlags debugFlags = Recents.getDebugFlags(); + + // Start dozing after the recents button is clicked + int timerIndicatorDuration = 0; + if (debugFlags.isFastToggleRecentsEnabled()) { + timerIndicatorDuration = getResources().getInteger( + R.integer.recents_subsequent_auto_advance_duration); + + mIterateTrigger.setDozeDuration(timerIndicatorDuration); + if (!mIterateTrigger.isDozing()) { + mIterateTrigger.startDozing(); + } else { + mIterateTrigger.poke(); + } + } + + // Focus the next task + EventBus.getDefault().send(new FocusNextTaskViewEvent(timerIndicatorDuration)); + + MetricsLogger.action(this, MetricsEvent.ACTION_OVERVIEW_PAGE); + } + public final void onBusEvent(RecentsActivityStartingEvent event) { mRecentsStartRequested = true; } + public final void onBusEvent(UserInteractionEvent event) { + // Stop the fast-toggle dozer + mIterateTrigger.stopDozing(); + } + public final void onBusEvent(HideRecentsEvent event) { if (event.triggeredFromAltTab) { // If we are hiding from releasing Alt-Tab, dismiss Recents to the focused app @@ -687,11 +751,15 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD } public final void onBusEvent(EnterRecentsWindowLastAnimationFrameEvent event) { + EventBus.getDefault().send(new UpdateFreeformTaskViewVisibilityEvent(true)); mRecentsView.getViewTreeObserver().addOnPreDrawListener(this); mRecentsView.invalidate(); } public final void onBusEvent(ExitRecentsWindowFirstAnimationFrameEvent event) { + if (mRecentsView.isLastTaskLaunchedFreeform()) { + EventBus.getDefault().send(new UpdateFreeformTaskViewVisibilityEvent(false)); + } mRecentsView.getViewTreeObserver().addOnPreDrawListener(this); mRecentsView.invalidate(); } @@ -791,6 +859,11 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD MetricsLogger.count(this, "overview_screen_pinned", 1); } + public final void onBusEvent(DebugFlagsChangedEvent event) { + // Just finish recents so that we can reload the flags anew on the next instantiation + finish(); + } + public final void onBusEvent(StackViewScrolledEvent event) { // Once the user has scrolled while holding alt-tab, then we should ignore the release of // the key @@ -815,13 +888,14 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD RecentsConfiguration config = Recents.getConfiguration(); RecentsActivityLaunchState launchState = config.getLaunchState(); RecentsTaskLoader loader = Recents.getTaskLoader(); - RecentsTaskLoadPlan loadPlan = new RecentsTaskLoadPlan(this); - loader.preloadTasks(loadPlan, -1 /* runningTaskId */); + RecentsTaskLoadPlan loadPlan = loader.createLoadPlan(this); + loader.preloadTasks(loadPlan, -1 /* runningTaskId */, + false /* includeFrontMostExcludedTask */); RecentsTaskLoadPlan.Options loadOpts = new RecentsTaskLoadPlan.Options(); loadOpts.numVisibleTasks = launchState.launchedNumVisibleTasks; loadOpts.numVisibleTaskThumbnails = launchState.launchedNumVisibleThumbnails; - loader.loadTasks(loadPlan, loadOpts); + loader.loadTasks(this, loadPlan, loadOpts); TaskStack stack = loadPlan.getTaskStack(); int numStackTasks = stack.getStackTaskCount(); @@ -850,11 +924,6 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD return true; } - public void onPackageChanged(String packageName, int userId) { - Recents.getTaskLoader().onPackageChanged(packageName); - EventBus.getDefault().send(new PackagesChangedEvent(packageName, userId)); - } - @Override public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { super.dump(prefix, fd, writer, args); @@ -862,9 +931,13 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD Recents.getTaskLoader().dump(prefix, writer); String id = Integer.toHexString(System.identityHashCode(this)); + long lastStackActiveTime = Settings.Secure.getLongForUser(getContentResolver(), + Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME, -1, + SystemServicesProxy.getInstance(this).getCurrentUser()); writer.print(prefix); writer.print(TAG); writer.print(" visible="); writer.print(mIsVisible ? "Y" : "N"); + writer.print(" lastStackTaskActiveTime="); writer.print(lastStackActiveTime); writer.print(" currentTime="); writer.print(System.currentTimeMillis()); writer.print(" [0x"); writer.print(id); writer.print("]"); writer.println(); |