Android11 Settings菜单加载

news2024/12/23 15:16:00

一、加载默认亮度

1、top_level_settings.xml

2、AndroidManifest.xml

3、DisplaySettings

①getPreferenceScreenResId

②buildPreferenceControllers

4、display_settings.xml

5、AutoBrightnessPreferenceController

6、BrightnessLevelPreferenceController

①getCurrentBrightness

②convertLinearToGammaFloat

7、 Z:\k630_64\vendor\tinno\k630_64\trunk\etc\settings-config.xml

<setting type="system" name="screen_brightness_float" value="0.35896719"/>

8、/data/system/users/0/settings_system.xml

<setting id="491" name="screen_brightness_float" value="0.3597016" package="android" defaultValue="0.35896719" defaultSysSet="true" />
 

二、字体调节

1、display_settings

2、FontSizePreferenceController

3、ToggleFontSizePreferenceFragment

4、values-zh-rCN/arrays.xml

5、arrays.xml

6、Z:\k630_64\vendor\tinno\k630_64\trunk\etc\settings-config.xml

<setting type="system" name="font_scale" value="1.0"/>

三、屏幕超时

1、TimeoutPreferenceController

2、arrays.xml

3、Z:\k630_64\vendor\tinno\k630_64\trunk\etc\settings-config.xml

四,显示实时电量

1、top_level_settings.xml

2、AndroidManifest.xml

3、TopLevelBatteryPreferenceController

配置项中配置了TopLevelBatteryPreferenceController控制器,它继承自AbstractPreferenceController,这个抽象类用于对所有菜单项进行统一管理(例如展示或隐藏,监听点击事件等)。

public class TopLevelBatteryPreferenceController extends BasePreferenceController implements
        LifecycleObserver, OnStart, OnStop {

    // 电量改变广播
    private final BatteryBroadcastReceiver mBatteryBroadcastReceiver;
    // 当前配置项
    private Preference mPreference;
    // 电量信息
    private BatteryInfo mBatteryInfo;

    //初始化电量改变广播
    public TopLevelBatteryPreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
        mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(mContext);
        mBatteryBroadcastReceiver.setBatteryChangedListener(type -> {
            BatteryInfo.getBatteryInfo(mContext, info -> {
                mBatteryInfo = info;
                updateState(mPreference);
            }, true /* shortString */);
        });
    }

    // 控制该项是否可用
    @Override
    public int getAvailabilityStatus() {
        return mContext.getResources().getBoolean(R.bool.config_show_top_level_battery)
                ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
    }

    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
        // 获取当前的配置项
        mPreference = screen.findPreference(getPreferenceKey());
    }

    @Override
    public void onStart() {
        // 注册广播
        mBatteryBroadcastReceiver.register();
    }

    @Override
    public void onStop() {
        // 取消注册广播
        mBatteryBroadcastReceiver.unRegister();
    }

    @Override
    public CharSequence getSummary() {
        // 返回电量概览
        return getDashboardLabel(mContext, mBatteryInfo);
    }

    // 获取电量信息
    static CharSequence getDashboardLabel(Context context, BatteryInfo info) {
        if (info == null || context == null) {
            return null;
        }
        CharSequence label;
        if (!info.discharging && info.chargeLabel != null) {
            label = info.chargeLabel;
        } else if (info.remainingLabel == null) {
            label = info.batteryPercentString;
        } else {
            label = context.getString(R.string.power_remaining_settings_home_page,
                    info.batteryPercentString,
                    info.remainingLabel);
        }
        return label;
    }
}

4、总结

  1. 在构造方法中初始化电量改变广播
  2. 在onStart()和onStop()中注册和取消注册广播
  3. 一旦收到电量改变广播,则把电量信息保存在mBatteryInfo中
  4. 然后执行updateState(),该方法会调用getSummary()把信息设置给当前配置项
  5. getSummary()中将mBatteryInfo保存的电量信息解析出来

五、系统提供者

Android的系统设置数据存放在/data/data/com.android.providers.settings/databases/settings.db 中

是否有默认值

在寻找一个开关的默认值时,首先要明白一点,该开关是否存在默认值,以及该开关状态是否有状态保存(一般状态存储在settings的db中)。 判断条件: 在reboot(重启)之后开关状态仍旧保存或者是在reset(恢复出厂设置)之后开关状态恢复到默认的,才能找到默认值

在reboot之后开关状态仍旧保存的,表示状态存储在了db中。 在reset之后开关状态恢复默认的,表示状态有一个默认值。

比如像wiif开关,蓝牙开关,gps开关等,都有默认值,并且状态值都在db中保存。

至于像WiFi热点开关这种在reboot之后,状态没有保存,那么你就别白费力气来找他的默认值或者状态存储值了

修改默认值

大部分的开关状态都存储在了SettingProvider的db中,与状态值相关的有三个文件

  1. /frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java:该文件中对状态值进行存储
  2. /frameworks/base/packages/SettingsProvider/res/values/defaults.xml:定义了开关状态的默认值
  3. /frameworks/base/core/java/android/provider/Settings.java:定义了各开关状态默认值存储时对应的key
  4. Z:\k630_64\vendor\tinno\k630_64\trunk\etc\settings-config.xml 亮度、字体大小、锁屏等设置的默认值在这里设置

以屏幕超时为例

1、TimeoutPreferenceController

    @Override
    public void updateState(Preference preference) {
        final TimeoutListPreference timeoutListPreference = (TimeoutListPreference) preference;
        //系统没有提供SCREEN_OFF_TIMEOUT才使用FALLBACK_SCREEN_TIMEOUT_VALUE
        final long currentTimeout = Settings.System.getLong(mContext.getContentResolver(),
                SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE);
    }

2、DatabaseHelper

并不是所有的默认值都是通过读取defaults.xml的,也有的是在DatabaseHelper.java中直接设置

如loadSetting(stmt, Settings.Secure.ADB_ENABLED, 1); 这个ADB Debugging开关就是直接在数据库文件中写入的。

关于USB Debugging 开关也可以在systemui的systemui/usb/StorageNotification.java文件中去设置,可以判断是否有IMEI号

分析代码时如果发现在defaults.xml找不到这一项就直接在DatabaseHelper.java文件中查找。

private void loadSystemSettings(SQLiteDatabase db) {
    //数据库名
    private static final String DATABASE_NAME = "settings.db";
    
    SQLiteStatement stmt = null;
    try {
        stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
                + " VALUES(?,?);");


        //SCREEN_OFF_TIMEOUT设置def_screen_off_timeout
        //def_screen_off_timeout在defaults.xml中
        loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
                R.integer.def_screen_off_timeout);
        .....
            

private void loadIntegerSetting(SQLiteStatement stmt, String key, int resid) {
            //
            loadSetting(stmt, key,
            Integer.toString(mContext.getResources().getInteger(resid)));
        }
}
    
private void loadSetting(SQLiteStatement stmt, String key, Object value) {
    //
    stmt.bindString(1, key);
    stmt.bindString(2, value.toString());
    stmt.execute();
}
    
.....
    
static final String PARTNER_SETTINGS_PATH ="etc/settings-config.xml";
private void updateSystemSecureSettings(SQLiteDatabase db) {  
    FileReader settingsReader;
    final File settingsFile = new File(Environment.getRootDirectory(), PARTNER_SETTINGS_PATH);
    try {
        settingsReader = new FileReader(settingsFile);
    } catch (FileNotFoundException e) {
        Log.w(TAG, "Can't open " + Environment.getRootDirectory() + "/" + PARTNER_SETTINGS_PATH);
        return;
    }

3、defaults.xml

<resources>
    <bool name="def_dim_screen">true</bool>
    //对应SCREEN_OFF_TIMEOUT
    <integer name="def_screen_off_timeout">15000</integer>
    <integer name="def_sleep_timeout">-1</integer>
    <bool name="def_airplane_mode_on">false</bool>
    ......

4、Settings.java

        /**
         * The amount of time in milliseconds before the device goes to sleep or begins
         * to dream after a period of inactivity.  This value is also known as the
         * user activity timeout period since the screen isn't necessarily turned off
         * when it expires.
         *
         * <p>
         * This value is bounded by maximum timeout set by
         * {@link android.app.admin.DevicePolicyManager#setMaximumTimeToLock(ComponentName, long)}.
         */
        //使用adb命令获取得到,区分大小写:screen_off_timeout
        public static final String SCREEN_OFF_TIMEOUT = "screen_off_timeout";

5、settings-config.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<resources>
	<setting type="global" name="auto_time" value="1"/>
	<setting type="global" name="auto_time_zone" value="1"/>
	<setting type="system" name="time_12_24" value="24"/>
	<setting type="system" name="date_format" value="dd/MM/yyyy"/>
	<setting type="system" name="accelerometer_rotation" value="0"/>
    //屏幕锁定时间
	<setting type="system" name="screen_off_timeout" value="120000"/>
	<setting type="system" name="sound_effects_enabled" value="0"/>
        <setting type="system" name="haptic_feedback_enabled" value="0"/>
        <setting type="system" name="dtmf_tone" value="0"/>
        <setting type="system" name="lockscreen_sounds_enabled" value="0"/>
	<setting type="system" name="screen_brightness" value="56"/>
    
	<setting type="system" name="screen_brightness_mode" value="1"/>
    //字体大小
    <setting type="system" name="font_scale" value="1.0"/>
	<setting type="system" name="status_bar_show_battery_percent" value="1"/>
	<setting type="global" name="install_non_market_apps" value="0"/>
	<setting type="secure" name="backup_enabled" value="0"/>
	<setting type="secure" name="charging_sounds_enabled" value="0"/>
    //屏幕亮度
	<setting type="system" name="screen_brightness_float" value="0.35896719"/>
	<setting type="secure" name="backup_transport" value="com.google.android.backup/.BackupTransportService"/>
	<setting type="secure" name="default_input_method" value="com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME"/>
	<setting type="secure" name="enabled_input_methods" value="com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME:com.google.android.googlequicksearchbox/com.google.android.voicesearch.ime.VoiceInputMethodService:com.google.android.inputmethod.pinyin/.PinyinIME"/>
	<setting type="system" name="ipo_setting" value="0"/>
        <setting type="global" name="device_name" value="K630"/>
	<!--
	<setting type="system" name="lowrawapp_optimize_white_packages" value="com.tencent.mm,com.tencent.mobileqq,com.facebook.katana,com.whatsapp,com.skype.rover,com.snapchat.android,com.tnmb.bootclean,com.ape.cubes,com.ape.folio,com.ape.retailmode,com.tinno.autotesttool,com.tinno.fieldtester,com.antutu.ABenchMark,com.antutu.benchmark.full,it.telecomitalia.cubovision,it.telecomitalia.selectedbytim,com.telecomitalia.cubomusica"/>
	<setting type="system" name="lowrawapp_optimize_limit_num" value="4"/>
	<setting type="system" name="lowrawapp_optimize_limit_sum" value="6"/>
	<setting type="system" name="lowrawapp_optimize_Custom_packages" value="com.kugou.android"/>
	<setting type="system" name="lowrawapp_optimize_cpuload_normal" value="12.5"/>
	<setting type="system" name="lowrawapp_optimize_cpuload_high" value="13.5"/>
	<setting type="system" name="lowrawapp_optimize_cpuload_ultrahigh" value="16.5"/>
	<setting type="system" name="lowrawapp_optimize_topPss_large" value="260000"/>
	<setting type="system" name="lowrawapp_optimize_topPss_resume" value="150000"/>
	<setting type="system" name="lowrawapp_optimize_topPss_ultralarge" value="340000"/>
	-->
    <!-- FEATURE_SINGLE_HAND hsg 20190904-->
    <setting type="global" name="enable_single_hand" value="1" />
    <!-- TINNO END -->
</resources>

6、默认值

value

含义

key

def_dim_screen

0=no 1=yes:是否让屏幕亮度渐渐变暗

Settings.System.DIM_SCREEN

def_screen_off_timeout

无操作多少秒后灭屏

Settings.System.SCREEN_OFF_TIMEOUT

def_sleep_timeout

无操作多少秒后休眠(该值要比灭屏时间长,因为在休眠之前会先灭屏)

Settings.Secure.SLEEP_TIMEOUT

def_airplane_mode_on

飞行模式是否默认开启

Settings.Global.AIRPLANE_MODE_ON

def_theater_mode_on

剧场模式是否默认开启

Settings.Global.THEATER_MODE_ON

def_airplane_mode_radios

开启飞行模式时会关掉的开关列表(通常会包括蓝牙,wifi,nfc等)

Settings.Global.AIRPLANE_MODE_RADIOS

airplane_mode_toggleable_radios

飞行模式下用户可以手动开启的开关列表

Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS

def_auto_time

1=yes, 0=no是否从网络自动同步日期、时间、时区

Settings.Global.AUTO_TIME

def_auto_time_zone

1=yes, 0=no是否从网络自动同步时区

Settings.Global.AUTO_TIME_ZONE

def_accelerometer_rotation

1=yes, 0=no是否开启自动旋转(即是否根据加速度传感器旋转屏幕方向)

Settings.System.ACCELEROMETER_ROTATION

def_screen_brightness

屏幕默认亮度(取值区间为0–255)

Settings.System.SCREEN_BRIGHTNESS

def_screen_brightness_automatic_mode

是否开启屏幕亮度的自动调节

Settings.System.SCREEN_BRIGHTNESS_MODE

def_window_animation_scale

1=yes, 0=no窗口动画缩放

Settings.System.WINDOW_ANIMATION_SCALE

def_window_transition_scale

1=yes, 0=no窗口透明度

Settings.System.TRANSITION_ANIMATION_SCALE

def_haptic_feedback

是否开启触摸反馈,不清楚什么含义

Settings.System.HAPTIC_FEEDBACK_ENABLED

def_bluetooth_on

0=disabled. 1=enabled.默认是否开启蓝牙

Settings.Global.BLUETOOTH_ON

def_wifi_display_on

0=disabled. 1=enabled.是否开启wifi显示

Settings.Global.WIFI_DISPLAY_ON

def_install_non_market_apps

是否允许安装不是在应用市场下载的app:1 = 允许通过安装包安装,0 = 不允许通过安装包安装

Settings.Secure.INSTALL_NON_MARKET_APPS

def_package_verifier_enable

在安装app之前进行证书检查,1审查,0不审查

Settings.Global.PACKAGE_VERIFIER_ENABLE

def_location_providers_allowed

是否开启gps,若字符串为null则默认不开启gps,还需借助LOCATION_MODE进行判断

Settings.Secure.LOCATION_PROVIDERS_ALLOWED

assisted_gps_enabled

是否开启辅助的gps应用

Settings.Global.ASSISTED_GPS_ENABLED

def_netstats_enabled

是否开启流量统计

Settings.Global.NETSTATS_ENABLED

def_usb_mass_storage_enabled

是否开启usb海量存储

Settings.Global.USB_MASS_STORAGE_ENABLED

def_wifi_on

wifi默认是否开启

Settings.Global.WIFI_ON

def_wifi_sleep_policy

wifi是否休眠(会和移动网络来回切换)取值为0-never, 1-only when plugged in, 2-always

Settings.Global.WIFI_SLEEP_POLICY

def_networks_available_notification_on

是否通知用户打开网络

Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON

def_backup_enabled

0-disabled, 1-enabled是否开启设置备份

Settings.Secure.BACKUP_ENABLED

def_backup_transport

用于备份或者恢复的传输文件

Settings.Secure.BACKUP_TRANSPORT

def_notification_pulse

当有通知来时,led灯是否要重复闪烁

Settings.System.NOTIFICATION_LIGHT_PULSE

def_mount_play_notification_snd

当有事件来临时是否播放通知铃声

Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND

def_mount_ums_autostart

是否自动启动主机检测系统

Settings.Secure.MOUNT_UMS_AUTOSTART

def_mount_ums_prompt

是否在主机检测时显示通知

Settings.Secure.MOUNT_UMS_PROMPT

def_mount_ums_notify_enabled

Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED

当开启ums时是否显示通知

def_power_sounds_enabled

电量过低时是否铃声通知

Settings.Global.POWER_SOUNDS_ENABLED

def_low_battery_sound

低电量时播放的铃声文件来源

Settings.Global.LOW_BATTERY_SOUND

def_dock_sounds_enabled

当插拔电源时是否播放声音

Settings.Global.DOCK_SOUNDS_ENABLED

def_desk_dock_sound

插上电源时播放的音频文件

Settings.Global.DESK_DOCK_SOUND

def_desk_undock_sound

拔下电源时播放的音频文件

Settings.Global.DESK_UNDOCK_SOUND

def_car_dock_sound

使用车载电源充电时播放的音频文件

Settings.Global.CAR_DOCK_SOUND

def_car_undock_sound

当从车载电源拔下时播放的音频文件

Settings.Global.CAR_UNDOCK_SOUND

def_lockscreen_sounds_enabled

当解锁或是锁屏时是否播放声音

Settings.System.LOCKSCREEN_SOUNDS_ENABLED

def_lock_sound

锁屏时播放的音频文件

Settings.Global.LOCK_SOUND

def_unlock_sound

解锁时播放的音频文件

Settings.Global.UNLOCK_SOUND

def_trusted_sound

在未解锁的情况下设备进入到可信任状态时播放的音频文件

Settings.Global.TRUSTED_SOUND

def_wireless_charging_started_sound

开启无线充电时播放声音

Settings.Global.WIRELESS_CHARGING_STARTED_SOUND

def_lockscreen_disabled

第一次开机时默认不锁屏(若要彻底去掉锁屏页面还需要在别的方法中设置)

Settings.System.LOCKSCREEN_DISABLED

def_device_provisioned

设备是否已经被配置(该参数考虑的时多用户不同时刻使用同一个设备的情况)

Settings.Global.DEVICE_PROVISIONED

def_dock_audio_media_enabled

使用dock音频输出媒体

Settings.Global.DOCK_AUDIO_MEDIA_ENABLED

def_vibrate_in_silent

静音模式下是否允许震动

Settings.System.VIBRATE_IN_SILENT

def_accessibility_script_injection

是否增强js的屏幕阅读性

Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION

def_accessibility_speak_password

访问模式下是否语音播报密码

Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD

def_low_battery_sound_timeout

当经过一定时间后,如果低电量提醒为播放声音,则灭屏

Settings.Global.LOW_BATTERY_SOUND_TIMEOUT

def_lock_screen_show_notifications

是否在锁屏界面显示通知

Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS

def_lock_screen_allow_private_notifications

允许在锁屏界面上显示私有通知,就像是解锁状态下一样

Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS

def_wifi_scan_always_available

设置-wlan-高级-随时扫描开关

Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE

7、adb命令获取/修改/设置值

C:\Users\jiabao.guan>adb shell settings get system screen_off_timeout
60000

C:\Users\jiabao.guan>adb shell settings put system guan 66
C:\Users\jiabao.guan>adb shell settings get system guan
66

C:\Users\jiabao.guan>adb shell settings put system screen_off_timeout 120000
C:\Users\jiabao.guan>adb shell settings get system screen_off_timeout
120000

六:添加辅助菜单

测试目标:

为系统设置最底部增加一项菜单项(title:辅助功能),进入辅助功能菜单项,设置一个<SwitchPreference>项(高对比度字体),和两个<Preference>项(颜色调整和多彩屏幕)。

1、top_level_settings.xml

在res/xml/top_level_settings.xml配置文件中增加一个<Preference>标签,并为<Preference>标签设置相关属性(fragment属性和controller属性需要配置该类的全限定类名)。

    <Preference
        android:key="assistant_function"
        android:title="@string/assistant_function"
        android:summary="@string/assistant_summary"
        android:icon="@drawable/ic_homepage_support"
        android:order="30"
        android:fragment="com.android.settings.assistant.AssistantFunctionDashboardFragment"
        settings:controller="com.android.settings.assistant.AssistantFunctionPreferenceController"/>

2、assistant

配置好后创建com.android.settings.assistant包,在该包下创建这两个类。(AssistantFunctionDashboardFragment类和AssistantFunctionPreferenceController类)

3、AssistantFunctionDashboardFragment

package com.android.settings.assistant;

import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.SearchIndexableRaw;
import com.android.settings.wiosfeature.firebase.ServiceUtils;
import android.content.Context;
import android.os.Bundle;
import androidx.preference.Preference;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import android.provider.SearchIndexableResource;
import java.util.ArrayList;
import java.util.List;
import android.util.Log;

/**
 * @Author : 柒
 * @Time : 2022/8/24 14:17
 */
public class AssistantFunctionDashboardFragment extends SettingsPreferenceFragment {

    private static final Object TAG = "AssistantFunctionDashboardFragment";
    private Context mContext;

    @Override
    public int getMetricsCategory() {
        return MetricsProto.MetricsEvent.SETTINGS_SYSTEM_CATEGORY;
    }

    //创建二级菜单
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        super.onCreatePreferences(savedInstanceState, rootKey);
        addPreferencesFromResource(R.xml.assistant_function);
    }


    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext = context;
    }

    // 为每个二级菜单项设置点击事件
    @Override
    public boolean onPreferenceTreeClick(Preference preference) {
        String key = preference.getKey();
        android.util.Log.i("AssistantFunctionDashboardFragment", "guan+onPreferenceTreeClick: " + key);
        switch (key){
            case "color_adjustment":
                android.util.Log.i("AssistantFunctionDashboardFragment", "guan+color_adjustment: " + key);
                break;
            case "colorful_screen":
                android.util.Log.i("AssistantFunctionDashboardFragment", "guan+colorful_screen: " + key);
                break;
        }
        return true;
    }

    /**
     * For Search.
     */
    public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
            new BaseSearchIndexProvider(R.xml.assistant_function) {
                @Override
                protected boolean isPageSearchEnabled(Context context) {
                    return super.isPageSearchEnabled(context);
                }

                @Override
                public List<SearchIndexableResource> getXmlResourcesToIndex(Context context, boolean enabled) {
                    return super.getXmlResourcesToIndex(context, enabled);
                }

            };
}

4、AssistantFunctionPreferenceController

package com.android.settings.assistant;

import com.android.settings.core.BasePreferenceController;
import android.content.Context;
/**
 * @Author : 柒
 * @Time : 2022/8/24 14:17
 */
public class AssistantFunctionPreferenceController extends BasePreferenceController {


    //调用父类的构造方法
    public AssistantFunctionPreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
    }

    //实现该菜单项的显示
    @Override
    public int getAvailabilityStatus() {
        return AVAILABLE;
    }
}

5、AssistantFunctionDashboardActivity

在Settings目录下创建

package com.android.settings;

/**
 * @Author : 柒
 * @Time : 2022/8/24 15:11
 */
public class AssistantFunctionDashboardActivity extends SettingsActivity{
}

6、assistant_function.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res-auto"
    android:title="@string/assistant_function"
    android:key="assistant_function_key">

    <SwitchPreference
        android:key="high_contrast_font"
        android:title="@string/high_contrast_font"
        android:summary="@string/high_contrast_font_summary"
        />

    <Preference
        android:key="color_adjustment"
        android:title="@string/color_adjustment"
        android:summary="@string/color_adjustment_summary"/>

    <Preference
        android:key="colorful_screen"
        android:title="@string/colorful_screen"
        android:summary="@string/colorful_screen_summary"/>

</PreferenceScreen>

7、AndroidManifest.xml

        <!--辅助功能-->
        <activity
            android:name="Settings$AssistantFunctionDashboardActivity"
            android:label="@string/assistant_function">
            <intent-filter android:priority="12">
                <action android:name="com.android.settings.action.SETTINGS" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                android:value="com.android.settings.assistant.AssistantFunctionDashboardFragment" />
        </activity>

8、Settings

public static class DateTimeSettingsActivity extends SettingsActivity { /* empty */ }

9、SettingsGateway

在SettingsGateway类的ENTRY_FRAGMENTS数组中加入AssistantFunctionDashboardFragment类名,在SETTINGS_FOR_RESTRICTED数组中加入AssistantFunctionPreferenceController类名

    public static final String[] SETTINGS_FOR_RESTRICTED = {
            // Home page
            AssistantFunctionPreferenceController.class.getName(),
        .....
                }



    public static final String[] ENTRY_FRAGMENTS = {
            AssistantFunctionDashboardFragment.class.getName(),
        ....
    }

10、strings

    <string name="assistant_function">assistant &amp; function</string>
    <string name="assistant_summary">assistant &amp; summary</string>

    <string name="high_contrast_font">high_contrast &amp; contrast_font</string>
    <string name="high_contrast_font_summary">high_contrast_font &amp; summary</string>

    <string name="color_adjustment">color &amp; adjustment</string>
    <string name="color_adjustment_summary">color_adjustment &amp; summary</string>

    <string name="colorful_screen">colorful &amp; screen</string>
    <string name="colorful_screen_summary">colorful_screen &amp; summary</string>
    <string name="assistant_function" msgid="3235725053332345774">"辅助功能"</string>
    <string name="assistant_summary" msgid="3235725053332345775">"高对比度字体、颜色调整、多彩屏幕"</string>

    <string name="high_contrast_font" msgid="3235725053332345776">"高对比度字体"</string>
    <string name="high_contrast_font_summary" msgid="3235725053332345777">"高对比度字体"</string>

    <string name="color_adjustment" msgid="3235725053332345778">"颜色调整"</string>
    <string name="color_adjustment_summary" msgid="3235725053332345779">"颜色调整"</string>

    <string name="colorful_screen" msgid="3235725053332345710">"多彩屏幕"</string>
    <string name="colorful_screen_summary" msgid="3235725053332345711">"多彩屏幕"</string>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/727889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全网最细,Pytest自动化测试-重复执行用例 pytest-repeat(实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 平常在做功能测试…

应对Python爬虫IP被封的策略及建议。

我们在进行数据抓取使用代理ip的时候需要有一些约束规定&#xff0c;才能保证我们持续稳定的抓取数据。 大概整理了一下&#xff0c;需要注意以下几点&#xff0c;仅供参考&#xff1a; 1、使用高质量的代理服务器&#xff1a;选择一些可靠的代理服务器&#xff0c;确保它们的…

从歌手李玟的自杀传闻,看骑行健身对心理健康的深远影响

从歌手李玟的自杀传闻&#xff0c;看骑行健身对心理健康的深远影响 最近&#xff0c;歌手李玟的自杀传闻让大众一片哗然。这个消息无疑成为了各大平台的热点话题。然而&#xff0c;作为骑友&#xff0c;我们今天再次谈谈骑行健身的重要性。 首先&#xff0c;我们要明确一点&…

性能测试如何做?性能测试实战从0-1进阶(内涵面试题+答案)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试实战 - 部…

checkout

git-checkout - Switch branches or restore working tree files# 用index或者指定commit中的版本,来更新工作区中的文件 # 切换分支 Updates files in the working tree to match the version in the index or the specified tree. If no pathspec was given,git checkout wil…

SonarQube扫描常见Bug、漏洞修复整理(持续更新中)

目录 DMS1、A "NullPointerException" could be thrown; "sra" is nullable here.2、Cast one of the operands of this multiplication operation to a "long"3、Call "remove()" on "requestContainer".4、Use try-with-r…

echarts条形图 动态 设置标签背景和柱状图渐变颜色

<!--Description: 横向渐变柱状图 --> <template><div ref"horizontal" class"w-full h-full"></div> </template><script> import * as echarts from echarts export default {components: {},props: [data],data() …

c++11 标准模板(STL)(std::basic_ostream)(八)

定义于头文件 <ostream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_ostream 提供字符流上的高层输出操作。受支持操作包含有格式…

kubernetes 节点排水维护 cordon, drain, uncordon

1.这三个命令是正式release的1.2新加入的命令&#xff0c;三个命令一起介绍&#xff0c;是因为三个命令配合使用可以实现节点的维护。在1.2之前&#xff0c;因为没有相应的命令支持&#xff0c;如果要维护一个节点&#xff0c;只能stop该节点上的kubelet将该节点退出集群&#…

Java-API简析_java.net.InetAddress类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131590559 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

git因网络问题报错

Failed to connect to github.com port 443 after 21051 ms: Couldnt connect to server Recv failure: Connection was reset 你是否最近也有遇到这种情况呢&#xff1f; 公司项目目前保存在github上, 在 git pull 和 git push 的时候总是遇到以上情况 也是困扰了我不少…

ESP32-C2 固件烧录需满足的硬件环境整理

ESP32-C2 默认通过 UART0 &#xff08;即 TXD&#xff08;GPIO20&#xff09;和 RXD&#xff08;GPIO19&#xff09;&#xff09;下载固件。 Windows 下可使用 Flash download tool 工具来下载编译后的 bin 文件&#xff1b; 运行 flash_download_tool.exe 的文件 选择开发…

2023 最新互联网大厂Java面经分享:25 分类、1000 道 Java 面试真题(50w 字解析)

作为 Java 程序员&#xff0c;选择学习什么样的技术&#xff1f;什么技术该不该学&#xff1f;去招聘网站上搜一搜、看看岗位要求就十分清楚了&#xff0c;自己具备的技术和能力&#xff0c;直接影响到你工作选择范围和能不能面试成功。 如果想进大厂&#xff0c;那就需要在 Ja…

数据库-分布式数据库历史变迁之旅

我们正式开始分布式数据库历史变迁之旅。 单机数据库的不可能三角 正如经济政策的不可能三角“不可能同时实现资本流动自由&#xff0c;货币政策的独立性和汇率的稳定”那样&#xff0c;单机数据库也有一个不可能三角&#xff0c;那就是&#xff1a;①持久化 ②事务隔离 ③高性…

17款奔驰S400加装原厂无钥匙进入系统,提升您的便利性

奔驰无钥匙进入功能&#xff0c;只要身上装着车钥匙进入车内&#xff0c;车辆就能感应到钥匙的存在&#xff0c;这时只需按下启动键就可启动车辆了 奔驰无钥匙进入功能主要有两大使用体验&#xff0c;首先就是要注意主驾驶位车门的有效检测距离不小于1.5m&#xff0c;其他门钥匙…

BOM/PCB/Gerber比对功能再升级,华秋DFM新版邀您体验!

在电子产品开发过程中&#xff0c;方案选型、原理图设计、BOM制作、PCB设计再到PCB、PCBA的生产都会经历多次版本迭代。在硬件开发过程中BOM文件的迭代、PCB设计的版本迭代是最为常见的&#xff0c;所以对应的版本管控至关重要&#xff0c;只有清晰地了解不同版本的差异&#x…

武汉理工大学第四届ACM校赛

武汉理工大学第四届ACM校赛传送门 A-ST和TS回文问题 这种题都是有一定简单的规律的 如果每个字符都相等的话,肯定存在 如果字符串T的长度是字符串S的整数倍的话,如果字符串S是回文串或者T的长度是S的长度的奇数倍的话,那么存在 否则不存在 就自己构造字符串来找规律&…

121.实战网页图片优化

如上图所示&#xff0c;这个图标的内部尺寸为14791459&#xff0c;但是我们实际呈现的渲染的效果为570562&#xff1b;所以我们可以调整一下图像的大小&#xff0c;缩小图片的文件大小&#xff1b; 我们可以修改他的尺寸&#xff0c;文件的大小就缩小了。但是在网页上显示一点区…

软件测试之单元测试详解

目录 前言&#xff1a; 1、什么是单元测试&#xff1f; 2、什么是好的单元测试&#xff1f; 3、怎么写单元测试&#xff1f; 4、玩转单元测试 前言&#xff1a; 单元测试是软件测试中的一种测试方法&#xff0c;用于验证代码中最小可测试单元的正确性。它主要关注对程序的…

云上百世慧|「慧」聚智能制造的全流程质量管控(我们在7月31日等你)

在制造业的迅猛发展中&#xff0c;「质量管控」一直是企业面临的重要挑战和痛点。如何对「原材料、组件、生产过程和最终产品」进行严格的监控和控制&#xff1f; 稳抓行业痛点&#xff0c;优化质量流程 质量管控&#xff0c;是确保产品符合标准的关键环节。通过严格的监控和控…