summaryrefslogtreecommitdiffstats
path: root/core/java/android/app/ActivityThread.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/app/ActivityThread.java')
-rw-r--r--core/java/android/app/ActivityThread.java108
1 files changed, 70 insertions, 38 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index a8f08c2..45500bc 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -239,6 +239,14 @@ public final class ActivityThread {
nextIdle = null;
}
+ public boolean isPreHoneycomb() {
+ if (activity != null) {
+ return activity.getApplicationInfo().targetSdkVersion
+ < android.os.Build.VERSION_CODES.HONEYCOMB;
+ }
+ return false;
+ }
+
public String toString() {
ComponentName componentName = intent.getComponent();
return "ActivityRecord{"
@@ -2299,41 +2307,44 @@ public final class ActivityThread {
private int mThumbnailWidth = -1;
private int mThumbnailHeight = -1;
+ private Bitmap mAvailThumbnailBitmap = null;
+ private Canvas mThumbnailCanvas = null;
private final Bitmap createThumbnailBitmap(ActivityClientRecord r) {
- Bitmap thumbnail = null;
+ Bitmap thumbnail = mAvailThumbnailBitmap;
try {
- int w = mThumbnailWidth;
- int h;
- if (w < 0) {
- Resources res = r.activity.getResources();
- mThumbnailHeight = h =
- res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_height);
-
- mThumbnailWidth = w =
- res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_width);
- } else {
- h = mThumbnailHeight;
- }
-
- // On platforms where we don't want thumbnails, set dims to (0,0)
- if ((w > 0) && (h > 0)) {
- View topView = r.activity.getWindow().getDecorView();
-
- // Maximize bitmap by capturing in native aspect.
- if (topView.getWidth() >= topView.getHeight()) {
- thumbnail = Bitmap.createBitmap(w, h, THUMBNAIL_FORMAT);
+ if (thumbnail == null) {
+ int w = mThumbnailWidth;
+ int h;
+ if (w < 0) {
+ Resources res = r.activity.getResources();
+ mThumbnailHeight = h =
+ res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_height);
+
+ mThumbnailWidth = w =
+ res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_width);
} else {
- thumbnail = Bitmap.createBitmap(h, w, THUMBNAIL_FORMAT);
+ h = mThumbnailHeight;
}
- thumbnail.eraseColor(0);
- Canvas cv = new Canvas(thumbnail);
- if (!r.activity.onCreateThumbnail(thumbnail, cv)) {
- thumbnail = null;
+ // On platforms where we don't want thumbnails, set dims to (0,0)
+ if ((w > 0) && (h > 0)) {
+ thumbnail = Bitmap.createBitmap(w, h, THUMBNAIL_FORMAT);
+ thumbnail.eraseColor(0);
}
}
+ Canvas cv = mThumbnailCanvas;
+ if (cv == null) {
+ mThumbnailCanvas = cv = new Canvas();
+ }
+
+ cv.setBitmap(thumbnail);
+ if (!r.activity.onCreateThumbnail(thumbnail, cv)) {
+ mAvailThumbnailBitmap = thumbnail;
+ thumbnail = null;
+ }
+
} catch (Exception e) {
if (!mInstrumentation.onException(r.activity, e)) {
throw new RuntimeException(
@@ -2357,14 +2368,14 @@ public final class ActivityThread {
}
r.activity.mConfigChangeFlags |= configChanges;
- Bundle state = performPauseActivity(token, finished, true);
+ performPauseActivity(token, finished, r.isPreHoneycomb());
// Make sure any pending writes are now committed.
QueuedWork.waitToFinish();
// Tell the activity manager we have paused.
try {
- ActivityManagerNative.getDefault().activityPaused(token, state);
+ ActivityManagerNative.getDefault().activityPaused(token);
} catch (RemoteException ex) {
}
}
@@ -2404,6 +2415,8 @@ public final class ActivityThread {
state = new Bundle();
mInstrumentation.callActivityOnSaveInstanceState(r.activity, state);
r.state = state;
+ } else {
+ r.state = null;
}
// Now we are idle.
r.activity.mCalled = false;
@@ -2430,9 +2443,9 @@ public final class ActivityThread {
return state;
}
- final void performStopActivity(IBinder token) {
+ final void performStopActivity(IBinder token, boolean saveState) {
ActivityClientRecord r = mActivities.get(token);
- performStopActivityInner(r, null, false);
+ performStopActivityInner(r, null, false, saveState);
}
private static class StopInfo {
@@ -2447,9 +2460,18 @@ public final class ActivityThread {
}
}
+ /**
+ * Core implementation of stopping an activity. Note this is a little
+ * tricky because the server's meaning of stop is slightly different
+ * than our client -- for the server, stop means to save state and give
+ * it the result when it is done, but the window may still be visible.
+ * For the client, we want to call onStop()/onStart() to indicate when
+ * the activity's UI visibillity changes.
+ */
private final void performStopActivityInner(ActivityClientRecord r,
- StopInfo info, boolean keepShown) {
+ StopInfo info, boolean keepShown, boolean saveState) {
if (localLOGV) Slog.v(TAG, "Performing stop of " + r);
+ Bundle state = null;
if (r != null) {
if (!keepShown && r.stopped) {
if (r.activity.mFinished) {
@@ -2479,6 +2501,17 @@ public final class ActivityThread {
}
}
+ // Next have the activity save its current state and managed dialogs...
+ if (!r.activity.mFinished && saveState) {
+ if (r.state == null) {
+ state = new Bundle();
+ mInstrumentation.callActivityOnSaveInstanceState(r.activity, state);
+ r.state = state;
+ } else {
+ state = r.state;
+ }
+ }
+
if (!keepShown) {
try {
// Now we are idle.
@@ -2530,7 +2563,7 @@ public final class ActivityThread {
r.activity.mConfigChangeFlags |= configChanges;
StopInfo info = new StopInfo();
- performStopActivityInner(r, info, show);
+ performStopActivityInner(r, info, show, true);
if (localLOGV) Slog.v(
TAG, "Finishing stop of " + r + ": show=" + show
@@ -2541,7 +2574,7 @@ public final class ActivityThread {
// Tell activity manager we have been stopped.
try {
ActivityManagerNative.getDefault().activityStopped(
- r.token, info.thumbnail, info.description);
+ r.token, r.state, info.thumbnail, info.description);
} catch (RemoteException ex) {
}
}
@@ -2557,7 +2590,7 @@ public final class ActivityThread {
private final void handleWindowVisibility(IBinder token, boolean show) {
ActivityClientRecord r = mActivities.get(token);
if (!show && !r.stopped) {
- performStopActivityInner(r, null, show);
+ performStopActivityInner(r, null, show, false);
} else if (show && r.stopped) {
// If we are getting ready to gc after going to the background, well
// we are back active so skip it.
@@ -2651,9 +2684,6 @@ public final class ActivityThread {
if (finishing) {
r.activity.mFinished = true;
}
- if (getNonConfigInstance) {
- r.activity.mChangingConfigurations = true;
- }
if (!r.paused) {
try {
r.activity.mCalled = false;
@@ -2924,9 +2954,11 @@ public final class ActivityThread {
r.onlyLocalRequest = tmp.onlyLocalRequest;
Intent currentIntent = r.activity.mIntent;
+ r.activity.mChangingConfigurations = true;
+
Bundle savedState = null;
if (!r.paused) {
- savedState = performPauseActivity(r.token, false, true);
+ savedState = performPauseActivity(r.token, false, r.isPreHoneycomb());
}
handleDestroyActivity(r.token, false, configChanges, true);