diff options
Diffstat (limited to 'bridge/src/android/view/WindowManagerImpl.java')
-rw-r--r-- | bridge/src/android/view/WindowManagerImpl.java | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/bridge/src/android/view/WindowManagerImpl.java b/bridge/src/android/view/WindowManagerImpl.java new file mode 100644 index 0000000000..36b7165c1e --- /dev/null +++ b/bridge/src/android/view/WindowManagerImpl.java @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2020 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 android.view; + +import static android.view.View.SYSTEM_UI_FLAG_VISIBLE; +import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; +import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; + +import android.app.ResourcesManager; +import android.content.Context; +import android.content.res.Configuration; +import android.graphics.Point; +import android.graphics.Rect; +import android.graphics.Region; +import android.os.IBinder; +import android.os.RemoteException; +import android.util.DisplayMetrics; +import android.view.Display.Mode; + +import com.android.ide.common.rendering.api.ILayoutLog; +import com.android.layoutlib.bridge.Bridge; + +public class WindowManagerImpl implements WindowManager { + + private final Context mContext; + private final DisplayMetrics mMetrics; + private final Display mDisplay; + + public WindowManagerImpl(Context context, DisplayMetrics metrics) { + mContext = context; + mMetrics = metrics; + + DisplayInfo info = new DisplayInfo(); + info.logicalHeight = mMetrics.heightPixels; + info.logicalWidth = mMetrics.widthPixels; + info.supportedModes = new Mode[] { + new Mode(0, mMetrics.widthPixels, mMetrics.heightPixels, 60f) + }; + info.logicalDensityDpi = mMetrics.densityDpi; + mDisplay = new Display(null, Display.DEFAULT_DISPLAY, info, + DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS); + } + + public WindowManagerImpl createLocalWindowManager(Window parentWindow) { + Bridge.getLog().fidelityWarning(ILayoutLog.TAG_UNSUPPORTED, + "The preview does not support multiple windows.", + null, null, null); + return this; + } + + public WindowManagerImpl createPresentationWindowManager(Context displayContext) { + Bridge.getLog().fidelityWarning(ILayoutLog.TAG_UNSUPPORTED, + "The preview does not support multiple windows.", + null, null, null); + return this; + } + + /** + * Sets the window token to assign when none is specified by the client or + * available from the parent window. + * + * @param token The default token to assign. + */ + public void setDefaultToken(IBinder token) { + + } + + @Override + public Display getDefaultDisplay() { + return mDisplay; + } + + + @Override + public void addView(View arg0, android.view.ViewGroup.LayoutParams arg1) { + // pass + } + + @Override + public void removeView(View arg0) { + // pass + } + + @Override + public void updateViewLayout(View arg0, android.view.ViewGroup.LayoutParams arg1) { + // pass + } + + + @Override + public void removeViewImmediate(View arg0) { + // pass + } + + @Override + public void requestAppKeyboardShortcuts( + KeyboardShortcutsReceiver receiver, int deviceId) { + } + + @Override + public Region getCurrentImeTouchRegion() { + return null; + } + + @Override + public void setShouldShowWithInsecureKeyguard(int displayId, boolean shouldShow) { + // pass + } + + @Override + public void setShouldShowSystemDecors(int displayId, boolean shouldShow) { + // pass + } + + @Override + public void setDisplayImePolicy(int displayId, int imePolicy) { + // pass + } + + @Override + public WindowMetrics getCurrentWindowMetrics() { + final Rect bound = getCurrentBounds(mContext); + + return new WindowMetrics(bound, computeWindowInsets()); + } + + private static Rect getCurrentBounds(Context context) { + synchronized (ResourcesManager.getInstance()) { + return context.getResources().getConfiguration().windowConfiguration.getBounds(); + } + } + + @Override + public WindowMetrics getMaximumWindowMetrics() { + return new WindowMetrics(getMaximumBounds(), computeWindowInsets()); + } + + private Rect getMaximumBounds() { + final Point displaySize = new Point(); + mDisplay.getRealSize(displaySize); + return new Rect(0, 0, displaySize.x, displaySize.y); + } + + private WindowInsets computeWindowInsets() { + try { + final InsetsState insetsState = new InsetsState(); + final boolean alwaysConsumeSystemBars = + WindowManagerGlobal.getWindowManagerService().getWindowInsets( + new WindowManager.LayoutParams(), mContext.getDisplayId(), insetsState); + final Configuration config = mContext.getResources().getConfiguration(); + final boolean isScreenRound = config.isScreenRound(); + final int windowingMode = config.windowConfiguration.getWindowingMode(); + return insetsState.calculateInsets(getCurrentBounds(mContext), + null /* ignoringVisibilityState*/, isScreenRound, alwaysConsumeSystemBars, + SOFT_INPUT_ADJUST_NOTHING, 0, SYSTEM_UI_FLAG_VISIBLE, TYPE_APPLICATION, + windowingMode, null /* typeSideMap */); + } catch (RemoteException ignore) { + } + return null; + } +} |