| /* |
| * 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; |
| } |
| } |