1879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi/* 2879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi * Copyright (C) 2016 The Android Open Source Project 3879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi * 4879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License"); 5879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi * you may not use this file except in compliance with the License. 6879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi * You may obtain a copy of the License at 7879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi * 8879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi * http://www.apache.org/licenses/LICENSE-2.0 9879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi * 10879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi * Unless required by applicable law or agreed to in writing, software 11879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS, 12879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi * See the License for the specific language governing permissions and 14879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi * limitations under the License 15879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi */ 16879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 17879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggipackage com.android.server.wm; 18879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 19879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; 20879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYERS; 21879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT; 22879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; 23879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; 24879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 25879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport android.os.Bundle; 26879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport android.os.IBinder; 27879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport android.os.RemoteException; 28879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport android.util.Slog; 29879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport android.view.DisplayInfo; 30879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport android.view.animation.Animation; 31879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 32879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi/** 33879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi * A token that represents a set of wallpaper windows. 34879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi */ 35879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiclass WallpaperWindowToken extends WindowToken { 36879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 37879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi private static final String TAG = TAG_WITH_CLASS_NAME ? "WallpaperWindowToken" : TAG_WM; 38879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 39879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi WallpaperWindowToken(WindowManagerService service, IBinder token, boolean explicit, 405cd907d3d6ceebf8731ef1f69347cce6f76109e9Wale Ogunwale DisplayContent dc, boolean ownerCanManageAppTokens) { 415cd907d3d6ceebf8731ef1f69347cce6f76109e9Wale Ogunwale super(service, token, TYPE_WALLPAPER, explicit, dc, ownerCanManageAppTokens); 42879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi dc.mWallpaperController.addWallpaperToken(this); 43879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 44879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 45879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi @Override 46879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi void setExiting() { 47879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi super.setExiting(); 48879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi mDisplayContent.mWallpaperController.removeWallpaperToken(this); 49879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 50879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 51879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi void hideWallpaperToken(boolean wasDeferred, String reason) { 52879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi for (int j = mChildren.size() - 1; j >= 0; j--) { 53879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WindowState wallpaper = mChildren.get(j); 54879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi wallpaper.hideWallpaperWindow(wasDeferred, reason); 55879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 56f5f9e12146a3857c28b8c0fc96c2fa68a2ae40deJorim Jaggi setHidden(true); 57879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 58879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 59879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi void sendWindowWallpaperCommand( 60879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi String action, int x, int y, int z, Bundle extras, boolean sync) { 61879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { 62879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WindowState wallpaper = mChildren.get(wallpaperNdx); 63879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi try { 64879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi wallpaper.mClient.dispatchWallpaperCommand(action, x, y, z, extras, sync); 65879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi // We only want to be synchronous with one wallpaper. 66879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi sync = false; 67879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } catch (RemoteException e) { 68879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 69879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 70879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 71879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 72879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi void updateWallpaperOffset(int dw, int dh, boolean sync) { 73879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WallpaperController wallpaperController = mDisplayContent.mWallpaperController; 74879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { 75879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WindowState wallpaper = mChildren.get(wallpaperNdx); 76879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi if (wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, sync)) { 77879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi // We only want to be synchronous with one wallpaper. 78879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi sync = false; 79879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 80879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 81879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 82879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 83879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi void updateWallpaperVisibility(boolean visible) { 84879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final DisplayInfo displayInfo = mDisplayContent.getDisplayInfo(); 85879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final int dw = displayInfo.logicalWidth; 86879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final int dh = displayInfo.logicalHeight; 87879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 88f5f9e12146a3857c28b8c0fc96c2fa68a2ae40deJorim Jaggi if (isHidden() == visible) { 89f5f9e12146a3857c28b8c0fc96c2fa68a2ae40deJorim Jaggi setHidden(!visible); 90f5f9e12146a3857c28b8c0fc96c2fa68a2ae40deJorim Jaggi 91879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi // Need to do a layout to ensure the wallpaper now has the correct size. 92879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi mDisplayContent.setLayoutNeeded(); 93879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 94879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 95879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WallpaperController wallpaperController = mDisplayContent.mWallpaperController; 96879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { 97879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WindowState wallpaper = mChildren.get(wallpaperNdx); 98879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi if (visible) { 99879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, false); 100879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 101879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 102879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi wallpaper.dispatchWallpaperVisibility(visible); 103879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 104879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 105879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 106879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi /** 107879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi * Starts {@param anim} on all children. 108879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi */ 109879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi void startAnimation(Animation anim) { 110879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi for (int ndx = mChildren.size() - 1; ndx >= 0; ndx--) { 111879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WindowState windowState = mChildren.get(ndx); 112a5e105728fb87264b9dc2e66b3703168f8864110Jorim Jaggi windowState.startAnimation(anim); 113879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 114879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 115879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 116b0fc817f284899cf4524b79a840bb1753b966119Jorim Jaggi void updateWallpaperWindows(boolean visible) { 117879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 118f5f9e12146a3857c28b8c0fc96c2fa68a2ae40deJorim Jaggi if (isHidden() == visible) { 119879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi if (DEBUG_WALLPAPER_LIGHT) Slog.d(TAG, 120879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi "Wallpaper token " + token + " hidden=" + !visible); 121f5f9e12146a3857c28b8c0fc96c2fa68a2ae40deJorim Jaggi setHidden(!visible); 122879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi // Need to do a layout to ensure the wallpaper now has the correct size. 123879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi mDisplayContent.setLayoutNeeded(); 124879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 125879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 126f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale final DisplayInfo displayInfo = mDisplayContent.getDisplayInfo(); 127f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale final int dw = displayInfo.logicalWidth; 128f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale final int dh = displayInfo.logicalHeight; 129879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WallpaperController wallpaperController = mDisplayContent.mWallpaperController; 130879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { 131879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WindowState wallpaper = mChildren.get(wallpaperNdx); 132879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 133879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi if (visible) { 134879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, false); 135879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 136879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 137879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi // First, make sure the client has the current visibility state. 138879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi wallpaper.dispatchWallpaperVisibility(visible); 139879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 140879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi if (DEBUG_LAYERS || DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, "adjustWallpaper win " 141879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi + wallpaper + " anim layer: " + wallpaper.mWinAnimator.mAnimLayer); 142879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 143879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 144879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 145879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi boolean hasVisibleNotDrawnWallpaper() { 146879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi for (int j = mChildren.size() - 1; j >= 0; --j) { 147879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WindowState wallpaper = mChildren.get(j); 148879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi if (wallpaper.hasVisibleNotDrawnWallpaper()) { 149879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi return true; 150879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 151879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 152879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi return false; 153879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 154879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 155879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi @Override 156879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi public String toString() { 157879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi if (stringName == null) { 158879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi StringBuilder sb = new StringBuilder(); 159879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi sb.append("WallpaperWindowToken{"); 160879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi sb.append(Integer.toHexString(System.identityHashCode(this))); 161879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi sb.append(" token="); sb.append(token); sb.append('}'); 162879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi stringName = sb.toString(); 163879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 164879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi return stringName; 165879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 166879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi} 167