Android-x86-6.0定制之路 - 永不休眠功能

需求确立

描述

一般, Kiosk 模式下不管处于什么界面,都要求屏幕保持常亮的。虽然在 App 内可以通过代码实现屏幕常亮,但是现在的需求是在系统设置里增加永不休眠的功能,可勾选的实现动态修改。涉及到系统 Apk 的修改,没办法只能去修改源码了。

确认

简单整理下需求:

  • 针对 Settings.apk 设置 -> 显示 -> 睡眠功能,添加永不休眠选项,支持切换休眠为永不休眠
  • 实现开机默认选中永不休眠,并且开启永不休眠功能

功能实现

源码过于庞大,不可能去分析每行代码。通过 Google 查阅资料,基本定位实现该功能所需要修改的文件,主要是PowerManagerService.javaDisplaySettings.java两个文件,现在就具体讲讲实现永不休眠功能的步骤。

添加永不休眠选项

Settings.apk 已经实现休眠功能,首先需要在选项里添加永不休眠选项,仅支持英文和中文

找到packages/apps/Settings/res/values-zh-rCN/arrays.xml文件,搜索 screen_timeout_entries,插入"永不休眠"代码。示例如下:


  "15秒"
  "30秒"
  "1分钟"
  "2分钟"
  "5分钟"
  "10分钟"
  "30分钟"
  "永不休眠"

找到packages/apps/Settings/res/values/arrays.xml文件,搜索 screen_timeout_entries,插入Never代码,搜索screen_timeout_values,插入0代码。示例如下:



    15 seconds
    30 seconds
    1 minute
    2 minutes
    5 minutes
    10 minutes
    30 minutes
    Never




    
    15000
    
    30000
    
    60000
    
    120000
    
    300000
    
    600000
    
    1800000
    
    0

Android-x86-6.0定制之路 - 永不休眠功能_第1张图片

默认选中永不休眠选项

默认休眠时间是 1 分钟,现在修改为永不休眠

找到frameworks/base/packages/SettingsProvider/res/values/defaults.xml文件,
60000替换为0即可。示例如下:

 
     true
-    60000
+    0
     -1
     false
     false

实现永不休眠功能

1.找到packages/apps/Settings/src/com/android/settings/DisplaySettings.java中的updateTimeoutPreferenceDescription,修改如下:

private void updateTimeoutPreferenceDescription(long currentTimeout) {
    ListPreference preference = mScreenTimeoutPreference;
    String summary;

    /* never screen off begin */
    final CharSequence[] entries = preference.getEntries();
    final CharSequence[] values = preference.getEntryValues();
    /* never screen off end */

    if (currentTimeout < 0) {
        // Unsupported value

        /* never screen off begin */
        if (entries != null || entries.length != 0){
            summary = (entries[entries.length-1]).toString();
        }else{
            summary = "";
        }
        /* never screen off end */
    } else {

        if (entries == null || entries.length == 0) {
            summary = "";
        } else {
            int best = 0;
            for (int i = 0; i < values.length; i++) {
                long timeout = Long.parseLong(values[i].toString());
                if (currentTimeout == timeout) {
                    best = i;
                }
            }

            if (entries.length != 0) {
                summary = preference.getContext().getString(R.string.screen_timeout_summary,
                    entries[best]);
            } else {
                summary = "";
            }
        }
    }
    preference.setSummary(summary);
}

2.找到frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java中的getScreenOffTimeoutLocked方法,修改如下:

private int getScreenOffTimeoutLocked(int sleepTimeout) {
    int noSleepTimeout = 0;
    int timeout = mScreenOffTimeoutSetting;
    if (isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()) {
        timeout = Math.min(timeout, mMaximumScreenOffTimeoutFromDeviceAdmin);
    }
    if (mUserActivityTimeoutOverrideFromWindowManager >= 0) {
        timeout = (int)Math.min(timeout, mUserActivityTimeoutOverrideFromWindowManager);
    }
    if (sleepTimeout >= 0) {
        timeout = Math.min(timeout, sleepTimeout);
    }
    /* never screen off begin */
    noSleepTimeout = mScreenOffTimeoutSetting;
    if (noSleepTimeout == 0) {
        noSleepTimeout = mMaximumScreenOffTimeoutFromDeviceAdmin;
        return Math.max(noSleepTimeout, mMaximumScreenOffTimeoutFromDeviceAdmin);
    }
    /* never screen off end */
    return Math.max(timeout, mMinimumScreenOffTimeoutConfig);
}

小结

Android-x86-6.0定制之路 - 永不休眠功能_第2张图片

如何从源码上实现永不休眠功能,具体实现也就这样了,这里仅是简单记录下。

Android-6.0 永不休眠补丁,提供下载

你可能感兴趣的:(Android)