Android 11 では、無操作スリープという省電力機能があり、ウィンドウに FLAG_KEEP_SCREEN_ON
が表示されている場合、またはウェイクロックのレベルが FULL_WAKE_LOCK
、SCREEN_BRIGHT_WAKE_LOCK
、SCREEN_DIM_WAKE_LOCK
に保持されている場合でも、画面がオフになるまでのユーザーの無操作タイムアウトを設定できます。PARTIAL_WAKE_LOCK
レベルのウェイクロックはこの機能の影響を受けません。タイムアウト時間の直前に、ユーザーがデバイスを操作しないとスリープ状態になることを示すメッセージが表示されます。
このコンテキストで、ユーザー アクティビティとは、(USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS
フラグを含まない)PowerManager#userActivity
を呼び出す呼び出しを指します。これには次のものが含まれます。
- タッチスクリーンの操作
- 物理的なボタンを押す
- 外部アクセサリー(入力キーボード、Bluetooth リモコン、IR リモコンなど)からの入力イベント
- 音声インタラクション
- One Touch Play などの特定の HDMI CEC メッセージを受信する
- 新しいキャスト セッションを開始する
カスタマイズ
この機能を有効にすると、指定した時間の間ユーザーの操作が行われないと、デバイスの画面上に警告が表示されます。何もしない場合、画面はオフになります。構成オプションを使用して機能をカスタマイズできます。
タイムアウトを設定する
タイムアウトを設定するには、frameworks/base/core/res/res/values/config.xml
の次の要素を更新します。
config_attentiveTimeout
- ユーザーの操作が行われない場合、画面がオフになるまでのデフォルトの時間をミリ秒単位で指定します。画面のウェイクロックが設定されていても画面がオフになります。
- ビルド時に設定されます。
- 値が
0
からconfig_minimumScreenOffTimeout
の間の場合、スリープが解除された直後にデバイスの画面がオフにならないように、タイムアウトがconfig_minimumScreenOffTimeout
に設定されます。 - デフォルト:
-1
。この機能を無効にします。
デフォルトのタイムアウトをオーバーライドする
デフォルトのタイムアウト設定をオーバーライドするには、次の要素を更新します。
Settings.Secure.ATTENTIVE_TIMEOUT
- 設定すると、
config_attentiveTimeout
で設定されたデフォルトのスリープ タイムアウトがオーバーライドされます。 - 実行時に設定できます。
警告が表示されるまでの時間を設定する
時間を設定するには、frameworks/base/core/res/res/values/config.xml
の次の要素を更新します。
config_attentiveWarningDuration
- 操作が長時間行われない場合、画面がオフになる前に警告メッセージを表示するまでの時間。
- この値は、設定した無操作スリープ タイムアウトを大幅に下回る必要があります。そうしないと、警告ダイアログが常に表示され、非表示にできません。
- デフォルト:
30000
(30 秒)。
TvSettings のタイムアウト設定を表示する
タイムアウト設定を表示するには、packages/apps/TvSettings/Settings/res/values/config.xml
の次の要素を更新します。
config_show_standby_timeout
- メディアの再生中に設定画面を非表示にできる設定アイテムを表示するかどうかを指定します。
- デフォルト
警告 UI のリソース
- 警告ダイアログのレイアウトは、
frameworks/base/packages/SystemUI/res/layout/inattentive_sleep_warning.xml
で定義されています。 - このダイアログの以下の文字列は、
frameworks/base/packages/SystemUI/res/values/strings.xml
とframeworks/base/packages/SystemUI/res-product/values/strings.xml
で定義されています。 inattentive_sleep_warning_title
inattentive_sleep_warning_message
ビルド時の構成とリソースは、リソース オーバーレイによって変更できます。
実装
次のコマンドを使用して機能を有効にします。
- デフォルトの
config_attentiveTimeout
をオーバーライドします。 - AOSP
TvSettings
を使用する場合: - 設定でこの機能を無効にするには、
config_show_standby_timeout
をオーバーライドします。 Settings.Secure.ATTENTIVE_TIMEOUT
を設定する独自の設定を実装します。
検証
この機能の CTS テストは cts/hostsidetests/os/src/android/os/cts/InattentiveSleepTests.java
にあります。
例とソース
frameworks/base/packages/SystemUI/src/com/android/systemui/power/InattentiveSleepWarningView.java
にはデフォルトの警告 UI の実装が含まれています。packages/apps/TvSettings
は、設定で設定を公開する方法の例を示しています。
手動テストケースの例
デバイスのヘルス HAL により、デバイスに電池が搭載されている(
battery_present
がtrue
)とレポートされた場合は、デベロッパー向け設定のstay_on_while_plugged_in
がオフになっていることを確認します。この機能により、画面がオフにならない可能性があります。
adb shell settings put global stay_on_while_plugged_in 0
- 無操作スリープ・タイムアウトを警告ダイアログの時間よりも数秒長く設定します。
adb shell settings put secure attentive_timeout 32000
- 動画の再生を開始します(画面のウェイクロックを取得)。
- スリープ警告ダイアログが数秒後に表示されることを確認します。
- 設定したタイムアウト時間後に画面がオフになることを確認します。