aboutsummaryrefslogtreecommitdiff
path: root/bridge/src/android/view/WindowManagerImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'bridge/src/android/view/WindowManagerImpl.java')
-rw-r--r--bridge/src/android/view/WindowManagerImpl.java174
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;
+ }
+}