Fields Summary |
---|
RecentsConfiguration | mConfig |
long | mLastTabKeyEventTime |
com.android.systemui.recents.views.RecentsView | mRecentsView |
com.android.systemui.recents.views.SystemBarScrimViews | mScrimViews |
android.view.ViewStub | mEmptyViewStub |
android.view.ViewStub | mDebugOverlayStub |
android.view.View | mEmptyView |
com.android.systemui.recents.views.DebugOverlayView | mDebugOverlay |
RecentsAppWidgetHost | mAppWidgetHost |
android.appwidget.AppWidgetProviderInfo | mSearchAppWidgetInfo |
android.appwidget.AppWidgetHostView | mSearchAppWidgetHostView |
FinishRecentsRunnable | mFinishLaunchHomeRunnable |
private com.android.systemui.statusbar.phone.PhoneStatusBar | mStatusBar |
final android.content.BroadcastReceiver | mServiceBroadcastReceiverBroadcast receiver to handle messages from AlternateRecentsComponent. |
final android.content.BroadcastReceiver | mSystemBroadcastReceiverBroadcast receiver to handle messages from the system |
final com.android.systemui.recents.misc.DebugTrigger | mDebugTriggerA custom debug trigger to listen for a debug key chord. |
Methods Summary |
---|
void | addSearchBarAppWidgetView()Creates the search bar app widget view
if (Constants.DebugFlags.App.EnableSearchLayout) {
int appWidgetId = mConfig.searchBarAppWidgetId;
if (appWidgetId >= 0) {
mSearchAppWidgetHostView = mAppWidgetHost.createView(this, appWidgetId,
mSearchAppWidgetInfo);
Bundle opts = new Bundle();
opts.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY,
AppWidgetProviderInfo.WIDGET_CATEGORY_SEARCHBOX);
mSearchAppWidgetHostView.updateAppWidgetOptions(opts);
// Set the padding to 0 for this search widget
mSearchAppWidgetHostView.setPadding(0, 0, 0, 0);
mRecentsView.setSearchBar(mSearchAppWidgetHostView);
} else {
mRecentsView.setSearchBar(null);
}
}
|
void | bindSearchBarAppWidget()Attempts to allocate and bind the search bar app widget
if (Constants.DebugFlags.App.EnableSearchLayout) {
SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy();
// Reset the host view and widget info
mSearchAppWidgetHostView = null;
mSearchAppWidgetInfo = null;
// Try and load the app widget id from the settings
int appWidgetId = mConfig.searchBarAppWidgetId;
if (appWidgetId >= 0) {
mSearchAppWidgetInfo = ssp.getAppWidgetInfo(appWidgetId);
if (mSearchAppWidgetInfo == null) {
// If there is no actual widget associated with that id, then delete it and
// prepare to bind another app widget in its place
ssp.unbindSearchAppWidget(mAppWidgetHost, appWidgetId);
appWidgetId = -1;
}
}
// If there is no id, then bind a new search app widget
if (appWidgetId < 0) {
Pair<Integer, AppWidgetProviderInfo> widgetInfo =
ssp.bindSearchAppWidget(mAppWidgetHost);
if (widgetInfo != null) {
// Save the app widget id into the settings
mConfig.updateSearchBarAppWidgetId(this, widgetInfo.first);
mSearchAppWidgetInfo = widgetInfo.second;
}
}
}
|
boolean | dismissRecentsToFocusedTaskOrHome(boolean checkFilteredStackState)Dismisses recents if we are already visible and the intent is to toggle the recents view
SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy();
if (ssp.isRecentsTopMost(ssp.getTopMostTask(), null)) {
// If we currently have filtered stacks, then unfilter those first
if (checkFilteredStackState &&
mRecentsView.unfilterFilteredStacks()) return true;
// If we have a focused Task, launch that Task now
if (mRecentsView.launchFocusedTask()) return true;
// If we launched from Home, then return to Home
if (mConfig.launchedFromHome) {
dismissRecentsToHomeRaw(true);
return true;
}
// Otherwise, try and return to the Task that Recents was launched from
if (mRecentsView.launchPreviousTask()) return true;
// If none of the other cases apply, then just go Home
dismissRecentsToHomeRaw(true);
return true;
}
return false;
|
boolean | dismissRecentsToHome(boolean animated)Dismisses Recents directly to Home if we currently aren't transitioning.
SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy();
if (ssp.isRecentsTopMost(ssp.getTopMostTask(), null)) {
// Return to Home
dismissRecentsToHomeRaw(animated);
return true;
}
return false;
|
void | dismissRecentsToHomeRaw(boolean animated)Dismisses Recents directly to Home.
if (animated) {
ReferenceCountedTrigger exitTrigger = new ReferenceCountedTrigger(this,
null, mFinishLaunchHomeRunnable, null);
mRecentsView.startExitToHomeAnimation(
new ViewAnimation.TaskViewExitContext(exitTrigger));
} else {
mFinishLaunchHomeRunnable.run();
}
|
void | inflateDebugOverlay()Inflates the debug overlay if debug mode is enabled.
if (!Constants.DebugFlags.App.EnableDebugMode) return;
if (mConfig.debugModeEnabled && mDebugOverlay == null) {
// Inflate the overlay and seek bars
mDebugOverlay = (DebugOverlayView) mDebugOverlayStub.inflate();
mDebugOverlay.setCallbacks(this);
mRecentsView.setDebugOverlay(mDebugOverlay);
}
|
public void | onAllTaskViewsDismissed()
mFinishLaunchHomeRunnable.run();
|
public void | onBackPressed()
// Test mode where back does not do anything
if (mConfig.debugModeEnabled) return;
// Dismiss Recents to the focused Task or Home
dismissRecentsToFocusedTaskOrHome(true);
|
public void | onCreate(android.os.Bundle savedInstanceState)Called with the activity is first created.
super.onCreate(savedInstanceState);
// For the non-primary user, ensure that the SystemServicesProxy and configuration is
// initialized
RecentsTaskLoader.initialize(this);
SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy();
mConfig = RecentsConfiguration.reinitialize(this, ssp);
// Initialize the widget host (the host id is static and does not change)
mAppWidgetHost = new RecentsAppWidgetHost(this, Constants.Values.App.AppWidgetHostId);
// Set the Recents layout
setContentView(R.layout.recents);
mRecentsView = (RecentsView) findViewById(R.id.recents_view);
mRecentsView.setCallbacks(this);
mRecentsView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
mEmptyViewStub = (ViewStub) findViewById(R.id.empty_view_stub);
mDebugOverlayStub = (ViewStub) findViewById(R.id.debug_overlay_stub);
mScrimViews = new SystemBarScrimViews(this, mConfig);
mStatusBar = ((SystemUIApplication) getApplication())
.getComponent(PhoneStatusBar.class);
inflateDebugOverlay();
// Bind the search app widget when we first start up
bindSearchBarAppWidget();
// 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(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);
registerReceiver(mSystemBroadcastReceiver, filter);
// Private API calls to make the shadows look better
try {
Utilities.setShadowProperty("ambientRatio", String.valueOf(1.5f));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
|
public void | onDebugModeTriggered()Called when debug mode is triggered
if (mConfig.developerOptionsEnabled) {
SharedPreferences settings = getSharedPreferences(getPackageName(), 0);
if (settings.getBoolean(Constants.Values.App.Key_DebugModeEnabled, false)) {
// Disable the debug mode
settings.edit().remove(Constants.Values.App.Key_DebugModeEnabled).apply();
mConfig.debugModeEnabled = false;
inflateDebugOverlay();
if (mDebugOverlay != null) {
mDebugOverlay.disable();
}
} else {
// Enable the debug mode
settings.edit().putBoolean(Constants.Values.App.Key_DebugModeEnabled, true).apply();
mConfig.debugModeEnabled = true;
inflateDebugOverlay();
if (mDebugOverlay != null) {
mDebugOverlay.enable();
}
}
Toast.makeText(this, "Debug mode (" + Constants.Values.App.DebugModeVersion + ") " +
(mConfig.debugModeEnabled ? "Enabled" : "Disabled") + ", please restart Recents now",
Toast.LENGTH_SHORT).show();
}
|
protected void | onDestroy()
super.onDestroy();
// Unregister the system broadcast receivers
unregisterReceiver(mSystemBroadcastReceiver);
// Stop listening for widget package changes if there was one bound
mAppWidgetHost.stopListening();
|
public void | onEnterAnimationTriggered()
// Try and start the enter animation (or restart it on configuration changed)
ReferenceCountedTrigger t = new ReferenceCountedTrigger(this, null, null, null);
ViewAnimation.TaskViewEnterContext ctx = new ViewAnimation.TaskViewEnterContext(t);
mRecentsView.startEnterRecentsAnimation(ctx);
if (mConfig.searchBarAppWidgetId >= 0) {
final WeakReference<RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks> cbRef =
new WeakReference<RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks>(
RecentsActivity.this);
ctx.postAnimationTrigger.addLastDecrementRunnable(new Runnable() {
@Override
public void run() {
// Start listening for widget package changes if there is one bound
RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks cb = cbRef.get();
if (cb != null) {
mAppWidgetHost.startListening(cb);
}
}
});
}
// Animate the SystemUI scrim views
mScrimViews.startEnterRecentsAnimation();
|
public void | onExitToHomeAnimationTriggered()RecentsView.RecentsViewCallbacks Implementation
// Animate the SystemUI scrim views out
mScrimViews.startExitRecentsAnimation();
|
public boolean | onKeyDown(int keyCode, android.view.KeyEvent event)
switch (keyCode) {
case KeyEvent.KEYCODE_TAB: {
boolean hasRepKeyTimeElapsed = (SystemClock.elapsedRealtime() -
mLastTabKeyEventTime) > mConfig.altTabKeyDelay;
if (event.getRepeatCount() <= 0 || hasRepKeyTimeElapsed) {
// Focus the next task in the stack
final boolean backward = event.isShiftPressed();
mRecentsView.focusNextTask(!backward);
mLastTabKeyEventTime = SystemClock.elapsedRealtime();
}
return true;
}
case KeyEvent.KEYCODE_DPAD_UP: {
mRecentsView.focusNextTask(true);
return true;
}
case KeyEvent.KEYCODE_DPAD_DOWN: {
mRecentsView.focusNextTask(false);
return true;
}
case KeyEvent.KEYCODE_DEL:
case KeyEvent.KEYCODE_FORWARD_DEL: {
mRecentsView.dismissFocusedTask();
return true;
}
default:
break;
}
// Pass through the debug trigger
mDebugTrigger.onKeyEvent(keyCode);
return super.onKeyDown(keyCode, event);
|
protected void | onNewIntent(android.content.Intent intent)
super.onNewIntent(intent);
setIntent(intent);
// Clear any debug rects
if (mDebugOverlay != null) {
mDebugOverlay.clear();
}
|
public void | onPrimarySeekBarChanged(float progress)DebugOverlayView.DebugOverlayViewCallbacks
// Do nothing
|
public void | onScreenPinningRequest()
if (mStatusBar != null) {
mStatusBar.showScreenPinningRequest(false);
}
|
public void | onSecondarySeekBarChanged(float progress)
// Do nothing
|
protected void | onStart()
super.onStart();
RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
SystemServicesProxy ssp = loader.getSystemServicesProxy();
AlternateRecentsComponent.notifyVisibilityChanged(this, ssp, true);
// Register the broadcast receiver to handle messages from our service
IntentFilter filter = new IntentFilter();
filter.addAction(AlternateRecentsComponent.ACTION_HIDE_RECENTS_ACTIVITY);
filter.addAction(AlternateRecentsComponent.ACTION_TOGGLE_RECENTS_ACTIVITY);
filter.addAction(AlternateRecentsComponent.ACTION_START_ENTER_ANIMATION);
registerReceiver(mServiceBroadcastReceiver, filter);
// Register any broadcast receivers for the task loader
loader.registerReceivers(this, mRecentsView);
// Update the recent tasks
updateRecentsTasks(getIntent());
// If this is a new instance from a configuration change, then we have to manually trigger
// the enter animation state
if (mConfig.launchedHasConfigurationChanged) {
onEnterAnimationTriggered();
}
|
protected void | onStop()
super.onStop();
RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
SystemServicesProxy ssp = loader.getSystemServicesProxy();
AlternateRecentsComponent.notifyVisibilityChanged(this, ssp, false);
// Notify the views that we are no longer visible
mRecentsView.onRecentsHidden();
// Unregister the RecentsService receiver
unregisterReceiver(mServiceBroadcastReceiver);
// Unregister any broadcast receivers for the task loader
loader.unregisterReceivers();
|
public void | onTaskLaunchFailed()
// Return to Home
dismissRecentsToHomeRaw(true);
|
public void | onTaskViewClicked()
|
public void | onTrimMemory(int level)
RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
if (loader != null) {
loader.onTrimMemory(level);
}
|
public void | onUserInteraction()
mRecentsView.onUserInteraction();
|
public void | refreshSearchWidget()RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks Implementation
bindSearchBarAppWidget();
addSearchBarAppWidgetView();
|
void | updateRecentsTasks(android.content.Intent launchIntent)Updates the set of recent tasks
// If AlternateRecentsComponent has preloaded a load plan, then use that to prevent
// reconstructing the task stack
RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
RecentsTaskLoadPlan plan = AlternateRecentsComponent.consumeInstanceLoadPlan();
if (plan == null) {
plan = loader.createLoadPlan(this);
}
// Start loading tasks according to the load plan
if (plan.getTaskStack() == null) {
loader.preloadTasks(plan, mConfig.launchedFromHome);
}
RecentsTaskLoadPlan.Options loadOpts = new RecentsTaskLoadPlan.Options();
loadOpts.runningTaskId = mConfig.launchedToTaskId;
loadOpts.numVisibleTasks = mConfig.launchedNumVisibleTasks;
loadOpts.numVisibleTaskThumbnails = mConfig.launchedNumVisibleThumbnails;
loader.loadTasks(this, plan, loadOpts);
SpaceNode root = plan.getSpaceNode();
ArrayList<TaskStack> stacks = root.getStacks();
boolean hasTasks = root.hasTasks();
if (hasTasks) {
mRecentsView.setTaskStacks(stacks);
}
mConfig.launchedWithNoRecentTasks = !hasTasks;
// Create the home intent runnable
Intent homeIntent = new Intent(Intent.ACTION_MAIN, null);
homeIntent.addCategory(Intent.CATEGORY_HOME);
homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
mFinishLaunchHomeRunnable = new FinishRecentsRunnable(homeIntent,
ActivityOptions.makeCustomAnimation(this,
mConfig.launchedFromSearchHome ? R.anim.recents_to_search_launcher_enter :
R.anim.recents_to_launcher_enter,
mConfig.launchedFromSearchHome ? R.anim.recents_to_search_launcher_exit :
R.anim.recents_to_launcher_exit));
// Mark the task that is the launch target
int taskStackCount = stacks.size();
if (mConfig.launchedToTaskId != -1) {
for (int i = 0; i < taskStackCount; i++) {
TaskStack stack = stacks.get(i);
ArrayList<Task> tasks = stack.getTasks();
int taskCount = tasks.size();
for (int j = 0; j < taskCount; j++) {
Task t = tasks.get(j);
if (t.key.id == mConfig.launchedToTaskId) {
t.isLaunchTarget = true;
break;
}
}
}
}
// Update the top level view's visibilities
if (mConfig.launchedWithNoRecentTasks) {
if (mEmptyView == null) {
mEmptyView = mEmptyViewStub.inflate();
}
mEmptyView.setVisibility(View.VISIBLE);
mRecentsView.setSearchBarVisibility(View.GONE);
} else {
if (mEmptyView != null) {
mEmptyView.setVisibility(View.GONE);
}
if (mRecentsView.hasSearchBar()) {
mRecentsView.setSearchBarVisibility(View.VISIBLE);
} else {
addSearchBarAppWidgetView();
}
}
// Animate the SystemUI scrims into view
mScrimViews.prepareEnterRecentsAnimation();
|