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);
        }
    }
相关推荐
雨白7 小时前
Jetpack系列(二):Lifecycle与LiveData结合,打造响应式UI
android·android jetpack
kk爱闹9 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
每次的天空10 小时前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭11 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日12 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安12 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑12 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟16 小时前
CTF Web的数组巧用
android
小蜜蜂嗡嗡17 小时前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio
aqi0017 小时前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体