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.PRIVATE_FLAG_KEYGUARD; 20879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; 21879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE; 22879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYERS; 23879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT; 24879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_MOVEMENT; 25879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; 26879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; 27879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 28879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport android.os.Bundle; 29879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport android.os.IBinder; 30879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport android.os.RemoteException; 31879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport android.util.Slog; 32879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport android.view.DisplayInfo; 33879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiimport android.view.animation.Animation; 34879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 35879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi/** 36879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi * A token that represents a set of wallpaper windows. 37879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi */ 38879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggiclass WallpaperWindowToken extends WindowToken { 39879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 40879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi private static final String TAG = TAG_WITH_CLASS_NAME ? "WallpaperWindowToken" : TAG_WM; 41879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 42879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi WallpaperWindowToken(WindowManagerService service, IBinder token, boolean explicit, 435cd907d3d6ceebf8731ef1f69347cce6f76109e9Wale Ogunwale DisplayContent dc, boolean ownerCanManageAppTokens) { 445cd907d3d6ceebf8731ef1f69347cce6f76109e9Wale Ogunwale super(service, token, TYPE_WALLPAPER, explicit, dc, ownerCanManageAppTokens); 45879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi dc.mWallpaperController.addWallpaperToken(this); 46879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 47879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 48879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi @Override 49879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi void setExiting() { 50879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi super.setExiting(); 51879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi mDisplayContent.mWallpaperController.removeWallpaperToken(this); 52879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 53879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 54879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi void hideWallpaperToken(boolean wasDeferred, String reason) { 55879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi for (int j = mChildren.size() - 1; j >= 0; j--) { 56879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WindowState wallpaper = mChildren.get(j); 57879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi wallpaper.hideWallpaperWindow(wasDeferred, reason); 58879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 59879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi hidden = true; 60879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 61879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 62879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi void sendWindowWallpaperCommand( 63879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi String action, int x, int y, int z, Bundle extras, boolean sync) { 64879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { 65879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WindowState wallpaper = mChildren.get(wallpaperNdx); 66879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi try { 67879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi wallpaper.mClient.dispatchWallpaperCommand(action, x, y, z, extras, sync); 68879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi // We only want to be synchronous with one wallpaper. 69879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi sync = false; 70879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } catch (RemoteException e) { 71879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 72879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 73879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 74879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 75879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi void updateWallpaperOffset(int dw, int dh, boolean sync) { 76879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WallpaperController wallpaperController = mDisplayContent.mWallpaperController; 77879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { 78879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WindowState wallpaper = mChildren.get(wallpaperNdx); 79879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi if (wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, sync)) { 80879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WindowStateAnimator winAnimator = wallpaper.mWinAnimator; 81879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi winAnimator.computeShownFrameLocked(); 82879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi // No need to lay out the windows - we can just set the wallpaper position directly. 83879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi winAnimator.setWallpaperOffset(wallpaper.mShownPosition); 84879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi // We only want to be synchronous with one wallpaper. 85879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi sync = false; 86879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 87879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 88879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 89879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 90879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi void updateWallpaperVisibility(boolean visible) { 91879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final DisplayInfo displayInfo = mDisplayContent.getDisplayInfo(); 92879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final int dw = displayInfo.logicalWidth; 93879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final int dh = displayInfo.logicalHeight; 94879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 95879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi if (hidden == visible) { 96879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi hidden = !visible; 97879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi // Need to do a layout to ensure the wallpaper now has the correct size. 98879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi mDisplayContent.setLayoutNeeded(); 99879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 100879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 101879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WallpaperController wallpaperController = mDisplayContent.mWallpaperController; 102879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { 103879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WindowState wallpaper = mChildren.get(wallpaperNdx); 104879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi if (visible) { 105879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, false); 106879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 107879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 108879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi wallpaper.dispatchWallpaperVisibility(visible); 109879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 110879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 111879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 112879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi /** 113879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi * Starts {@param anim} on all children. 114879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi */ 115879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi void startAnimation(Animation anim) { 116879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi for (int ndx = mChildren.size() - 1; ndx >= 0; ndx--) { 117879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WindowState windowState = mChildren.get(ndx); 118879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi windowState.mWinAnimator.setAnimation(anim); 119879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 120879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 121879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 122f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale void updateWallpaperWindows(boolean visible, int animLayerAdj) { 123879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 124879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi if (hidden == visible) { 125879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi if (DEBUG_WALLPAPER_LIGHT) Slog.d(TAG, 126879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi "Wallpaper token " + token + " hidden=" + !visible); 127879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi hidden = !visible; 128879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi // Need to do a layout to ensure the wallpaper now has the correct size. 129879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi mDisplayContent.setLayoutNeeded(); 130879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 131879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 132f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale final DisplayInfo displayInfo = mDisplayContent.getDisplayInfo(); 133f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale final int dw = displayInfo.logicalWidth; 134f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale final int dh = displayInfo.logicalHeight; 135879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WallpaperController wallpaperController = mDisplayContent.mWallpaperController; 136879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { 137879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WindowState wallpaper = mChildren.get(wallpaperNdx); 138879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 139879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi if (visible) { 140879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, false); 141879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 142879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 143879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi // First, make sure the client has the current visibility state. 144879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi wallpaper.dispatchWallpaperVisibility(visible); 145879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 146879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi if (DEBUG_LAYERS || DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, "adjustWallpaper win " 147879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi + wallpaper + " anim layer: " + wallpaper.mWinAnimator.mAnimLayer); 148879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 149879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 150879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 151879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi boolean hasVisibleNotDrawnWallpaper() { 152879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi for (int j = mChildren.size() - 1; j >= 0; --j) { 153879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi final WindowState wallpaper = mChildren.get(j); 154879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi if (wallpaper.hasVisibleNotDrawnWallpaper()) { 155879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi return true; 156879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 157879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 158879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi return false; 159879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 160879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi 161879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi @Override 162879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi public String toString() { 163879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi if (stringName == null) { 164879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi StringBuilder sb = new StringBuilder(); 165879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi sb.append("WallpaperWindowToken{"); 166879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi sb.append(Integer.toHexString(System.identityHashCode(this))); 167879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi sb.append(" token="); sb.append(token); sb.append('}'); 168879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi stringName = sb.toString(); 169879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 170879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi return stringName; 171879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi } 172879ff721bed9999540c0b03acf4843886b7c3a75Jorim Jaggi} 173