/* * 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 com.android.systemui.accessibility; import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY; import static com.android.systemui.accessibility.MagnificationModeSwitch.ClickListener; import android.annotation.MainThread; import android.content.Context; import android.hardware.display.DisplayManager; import android.view.Display; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.dagger.SysUISingleton; import javax.inject.Inject; /** * A class to control {@link MagnificationModeSwitch}. It shows the button UI with following * conditions: * <ol> * <li> Both full-screen and window magnification mode are capable.</li> * <li> The magnification scale is changed by a user.</li> * <ol> * The click action will be handled by {@link #mClickListenerDelegate} which opens the * {@link WindowMagnificationSettings} panel. */ @SysUISingleton public class ModeSwitchesController implements ClickListener { private final DisplayIdIndexSupplier<MagnificationModeSwitch> mSwitchSupplier; private ClickListener mClickListenerDelegate; @Inject public ModeSwitchesController(Context context, DisplayManager displayManager) { mSwitchSupplier = new SwitchSupplier(context, displayManager, this::onClick); } @VisibleForTesting ModeSwitchesController(DisplayIdIndexSupplier<MagnificationModeSwitch> switchSupplier) { mSwitchSupplier = switchSupplier; } /** * Shows a button that a user can click to switch magnification mode. And the button * would be dismissed automatically after the button is displayed for a period of time. * * @param displayId The logical display id * @param mode The magnification mode * @see android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW * @see android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN */ @MainThread void showButton(int displayId, int mode) { final MagnificationModeSwitch magnificationModeSwitch = mSwitchSupplier.get(displayId); if (magnificationModeSwitch == null) { return; } magnificationModeSwitch.showButton(mode); } /** * Removes magnification mode switch button immediately. * * @param displayId The logical display id */ void removeButton(int displayId) { final MagnificationModeSwitch magnificationModeSwitch = mSwitchSupplier.get(displayId); if (magnificationModeSwitch == null) { return; } magnificationModeSwitch.removeButton(); } /** * Called when the configuration has changed, and it updates magnification button UI. * * @param configDiff a bit mask of the differences between the configurations */ @MainThread void onConfigurationChanged(int configDiff) { mSwitchSupplier.forEach( switchController -> switchController.onConfigurationChanged(configDiff)); } @Override public void onClick(int displayId) { if (mClickListenerDelegate != null) { mClickListenerDelegate.onClick(displayId); } } public void setClickListenerDelegate(ClickListener clickListenerDelegate) { mClickListenerDelegate = clickListenerDelegate; } private static class SwitchSupplier extends DisplayIdIndexSupplier<MagnificationModeSwitch> { private final Context mContext; private final ClickListener mClickListener; /** * Supplies the switch for the given display. * * @param context Context * @param displayManager DisplayManager * @param clickListener The callback that will run when the switch is clicked */ SwitchSupplier(Context context, DisplayManager displayManager, ClickListener clickListener) { super(displayManager); mContext = context; mClickListener = clickListener; } @Override protected MagnificationModeSwitch createInstance(Display display) { final Context uiContext = mContext.createWindowContext(display, TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY, /* options */ null); return new MagnificationModeSwitch(uiContext, mClickListener); } } }