Merge "Move wallpaper related methods to WallpaperToken"
This commit is contained in:
committed by
Android (Google) Code Review
commit
664e8e5829
@@ -40,9 +40,7 @@ import com.android.server.EventLogTags;
|
||||
import java.io.FileDescriptor;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
|
||||
import static android.app.AppOpsManager.MODE_ALLOWED;
|
||||
import static android.app.AppOpsManager.MODE_DEFAULT;
|
||||
import static android.app.AppOpsManager.OP_NONE;
|
||||
@@ -55,17 +53,13 @@ import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG;
|
||||
import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
|
||||
import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
|
||||
import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
|
||||
import static com.android.server.wm.AppTransition.TRANSIT_UNSET;
|
||||
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DISPLAY;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS_LIGHT;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_KEEP_SCREEN_ON;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_POWER;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TOKEN_MOVEMENT;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT;
|
||||
@@ -78,7 +72,6 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
|
||||
import static com.android.server.wm.WindowManagerService.H.REPORT_LOSING_FOCUS;
|
||||
import static com.android.server.wm.WindowManagerService.H.SEND_NEW_CONFIGURATION;
|
||||
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;
|
||||
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES;
|
||||
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES;
|
||||
import static com.android.server.wm.WindowManagerService.WINDOWS_FREEZING_SCREENS_NONE;
|
||||
@@ -760,9 +753,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
|
||||
WindowToken token = exitingTokens.get(i);
|
||||
if (!token.hasVisible) {
|
||||
exitingTokens.remove(i);
|
||||
if (token.windowType == TYPE_WALLPAPER) {
|
||||
displayContent.mWallpaperController.removeWallpaperToken(token);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ class WallpaperController {
|
||||
private static final String TAG = TAG_WITH_CLASS_NAME ? "WallpaperController" : TAG_WM;
|
||||
final private WindowManagerService mService;
|
||||
|
||||
private final ArrayList<WindowToken> mWallpaperTokens = new ArrayList<>();
|
||||
private final ArrayList<WallpaperWindowToken> mWallpaperTokens = new ArrayList<>();
|
||||
|
||||
// If non-null, this is the currently visible window that is associated
|
||||
// with the wallpaper.
|
||||
@@ -135,7 +135,7 @@ class WallpaperController {
|
||||
*/
|
||||
void startWallpaperAnimation(Animation a) {
|
||||
for (int curTokenNdx = mWallpaperTokens.size() - 1; curTokenNdx >= 0; curTokenNdx--) {
|
||||
final WindowToken token = mWallpaperTokens.get(curTokenNdx);
|
||||
final WallpaperWindowToken token = mWallpaperTokens.get(curTokenNdx);
|
||||
token.startAnimation(a);
|
||||
}
|
||||
}
|
||||
@@ -163,7 +163,7 @@ class WallpaperController {
|
||||
final boolean visible = isWallpaperVisible(mWallpaperTarget);
|
||||
|
||||
for (int curTokenNdx = mWallpaperTokens.size() - 1; curTokenNdx >= 0; curTokenNdx--) {
|
||||
final WindowToken token = mWallpaperTokens.get(curTokenNdx);
|
||||
final WallpaperWindowToken token = mWallpaperTokens.get(curTokenNdx);
|
||||
token.updateWallpaperVisibility(visible);
|
||||
}
|
||||
}
|
||||
@@ -189,7 +189,7 @@ class WallpaperController {
|
||||
|
||||
final boolean wasDeferred = (mDeferredHideWallpaper == winGoingAway);
|
||||
for (int i = mWallpaperTokens.size() - 1; i >= 0; i--) {
|
||||
final WindowToken token = mWallpaperTokens.get(i);
|
||||
final WallpaperWindowToken token = mWallpaperTokens.get(i);
|
||||
token.hideWallpaperToken(wasDeferred, "hideWallpapers");
|
||||
if (DEBUG_WALLPAPER_LIGHT && !token.hidden) Slog.d(TAG, "Hiding wallpaper " + token
|
||||
+ " from " + winGoingAway + " target=" + mWallpaperTarget + " lower="
|
||||
@@ -304,7 +304,7 @@ class WallpaperController {
|
||||
|| window == mUpperWallpaperTarget) {
|
||||
boolean doWait = sync;
|
||||
for (int curTokenNdx = mWallpaperTokens.size() - 1; curTokenNdx >= 0; curTokenNdx--) {
|
||||
final WindowToken token = mWallpaperTokens.get(curTokenNdx);
|
||||
final WallpaperWindowToken token = mWallpaperTokens.get(curTokenNdx);
|
||||
token.sendWindowWallpaperCommand(action, x, y, z, extras, sync);
|
||||
}
|
||||
|
||||
@@ -652,7 +652,7 @@ class WallpaperController {
|
||||
// Start stepping backwards from here, ensuring that our wallpaper windows are correctly placed.
|
||||
boolean changed = false;
|
||||
for (int curTokenNdx = mWallpaperTokens.size() - 1; curTokenNdx >= 0; curTokenNdx--) {
|
||||
final WindowToken token = mWallpaperTokens.get(curTokenNdx);
|
||||
final WallpaperWindowToken token = mWallpaperTokens.get(curTokenNdx);
|
||||
changed |= token.updateWallpaperWindowsPlacement(windows, wallpaperTarget,
|
||||
wallpaperTargetIndex, visible, dw, dh, mWallpaperAnimLayerAdjustment);
|
||||
}
|
||||
@@ -725,7 +725,7 @@ class WallpaperController {
|
||||
boolean wallpaperReady = true;
|
||||
for (int curTokenIndex = mWallpaperTokens.size() - 1;
|
||||
curTokenIndex >= 0 && wallpaperReady; curTokenIndex--) {
|
||||
final WindowToken token = mWallpaperTokens.get(curTokenIndex);
|
||||
final WallpaperWindowToken token = mWallpaperTokens.get(curTokenIndex);
|
||||
if (token.hasVisibleNotDrawnWallpaper()) {
|
||||
// We've told this wallpaper to be visible, but it is not drawn yet
|
||||
wallpaperReady = false;
|
||||
@@ -777,11 +777,11 @@ class WallpaperController {
|
||||
}
|
||||
}
|
||||
|
||||
void addWallpaperToken(WindowToken token) {
|
||||
void addWallpaperToken(WallpaperWindowToken token) {
|
||||
mWallpaperTokens.add(token);
|
||||
}
|
||||
|
||||
void removeWallpaperToken(WindowToken token) {
|
||||
void removeWallpaperToken(WallpaperWindowToken token) {
|
||||
mWallpaperTokens.remove(token);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,228 @@
|
||||
/*
|
||||
* Copyright (C) 2016 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License
|
||||
*/
|
||||
|
||||
package com.android.server.wm;
|
||||
|
||||
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYERS;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_MOVEMENT;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
import android.view.DisplayInfo;
|
||||
import android.view.animation.Animation;
|
||||
|
||||
/**
|
||||
* A token that represents a set of wallpaper windows.
|
||||
*/
|
||||
class WallpaperWindowToken extends WindowToken {
|
||||
|
||||
private static final String TAG = TAG_WITH_CLASS_NAME ? "WallpaperWindowToken" : TAG_WM;
|
||||
|
||||
WallpaperWindowToken(WindowManagerService service, IBinder token, boolean explicit,
|
||||
DisplayContent dc) {
|
||||
super(service, token, TYPE_WALLPAPER, explicit, dc);
|
||||
dc.mWallpaperController.addWallpaperToken(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
void setExiting() {
|
||||
super.setExiting();
|
||||
mDisplayContent.mWallpaperController.removeWallpaperToken(this);
|
||||
}
|
||||
|
||||
void hideWallpaperToken(boolean wasDeferred, String reason) {
|
||||
for (int j = mChildren.size() - 1; j >= 0; j--) {
|
||||
final WindowState wallpaper = mChildren.get(j);
|
||||
wallpaper.hideWallpaperWindow(wasDeferred, reason);
|
||||
}
|
||||
hidden = true;
|
||||
}
|
||||
|
||||
void sendWindowWallpaperCommand(
|
||||
String action, int x, int y, int z, Bundle extras, boolean sync) {
|
||||
for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) {
|
||||
final WindowState wallpaper = mChildren.get(wallpaperNdx);
|
||||
try {
|
||||
wallpaper.mClient.dispatchWallpaperCommand(action, x, y, z, extras, sync);
|
||||
// We only want to be synchronous with one wallpaper.
|
||||
sync = false;
|
||||
} catch (RemoteException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void updateWallpaperOffset(int dw, int dh, boolean sync) {
|
||||
final WallpaperController wallpaperController = mDisplayContent.mWallpaperController;
|
||||
for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) {
|
||||
final WindowState wallpaper = mChildren.get(wallpaperNdx);
|
||||
if (wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, sync)) {
|
||||
final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
|
||||
winAnimator.computeShownFrameLocked();
|
||||
// No need to lay out the windows - we can just set the wallpaper position directly.
|
||||
winAnimator.setWallpaperOffset(wallpaper.mShownPosition);
|
||||
// We only want to be synchronous with one wallpaper.
|
||||
sync = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void updateWallpaperVisibility(boolean visible) {
|
||||
final DisplayInfo displayInfo = mDisplayContent.getDisplayInfo();
|
||||
final int dw = displayInfo.logicalWidth;
|
||||
final int dh = displayInfo.logicalHeight;
|
||||
|
||||
if (hidden == visible) {
|
||||
hidden = !visible;
|
||||
// Need to do a layout to ensure the wallpaper now has the correct size.
|
||||
mDisplayContent.setLayoutNeeded();
|
||||
}
|
||||
|
||||
final WallpaperController wallpaperController = mDisplayContent.mWallpaperController;
|
||||
for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) {
|
||||
final WindowState wallpaper = mChildren.get(wallpaperNdx);
|
||||
if (visible) {
|
||||
wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, false);
|
||||
}
|
||||
|
||||
wallpaper.dispatchWallpaperVisibility(visible);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts {@param anim} on all children.
|
||||
*/
|
||||
void startAnimation(Animation anim) {
|
||||
for (int ndx = mChildren.size() - 1; ndx >= 0; ndx--) {
|
||||
final WindowState windowState = mChildren.get(ndx);
|
||||
windowState.mWinAnimator.setAnimation(anim);
|
||||
}
|
||||
}
|
||||
|
||||
boolean updateWallpaperWindowsPlacement(ReadOnlyWindowList windowList,
|
||||
WindowState wallpaperTarget, int wallpaperTargetIndex, boolean visible, int dw, int dh,
|
||||
int wallpaperAnimLayerAdj) {
|
||||
|
||||
boolean changed = false;
|
||||
if (hidden == visible) {
|
||||
if (DEBUG_WALLPAPER_LIGHT) Slog.d(TAG,
|
||||
"Wallpaper token " + token + " hidden=" + !visible);
|
||||
hidden = !visible;
|
||||
// Need to do a layout to ensure the wallpaper now has the correct size.
|
||||
mDisplayContent.setLayoutNeeded();
|
||||
}
|
||||
|
||||
final WallpaperController wallpaperController = mDisplayContent.mWallpaperController;
|
||||
for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) {
|
||||
final WindowState wallpaper = mChildren.get(wallpaperNdx);
|
||||
|
||||
if (visible) {
|
||||
wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, false);
|
||||
}
|
||||
|
||||
// First, make sure the client has the current visibility state.
|
||||
wallpaper.dispatchWallpaperVisibility(visible);
|
||||
wallpaper.adjustAnimLayer(wallpaperAnimLayerAdj);
|
||||
|
||||
if (DEBUG_LAYERS || DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, "adjustWallpaper win "
|
||||
+ wallpaper + " anim layer: " + wallpaper.mWinAnimator.mAnimLayer);
|
||||
|
||||
// First, if this window is at the current index, then all is well.
|
||||
if (wallpaper == wallpaperTarget) {
|
||||
wallpaperTargetIndex--;
|
||||
wallpaperTarget = wallpaperTargetIndex > 0
|
||||
? windowList.get(wallpaperTargetIndex - 1) : null;
|
||||
continue;
|
||||
}
|
||||
|
||||
// The window didn't match... the current wallpaper window,
|
||||
// wherever it is, is in the wrong place, so make sure it is not in the list.
|
||||
int oldIndex = windowList.indexOf(wallpaper);
|
||||
if (oldIndex >= 0) {
|
||||
if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG,
|
||||
"Wallpaper removing at " + oldIndex + ": " + wallpaper);
|
||||
mDisplayContent.removeFromWindowList(wallpaper);
|
||||
if (oldIndex < wallpaperTargetIndex) {
|
||||
wallpaperTargetIndex--;
|
||||
}
|
||||
}
|
||||
|
||||
// Now stick it in. For apps over wallpaper keep the wallpaper at the bottommost
|
||||
// layer. For keyguard over wallpaper put the wallpaper under the lowest window that
|
||||
// is currently on screen, i.e. not hidden by policy.
|
||||
int insertionIndex = 0;
|
||||
if (visible && wallpaperTarget != null) {
|
||||
final int privateFlags = wallpaperTarget.mAttrs.privateFlags;
|
||||
if ((privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) {
|
||||
insertionIndex = Math.min(windowList.indexOf(wallpaperTarget),
|
||||
findLowestWindowOnScreen(windowList));
|
||||
}
|
||||
}
|
||||
if (DEBUG_WALLPAPER_LIGHT || DEBUG_WINDOW_MOVEMENT
|
||||
|| (DEBUG_ADD_REMOVE && oldIndex != insertionIndex)) Slog.v(TAG,
|
||||
"Moving wallpaper " + wallpaper + " from " + oldIndex + " to " + insertionIndex);
|
||||
|
||||
mDisplayContent.addToWindowList(wallpaper, insertionIndex);
|
||||
changed = true;
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The index in {@param windows} of the lowest window that is currently on screen and
|
||||
* not hidden by the policy.
|
||||
*/
|
||||
private int findLowestWindowOnScreen(ReadOnlyWindowList windowList) {
|
||||
final int size = windowList.size();
|
||||
for (int index = 0; index < size; index++) {
|
||||
final WindowState win = windowList.get(index);
|
||||
if (win.isOnScreen()) {
|
||||
return index;
|
||||
}
|
||||
}
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
|
||||
boolean hasVisibleNotDrawnWallpaper() {
|
||||
for (int j = mChildren.size() - 1; j >= 0; --j) {
|
||||
final WindowState wallpaper = mChildren.get(j);
|
||||
if (wallpaper.hasVisibleNotDrawnWallpaper()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
if (stringName == null) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("WallpaperWindowToken{");
|
||||
sb.append(Integer.toHexString(System.identityHashCode(this)));
|
||||
sb.append(" token="); sb.append(token); sb.append('}');
|
||||
stringName = sb.toString();
|
||||
}
|
||||
return stringName;
|
||||
}
|
||||
}
|
||||
@@ -2415,9 +2415,10 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
+ " displayId=" + displayId);
|
||||
return;
|
||||
}
|
||||
token = new WindowToken(this, binder, type, true, dc);
|
||||
if (type == TYPE_WALLPAPER) {
|
||||
dc.mWallpaperController.addWallpaperToken(token);
|
||||
new WallpaperWindowToken(this, binder, true, dc);
|
||||
} else {
|
||||
new WindowToken(this, binder, type, true, dc);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2446,9 +2447,6 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
}
|
||||
|
||||
token.setExiting();
|
||||
if (token.windowType == TYPE_WALLPAPER) {
|
||||
dc.mWallpaperController.removeWallpaperToken(token);
|
||||
}
|
||||
|
||||
mInputMonitor.updateInputWindowsLw(true /*force*/);
|
||||
}
|
||||
|
||||
@@ -82,7 +82,7 @@ class WindowToken extends WindowContainer<WindowState> {
|
||||
boolean sendingToBottom;
|
||||
|
||||
// The display this token is on.
|
||||
private DisplayContent mDisplayContent;
|
||||
protected DisplayContent mDisplayContent;
|
||||
|
||||
/**
|
||||
* Compares two child window of this token and returns -1 if the first is lesser than the
|
||||
@@ -280,169 +280,6 @@ class WindowToken extends WindowContainer<WindowState> {
|
||||
return false;
|
||||
}
|
||||
|
||||
void hideWallpaperToken(boolean wasDeferred, String reason) {
|
||||
for (int j = mChildren.size() - 1; j >= 0; j--) {
|
||||
final WindowState wallpaper = mChildren.get(j);
|
||||
wallpaper.hideWallpaperWindow(wasDeferred, reason);
|
||||
}
|
||||
hidden = true;
|
||||
}
|
||||
|
||||
void sendWindowWallpaperCommand(
|
||||
String action, int x, int y, int z, Bundle extras, boolean sync) {
|
||||
for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) {
|
||||
final WindowState wallpaper = mChildren.get(wallpaperNdx);
|
||||
try {
|
||||
wallpaper.mClient.dispatchWallpaperCommand(action, x, y, z, extras, sync);
|
||||
// We only want to be synchronous with one wallpaper.
|
||||
sync = false;
|
||||
} catch (RemoteException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void updateWallpaperOffset(int dw, int dh, boolean sync) {
|
||||
final WallpaperController wallpaperController = mDisplayContent.mWallpaperController;
|
||||
for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) {
|
||||
final WindowState wallpaper = mChildren.get(wallpaperNdx);
|
||||
if (wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, sync)) {
|
||||
final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
|
||||
winAnimator.computeShownFrameLocked();
|
||||
// No need to lay out the windows - we can just set the wallpaper position directly.
|
||||
winAnimator.setWallpaperOffset(wallpaper.mShownPosition);
|
||||
// We only want to be synchronous with one wallpaper.
|
||||
sync = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void updateWallpaperVisibility(boolean visible) {
|
||||
final DisplayInfo displayInfo = mDisplayContent.getDisplayInfo();
|
||||
final int dw = displayInfo.logicalWidth;
|
||||
final int dh = displayInfo.logicalHeight;
|
||||
|
||||
if (hidden == visible) {
|
||||
hidden = !visible;
|
||||
// Need to do a layout to ensure the wallpaper now has the correct size.
|
||||
mDisplayContent.setLayoutNeeded();
|
||||
}
|
||||
|
||||
final WallpaperController wallpaperController = mDisplayContent.mWallpaperController;
|
||||
for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) {
|
||||
final WindowState wallpaper = mChildren.get(wallpaperNdx);
|
||||
if (visible) {
|
||||
wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, false);
|
||||
}
|
||||
|
||||
wallpaper.dispatchWallpaperVisibility(visible);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts {@param anim} on all children.
|
||||
*/
|
||||
void startAnimation(Animation anim) {
|
||||
for (int ndx = mChildren.size() - 1; ndx >= 0; ndx--) {
|
||||
final WindowState windowState = mChildren.get(ndx);
|
||||
windowState.mWinAnimator.setAnimation(anim);
|
||||
}
|
||||
}
|
||||
|
||||
boolean updateWallpaperWindowsPlacement(ReadOnlyWindowList windowList,
|
||||
WindowState wallpaperTarget, int wallpaperTargetIndex, boolean visible, int dw, int dh,
|
||||
int wallpaperAnimLayerAdj) {
|
||||
|
||||
boolean changed = false;
|
||||
if (hidden == visible) {
|
||||
if (DEBUG_WALLPAPER_LIGHT) Slog.d(TAG,
|
||||
"Wallpaper token " + token + " hidden=" + !visible);
|
||||
hidden = !visible;
|
||||
// Need to do a layout to ensure the wallpaper now has the correct size.
|
||||
mDisplayContent.setLayoutNeeded();
|
||||
}
|
||||
|
||||
final WallpaperController wallpaperController = mDisplayContent.mWallpaperController;
|
||||
for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) {
|
||||
final WindowState wallpaper = mChildren.get(wallpaperNdx);
|
||||
|
||||
if (visible) {
|
||||
wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, false);
|
||||
}
|
||||
|
||||
// First, make sure the client has the current visibility state.
|
||||
wallpaper.dispatchWallpaperVisibility(visible);
|
||||
wallpaper.adjustAnimLayer(wallpaperAnimLayerAdj);
|
||||
|
||||
if (DEBUG_LAYERS || DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, "adjustWallpaper win "
|
||||
+ wallpaper + " anim layer: " + wallpaper.mWinAnimator.mAnimLayer);
|
||||
|
||||
// First, if this window is at the current index, then all is well.
|
||||
if (wallpaper == wallpaperTarget) {
|
||||
wallpaperTargetIndex--;
|
||||
wallpaperTarget = wallpaperTargetIndex > 0
|
||||
? windowList.get(wallpaperTargetIndex - 1) : null;
|
||||
continue;
|
||||
}
|
||||
|
||||
// The window didn't match... the current wallpaper window,
|
||||
// wherever it is, is in the wrong place, so make sure it is not in the list.
|
||||
int oldIndex = windowList.indexOf(wallpaper);
|
||||
if (oldIndex >= 0) {
|
||||
if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG,
|
||||
"Wallpaper removing at " + oldIndex + ": " + wallpaper);
|
||||
mDisplayContent.removeFromWindowList(wallpaper);
|
||||
if (oldIndex < wallpaperTargetIndex) {
|
||||
wallpaperTargetIndex--;
|
||||
}
|
||||
}
|
||||
|
||||
// Now stick it in. For apps over wallpaper keep the wallpaper at the bottommost
|
||||
// layer. For keyguard over wallpaper put the wallpaper under the lowest window that
|
||||
// is currently on screen, i.e. not hidden by policy.
|
||||
int insertionIndex = 0;
|
||||
if (visible && wallpaperTarget != null) {
|
||||
final int privateFlags = wallpaperTarget.mAttrs.privateFlags;
|
||||
if ((privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) {
|
||||
insertionIndex = Math.min(windowList.indexOf(wallpaperTarget),
|
||||
findLowestWindowOnScreen(windowList));
|
||||
}
|
||||
}
|
||||
if (DEBUG_WALLPAPER_LIGHT || DEBUG_WINDOW_MOVEMENT
|
||||
|| (DEBUG_ADD_REMOVE && oldIndex != insertionIndex)) Slog.v(TAG,
|
||||
"Moving wallpaper " + wallpaper + " from " + oldIndex + " to " + insertionIndex);
|
||||
|
||||
mDisplayContent.addToWindowList(wallpaper, insertionIndex);
|
||||
changed = true;
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The index in {@param windows} of the lowest window that is currently on screen and
|
||||
* not hidden by the policy.
|
||||
*/
|
||||
private int findLowestWindowOnScreen(ReadOnlyWindowList windowList) {
|
||||
final int size = windowList.size();
|
||||
for (int index = 0; index < size; index++) {
|
||||
final WindowState win = windowList.get(index);
|
||||
if (win.isOnScreen()) {
|
||||
return index;
|
||||
}
|
||||
}
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
|
||||
boolean hasVisibleNotDrawnWallpaper() {
|
||||
for (int j = mChildren.size() - 1; j >= 0; --j) {
|
||||
final WindowState wallpaper = mChildren.get(j);
|
||||
if (wallpaper.hasVisibleNotDrawnWallpaper()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
int getHighestAnimLayer() {
|
||||
int highest = -1;
|
||||
for (int j = 0; j < mChildren.size(); j++) {
|
||||
|
||||
Reference in New Issue
Block a user