Android11 setting中增加永不息屏

首先修改android:entries和 android:entryValues屬性。默認(rèn)的是screen_timeout_entries和screen_timeout_values,是沒有永不息屏的選項的,但是array有定義dream_timeout_entries和dream_timeout_values,這里有永不息屏。

//vendor\mediatek\proprietary\packages\apps\MtkSettings\res\xml\display_settings.xml
   <com.android.settings.display.TimeoutListPreference
        android:key="screen_timeout"
        android:title="@string/screen_timeout"
        android:summary="@string/summary_placeholder"
        android:entries="@array/screen_timeout_entries"
        android:entryValues="@array/screen_timeout_values"
        settings:keywords="@string/keywords_screen_timeout" />

修改后如下。

    <com.android.settings.display.TimeoutListPreference
        android:key="screen_timeout"
        android:title="@string/screen_timeout"
        android:summary="@string/summary_placeholder"
        android:entries="@array/dream_timeout_entries"
        android:entryValues="@array/dream_timeout_values"
        settings:keywords="@string/keywords_screen_timeout" />

但是這樣只是setting中對應(yīng)的dialog界面會增加never這個選項,如果選擇never的話,還是會息屏。never對應(yīng)的時間是0.
我嘗試在PowerManagerService增加判斷,這里雖然可以實現(xiàn)永不息屏,但是會導(dǎo)致新的問題,鎖屏后無法亮屏。

      if(mScreenOffTimeoutSetting == 0){
            return mMaximumScreenOffTimeoutFromDeviceAdmin;
        }

具體如下(這樣修改在Android11中會導(dǎo)致新的問題)。

//frameworks\base\services\core\java\com\android\server\power\PowerManagerService.java
    private long getScreenOffTimeoutLocked(long sleepTimeout, long attentiveTimeout) {
        long timeout = mScreenOffTimeoutSetting;
        if (isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()) {
            timeout = Math.min(timeout, mMaximumScreenOffTimeoutFromDeviceAdmin);
        }
        if (mUserActivityTimeoutOverrideFromWindowManager >= 0) {
            timeout = Math.min(timeout, mUserActivityTimeoutOverrideFromWindowManager);
        }
        if (sleepTimeout >= 0) {
            timeout = Math.min(timeout, sleepTimeout);
        }
        if (attentiveTimeout >= 0) {
            timeout = Math.min(timeout, attentiveTimeout);
        }
        if(mScreenOffTimeoutSetting == 0){
            return mMaximumScreenOffTimeoutFromDeviceAdmin;
        }
        return Math.max(timeout, mMinimumScreenOffTimeoutConfig);
    }

最終修改如下。
1.給mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout);加個判斷。

//frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java
    private void updateLockScreenTimeout() {
        synchronized (mScreenLockTimeout) {
            final boolean enable = !mAllowLockscreenWhenOnDisplays.isEmpty()
                    && mDefaultDisplayPolicy.isAwake()
                    && mKeyguardDelegate != null && mKeyguardDelegate.isSecure(mCurrentUserId);
            if (mLockScreenTimerActive != enable) {
                if (enable) {
                    if (localLOGV) Log.v(TAG, "setting lockscreen timer");
                    mHandler.removeCallbacks(mScreenLockTimeout); // remove any pending requests
                    //mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout);
                    if (mLockScreenTimeout != 0) {
                        mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout);
                    }
                } else {
                    if (localLOGV) Log.v(TAG, "clearing lockscreen timer");
                    mHandler.removeCallbacks(mScreenLockTimeout);
                }
                mLockScreenTimerActive = enable;
            }
        }
    }

2.修改updateUserActivitySummaryLocked中部分邏輯,增加判斷條件。
最終如下。

//frameworks\base\services\core\java\com\android\server\power\PowerManagerService.java
    private void updateUserActivitySummaryLocked(long now, int dirty) {
        // Update the status of the user activity timeout timer.
       ................

               /* if ((mUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0
                        && (mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) == 0) {
                    nextTimeout = mAttentionDetector.updateUserActivity(nextTimeout,
                            screenDimDuration);
                }

                if (nextProfileTimeout > 0) {
                    nextTimeout = Math.min(nextTimeout, nextProfileTimeout);
                }

                if (mUserActivitySummary != 0 && nextTimeout >= 0) {
                    scheduleUserInactivityTimeout(nextTimeout);
                }*/

                if (mScreenOffTimeoutSetting != 0) {
                    if ((mUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0
                            && (mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) == 0) {
                        nextTimeout = mAttentionDetector.updateUserActivity(nextTimeout,screenDimDuration);
                    }
                    if (nextProfileTimeout > 0) {
                        nextTimeout = Math.min(nextTimeout, nextProfileTimeout);
                    }
                    if (mUserActivitySummary != 0 && nextTimeout >= 0) {
                        scheduleUserInactivityTimeout(nextTimeout);
                    }
                } else {
                    mUserActivitySummary |= USER_ACTIVITY_SCREEN_BRIGHT;
                }
            } else {
                mUserActivitySummary = 0;
            }

            if (DEBUG_SPEW) {
                Slog.d(TAG, "updateUserActivitySummaryLocked: mWakefulness="
                        + PowerManagerInternal.wakefulnessToString(getWakefulnessLocked())
                        + ", mUserActivitySummary=0x" + Integer.toHexString(mUserActivitySummary)
                        + ", nextTimeout=" + TimeUtils.formatUptime(nextTimeout));
            }
        }
    }

參考鏈接:
展訊平臺記錄下工作中一些修改
Android7.1 Settings加入永不休眠選項
安卓7.0顯示設(shè)置界面休眠菜單添加“永不滅屏”選項
android設(shè)置永不滅屏

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 首先,給設(shè)備增加一個屬性persist.language.suggest,具體賦值為frameworks/base...
    梧葉已秋聲閱讀 1,112評論 0 0
  • 1.由于我的jdk是32位的,安裝成功后報 "64 bit jdk not found" 。百度的方法都是編輯st...
    hjm1fb閱讀 2,758評論 0 2
  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 13,990評論 2 59
  • 本系列出于AWeiLoveAndroid的分享,在此感謝,再結(jié)合自身經(jīng)驗查漏補缺,完善答案。以成系統(tǒng)。 Andro...
    濟公大將閱讀 1,998評論 2 10
  • 久違的晴天,家長會。 家長大會開好到教室時,離放學(xué)已經(jīng)沒多少時間了。班主任說已經(jīng)安排了三個家長分享經(jīng)驗。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,818評論 16 22

友情鏈接更多精彩內(nèi)容