From fa387ad6cfa996d09050f8f6c39eaa0537893d20 Mon Sep 17 00:00:00 2001 From: Craig Mautner Date: Tue, 5 Aug 2014 11:16:41 -0700 Subject: [PATCH] Make next activity opaque when media stops Call convertFromTranslucent on next activity when an activity below it stops playing media. Fixes bug 14469711. Change-Id: I7e4346987cb620cb3a8c09096ff3a639cf344679 --- .../com/android/server/am/ActivityStack.java | 45 +++++++++++++++++++ .../server/am/ActivityStackSupervisor.java | 7 +++ 2 files changed, 52 insertions(+) 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) {