diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index c5bc7d3a019ae..465374246a044 100755 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -1099,6 +1099,51 @@ final class ActivityStack { } } + // Find the first visible activity above the passed activity and if it is translucent return it + // otherwise return null; + ActivityRecord findNextTranslucentActivity(ActivityRecord r) { + TaskRecord task = r.task; + if (task == null) { + return null; + } + + ActivityStack stack = task.stack; + if (stack == null) { + return null; + } + + int stackNdx = mStacks.indexOf(stack); + + ArrayList tasks = stack.mTaskHistory; + int taskNdx = tasks.indexOf(task); + + ArrayList activities = task.mActivities; + int activityNdx = activities.indexOf(r) + 1; + + final int numStacks = mStacks.size(); + while (stackNdx < numStacks) { + tasks = mStacks.get(stackNdx).mTaskHistory; + final int numTasks = tasks.size(); + while (taskNdx < numTasks) { + activities = tasks.get(taskNdx).mActivities; + final int numActivities = activities.size(); + while (activityNdx < numActivities) { + final ActivityRecord activity = activities.get(activityNdx); + if (!activity.finishing) { + return activity.fullscreen ? null : activity; + } + ++activityNdx; + } + activityNdx = 0; + ++taskNdx; + } + taskNdx = 0; + ++stackNdx; + } + + return null; + } + // Checks if any of the stacks above this one has a fullscreen activity behind it. // If so, this stack is hidden, otherwise it is visible. private boolean isStackVisible() { diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index b4e66c16b1f67..4a99ef3342089 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -2680,6 +2680,13 @@ public final class ActivityStackSupervisor implements DisplayListener { } stack.setMediaPlayer(playing ? r : null); + if (!playing) { + // Make the activity immediately above r opaque. + final ActivityRecord next = stack.findNextTranslucentActivity(r); + if (next != null) { + mService.convertFromTranslucent(next.appToken); + } + } try { top.app.thread.scheduleBackgroundMediaPlayingChanged(top.appToken, playing); } catch (RemoteException e) {