Merge "Delete the separate grid recents activity and related code"
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index d232e00..5c2787b 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -287,22 +287,6 @@
</intent-filter>
</activity>
- <activity android:name=".recents.grid.RecentsGridActivity"
- android:label="@string/accessibility_desc_recent_apps"
- android:exported="false"
- android:launchMode="singleInstance"
- android:excludeFromRecents="true"
- android:stateNotNeeded="true"
- android:resumeWhilePausing="true"
- android:screenOrientation="behind"
- android:resizeableActivity="true"
- android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
- android:theme="@style/RecentsTheme.Grid">
- <intent-filter>
- <action android:name="com.android.systemui.recents.TOGGLE_RECENTS" />
- </intent-filter>
- </activity>
-
<activity android:name=".recents.tv.RecentsTvActivity"
android:label="@string/accessibility_desc_recent_apps"
android:exported="false"
diff --git a/packages/SystemUI/res/layout-sw600dp/recents_grid.xml b/packages/SystemUI/res/layout-sw600dp/recents_grid.xml
deleted file mode 100644
index 1a054a5..0000000
--- a/packages/SystemUI/res/layout-sw600dp/recents_grid.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:id="@+id/recents_view"
- android:gravity="center"
- android:background="#99000000">
- <include layout="@layout/recents_stack_action_button" />
-</FrameLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index fe5606e..5f9ade5 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -720,18 +720,4 @@
<!-- The size of a PIP menu action icon. -->
<dimen name="pip_menu_action_icon_size">32dp</dimen>
- <!-- Values specific to grid-based recents. -->
- <!-- Margins around recent tasks. -->
- <dimen name="recents_grid_margin_left">15dp</dimen>
- <dimen name="recents_grid_margin_top">70dp</dimen>
- <dimen name="recents_grid_margin_right">15dp</dimen>
- <dimen name="recents_grid_margin_bottom">90dp</dimen>
- <!-- Margins around the "Clear all" button. -->
- <dimen name="recents_grid_clear_all_margin_left">0dp</dimen>
- <dimen name="recents_grid_clear_all_margin_top">30dp</dimen>
- <dimen name="recents_grid_clear_all_margin_right">15dp</dimen>
- <dimen name="recents_grid_clear_all_margin_bottom">0dp</dimen>
- <!-- Padding in between task views. -->
- <dimen name="recents_grid_inter_task_padding">15dp</dimen>
-
</resources>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 08b8988..93b6965 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -44,22 +44,6 @@
<item name="android:layout_marginBottom">0dp</item>
</style>
- <!-- Grid-based Recents theme. -->
- <style name="RecentsTheme.Grid">
- <item name="android:windowBackground">@color/transparent</item>
- <item name="android:colorBackgroundCacheHint">@null</item>
- <item name="android:windowShowWallpaper">true</item>
- <item name="android:windowDisablePreview">true</item>
- <item name="clearAllStyle">@style/ClearAllButtonLargeMargins</item>
- </style>
-
- <style name="ClearAllButtonLargeMargins">
- <item name="android:layout_marginStart">@dimen/recents_grid_clear_all_margin_left</item>
- <item name="android:layout_marginTop">@dimen/recents_grid_clear_all_margin_top</item>
- <item name="android:layout_marginEnd">@dimen/recents_grid_clear_all_margin_right</item>
- <item name="android:layout_marginBottom">@dimen/recents_grid_clear_all_margin_bottom</item>
- </style>
-
<!-- Performance optimized Recents theme (no wallpaper) -->
<style name="RecentsTheme.NoWallpaper">
<item name="android:windowBackground">@android:color/black</item>
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
index d9fc2fc..0265c9e 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
@@ -57,7 +57,6 @@
import com.android.systemui.recents.events.ui.RecentsDrawnEvent;
import com.android.systemui.recents.misc.SystemServicesProxy;
import com.android.systemui.recents.model.RecentsTaskLoader;
-import com.android.systemui.recents.grid.RecentsGridImpl;
import com.android.systemui.recents.tv.RecentsTvImpl;
import com.android.systemui.stackdivider.Divider;
@@ -84,7 +83,6 @@
static {
RECENTS_ACTIVITIES.add(RecentsImpl.RECENTS_ACTIVITY);
RECENTS_ACTIVITIES.add(RecentsTvImpl.RECENTS_TV_ACTIVITY);
- RECENTS_ACTIVITIES.add(RecentsGridImpl.RECENTS_MOSAIC_ACTIVITY);
}
// Purely for experimentation
diff --git a/packages/SystemUI/src/com/android/systemui/recents/grid/RecentsGridActivity.java b/packages/SystemUI/src/com/android/systemui/recents/grid/RecentsGridActivity.java
deleted file mode 100644
index 71c2148..0000000
--- a/packages/SystemUI/src/com/android/systemui/recents/grid/RecentsGridActivity.java
+++ /dev/null
@@ -1,504 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.recents.grid;
-
-import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.util.DisplayMetrics;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.view.animation.Animation;
-import android.view.animation.AnimationSet;
-import android.view.animation.DecelerateInterpolator;
-import android.view.animation.ScaleAnimation;
-import android.view.animation.TranslateAnimation;
-import android.widget.FrameLayout;
-import android.widget.TextView;
-
-import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.systemui.R;
-import com.android.systemui.recents.Recents;
-import com.android.systemui.recents.RecentsActivity;
-import com.android.systemui.recents.RecentsActivityLaunchState;
-import com.android.systemui.recents.RecentsConfiguration;
-import com.android.systemui.recents.RecentsImpl;
-import com.android.systemui.recents.events.EventBus;
-import com.android.systemui.recents.events.activity.ConfigurationChangedEvent;
-import com.android.systemui.recents.events.activity.HideRecentsEvent;
-import com.android.systemui.recents.events.activity.LaunchNextTaskRequestEvent;
-import com.android.systemui.recents.events.activity.LaunchTaskEvent;
-import com.android.systemui.recents.events.activity.ToggleRecentsEvent;
-import com.android.systemui.recents.events.component.RecentsVisibilityChangedEvent;
-import com.android.systemui.recents.events.ui.AllTaskViewsDismissedEvent;
-import com.android.systemui.recents.events.ui.DeleteTaskDataEvent;
-import com.android.systemui.recents.events.ui.DismissAllTaskViewsEvent;
-import com.android.systemui.recents.events.ui.DismissTaskViewEvent;
-import com.android.systemui.recents.events.ui.TaskViewDismissedEvent;
-import com.android.systemui.recents.misc.SystemServicesProxy;
-import com.android.systemui.recents.misc.Utilities;
-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.TaskView;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-
-/**
- * The main grid recents activity started by the RecentsImpl.
- */
-public class RecentsGridActivity extends Activity {
- public final static int MAX_VISIBLE_TASKS = 9;
-
- private final static String TAG = "RecentsGridActivity";
- private final static int TITLE_BAR_HEIGHT_DP = 64;
-
- private ArrayList<Integer> mMargins = new ArrayList<>();
-
- private TaskStack mTaskStack;
- private ArrayList<Task> mTasks = new ArrayList<>();
- private ArrayList<TaskView> mTaskViews = new ArrayList<>();
- private ArrayList<Rect> mTaskViewRects;
- private FrameLayout mRecentsView;
- private TextView mEmptyView;
- private View mClearAllButton;
- private int mLastDisplayOrientation = Configuration.ORIENTATION_UNDEFINED;
- private int mLastDisplayDensity;
- private Rect mDisplayRect = new Rect();
- private LayoutInflater mInflater;
- private boolean mTouchExplorationEnabled;
- private Point mScreenSize;
- private int mTitleBarHeightPx;
- private int mStatusBarHeightPx;
- private int mNavigationBarHeightPx;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.recents_grid);
- SystemServicesProxy ssp = Recents.getSystemServices();
-
- Resources res = getResources();
- Integer[] margins = {
- res.getDimensionPixelSize(R.dimen.recents_grid_margin_left),
- res.getDimensionPixelSize(R.dimen.recents_grid_margin_top),
- res.getDimensionPixelSize(R.dimen.recents_grid_margin_right),
- res.getDimensionPixelSize(R.dimen.recents_grid_margin_bottom),
- };
- mMargins.addAll(Arrays.asList(margins));
-
- mInflater = LayoutInflater.from(this);
- Configuration appConfiguration = Utilities.getAppConfiguration(this);
- mDisplayRect = ssp.getDisplayRect();
- mLastDisplayOrientation = appConfiguration.orientation;
- mLastDisplayDensity = appConfiguration.densityDpi;
- mTouchExplorationEnabled = ssp.isTouchExplorationEnabled();
- mScreenSize = new Point();
- getWindowManager().getDefaultDisplay().getRealSize(mScreenSize);
- DisplayMetrics metrics = res.getDisplayMetrics();
- mTitleBarHeightPx = (int) (TITLE_BAR_HEIGHT_DP *
- ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT));
- mStatusBarHeightPx = res.getDimensionPixelSize(R.dimen.status_bar_height);
- mNavigationBarHeightPx = res.getDimensionPixelSize(R.dimen.navigation_bar_height);
-
- mRecentsView = (FrameLayout) findViewById(R.id.recents_view);
- mRecentsView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
- View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
- View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
- getWindow().getAttributes().privateFlags |=
- WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY;
- mEmptyView = (TextView) mInflater.inflate(R.layout.recents_empty, mRecentsView, false);
- mClearAllButton = findViewById(R.id.button);
-
- FrameLayout.LayoutParams emptyViewLayoutParams = new FrameLayout.LayoutParams(
- FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT);
- emptyViewLayoutParams.gravity = Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL;
- mEmptyView.setLayoutParams(emptyViewLayoutParams);
- mRecentsView.addView(mEmptyView);
-
- mClearAllButton.setVisibility(View.VISIBLE);
- FrameLayout.LayoutParams lp =
- (FrameLayout.LayoutParams) mClearAllButton.getLayoutParams();
- lp.gravity = Gravity.END;
-
- mClearAllButton.setOnClickListener(v -> {
- EventBus.getDefault().send(new DismissAllTaskViewsEvent());
- });
-
- mRecentsView.setOnClickListener(v -> {
- EventBus.getDefault().send(new HideRecentsEvent(
- false /* triggeredFromAltTab */, false /* triggeredFromHomeKey */));
- });
-
- EventBus.getDefault().register(this, RecentsActivity.EVENT_BUS_PRIORITY);
- }
-
- private TaskView createView() {
- return (TaskView) mInflater.inflate(R.layout.recents_task_view, mRecentsView, false);
- }
-
- private void removeTaskViews() {
- for (View taskView : mTaskViews) {
- ViewGroup parent = (ViewGroup) taskView.getParent();
- if (parent != null) {
- parent.removeView(taskView);
- }
- }
- }
-
- private void clearTaskViews() {
- removeTaskViews();
- mTaskViews.clear();
- }
-
- private TaskView getChildViewForTask(Task task) {
- for (TaskView tv : mTaskViews) {
- if (tv.getTask() == task) {
- return tv;
- }
- }
- return null;
- }
-
- /**
- * Starts animations for each task view to either enlarge it to the size of the screen (when
- * launching a task), or (if {@code reverse} is true, to reduce it from the size of the screen
- * back to its place in the recents layout (when opening recents).
- * @param animationListener An animation listener for executing code before or after the
- * animations run.
- * @param reverse Whether the blow-up animations should be run in reverse.
- */
- private void startBlowUpAnimations(Animation.AnimationListener animationListener,
- boolean reverse) {
- if (mTaskViews.size() == 0) {
- return;
- }
- int screenWidth = mLastDisplayOrientation == Configuration.ORIENTATION_LANDSCAPE
- ? mScreenSize.x : mScreenSize.y;
- int screenHeight = mLastDisplayOrientation == Configuration.ORIENTATION_LANDSCAPE
- ? mScreenSize.y : mScreenSize.x;
- screenHeight -= mStatusBarHeightPx + mNavigationBarHeightPx;
- for (int i = 0; i < mTaskViews.size(); i++) {
- View tv = mTaskViews.get(i);
- AnimationSet animations = new AnimationSet(true /* shareInterpolator */);
- animations.setInterpolator(new DecelerateInterpolator());
- if (i == 0 && animationListener != null) {
- animations.setAnimationListener(animationListener);
- }
- animations.setFillBefore(reverse);
- animations.setFillAfter(!reverse);
- Rect initialRect = mTaskViewRects.get(mTaskViewRects.size() - 1 - i);
- int xDelta = - initialRect.left;
- int yDelta = - initialRect.top - mTitleBarHeightPx + mStatusBarHeightPx;
- TranslateAnimation translate = new TranslateAnimation(
- reverse ? xDelta : 0, reverse ? 0 : xDelta,
- reverse ? yDelta : 0, reverse ? 0 : yDelta);
- translate.setDuration(250);
- animations.addAnimation(translate);
-
-
- float xScale = (float) screenWidth / (float) initialRect.width();
- float yScale = (float) screenHeight /
- ((float) initialRect.height() - mTitleBarHeightPx);
- ScaleAnimation scale = new ScaleAnimation(
- reverse ? xScale : 1, reverse ? 1 : xScale,
- reverse ? yScale : 1, reverse ? 1 : yScale,
- Animation.ABSOLUTE, 0, Animation.ABSOLUTE, mStatusBarHeightPx);
- scale.setDuration(300);
- animations.addAnimation(scale);
-
- tv.startAnimation(animations);
- }
- }
-
- private void updateControlVisibility() {
- boolean empty = (mTasks.size() == 0);
- mClearAllButton.setVisibility(empty ? View.INVISIBLE : View.VISIBLE);
- mEmptyView.setVisibility(empty ? View.VISIBLE : View.INVISIBLE);
- if (empty) {
- mEmptyView.bringToFront();
- }
- }
-
- private void updateModel() {
- RecentsTaskLoader loader = Recents.getTaskLoader();
- RecentsTaskLoadPlan plan = RecentsImpl.consumeInstanceLoadPlan();
- if (plan == null) {
- plan = loader.createLoadPlan(this);
- }
- RecentsConfiguration config = Recents.getConfiguration();
- RecentsActivityLaunchState launchState = config.getLaunchState();
- if (!plan.hasTasks()) {
- loader.preloadTasks(plan, -1, !launchState.launchedFromHome);
- }
- mTaskStack = plan.getTaskStack();
- RecentsTaskLoadPlan.Options loadOpts = new RecentsTaskLoadPlan.Options();
- loadOpts.runningTaskId = launchState.launchedToTaskId;
- loadOpts.numVisibleTasks = MAX_VISIBLE_TASKS;
- loadOpts.numVisibleTaskThumbnails = MAX_VISIBLE_TASKS;
- loader.loadTasks(this, plan, loadOpts);
-
- mTasks = mTaskStack.getStackTasks();
- }
-
- private void updateViews() {
- int screenWidth = mLastDisplayOrientation == Configuration.ORIENTATION_LANDSCAPE
- ? mScreenSize.x : mScreenSize.y;
- int screenHeight = mLastDisplayOrientation == Configuration.ORIENTATION_LANDSCAPE
- ? mScreenSize.y : mScreenSize.x;
- int paddingPixels = getResources().getDimensionPixelSize(
- R.dimen.recents_grid_inter_task_padding);
- mTaskViewRects = TaskGridLayoutAlgorithm.getRectsForTaskCount(
- mTasks.size(), screenWidth, screenHeight, getAppRectRatio(), paddingPixels,
- mMargins, mTitleBarHeightPx);
- boolean recycleViews = (mTaskViews.size() == mTasks.size());
- if (!recycleViews) {
- clearTaskViews();
- }
- for (int i = 0; i < mTasks.size(); i++) {
- Task task = mTasks.get(i);
- // We keep the same ordering in the model as other Recents flavors (older tasks are
- // first in the stack) so that the logic can be similar, but we reverse the order
- // when placing views on the screen so that most recent tasks are displayed first.
- Rect rect = mTaskViewRects.get(mTaskViewRects.size() - 1 - i);
- TaskView taskView;
- if (recycleViews) {
- taskView = mTaskViews.get(i);
- } else {
- taskView = createView();
- }
- taskView.onTaskBound(task, mTouchExplorationEnabled, mLastDisplayOrientation,
- mDisplayRect);
- Recents.getTaskLoader().loadTaskData(task);
- taskView.setTouchEnabled(true);
- // Show dismiss button right away.
- taskView.startNoUserInteractionAnimation();
- taskView.setLayoutParams(new FrameLayout.LayoutParams(rect.width(), rect.height()));
- taskView.setTranslationX(rect.left);
- taskView.setTranslationY(rect.top);
- if (!recycleViews) {
- mRecentsView.addView(taskView);
- mTaskViews.add(taskView);
- }
- }
- updateControlVisibility();
- }
-
- private float getAppRectRatio() {
- if (mLastDisplayOrientation == Configuration.ORIENTATION_LANDSCAPE) {
- return (float) mScreenSize.x /
- (float) (mScreenSize.y - mStatusBarHeightPx - mNavigationBarHeightPx);
- } else {
- return (float) mScreenSize.y /
- (float) (mScreenSize.x - mStatusBarHeightPx - mNavigationBarHeightPx);
- }
- }
-
- @Override
- protected void onStart() {
- super.onStart();
- EventBus.getDefault().send(new RecentsVisibilityChangedEvent(this, true));
- updateModel();
- updateViews();
- if (mTaskViews.size() > 0) {
- mTaskViews.get(mTaskViews.size() - 1).bringToFront();
- }
- startBlowUpAnimations(new Animation.AnimationListener() {
- @Override
- public void onAnimationStart(Animation animation) { }
-
- @Override
- public void onAnimationEnd(Animation animation) {
- updateViews();
- }
-
- @Override
- public void onAnimationRepeat(Animation animation) { }
- }, true /* reverse */);
- }
-
- @Override
- protected void onStop() {
- super.onStop();
- EventBus.getDefault().send(new RecentsVisibilityChangedEvent(this, false));
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- EventBus.getDefault().unregister(this);
- }
-
- @Override
- public void onBackPressed() {
- // Back behaves like the recents button so just trigger a toggle event.
- EventBus.getDefault().send(new ToggleRecentsEvent());
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- // Notify of the config change.
- Configuration newDeviceConfiguration = Utilities.getAppConfiguration(this);
- mDisplayRect = Recents.getSystemServices().getDisplayRect();
- int numStackTasks = mTaskStack.getStackTaskCount();
- EventBus.getDefault().send(new ConfigurationChangedEvent(false /* fromMultiWindow */,
- mLastDisplayOrientation != newDeviceConfiguration.orientation,
- mLastDisplayDensity != newDeviceConfiguration.densityDpi, numStackTasks > 0));
- mLastDisplayOrientation = newDeviceConfiguration.orientation;
- mLastDisplayDensity = newDeviceConfiguration.densityDpi;
- updateViews();
- }
-
- void dismissRecentsToHome() {
- Intent startMain = new Intent(Intent.ACTION_MAIN);
- startMain.addCategory(Intent.CATEGORY_HOME);
- startActivity(startMain);
- }
-
- /** Launches the task that recents was launched from if possible. */
- boolean launchPreviousTask() {
- if (mRecentsView != null) {
- Task task = mTaskStack.getLaunchTarget();
- if (task != null) {
- TaskView taskView = getChildViewForTask(task);
- EventBus.getDefault().send(new LaunchTaskEvent(taskView, task, null,
- INVALID_STACK_ID, false));
- return true;
- }
- }
- return false;
- }
-
- /** Dismisses recents back to the launch target task. */
- boolean dismissRecentsToLaunchTargetTaskOrHome() {
- SystemServicesProxy ssp = Recents.getSystemServices();
- if (ssp.isRecentsActivityVisible()) {
- // If we can launch the task that Recents was launched from, do that, otherwise go home.
- if (launchPreviousTask()) return true;
- dismissRecentsToHome();
- }
- return false;
- }
-
- /**** EventBus events ****/
-
- public final void onBusEvent(HideRecentsEvent event) {
- if (event.triggeredFromAltTab) {
- dismissRecentsToLaunchTargetTaskOrHome();
- } else if (event.triggeredFromHomeKey) {
- dismissRecentsToHome();
- } else {
- // Fall through tap on the background view but not on any of the tasks.
- dismissRecentsToHome();
- }
- }
-
- public final void onBusEvent(ToggleRecentsEvent event) {
- dismissRecentsToLaunchTargetTaskOrHome();
- }
-
- public final void onBusEvent(DismissTaskViewEvent event) {
- int taskIndex = mTaskViews.indexOf(event.taskView);
- if (taskIndex != -1) {
- mTasks.remove(taskIndex);
- ((ViewGroup) event.taskView.getParent()).removeView(event.taskView);
- mTaskViews.remove(taskIndex);
- EventBus.getDefault().send(
- new TaskViewDismissedEvent(event.taskView.getTask(), event.taskView, null));
- }
- }
-
- public final void onBusEvent(TaskViewDismissedEvent event) {
- mRecentsView.announceForAccessibility(this.getString(
- R.string.accessibility_recents_item_dismissed, event.task.title));
- updateControlVisibility();
-
- EventBus.getDefault().send(new DeleteTaskDataEvent(event.task));
-
- MetricsLogger.action(this, MetricsEvent.OVERVIEW_DISMISS,
- event.task.key.getComponent().toString());
- }
-
- public final void onBusEvent(DeleteTaskDataEvent event) {
- // Remove any stored data from the loader.
- RecentsTaskLoader loader = Recents.getTaskLoader();
- loader.deleteTaskData(event.task, false);
-
- // Remove the task from activity manager.
- SystemServicesProxy ssp = Recents.getSystemServices();
- ssp.removeTask(event.task.key.id);
- }
-
- public final void onBusEvent(final DismissAllTaskViewsEvent event) {
- // Keep track of the tasks which will have their data removed.
- ArrayList<Task> tasks = new ArrayList<>(mTaskStack.getStackTasks());
- mRecentsView.announceForAccessibility(this.getString(
- R.string.accessibility_recents_all_items_dismissed));
- mTaskStack.removeAllTasks();
- for (int i = tasks.size() - 1; i >= 0; i--) {
- EventBus.getDefault().send(new DeleteTaskDataEvent(tasks.get(i)));
- }
- mTasks = new ArrayList<>();
- updateModel();
- updateViews();
-
- MetricsLogger.action(this, MetricsEvent.OVERVIEW_DISMISS_ALL);
- }
-
- public final void onBusEvent(AllTaskViewsDismissedEvent event) {
- SystemServicesProxy ssp = Recents.getSystemServices();
- if (!ssp.hasDockedTask()) {
- dismissRecentsToHome();
- }
- }
-
- public final void onBusEvent(LaunchNextTaskRequestEvent event) {
- if (mTaskStack.getTaskCount() > 0) {
- Task launchTask = mTaskStack.getNextLaunchTarget();
- TaskView launchTaskView = getChildViewForTask(launchTask);
- if (launchTaskView != null) {
- EventBus.getDefault().send(new LaunchTaskEvent(launchTaskView,
- launchTask, null, INVALID_STACK_ID, false /* screenPinningRequested */));
- MetricsLogger.action(this, MetricsEvent.OVERVIEW_LAUNCH_PREVIOUS_TASK,
- launchTask.key.getComponent().toString());
- return;
- }
- }
- // We couldn't find a matching task view, or there are no tasks. Just hide recents back
- // to home.
- EventBus.getDefault().send(new HideRecentsEvent(false, true));
- }
-
- public final void onBusEvent(LaunchTaskEvent event) {
- event.taskView.bringToFront();
- startActivity(event.task.key.baseIntent);
- // Eventually we should start blow-up animations here, but we need to make sure it's done
- // in parallel with starting the activity so that we don't introduce unneeded latency.
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/grid/RecentsGridImpl.java b/packages/SystemUI/src/com/android/systemui/recents/grid/RecentsGridImpl.java
deleted file mode 100644
index 41acaa0..0000000
--- a/packages/SystemUI/src/com/android/systemui/recents/grid/RecentsGridImpl.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.recents.grid;
-
-import android.app.ActivityManager;
-import android.content.Context;
-import android.content.Intent;
-import android.os.UserHandle;
-
-import com.android.systemui.recents.RecentsImpl;
-import com.android.systemui.recents.events.EventBus;
-import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent;
-
-public class RecentsGridImpl extends RecentsImpl {
- public static final String RECENTS_MOSAIC_ACTIVITY =
- "com.android.systemui.recents.grid.RecentsGridActivity";
-
- public RecentsGridImpl(Context context) {
- super(context);
- }
-
- @Override
- protected void startRecentsActivity(ActivityManager.RunningTaskInfo runningTask,
- boolean isHomeStackVisible, boolean animate, int growTarget) {
- Intent intent = new Intent();
- intent.setClassName(RECENTS_PACKAGE, RECENTS_MOSAIC_ACTIVITY);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
- | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
-
- mContext.startActivityAsUser(intent, UserHandle.CURRENT);
- EventBus.getDefault().send(new RecentsActivityStartingEvent());
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/grid/TaskGridLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/grid/TaskGridLayoutAlgorithm.java
deleted file mode 100644
index 648f2f0..0000000
--- a/packages/SystemUI/src/com/android/systemui/recents/grid/TaskGridLayoutAlgorithm.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.recents.grid;
-
-import android.graphics.Rect;
-import android.util.Log;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-class TaskGridLayoutAlgorithm {
-
- public enum VerticalGravity {
- START, END, CENTER
- }
-
- public static final List<Integer> ZERO_MARGIN = new ArrayList<>();
- static {
- Integer[] zero = {0, 0, 0, 0};
- ZERO_MARGIN.addAll(Arrays.asList(zero));
- }
- private static final String TAG = "TaskGridLayoutAlgorithm";
-
- /**
- * Calculates the adequate rectangles for the specified number of tasks to be layed out on
- * the screen.
- * @param count The number of task views to layout.
- * @param containerWidth The width of the whole area containing those tasks.
- * @param containerHeight The height of the whole area containing those tasks.
- * @param screenRatio The ratio of the device's screen, so that tasks have the same aspect
- * ratio (ignoring the title bar).
- * @param padding The amount of padding, in pixels, in between task views.
- * @param margins The amount of space to be left blank around the area on the left, top, right
- * and bottom.
- * @param titleBarHeight The height, in pixels, of the task views title bar.
- * @return A list of rectangles to be used for layout.
- */
- static ArrayList<Rect> getRectsForTaskCount(int count, int containerWidth, int containerHeight,
- float screenRatio, int padding, List<Integer> margins, int titleBarHeight) {
- return getRectsForTaskCount(count, containerWidth, containerHeight, screenRatio, padding,
- margins, titleBarHeight, null, VerticalGravity.CENTER);
- }
-
- private static ArrayList<Rect> getRectsForTaskCount(int count, int containerWidth,
- int containerHeight, float screenRatio, int padding, List<Integer> margins,
- int titleBarHeight, Rect preCalculatedTile, VerticalGravity gravity) {
- ArrayList<Rect> rects = new ArrayList<>(count);
- boolean landscape = (containerWidth > containerHeight);
- containerWidth -= margins.get(0) + margins.get(2);
- containerHeight -= margins.get(1) + margins.get(3);
-
- // We support at most 9 tasks in this layout.
- count = Math.min(count, RecentsGridActivity.MAX_VISIBLE_TASKS);
-
- if (count == 0) {
- return rects;
- }
- if (count <= 3) {
- // Base case: single line.
- int taskWidth, taskHeight;
- if (preCalculatedTile != null) {
- taskWidth = preCalculatedTile.width();
- taskHeight = preCalculatedTile.height();
- } else {
- // Divide available width in equal parts.
- int maxTaskWidth = (containerWidth - (count - 1) * padding) / count;
- int maxTaskHeight = containerHeight;
- if (maxTaskHeight >= maxTaskWidth / screenRatio + titleBarHeight) {
- // Width bound.
- taskWidth = maxTaskWidth;
- taskHeight = (int) (maxTaskWidth / screenRatio + titleBarHeight);
- } else {
- // Height bound.
- taskHeight = maxTaskHeight;
- taskWidth = (int) ((taskHeight - titleBarHeight) * screenRatio);
- }
- }
- int emptySpaceX = containerWidth - (count * taskWidth) - (count - 1) * padding;
- int emptySpaceY = containerHeight - taskHeight;
- for (int i = 0; i < count; i++) {
- int left = emptySpaceX / 2 + i * taskWidth + i * padding;
- int top;
- switch (gravity) {
- case CENTER:
- top = emptySpaceY / 2;
- break;
- case END:
- top = emptySpaceY;
- break;
- case START:
- default:
- top = 0;
- break;
- }
- Rect rect = new Rect(left, top, left + taskWidth, top + taskHeight);
- rect.offset(margins.get(0), margins.get(1));
- rects.add(rect);
- }
- } else if (count < 7) {
- // Two lines.
- int lineHeight = (containerHeight - padding) / 2;
- int lineTaskCount = (int) Math.ceil((double) count / 2);
- List<Rect> rectsA = getRectsForTaskCount(lineTaskCount, containerWidth, lineHeight,
- screenRatio, padding, ZERO_MARGIN, titleBarHeight, null, VerticalGravity.END);
- List<Rect> rectsB = getRectsForTaskCount(count - lineTaskCount, containerWidth,
- lineHeight, screenRatio, padding, ZERO_MARGIN, titleBarHeight, rectsA.get(0),
- VerticalGravity.START);
- for (int i = 0; i < rectsA.size(); i++) {
- rectsA.get(i).offset(margins.get(0), margins.get(1));
- }
- for (int i = 0; i < rectsB.size(); i++) {
- rectsB.get(i).offset(margins.get(0), margins.get(1) + lineHeight + padding);
- }
- rects.addAll(rectsA);
- rects.addAll(rectsB);
- } else {
- // Three lines.
- int lineHeight = (containerHeight - 2 * padding) / 3;
- int lineTaskCount = (int) Math.ceil((double) count / 3);
- List<Rect> rectsA = getRectsForTaskCount(lineTaskCount, containerWidth, lineHeight,
- screenRatio, padding, ZERO_MARGIN, titleBarHeight, null, VerticalGravity.END);
- List<Rect> rectsB = getRectsForTaskCount(lineTaskCount, containerWidth, lineHeight,
- screenRatio, padding, ZERO_MARGIN, titleBarHeight, rectsA.get(0),
- VerticalGravity.END);
- List<Rect> rectsC = getRectsForTaskCount(count - (2 * lineTaskCount), containerWidth,
- lineHeight, screenRatio, padding, ZERO_MARGIN, titleBarHeight, rectsA.get(0),
- VerticalGravity.START);
- for (int i = 0; i < rectsA.size(); i++) {
- rectsA.get(i).offset(margins.get(0), margins.get(1));
- }
- for (int i = 0; i < rectsB.size(); i++) {
- rectsB.get(i).offset(margins.get(0), margins.get(1) + lineHeight + padding);
- }
- for (int i = 0; i < rectsC.size(); i++) {
- rectsC.get(i).offset(margins.get(0), margins.get(1) + 2 * (lineHeight + padding));
- }
- rects.addAll(rectsA);
- rects.addAll(rectsB);
- rects.addAll(rectsC);
- }
- return rects;
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/recents/grid/TaskGridLayoutAlgorithmTest.java b/packages/SystemUI/tests/src/com/android/systemui/recents/grid/TaskGridLayoutAlgorithmTest.java
deleted file mode 100644
index a9f811b..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/recents/grid/TaskGridLayoutAlgorithmTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-package com.android.systemui.recents.grid;
-
-import android.graphics.Rect;
-import android.test.suitebuilder.annotation.SmallTest;
-import com.android.systemui.SysuiTestCase;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertTrue;
-
-import org.junit.Test;
-
-@SmallTest
-public class TaskGridLayoutAlgorithmTest extends SysuiTestCase {
-
- private static final List<Integer> ZERO_MARGIN = TaskGridLayoutAlgorithm.ZERO_MARGIN;
-
- @Test
- public void testOneTile() {
- List<Rect> rects = TaskGridLayoutAlgorithm.getRectsForTaskCount(
- 1, 1000, 1000, 1 /* screenRatio */, 0 /* padding */, ZERO_MARGIN, 0);
- assertEquals(1, rects.size());
- Rect singleRect = rects.get(0);
- assertEquals(1000, singleRect.width());
- }
-
- @Test
- public void testTwoTilesLandscape() {
- List<Rect> rects = TaskGridLayoutAlgorithm.getRectsForTaskCount(
- 2, 1200, 500, 1.2f /* screenRatio */, 0 /* padding */, ZERO_MARGIN, 0);
- assertEquals(2, rects.size());
- for (Rect rect : rects) {
- assertEquals(600, rect.width());
- assertEquals(499, rect.height());
- }
- }
-
- @Test
- public void testTwoTilesLandscapeWithPadding() {
- List<Rect> rects = TaskGridLayoutAlgorithm.getRectsForTaskCount(
- 2, 1200, 500, 1.19f /* screenRatio */, 10 /* padding */, ZERO_MARGIN, 0);
- assertEquals(2, rects.size());
- Rect rectA = rects.get(0);
- Rect rectB = rects.get(1);
- assertEquals(595, rectA.width());
- assertEquals(595, rectB.width());
- assertEquals(605, rectB.left);
- }
-
- @Test
- public void testTwoTilesPortrait() {
- List<Rect> rects = TaskGridLayoutAlgorithm.getRectsForTaskCount(
- 2, 500, 1200, 1 /* screenRatio */, 0 /* padding */, ZERO_MARGIN, 0);
- assertEquals(2, rects.size());
- for (Rect rect : rects) {
- assertEquals(250, rect.width());
- assertEquals(250, rect.height());
- }
- }
-
- @Test
- public void testThreeTiles() {
- List<Rect> rects = TaskGridLayoutAlgorithm.getRectsForTaskCount(
- 3, 1200, 500, 2 /* screenRatio */, 0 /* padding */, ZERO_MARGIN, 0);
- assertEquals(3, rects.size());
- for (Rect rect : rects) {
- assertEquals(400, rect.width());
- assertEquals(200, rect.height());
- }
- }
-
- @Test
- public void testFourTiles() {
- List<Rect> rects = TaskGridLayoutAlgorithm.getRectsForTaskCount(
- 4, 1200, 500, 2.4f /* screenRatio */, 0 /* padding */, ZERO_MARGIN, 0);
- assertEquals(4, rects.size());
- for (Rect rect : rects) {
- assertEquals(600, rect.width());
- assertEquals(249, rect.height());
- }
- Rect rectD = rects.get(3);
- assertEquals(600, rectD.left);
- assertEquals(250, rectD.top);
- }
-
- @Test
- public void testNineTiles() {
- List<Rect> rects = TaskGridLayoutAlgorithm.getRectsForTaskCount(
- 9, 1200, 600, 2 /* screenRatio */, 0 /* padding */, ZERO_MARGIN, 0);
- assertEquals(9, rects.size());
- for (Rect rect : rects) {
- assertEquals(400, rect.width());
- assertEquals(200, rect.height());
- }
- Rect rectE = rects.get(4);
- assertEquals(400, rectE.left);
- assertEquals(200, rectE.top);
- Rect rectI = rects.get(8);
- assertEquals(800, rectI.left);
- assertEquals(400, rectI.top);
- }}
-