From 1f544beb7a5bfa7ae34aa86ecf939254ad18d47a Mon Sep 17 00:00:00 2001 From: Wale Ogunwale Date: Thu, 17 Dec 2015 10:27:23 -0800 Subject: [PATCH] Use accessor methods to get/set visibleBehindActivity The accessor methods have protection against the stack been in a detached state. Reading the field directly can lead to an NPE when the stack is detached. Bug: 26209403 Change-Id: I66fc1871ea96504cf1bcbc72cae9b564d6527bce --- .../java/com/android/server/am/ActivityStack.java | 11 +++++------ .../android/server/am/ActivityStackSupervisor.java | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index bfd17b2e1bf96..ada71f670e783 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -813,10 +813,9 @@ final class ActivityStack { if (hasVisibleBehindActivity()) { // Stop visible behind activity before going to sleep. - final ActivityRecord r = mActivityContainer.mActivityDisplay.mVisibleBehindActivity; + final ActivityRecord r = getVisibleBehindActivity(); mStackSupervisor.mStoppingActivities.add(r); - if (DEBUG_STATES) Slog.v(TAG_STATES, - "Sleep still waiting to stop visible behind " + r); + if (DEBUG_STATES) Slog.v(TAG_STATES, "Sleep still waiting to stop visible behind " + r); return true; } @@ -1053,7 +1052,7 @@ final class ActivityStack { mHandler.removeMessages(STOP_TIMEOUT_MSG, r); r.stopped = true; r.state = ActivityState.STOPPED; - if (mActivityContainer.mActivityDisplay.mVisibleBehindActivity == r) { + if (getVisibleBehindActivity() == r) { mStackSupervisor.requestVisibleBehindLocked(r, false); } if (r.finishing) { @@ -1214,9 +1213,9 @@ final class ActivityStack { next.returningOptions = null; - if (mActivityContainer.mActivityDisplay.mVisibleBehindActivity == next) { + if (getVisibleBehindActivity() == next) { // When resuming an activity, require it to call requestVisibleBehind() again. - mActivityContainer.mActivityDisplay.setVisibleBehindActivity(null); + setVisibleBehindActivity(null); } } diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 80d531e71f3ec..271a9437b5546 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -5170,7 +5170,7 @@ public final class ActivityStackSupervisor implements DisplayListener { /** All of the stacks on this display. Order matters, topmost stack is in front of all other * stacks, bottommost behind. Accessed directly by ActivityManager package classes */ - final ArrayList mStacks = new ArrayList(); + final ArrayList mStacks = new ArrayList<>(); ActivityRecord mVisibleBehindActivity;