Merge "Change recents UIs to do task switches."
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentApplicationsActivity.java b/packages/SystemUI/src/com/android/systemui/recent/RecentApplicationsActivity.java
index faea3fc..ff2a4ed 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentApplicationsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentApplicationsActivity.java
@@ -29,6 +29,8 @@
import android.app.Activity;
import android.app.ActivityManager;
+import android.app.ActivityManagerNative;
+import android.app.IActivityManager;
import android.app.IThumbnailReceiver;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.ActivityNotFoundException;
@@ -189,8 +191,15 @@
public void onCardSelected(int n) {
if (n < mActivityDescriptions.size()) {
ActivityDescription item = mActivityDescriptions.get(n);
- // prepare a launch intent and send it
- if (item.intent != null) {
+ if (item.id >= 0) {
+ // This is an active task; it should just go to the foreground.
+ IActivityManager am = ActivityManagerNative.getDefault();
+ try {
+ am.moveTaskToFront(item.id);
+ } catch (RemoteException e) {
+ }
+ } else if (item.intent != null) {
+ // prepare a launch intent and send it
item.intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
try {
if (DBG) Log.v(TAG, "Starting intent " + item.intent);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java
index 1831eda..3d4d42c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java
@@ -20,6 +20,8 @@
import java.util.List;
import android.app.ActivityManager;
+import android.app.ActivityManagerNative;
+import android.app.IActivityManager;
import android.app.IThumbnailReceiver;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.Context;
@@ -236,7 +238,7 @@
appIcon.setImageDrawable(activityDescription.icon);
appDescription.setText(activityDescription.label);
view.setOnClickListener(this);
- view.setTag(activityDescription.intent);
+ view.setTag(activityDescription);
Log.v(TAG, "Adding task: " + activityDescription.label);
mRecentsContainer.addView(view);
}
@@ -247,9 +249,19 @@
}
public void onClick(View v) {
- Intent intent = (Intent) v.getTag();
- if (DEBUG) Log.v(TAG, "Starting activity " + intent);
- getContext().startActivity(intent);
+ ActivityDescription ad = (ActivityDescription)v.getTag();
+ if (ad.id >= 0) {
+ // This is an active task; it should just go to the foreground.
+ IActivityManager am = ActivityManagerNative.getDefault();
+ try {
+ am.moveTaskToFront(ad.id);
+ } catch (RemoteException e) {
+ }
+ } else {
+ Intent intent = ad.intent;
+ if (DEBUG) Log.v(TAG, "Starting activity " + intent);
+ getContext().startActivity(intent);
+ }
mBar.animateCollapse();
}
}
diff --git a/policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java b/policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java
index 9608b9a..d9e8c2b 100644
--- a/policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java
+++ b/policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java
@@ -17,7 +17,9 @@
package com.android.internal.policy.impl;
import android.app.ActivityManager;
+import android.app.ActivityManagerNative;
import android.app.Dialog;
+import android.app.IActivityManager;
import android.app.StatusBarManager;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
@@ -30,6 +32,8 @@
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.Window;
@@ -53,6 +57,22 @@
View mNoAppsText;
IntentFilter mBroadcastIntentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
+ class RecentTag {
+ ActivityManager.RecentTaskInfo info;
+ Intent intent;
+ }
+
+ Handler mHandler = new Handler();
+ Runnable mCleanup = new Runnable() {
+ public void run() {
+ // dump extra memory we're hanging on to
+ for (TextView icon: mIcons) {
+ icon.setCompoundDrawables(null, null, null, null);
+ icon.setTag(null);
+ }
+ }
+ };
+
private int mIconSize;
public RecentApplicationsDialog(Context context) {
@@ -115,12 +135,18 @@
for (TextView b: mIcons) {
if (b == v) {
- // prepare a launch intent and send it
- Intent intent = (Intent)b.getTag();
- if (intent != null) {
- intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
+ RecentTag tag = (RecentTag)b.getTag();
+ if (tag.info.id >= 0) {
+ // This is an active task; it should just go to the foreground.
+ IActivityManager am = ActivityManagerNative.getDefault();
try {
- getContext().startActivity(intent);
+ am.moveTaskToFront(tag.info.id);
+ } catch (RemoteException e) {
+ }
+ } else if (tag.intent != null) {
+ tag.intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
+ try {
+ getContext().startActivity(tag.intent);
} catch (ActivityNotFoundException e) {
Log.w("Recent", "Unable to launch recent task", e);
}
@@ -144,6 +170,8 @@
// receive broadcasts
getContext().registerReceiver(mBroadcastReceiver, mBroadcastIntentFilter);
+
+ mHandler.removeCallbacks(mCleanup);
}
/**
@@ -153,18 +181,14 @@
public void onStop() {
super.onStop();
- // dump extra memory we're hanging on to
- for (TextView icon: mIcons) {
- icon.setCompoundDrawables(null, null, null, null);
- icon.setTag(null);
- }
-
if (sStatusBar != null) {
sStatusBar.disable(StatusBarManager.DISABLE_NONE);
}
// stop receiving broadcasts
getContext().unregisterReceiver(mBroadcastReceiver);
+
+ mHandler.postDelayed(mCleanup, 100);
}
/**
@@ -224,7 +248,10 @@
tv.setText(title);
icon = iconUtilities.createIconDrawable(icon);
tv.setCompoundDrawables(null, icon, null, null);
- tv.setTag(intent);
+ RecentTag tag = new RecentTag();
+ tag.info = info;
+ tag.intent = intent;
+ tv.setTag(tag);
tv.setVisibility(View.VISIBLE);
tv.setPressed(false);
tv.clearFocus();