android13 settings-display-screen timeout

1.简介

主要是随便设置了值以后,display页面显示的summary有点奇怪,如下,显示个after null of inactivity,所以简单看下

2.display页

2.1.display_settings.xml

  • 可以看到由ScreenTimeoutPreferenceController控制的
  • 跳转的fragment是ScreenTimeoutSettings
ini 复制代码
    <PreferenceCategory
        android:title="@string/category_name_lock_display">

        <Preference
            android:key="lockscreen_from_display_settings"
            android:title="@string/lockscreen_settings_title"
            android:fragment="com.android.settings.security.LockscreenDashboardFragment"
            settings:keywords="@string/keywords_ambient_display_screen"
            settings:controller="com.android.settings.security.screenlock.LockScreenPreferenceController"/>

        <com.android.settingslib.RestrictedPreference
            android:key="screen_timeout"
            android:title="@string/screen_timeout"
            android:summary="@string/summary_placeholder"
            android:fragment="com.android.settings.display.ScreenTimeoutSettings"
            settings:controller="com.android.settings.display.ScreenTimeoutPreferenceController"/>
    </PreferenceCategory>

2.2.ScreenTimeoutPreferenceController

>getTimeoutSummary

java 复制代码
    private CharSequence getTimeoutSummary(long maxTimeout) {
    //获取设置的时间或者默认值
        final long currentTimeout = getCurrentScreenTimeout();
        //maxTimeout没有特殊设置的话就是LONG.MAX_VALUE
        final CharSequence description = getTimeoutDescription(currentTimeout, maxTimeout);
        return mContext.getString(R.string.screen_timeout_summary, description);
    }

>getCurrentScreenTimeout

这个就是用户设置的值,没有的话就是默认值

csharp 复制代码
    private long getCurrentScreenTimeout() {
        return Settings.System.getLong(mContext.getContentResolver(),
                SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE);
    }

>getTimeoutDescription

csharp 复制代码
    private CharSequence getTimeoutDescription(long currentTimeout, long maxTimeout) {
    //异常情况返回空,设置的时间为负的,条目为空或entries和values数量不一样
        if (currentTimeout < 0 || mTimeoutEntries == null || mTimeoutValues == null
                || mTimeoutValues.length != mTimeoutEntries.length) {
            return null;
        }
        //设置的时间比支持的最大值还大,就取条目的最后一个
        if (currentTimeout > maxTimeout) {
            // The selected time out value is longer than the max timeout allowed by the admin.
            // Select the largest value from the list by default.
            return getLargestTimeout(maxTimeout);
        } else {
            return getCurrentTimeout(currentTimeout);
        }
    }
    //我们的走这里了
    private CharSequence getCurrentTimeout(long currentTimeout) {
        for (int i = 0; i < mTimeoutValues.length; i++) {
            if (currentTimeout == Long.parseLong(mTimeoutValues[i].toString())) {
                return mTimeoutEntries[i];
            }
        }
        //我们设置的值不是系统提供的条目里,所以返回了null
        return null;
    }

3.ScreenTimeoutSettings

3.1.onAttach

ini 复制代码
    public static final int FALLBACK_SCREEN_TIMEOUT_VALUE = 30000;

    public void onAttach(Context context) {
        super.onAttach(context);
        mContext = context;
        mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
        mInitialEntries = getResources().getStringArray(R.array.screen_timeout_entries);
        mInitialValues = getResources().getStringArray(R.array.screen_timeout_values);

>screen_timeout_entries

默认支持的条目

ini 复制代码
32   <string-array name="screen_timeout_entries">
33     <item msgid="8386012403457852396">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‎‎‏‎‎‎‏‏‎‎‏‏‏‎‏‏‎‎‏‏‎‎‏‎‏‏‎‎‎‏‎‎‎‎‎‎‎‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎15 seconds‎‏‎‎‏‎"</item>
34     <item msgid="4572123773028439079">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‏‏‏‎‎‏‎‎‏‎‏‏‎‎‎‏‏‏‏‎‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‎‏‎‎‎‎‏‎‎‏‏‏‎30 seconds‎‏‎‎‏‎"</item>
35     <item msgid="7016081293774377048">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‏‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‎‎‎‏‏‏‎‎‎‏‏‏‎‏‎‏‎‏‏‏‏‎‏‎‏‎‎‎‎‎‏‎‏‏‎‎‎‎1 minute‎‏‎‎‏‎"</item>
36     <item msgid="838575533670111144">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎‏‏‏‎‏‎‎‎‏‏‎‎‏‏‏‎‎‎‎‎‎‎‎‎‎‏‎‏‎‎‎‎‎‏‏‎‏‏‏‏‎‏‏‎‎‏‎‏‏‏‏‎‏‎‏‎‎‎‎2 minutes‎‏‎‎‏‎"</item>
37     <item msgid="2693197579676214668">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‎‏‎‏‏‎‎‎‎‎‎‎‏‎‏‎‎‎‏‏‏‎‏‏‎‏‏‏‏‏‎‏‏‎‏‎‎‎‏‎‏‎‏‏‏‎‎‏‎‏‏‎‎‎‏‏‎‎‎5 minutes‎‏‎‎‏‎"</item>
38     <item msgid="1955784331962974678">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‏‎‎‎‏‎‏‎‏‏‏‎‏‏‏‏‏‎‎‏‏‎‏‏‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‎‏‏‏‎‏‎‏‏‎‎10 minutes‎‏‎‎‏‎"</item>
39     <item msgid="5578717731965793584">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎‏‎‏‏‏‎‎‏‎‏‏‎‎‎‏‏‏‎‎‎‎‏‎‎‏‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‎‏‎‎‏‏‎‎‎‎‎30 minutes‎‏‎‎‏‎"</item>
40   </string-array>

3.2.updateCandidates

scss 复制代码
    public void updateCandidates() {
        final String defaultKey = getDefaultKey();
        final PreferenceScreen screen = getPreferenceScreen();
        screen.removeAll();

        final List<? extends CandidateInfo> candidateList = getCandidates();
        if (candidateList == null) {
            return;
        }
//手动添加条目
        for (CandidateInfo info : candidateList) {
            SelectorWithWidgetPreference pref =
                    new SelectorWithWidgetPreference(getPrefContext());
                    //bind的时候如果设置的值和对应条目一样话,自动设置为选中状态
            bindPreference(pref, info.getKey(), info, defaultKey);
            screen.addPreference(pref);
        }
//设置的值不在条目里,则没有选中状态
        final long selectedTimeout = Long.parseLong(defaultKey);
        final long maxTimeout = getMaxScreenTimeout(getContext());
        if (!candidateList.isEmpty() && (selectedTimeout > maxTimeout)) {
            //如果设置的值比支持的最大值还大,修改为条目的最大值
            final SelectorWithWidgetPreference preferenceWithLargestTimeout =
                    (SelectorWithWidgetPreference) screen.getPreference(candidateList.size() - 1);
            preferenceWithLargestTimeout.setChecked(true);
        }

        mPrivacyPreference = new FooterPreference(mContext);
        mPrivacyPreference.setIcon(R.drawable.ic_privacy_shield_24dp);
        mPrivacyPreference.setTitle(R.string.adaptive_sleep_privacy);
        mPrivacyPreference.setSelectable(false);
        mPrivacyPreference.setLayoutResource(R.layout.preference_footer);
//添加screen attention 选项
        if (isScreenAttentionAvailable(getContext())) {
            mAdaptiveSleepPermissionController.addToScreen(screen);
            mAdaptiveSleepCameraStatePreferenceController.addToScreen(screen);
            mAdaptiveSleepController.addToScreen(screen);
            mAdaptiveSleepBatterySaverPreferenceController.addToScreen(screen);
            screen.addPreference(mPrivacyPreference);
        }

        if (mAdmin != null) {
            setupDisabledFooterPreference();
            screen.addPreference(mDisableOptionsPreference);
        }
    }
相关推荐
杉氧17 小时前
深入理解 Compose 重组机制:快照系统如何驱动 UI 精准刷新?
android·架构·android jetpack
召钱熏17 小时前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端
杉氧18 小时前
深度解析:Jetpack Compose 核心架构与底层原理 —— 十年安卓老兵的“破茧重生”
android·架构·android jetpack
通玄18 小时前
Jetpack Compose 入门系列(七):ViewModel 与界面状态管理
android
落魄Android在线炒饭18 小时前
Android Framework 开发技巧:android.jar 生成与系统快速编译验证
android
如此风景19 小时前
Kotlin Flow操作符学习
android·kotlin
plainGeekDev19 小时前
GreenDAO → Room
android·java·kotlin
weiggle20 小时前
第八篇:ViewModel + Compose——生产级状态管理实践
android
恋猫de小郭1 天前
Amper 正式转正 Kotlin Toolchain ,Gradle 未来何去何从
android·前端·flutter
plainGeekDev1 天前
ButterKnife → ViewBinding
android·java·kotlin