blob: c3bb423e5e4e413b78bf397d184c291494376459 [file] [log] [blame]
/*
* Copyright (C) 2023 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 com.android.systemui.accessibility.WindowMagnificationSettings.MagnificationSize;
import android.annotation.NonNull;
import android.annotation.UiContext;
import android.content.ComponentCallbacks;
import android.content.Context;
import android.content.res.Configuration;
import android.util.Range;
import android.view.WindowManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.graphics.SfVsyncFrameCallbackProvider;
import com.android.systemui.util.settings.SecureSettings;
/**
* A class to control {@link WindowMagnificationSettings} and receive settings panel callbacks by
* {@link WindowMagnificationSettingsCallback}.
* The settings panel callbacks will be delegated through
* {@link MagnificationSettingsController.Callback} to {@link WindowMagnification}.
*/
public class MagnificationSettingsController implements ComponentCallbacks {
// It should be consistent with the value defined in WindowMagnificationGestureHandler.
private static final Range<Float> A11Y_ACTION_SCALE_RANGE = new Range<>(1.0f, 8.0f);
private final Context mContext;
private final int mDisplayId;
@NonNull
private final Callback mSettingsControllerCallback;
// Window Magnification Setting view
private WindowMagnificationSettings mWindowMagnificationSettings;
private final Configuration mConfiguration;
MagnificationSettingsController(
@UiContext Context context,
SfVsyncFrameCallbackProvider sfVsyncFrameProvider,
@NonNull Callback settingsControllerCallback,
SecureSettings secureSettings) {
this(context, sfVsyncFrameProvider, settingsControllerCallback, secureSettings, null);
}
@VisibleForTesting
MagnificationSettingsController(
@UiContext Context context,
SfVsyncFrameCallbackProvider sfVsyncFrameProvider,
@NonNull Callback settingsControllerCallback,
SecureSettings secureSettings,
WindowMagnificationSettings windowMagnificationSettings) {
mContext = context.createWindowContext(
context.getDisplay(),
WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
null);
mContext.setTheme(com.android.systemui.R.style.Theme_SystemUI);
mDisplayId = mContext.getDisplayId();
mConfiguration = new Configuration(mContext.getResources().getConfiguration());
mSettingsControllerCallback = settingsControllerCallback;
if (windowMagnificationSettings != null) {
mWindowMagnificationSettings = windowMagnificationSettings;
} else {
mWindowMagnificationSettings = new WindowMagnificationSettings(mContext,
mWindowMagnificationSettingsCallback,
sfVsyncFrameProvider, secureSettings);
}
}
/**
* Shows magnification settings panel {@link WindowMagnificationSettings}.
*/
void showMagnificationSettings() {
if (!mWindowMagnificationSettings.isSettingPanelShowing()) {
onConfigurationChanged(mContext.getResources().getConfiguration());
mContext.registerComponentCallbacks(this);
}
mWindowMagnificationSettings.showSettingPanel();
}
void closeMagnificationSettings() {
mContext.unregisterComponentCallbacks(this);
mWindowMagnificationSettings.hideSettingPanel();
}
boolean isMagnificationSettingsShowing() {
return mWindowMagnificationSettings.isSettingPanelShowing();
}
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
final int configDiff = newConfig.diff(mConfiguration);
mConfiguration.setTo(newConfig);
onConfigurationChanged(configDiff);
}
@VisibleForTesting
void onConfigurationChanged(int configDiff) {
mWindowMagnificationSettings.onConfigurationChanged(configDiff);
}
@Override
public void onLowMemory() {
}
interface Callback {
/**
* Called when change magnification size.
*
* @param displayId The logical display id.
* @param index Magnification size index.
* 0 : MagnificationSize.NONE,
* 1 : MagnificationSize.SMALL,
* 2 : MagnificationSize.MEDIUM,
* 3 : MagnificationSize.LARGE,
* 4 : MagnificationSize.FULLSCREEN
*/
void onSetMagnifierSize(int displayId, @MagnificationSize int index);
/**
* Called when set allow diagonal scrolling.
*
* @param displayId The logical display id.
* @param enable Allow diagonal scrolling enable value.
*/
void onSetDiagonalScrolling(int displayId, boolean enable);
/**
* Called when change magnification size on free mode.
*
* @param displayId The logical display id.
* @param enable Free mode enable value.
*/
void onEditMagnifierSizeMode(int displayId, boolean enable);
/**
* Called when set magnification scale.
*
* @param displayId The logical display id.
* @param scale Magnification scale value.
*/
void onMagnifierScale(int displayId, float scale);
/**
* Called when magnification mode changed.
*
* @param displayId The logical display id.
* @param newMode Magnification mode
* 1 : ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN,
* 2 : ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW
*/
void onModeSwitch(int displayId, int newMode);
/**
* Called when the visibility of the magnification settings panel changed.
*
* @param displayId The logical display id.
* @param shown The visibility of the magnification settings panel.
*/
void onSettingsPanelVisibilityChanged(int displayId, boolean shown);
}
@VisibleForTesting
final WindowMagnificationSettingsCallback mWindowMagnificationSettingsCallback =
new WindowMagnificationSettingsCallback() {
@Override
public void onSetDiagonalScrolling(boolean enable) {
mSettingsControllerCallback.onSetDiagonalScrolling(mDisplayId, enable);
}
@Override
public void onModeSwitch(int newMode) {
mSettingsControllerCallback.onModeSwitch(mDisplayId, newMode);
}
@Override
public void onSettingsPanelVisibilityChanged(boolean shown) {
mSettingsControllerCallback.onSettingsPanelVisibilityChanged(mDisplayId, shown);
}
@Override
public void onSetMagnifierSize(@MagnificationSize int index) {
mSettingsControllerCallback.onSetMagnifierSize(mDisplayId, index);
}
@Override
public void onEditMagnifierSizeMode(boolean enable) {
mSettingsControllerCallback.onEditMagnifierSizeMode(mDisplayId, enable);
}
@Override
public void onMagnifierScale(float scale) {
mSettingsControllerCallback.onMagnifierScale(mDisplayId,
A11Y_ACTION_SCALE_RANGE.clamp(scale));
}
};
}