Merge "Added foundation for supporting unit tests in WindowManager"

This commit is contained in:
TreeHugger Robot
2016-07-19 05:22:24 +00:00
committed by Android (Google) Code Review
7 changed files with 762 additions and 34 deletions

View File

@@ -30,6 +30,7 @@ import android.app.ActivityManager.StackId;
import android.graphics.Rect;
import android.graphics.Region;
import android.graphics.Region.Op;
import android.hardware.display.DisplayManagerInternal;
import android.util.DisplayMetrics;
import android.util.Slog;
import android.view.Display;
@@ -197,12 +198,15 @@ class DisplayContent {
}
void initializeDisplayBaseInfo() {
// Bootstrap the default logical display from the display manager.
final DisplayInfo newDisplayInfo =
mService.mDisplayManagerInternal.getDisplayInfo(mDisplayId);
if (newDisplayInfo != null) {
mDisplayInfo.copyFrom(newDisplayInfo);
final DisplayManagerInternal displayManagerInternal = mService.mDisplayManagerInternal;
if (displayManagerInternal != null) {
// Bootstrap the default logical display from the display manager.
final DisplayInfo newDisplayInfo = displayManagerInternal.getDisplayInfo(mDisplayId);
if (newDisplayInfo != null) {
mDisplayInfo.copyFrom(newDisplayInfo);
}
}
mBaseDisplayWidth = mInitialDisplayWidth = mDisplayInfo.logicalWidth;
mBaseDisplayHeight = mInitialDisplayHeight = mDisplayInfo.logicalHeight;
mBaseDisplayDensity = mInitialDisplayDensity = mDisplayInfo.logicalDensityDpi;

View File

@@ -389,7 +389,7 @@ public class WindowManagerService extends IWindowManager.Stub
final boolean mLimitedAlphaCompositing;
final WindowManagerPolicy mPolicy = new PhoneWindowManager();
final WindowManagerPolicy mPolicy;
final IActivityManager mActivityManager;
final ActivityManagerInternal mAmInternal;
@@ -925,14 +925,11 @@ public class WindowManagerService extends IWindowManager.Stub
public static WindowManagerService main(final Context context,
final InputManagerService im,
final boolean haveInputMethods, final boolean showBootMsgs,
final boolean onlyCore) {
final boolean onlyCore, WindowManagerPolicy policy) {
final WindowManagerService[] holder = new WindowManagerService[1];
DisplayThread.getHandler().runWithScissors(new Runnable() {
@Override
public void run() {
holder[0] = new WindowManagerService(context, im,
haveInputMethods, showBootMsgs, onlyCore);
}
DisplayThread.getHandler().runWithScissors(() -> {
holder[0] = new WindowManagerService(context, im, haveInputMethods, showBootMsgs,
onlyCore, policy);
}, 0);
return holder[0];
}
@@ -949,7 +946,8 @@ public class WindowManagerService extends IWindowManager.Stub
}
private WindowManagerService(Context context, InputManagerService inputManager,
boolean haveInputMethods, boolean showBootMsgs, boolean onlyCore) {
boolean haveInputMethods, boolean showBootMsgs, boolean onlyCore,
WindowManagerPolicy policy) {
mContext = context;
mHaveInputMethods = haveInputMethods;
mAllowBootMessages = showBootMsgs;
@@ -972,10 +970,12 @@ public class WindowManagerService extends IWindowManager.Stub
mWallpaperControllerLocked = new WallpaperController(this);
mWindowPlacerLocked = new WindowSurfacePlacer(this);
mLayersController = new WindowLayersController(this);
mPolicy = policy;
LocalServices.addService(WindowManagerPolicy.class, mPolicy);
mPointerEventDispatcher = new PointerEventDispatcher(mInputManager.monitorInput(TAG_WM));
mPointerEventDispatcher = mInputManager != null
? new PointerEventDispatcher(mInputManager.monitorInput(TAG_WM)) : null;
mFxSession = new SurfaceSession();
mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
@@ -988,19 +988,18 @@ public class WindowManagerService extends IWindowManager.Stub
mPowerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
mPowerManagerInternal.registerLowPowerModeObserver(
new PowerManagerInternal.LowPowerModeListener() {
@Override
public void onLowPowerModeChanged(boolean enabled) {
if (mPowerManagerInternal != null) {
mPowerManagerInternal.registerLowPowerModeObserver((enabled) -> {
synchronized (mWindowMap) {
if (mAnimationsDisabled != enabled && !mAllowAnimationsInLowPowerMode) {
mAnimationsDisabled = enabled;
dispatchNewAnimatorScaleLocked(null);
}
}
}
});
mAnimationsDisabled = mPowerManagerInternal.getLowPowerModeEnabled();
});
mAnimationsDisabled = mPowerManagerInternal.getLowPowerModeEnabled();
}
mScreenFrozenLock = mPowerManager.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, "SCREEN_FROZEN");
mScreenFrozenLock.setReferenceCounted(false);
@@ -2032,8 +2031,8 @@ public class WindowManagerService extends IWindowManager.Stub
addToken = true;
}
WindowState win = new WindowState(this, session, client, token,
attachedWindow, appOp[0], seq, attrs, viewVisibility, displayContent);
WindowState win = new WindowState(this, session, client, token, attachedWindow,
appOp[0], seq, attrs, viewVisibility, displayContent, session.mUid);
if (win.mDeathRecipient == null) {
// Client has apparently died, so there is no reason to
// continue.
@@ -10808,14 +10807,16 @@ public class WindowManagerService extends IWindowManager.Stub
displayInfo.overscanTop = rect.top;
displayInfo.overscanRight = rect.right;
displayInfo.overscanBottom = rect.bottom;
mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager(displayId, displayInfo);
configureDisplayPolicyLocked(displayContent);
if (mDisplayManagerInternal != null) {
mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager(displayId, displayInfo);
configureDisplayPolicyLocked(displayContent);
// TODO: Create an input channel for each display with touch capability.
if (displayId == Display.DEFAULT_DISPLAY) {
displayContent.mTapDetector = new TaskTapPointerEventListener(this, displayContent);
registerPointerEventListener(displayContent.mTapDetector);
registerPointerEventListener(mMousePositionTracker);
// TODO: Create an input channel for each display with touch capability.
if (displayId == Display.DEFAULT_DISPLAY) {
displayContent.mTapDetector = new TaskTapPointerEventListener(this, displayContent);
registerPointerEventListener(displayContent.mTapDetector);
registerPointerEventListener(mMousePositionTracker);
}
}
return displayContent;

View File

@@ -505,13 +505,13 @@ final class WindowState implements WindowManagerPolicy.WindowState {
WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token,
WindowState parentWindow, int appOp, int seq, WindowManager.LayoutParams a,
int viewVisibility, final DisplayContent displayContent) {
int viewVisibility, final DisplayContent displayContent, int ownerId) {
mService = service;
mSession = s;
mClient = c;
mAppOp = appOp;
mToken = token;
mOwnerUid = s.mUid;
mOwnerUid = ownerId;
mWindowId = new IWindowId.Stub() {
@Override
public void registerFocusObserver(IWindowFocusObserver observer) {

View File

@@ -86,6 +86,7 @@ import com.android.server.pm.OtaDexoptService;
import com.android.server.pm.PackageManagerService;
import com.android.server.pm.ShortcutService;
import com.android.server.pm.UserManagerService;
import com.android.server.policy.PhoneWindowManager;
import com.android.server.power.PowerManagerService;
import com.android.server.power.ShutdownThread;
import com.android.server.restrictions.RestrictionsManagerService;
@@ -616,7 +617,7 @@ public final class SystemServer {
traceBeginAndSlog("StartWindowManagerService");
wm = WindowManagerService.main(context, inputManager,
mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
!mFirstBoot, mOnlyCore);
!mFirstBoot, mOnlyCore, new PhoneWindowManager());
ServiceManager.addService(Context.WINDOW_SERVICE, wm);
ServiceManager.addService(Context.INPUT_SERVICE, inputManager);
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);

View File

@@ -0,0 +1,110 @@
/*
* 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 com.android.internal.os.IResultReceiver;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.view.DragEvent;
import android.view.IWindow;
public class TestIWindow extends IWindow.Stub {
@Override
public void executeCommand(String command, String parameters,
ParcelFileDescriptor descriptor)
throws RemoteException {
}
@Override
public void resized(Rect frame, Rect overscanInsets, Rect contentInsets, Rect visibleInsets,
Rect stableInsets, Rect outsets, boolean reportDraw, Configuration newConfig,
Rect backDropFrame, boolean forceLayout, boolean alwaysConsumeNavBar)
throws RemoteException {
}
@Override
public void moved(int newX, int newY) throws RemoteException {
}
@Override
public void dispatchAppVisibility(boolean visible) throws RemoteException {
}
@Override
public void dispatchGetNewSurface() throws RemoteException {
}
@Override
public void windowFocusChanged(boolean hasFocus, boolean inTouchMode)
throws RemoteException {
}
@Override
public void closeSystemDialogs(String reason) throws RemoteException {
}
@Override
public void dispatchWallpaperOffsets(float x, float y, float xStep, float yStep,
boolean sync)
throws RemoteException {
}
@Override
public void dispatchWallpaperCommand(String action, int x, int y, int z, Bundle extras,
boolean sync) throws RemoteException {
}
@Override
public void dispatchDragEvent(DragEvent event) throws RemoteException {
}
@Override
public void updatePointerIcon(float x, float y) throws RemoteException {
}
@Override
public void dispatchSystemUiVisibilityChanged(int seq, int globalVisibility, int localValue,
int localChanges) throws RemoteException {
}
@Override
public void dispatchWindowShown() throws RemoteException {
}
@Override
public void requestAppKeyboardShortcuts(IResultReceiver receiver, int deviceId)
throws RemoteException {
}
}

View File

@@ -0,0 +1,555 @@
/*
* 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 com.android.internal.policy.IShortcutService;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.Display;
import android.view.IWindowManager;
import android.view.KeyEvent;
import android.view.Surface;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManagerPolicy;
import android.view.animation.Animation;
import java.io.PrintWriter;
public class TestWindowManagerPolicy implements WindowManagerPolicy {
@Override
public void registerShortcutKey(long shortcutCode, IShortcutService shortcutKeyReceiver)
throws RemoteException {
}
@Override
public void init(Context context, IWindowManager windowManager,
WindowManagerFuncs windowManagerFuncs) {
}
@Override
public boolean isDefaultOrientationForced() {
return false;
}
@Override
public void setInitialDisplaySize(Display display, int width, int height, int density) {
}
@Override
public void setDisplayOverscan(Display display, int left, int top, int right, int bottom) {
}
@Override
public int checkAddPermission(WindowManager.LayoutParams attrs, int[] outAppOp) {
return 0;
}
@Override
public boolean checkShowToOwnerOnly(WindowManager.LayoutParams attrs) {
return false;
}
@Override
public void adjustWindowParamsLw(WindowManager.LayoutParams attrs) {
}
@Override
public void adjustConfigurationLw(Configuration config, int keyboardPresence,
int navigationPresence) {
}
@Override
public int windowTypeToLayerLw(int type) {
return 0;
}
@Override
public int subWindowTypeToLayerLw(int type) {
return 0;
}
@Override
public int getMaxWallpaperLayer() {
return 0;
}
@Override
public int getNonDecorDisplayWidth(int fullWidth, int fullHeight, int rotation, int uiMode) {
return 0;
}
@Override
public int getNonDecorDisplayHeight(int fullWidth, int fullHeight, int rotation, int uiMode) {
return 0;
}
@Override
public int getConfigDisplayWidth(int fullWidth, int fullHeight, int rotation, int uiMode) {
return 0;
}
@Override
public int getConfigDisplayHeight(int fullWidth, int fullHeight, int rotation, int uiMode) {
return 0;
}
@Override
public boolean isForceHiding(WindowManager.LayoutParams attrs) {
return false;
}
@Override
public boolean isKeyguardHostWindow(WindowManager.LayoutParams attrs) {
return false;
}
@Override
public boolean canBeForceHidden(WindowState win,
WindowManager.LayoutParams attrs) {
return false;
}
@Override
public WindowState getWinShowWhenLockedLw() {
return null;
}
@Override
public View addStartingWindow(IBinder appToken, String packageName, int theme,
CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon,
int logo, int windowFlags, Configuration overrideConfig) {
return null;
}
@Override
public void removeStartingWindow(IBinder appToken, View window) {
}
@Override
public int prepareAddWindowLw(WindowState win,
WindowManager.LayoutParams attrs) {
return 0;
}
@Override
public void removeWindowLw(WindowState win) {
}
@Override
public int selectAnimationLw(WindowState win, int transit) {
return 0;
}
@Override
public void selectRotationAnimationLw(int[] anim) {
}
@Override
public boolean validateRotationAnimationLw(int exitAnimId, int enterAnimId,
boolean forceDefault) {
return false;
}
@Override
public Animation createForceHideEnterAnimation(boolean onWallpaper,
boolean goingToNotificationShade) {
return null;
}
@Override
public Animation createForceHideWallpaperExitAnimation(boolean goingToNotificationShade) {
return null;
}
@Override
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
return 0;
}
@Override
public int interceptMotionBeforeQueueingNonInteractive(long whenNanos, int policyFlags) {
return 0;
}
@Override
public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event,
int policyFlags) {
return 0;
}
@Override
public KeyEvent dispatchUnhandledKey(WindowState win, KeyEvent event,
int policyFlags) {
return null;
}
@Override
public void beginLayoutLw(boolean isDefaultDisplay, int displayWidth, int displayHeight,
int displayRotation, int uiMode) {
}
@Override
public int getSystemDecorLayerLw() {
return 0;
}
@Override
public void getContentRectLw(Rect r) {
}
@Override
public void layoutWindowLw(WindowState win,
WindowState attached) {
}
@Override
public boolean getInsetHintLw(WindowManager.LayoutParams attrs, Rect taskBounds,
int displayRotation, int displayWidth, int displayHeight, Rect outContentInsets,
Rect outStableInsets, Rect outOutsets) {
return false;
}
@Override
public void finishLayoutLw() {
}
@Override
public void beginPostLayoutPolicyLw(int displayWidth, int displayHeight) {
}
@Override
public void applyPostLayoutPolicyLw(WindowState win,
WindowManager.LayoutParams attrs, WindowState attached) {
}
@Override
public int finishPostLayoutPolicyLw() {
return 0;
}
@Override
public boolean allowAppAnimationsLw() {
return false;
}
@Override
public int focusChangedLw(WindowState lastFocus,
WindowState newFocus) {
return 0;
}
@Override
public void startedWakingUp() {
}
@Override
public void finishedWakingUp() {
}
@Override
public void startedGoingToSleep(int why) {
}
@Override
public void finishedGoingToSleep(int why) {
}
@Override
public void screenTurningOn(ScreenOnListener screenOnListener) {
}
@Override
public void screenTurnedOn() {
}
@Override
public void screenTurnedOff() {
}
@Override
public boolean isScreenOn() {
return false;
}
@Override
public void notifyLidSwitchChanged(long whenNanos, boolean lidOpen) {
}
@Override
public void notifyCameraLensCoverSwitchChanged(long whenNanos, boolean lensCovered) {
}
@Override
public void enableKeyguard(boolean enabled) {
}
@Override
public void exitKeyguardSecurely(OnKeyguardExitResult callback) {
}
@Override
public boolean isKeyguardLocked() {
return false;
}
@Override
public boolean isKeyguardSecure(int userId) {
return false;
}
@Override
public boolean isKeyguardShowingOrOccluded() {
return false;
}
@Override
public boolean isKeyguardShowingAndNotOccluded() {
return false;
}
@Override
public boolean inKeyguardRestrictedKeyInputMode() {
return false;
}
@Override
public void dismissKeyguardLw() {
}
@Override
public void notifyActivityDrawnForKeyguardLw() {
}
@Override
public boolean isKeyguardDrawnLw() {
return false;
}
@Override
public int rotationForOrientationLw(int orientation,
int lastRotation) {
return 0;
}
@Override
public boolean rotationHasCompatibleMetricsLw(int orientation,
int rotation) {
return false;
}
@Override
public void setRotationLw(int rotation) {
}
@Override
public void setSafeMode(boolean safeMode) {
}
@Override
public void systemReady() {
}
@Override
public void systemBooted() {
}
@Override
public void showBootMessage(CharSequence msg, boolean always) {
}
@Override
public void hideBootMessages() {
}
@Override
public void userActivity() {
}
@Override
public void enableScreenAfterBoot() {
}
@Override
public void setCurrentOrientationLw(int newOrientation) {
}
@Override
public boolean performHapticFeedbackLw(WindowState win, int effectId,
boolean always) {
return false;
}
@Override
public void keepScreenOnStartedLw() {
}
@Override
public void keepScreenOnStoppedLw() {
}
@Override
public int getUserRotationMode() {
return 0;
}
@Override
public void setUserRotationMode(int mode,
int rotation) {
}
@Override
public int adjustSystemUiVisibilityLw(int visibility) {
return 0;
}
@Override
public boolean hasNavigationBar() {
return false;
}
@Override
public void lockNow(Bundle options) {
}
@Override
public void setLastInputMethodWindowLw(WindowState ime,
WindowState target) {
}
@Override
public void showRecentApps(boolean fromHome) {
}
@Override
public void showGlobalActions() {
}
@Override
public int getInputMethodWindowVisibleHeightLw() {
return 0;
}
@Override
public void setCurrentUserLw(int newUserId) {
}
@Override
public void dump(String prefix, PrintWriter writer, String[] args) {
}
@Override
public boolean canMagnifyWindow(int windowType) {
return false;
}
@Override
public boolean isTopLevelWindow(int windowType) {
return false;
}
@Override
public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) {
}
@Override
public void getStableInsetsLw(int displayRotation, int displayWidth, int displayHeight,
Rect outInsets) {
}
@Override
public boolean isNavBarForcedShownLw(WindowState win) {
return false;
}
@Override
public void getNonDecorInsetsLw(int displayRotation, int displayWidth, int displayHeight,
Rect outInsets) {
}
@Override
public boolean isDockSideAllowed(int dockSide) {
return false;
}
@Override
public void onConfigurationChanged() {
}
@Override
public boolean shouldRotateSeamlessly(int oldRotation, int newRotation) {
return false;
}
}

View File

@@ -0,0 +1,57 @@
/*
* 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 android.content.Context;
import android.test.AndroidTestCase;
import android.view.IWindow;
import android.view.WindowManager;
import android.view.WindowManagerPolicy;
import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
/**
* Tests for the {@link WindowState} class.
*
* Build: mmma -j32 frameworks/base/services/tests/servicestests
* Install: adb install -r out/target/product/angler/data/app/FrameworksServicesTests/FrameworksServicesTests.apk
* Run: adb shell am instrument -w -e class com.android.server.wm.WindowStateTests com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
*/
public class WindowStateTests extends AndroidTestCase {
private WindowManagerService mWm;
private WindowToken mWindowToken;
private final WindowManagerPolicy mPolicy = new TestWindowManagerPolicy();
private final IWindow mIWindow = new TestIWindow();
@Override
public void setUp() throws Exception {
final Context context = getContext();
// final InputManagerService im = new InputManagerService(context);
mWm = WindowManagerService.main(context, /*im*/ null, true, false, false, mPolicy);
mWindowToken = new WindowToken(mWm, null, 0, false);
}
private WindowState createWindow(WindowState parent) {
final int type = (parent == null) ? TYPE_APPLICATION : FIRST_SUB_WINDOW;
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(type);
return new WindowState(mWm, null, mIWindow, mWindowToken, parent, 0, 0, attrs, 0,
mWm.getDefaultDisplayContentLocked(), 0);
}
}