1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 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 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 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. 15 */ 16 17 package com.android.server.am; 18 19 import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; 20 import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; 21 22 import android.app.IStopUserCallback; 23 import android.os.Trace; 24 import android.os.UserHandle; 25 import android.util.ArrayMap; 26 import android.util.Slog; 27 28 import com.android.internal.util.ProgressReporter; 29 30 import java.io.PrintWriter; 31 import java.util.ArrayList; 32 33 public final class UserState { 34 private static final String TAG = TAG_WITH_CLASS_NAME ? "UserState" : TAG_AM; 35 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; 48 49 public final UserHandle mHandle; 50 public final ArrayList<IStopUserCallback> mStopCallbacks 51 = new ArrayList<IStopUserCallback>(); 52 public final ProgressReporter mUnlockProgress; 53 54 public int state = STATE_BOOTING; 55 public int lastState = STATE_BOOTING; 56 public boolean switching; 57 public boolean tokenProvided; 58 59 /** 60 * The last time that a provider was reported to usage stats as being brought to important 61 * foreground procstate. 62 */ 63 public final ArrayMap<String,Long> mProviderLastReportedFg = new ArrayMap<>(); 64 65 public UserState(UserHandle handle) { 66 mHandle = handle; 67 mUnlockProgress = new ProgressReporter(handle.getIdentifier()); 68 } 69 70 public boolean setState(int oldState, int newState) { 71 if (state == oldState) { 72 setState(newState); 73 return true; 74 } else { 75 Slog.w(TAG, "Expected user " + mHandle.getIdentifier() + " in state " 76 + stateToString(oldState) + " but was in state " + stateToString(state)); 77 return false; 78 } 79 } 80 81 public void setState(int newState) { 82 if (newState == state) { 83 return; 84 } 85 final int userId = mHandle.getIdentifier(); 86 if (state != STATE_BOOTING) { 87 Trace.asyncTraceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER, 88 stateToString(state) + " " + userId, userId); 89 } 90 if (newState != STATE_SHUTDOWN) { 91 Trace.asyncTraceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, 92 stateToString(newState) + " " + userId, userId); 93 } 94 Slog.i(TAG, "User " + userId + " state changed from " 95 + stateToString(state) + " to " + stateToString(newState)); 96 EventLogTags.writeAmUserStateChanged(userId, newState); 97 lastState = state; 98 state = newState; 99 } 100 101 public static String stateToString(int state) { 102 switch (state) { 103 case STATE_BOOTING: return "BOOTING"; 104 case STATE_RUNNING_LOCKED: return "RUNNING_LOCKED"; 105 case STATE_RUNNING_UNLOCKING: return "RUNNING_UNLOCKING"; 106 case STATE_RUNNING_UNLOCKED: return "RUNNING_UNLOCKED"; 107 case STATE_STOPPING: return "STOPPING"; 108 case STATE_SHUTDOWN: return "SHUTDOWN"; 109 default: return Integer.toString(state); 110 } 111 } 112 113 void dump(String prefix, PrintWriter pw) { 114 pw.print(prefix); 115 pw.print("state="); pw.print(stateToString(state)); 116 if (switching) pw.print(" SWITCHING"); 117 pw.println(); 118 } 119 } 120