1、frameworks\base\packages\SystemUI\res\values\config.xml
这里是去下拉栏去加一个点击框
internet,bt,dnd,alarm,airplane,controls,rotation,battery,superbattery,cast,screenrecord,mictoggle,cameratoggle,location,hotspot,inversion,saver,dark,work,night,reverse,reduce_brightness,color_correction,font_scaling,record_issue,hearing_devices,readingmode
2、frameworks\base\packages\SystemUI\res\values\strings.xml
加入名称
<string name="bv_qs_tile_read_mode">read mode</string>
3、frameworks\base\packages\SystemUI\src\com\android\systemui\qs\tiles\ReadingModeTile.java
修改打开阅读模式和不开阅读模式的场景
package com.bv.systemui.qs.tiles;
import android.content.Intent;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
import android.service.quicksettings.Tile;
import android.util.Log;
import android.view.View;
import androidx.annotation.Nullable;
import com.android.internal.logging.MetricsLogger;
import com.android.systemui.animation.Expandable;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.qs.QSTile;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.QsEventLogger;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.res.R;
import javax.inject.Inject;
import android.content.ContentResolver;
public class ReadingModeTile extends QSTileImpl<QSTile.BooleanState> {
public static final String TILE_SPEC = "readingmode";
private static final String TAG = "ReadingModeTile";
// private static final String READING_MODE_KEY = "bv_reading_mode";
private final Uri SETTINGS_URI = Settings.System.getUriFor(Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED);
private SettingObserver mSettingObserver;
static final int SETTING_VALUE_OFF = 0;
static final int SETTING_VALUE_ON = 1;
private final class SettingObserver extends ContentObserver {
public SettingObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
handleRefreshState(isReadingMode());
}
}
@Inject
public ReadingModeTile(
QSHost host,
QsEventLogger uiEventLogger,
@Background Looper backgroundLooper,
@Main Handler mainHandler,
FalsingManager falsingManager,
MetricsLogger metricsLogger,
StatusBarStateController statusBarStateController,
ActivityStarter activityStarter,
QSLogger qsLogger
) {
super(host, uiEventLogger, backgroundLooper, mainHandler, falsingManager, metricsLogger,
statusBarStateController, activityStarter, qsLogger);
mSettingObserver = new SettingObserver(new Handler(mContext.getMainLooper()));
}
@Override
public boolean isAvailable() {
return true;
}
@Override
protected void handleSetListening(boolean listening) {
super.handleSetListening(listening);
try {
if (listening) {
mContext.getContentResolver().registerContentObserver(SETTINGS_URI, false, mSettingObserver);
} else {
mContext.getContentResolver().unregisterContentObserver(mSettingObserver);
}
} catch (Exception e) {
Log.i(TAG, "[handleSetListening]get exception");
}
}
@Override
public BooleanState newTileState() {
BooleanState state = new BooleanState();
state.handlesLongClick = false;
return state;
}
@Override
protected void handleClick(@Nullable Expandable expandable) {
setReadingMode(!isReadingMode());
}
@Override
protected void handleLongClick(@Nullable Expandable expandable) {
handleClick(expandable);
}
@Override
protected void handleUpdateState(BooleanState state, Object arg) {
state.value = isReadingMode();
Log.i(TAG, "[handleUpdateState]state.value=" + state.value);
state.label = mContext.getString(R.string.bv_qs_tile_read_mode);
state.icon = ResourceIcon.get(R.drawable.ic_add);
state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
state.contentDescription = mContext.getString(R.string.bv_qs_tile_read_mode);
}
@Override
public int getMetricsCategory() {
return 0;
}
@Override
public Intent getLongClickIntent() {
return new Intent(Settings.ACTION_DISPLAY_SETTINGS);
}
@Override
public CharSequence getTileLabel() {
return getState().label;
}
private boolean isReadingMode() {
final ContentResolver cr = mContext.getContentResolver();
final boolean enabled = Settings.Secure.getInt(
cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, SETTING_VALUE_OFF)
!= SETTING_VALUE_OFF;
return enabled;
}
private void setReadingMode(boolean bool) {
final ContentResolver cr = mContext.getContentResolver();
// final int newMode = Integer.parseInt(value.toString());
if (!bool) {
Settings.Secure.putInt(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
SETTING_VALUE_OFF);
} else {
Settings.Secure.putInt(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
SETTING_VALUE_ON);
Settings.Secure.putInt(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, 0);
}
}
}
4、packages\apps\Settings\res\values\strings.xml
设置中加入阅读模式的翻译
<string name="bv_read_mode">"Reading Mode"</string>
5、packages\apps\Settings\res\xml\display_settings.xml
设置中显示里面加入阅读模式
<SwitchPreferenceCompat
android:key="reading_mode"
android:title="@string/bv_read_mode"
settings:controller="com.android.settings.display.ReadingModePreferenceController"
settings:keywords="@string/bv_read_mode"/>
6、packages\apps\Settings\src\com\android\settings\display\ReadingModePreferenceController.java
阅读模式获取的点击事件
/*
* Copyright (C) 2016 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.settings.display;
import android.content.Context;
import android.content.ContentResolver;
import android.hardware.display.ColorDisplayManager;
import android.hardware.display.NightDisplayListener;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import android.provider.Settings;
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
import androidx.preference.SwitchPreferenceCompat;
/** A controller can control the behavior of night display setting. */
public class ReadingModePreferenceController extends TogglePreferenceController{
private SwitchPreferenceCompat mPreference;
static final int SETTING_VALUE_OFF = 0;
static final int SETTING_VALUE_ON = 1;
public ReadingModePreferenceController(Context context, String key) {
super(context, key);
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey());
}
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
}
@Override
public boolean isChecked() {
final ContentResolver cr = mContext.getContentResolver();
final boolean enabled = Settings.Secure.getInt(
cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, SETTING_VALUE_OFF)
!= SETTING_VALUE_OFF;
return enabled;
}
@Override
public boolean setChecked(boolean isChecked) {
writeSimulateColorSpace(isChecked);
return true;
}
private void writeSimulateColorSpace(boolean bool) {
final ContentResolver cr = mContext.getContentResolver();
// final int newMode = Integer.parseInt(value.toString());
if (!bool) {
Settings.Secure.putInt(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
SETTING_VALUE_OFF);
} else {
Settings.Secure.putInt(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
SETTING_VALUE_ON);
Settings.Secure.putInt(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, 0);
}
}
@Override
public int getSliceHighlightMenuRes() {
return R.string.menu_key_display;
}
public void onActivated(boolean activated) {
updateState(mPreference);
}
}