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