Android 15加入阅读模式

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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值