IdleMaintenanceService.java revision f23b64df94bbff9ac8c87832dea9c1bc0ae9a950
1b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav/* 2b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * Copyright (C) 2013 The Android Open Source Project 3b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * 4b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * Licensed under the Apache License, Version 2.0 (the "License"); 5b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * you may not use this file except in compliance with the License. 6b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * You may obtain a copy of the License at 7b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * 8b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * http://www.apache.org/licenses/LICENSE-2.0 9b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * 10b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * Unless required by applicable law or agreed to in writing, software 11b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * distributed under the License is distributed on an "AS IS" BASIS, 12b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * See the License for the specific language governing permissions and 14b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * limitations under the License. 15b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav */ 16b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 17b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslavpackage com.android.server; 18b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 19b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslavimport android.app.Activity; 20b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslavimport android.content.BroadcastReceiver; 21b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslavimport android.content.Context; 22b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslavimport android.content.Intent; 23b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslavimport android.content.IntentFilter; 24b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslavimport android.os.BatteryManager; 25b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslavimport android.os.Handler; 26b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslavimport android.os.Looper; 27b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslavimport android.os.PowerManager; 28b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslavimport android.os.PowerManager.WakeLock; 29b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslavimport android.os.SystemClock; 30b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslavimport android.os.UserHandle; 31b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslavimport android.util.Log; 32b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 33b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav/** 34b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * This service observes the device state and when applicable sends 35b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * broadcasts at the beginning and at the end of a period during which 36b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * observers can perform idle maintenance tasks. Typical use of the 37b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * idle maintenance is to perform somehow expensive tasks that can be 38b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * postponed to a moment when they will not degrade user experience. 39b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * 40b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * The current implementation is very simple. The start of a maintenance 41b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * window is announced if: the screen is off or showing a dream AND the 42b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * battery level is more than twenty percent AND at least one hour passed 43b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * since the screen went off or a dream started (i.e. since the last user 44b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * activity). 45b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * 46b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * The end of a maintenance window is announced only if: a start was 47b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav * announced AND the screen turned on or a dream was stopped. 48b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav */ 49b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslavpublic class IdleMaintenanceService extends BroadcastReceiver { 50b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 51b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav private final boolean DEBUG = false; 52b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 53b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav private static final String LOG_TAG = IdleMaintenanceService.class.getSimpleName(); 54b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 55b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav private static final int LAST_USER_ACTIVITY_TIME_INVALID = -1; 56b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 57f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav private static final long MILLIS_IN_DAY = 24 * 60 * 60 * 1000; 58f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav 59f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav private static final int MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_START_CHARGING = 30; // percent 60f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav 61f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav private static final int MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_START_NOT_CHARGING = 80; // percent 62b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 63f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav private static final int MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_RUNNING = 10; // percent 64f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav 65f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav private static final long MIN_USER_INACTIVITY_IDLE_MAINTENANCE_START = 60 * 60 * 1000; // 1 hour 66b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 67b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav private final Intent mIdleMaintenanceStartIntent = 68b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav new Intent(Intent.ACTION_IDLE_MAINTENANCE_START); 69b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 70b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav private final Intent mIdleMaintenanceEndIntent = 71b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav new Intent(Intent.ACTION_IDLE_MAINTENANCE_END); 72b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 73b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav private final Context mContext; 74b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 75b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav private final WakeLock mWakeLock; 76b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 77b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav private final Handler mHandler; 78b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 79f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav private long mLastIdleMaintenanceStartTimeMillis = SystemClock.elapsedRealtime(); 80b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 81b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav private long mLastUserActivityElapsedTimeMillis = LAST_USER_ACTIVITY_TIME_INVALID; 82b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 83b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav private int mBatteryLevel; 84b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 85f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav private boolean mBatteryCharging; 86f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav 87b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav private boolean mIdleMaintenanceStarted; 88b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 89b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav public IdleMaintenanceService(Context context) { 90b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav mContext = context; 91b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 92b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 93b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); 94b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 95b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav mHandler = new Handler(mContext.getMainLooper()); 96b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 97b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav register(mContext.getMainLooper()); 98b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav } 99b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 100b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav public void register(Looper looper) { 101b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav IntentFilter intentFilter = new IntentFilter(); 102b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 103b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav // Battery actions. 104b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); 105b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 106b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav // Screen actions. 107b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav intentFilter.addAction(Intent.ACTION_SCREEN_ON); 108b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav intentFilter.addAction(Intent.ACTION_SCREEN_OFF); 109b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 110b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav // Dream actions. 111b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav intentFilter.addAction(Intent.ACTION_DREAMING_STARTED); 112b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav intentFilter.addAction(Intent.ACTION_DREAMING_STOPPED); 113b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 114b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav mContext.registerReceiverAsUser(this, UserHandle.ALL, 115b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav intentFilter, null, new Handler(looper)); 116b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav } 117b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 118b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav private void updateIdleMaintenanceState() { 119b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav if (mIdleMaintenanceStarted) { 120b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav // Idle maintenance can be interrupted only by 121b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav // a change of the device state. 122f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav if (!deviceStatePermitsIdleMaintenanceRunning()) { 123b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav mIdleMaintenanceStarted = false; 124f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav EventLogTags.writeIdleMaintenanceWindowFinish(SystemClock.elapsedRealtime(), 125f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav mLastUserActivityElapsedTimeMillis, mBatteryLevel, 126f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav mBatteryCharging ? 1 : 0); 127b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav sendIdleMaintenanceEndIntent(); 128b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav } 129f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav } else if (deviceStatePermitsIdleMaintenanceStart() 130b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav && lastUserActivityPermitsIdleMaintenanceStart() 131b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav && lastRunPermitsIdleMaintenanceStart()) { 132b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav mIdleMaintenanceStarted = true; 133f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav EventLogTags.writeIdleMaintenanceWindowStart(SystemClock.elapsedRealtime(), 134f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav mLastUserActivityElapsedTimeMillis, mBatteryLevel, 135f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav mBatteryCharging ? 1 : 0); 136f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav mLastIdleMaintenanceStartTimeMillis = SystemClock.elapsedRealtime(); 137b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav sendIdleMaintenanceStartIntent(); 138b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav } 139b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav } 140b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 141b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav private void sendIdleMaintenanceStartIntent() { 142b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav if (DEBUG) { 143b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav Log.i(LOG_TAG, "Broadcasting " + Intent.ACTION_IDLE_MAINTENANCE_START); 144b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav } 145b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav mWakeLock.acquire(); 146b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav mContext.sendOrderedBroadcastAsUser(mIdleMaintenanceStartIntent, UserHandle.ALL, 147b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav null, this, mHandler, Activity.RESULT_OK, null, null); 148b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav } 149b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 150b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav private void sendIdleMaintenanceEndIntent() { 151b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav if (DEBUG) { 152b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav Log.i(LOG_TAG, "Broadcasting " + Intent.ACTION_IDLE_MAINTENANCE_END); 153b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav } 154b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav mWakeLock.acquire(); 155b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav mContext.sendOrderedBroadcastAsUser(mIdleMaintenanceEndIntent, UserHandle.ALL, 156b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav null, this, mHandler, Activity.RESULT_OK, null, null); 157b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav } 158b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 159f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav private boolean deviceStatePermitsIdleMaintenanceStart() { 160f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav final int minBatteryLevel = mBatteryCharging 161f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav ? MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_START_CHARGING 162f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav : MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_START_NOT_CHARGING; 163f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav return (mLastUserActivityElapsedTimeMillis != LAST_USER_ACTIVITY_TIME_INVALID 164f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav && mBatteryLevel > minBatteryLevel); 165f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav } 166f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav 167f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav private boolean deviceStatePermitsIdleMaintenanceRunning() { 168b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav return (mLastUserActivityElapsedTimeMillis != LAST_USER_ACTIVITY_TIME_INVALID 169f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav && mBatteryLevel > MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_RUNNING); 170b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav } 171b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 172b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav private boolean lastUserActivityPermitsIdleMaintenanceStart() { 173b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav return (SystemClock.elapsedRealtime() - mLastUserActivityElapsedTimeMillis 174f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav > MIN_USER_INACTIVITY_IDLE_MAINTENANCE_START); 175b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav } 176b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 177b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav private boolean lastRunPermitsIdleMaintenanceStart() { 178f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav return SystemClock.elapsedRealtime() - mLastIdleMaintenanceStartTimeMillis > MILLIS_IN_DAY; 179b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav } 180b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav 181b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav @Override 182b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav public void onReceive(Context context, Intent intent) { 183b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav if (DEBUG) { 184b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav Log.i(LOG_TAG, intent.getAction()); 185b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav } 186b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav String action = intent.getAction(); 187b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav if (Intent.ACTION_BATTERY_CHANGED.equals(action)) { 188b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav final int maxBatteryLevel = intent.getExtras().getInt(BatteryManager.EXTRA_SCALE); 189b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav final int currBatteryLevel = intent.getExtras().getInt(BatteryManager.EXTRA_LEVEL); 190b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav mBatteryLevel = (int) (((float) maxBatteryLevel / 100) * currBatteryLevel); 191f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav final int pluggedState = intent.getExtras().getInt(BatteryManager.EXTRA_PLUGGED); 192f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav final int chargerState = intent.getExtras().getInt( 193f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav BatteryManager.EXTRA_INVALID_CHARGER, 0); 194f23b64df94bbff9ac8c87832dea9c1bc0ae9a950Svetoslav mBatteryCharging = (pluggedState > 0 && chargerState == 0); 195b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav } else if (Intent.ACTION_SCREEN_ON.equals(action) 196b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav || Intent.ACTION_DREAMING_STOPPED.equals(action)) { 197b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav mLastUserActivityElapsedTimeMillis = LAST_USER_ACTIVITY_TIME_INVALID; 198b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav } else if (Intent.ACTION_SCREEN_OFF.equals(action) 199b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav || Intent.ACTION_DREAMING_STARTED.equals(action)) { 200b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav mLastUserActivityElapsedTimeMillis = SystemClock.elapsedRealtime(); 201b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav } else if (Intent.ACTION_IDLE_MAINTENANCE_START.equals(action) 202b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav || Intent.ACTION_IDLE_MAINTENANCE_END.equals(action)) { 203b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav mWakeLock.release(); 204b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav return; 205b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav } 206b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav updateIdleMaintenanceState(); 207b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav } 208b3038ec7cfc5d26eb0be18ae65c62825556bca0fSvetoslav} 209