2 * Copyright (C) 2012 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com.android.server.am;
19 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU;
20 import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
21 import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
23 import android.app.IStopUserCallback;
24 import android.os.UserHandle;
25 import android.util.ArrayMap;
26 import android.util.Slog;
28 import com.android.internal.util.ProgressReporter;
30 import java.io.PrintWriter;
31 import java.util.ArrayList;
33 public final class UserState {
34 private static final String TAG = TAG_WITH_CLASS_NAME ? "UserState" : TAG_AM;
36 // User is first coming up.
37 public final static int STATE_BOOTING = 0;
38 // User is in the locked state.
39 public final static int STATE_RUNNING_LOCKED = 1;
40 // User is in the unlocking state.
41 public final static int STATE_RUNNING_UNLOCKING = 2;
42 // User is in the running state.
43 public final static int STATE_RUNNING_UNLOCKED = 3;
44 // User is in the initial process of being stopped.
45 public final static int STATE_STOPPING = 4;
46 // User is in the final phase of stopping, sending Intent.ACTION_SHUTDOWN.
47 public final static int STATE_SHUTDOWN = 5;
49 public final UserHandle mHandle;
50 public final ArrayList<IStopUserCallback> mStopCallbacks
51 = new ArrayList<IStopUserCallback>();
52 public final ProgressReporter mUnlockProgress;
54 public int state = STATE_BOOTING;
55 public int lastState = STATE_BOOTING;
56 public boolean switching;
59 * The last time that a provider was reported to usage stats as being brought to important
60 * foreground procstate.
62 public final ArrayMap<String,Long> mProviderLastReportedFg = new ArrayMap<>();
64 public UserState(UserHandle handle) {
66 mUnlockProgress = new ProgressReporter(handle.getIdentifier());
69 public boolean setState(int oldState, int newState) {
70 if (state == oldState) {
74 Slog.w(TAG, "Expected user " + mHandle.getIdentifier() + " in state "
75 + stateToString(oldState) + " but was in state " + stateToString(state));
80 public void setState(int newState) {
82 Slog.i(TAG, "User " + mHandle.getIdentifier() + " state changed from "
83 + stateToString(state) + " to " + stateToString(newState));
89 private static String stateToString(int state) {
91 case STATE_BOOTING: return "BOOTING";
92 case STATE_RUNNING_LOCKED: return "RUNNING_LOCKED";
93 case STATE_RUNNING_UNLOCKING: return "RUNNING_UNLOCKING";
94 case STATE_RUNNING_UNLOCKED: return "RUNNING_UNLOCKED";
95 case STATE_STOPPING: return "STOPPING";
96 case STATE_SHUTDOWN: return "SHUTDOWN";
97 default: return Integer.toString(state);
101 void dump(String prefix, PrintWriter pw) {
103 pw.print("state="); pw.print(stateToString(state));
104 if (switching) pw.print(" SWITCHING");