UserSwitchingDialog.java revision 7805a10c86a2de9fb5ddf41d63075eef342a59ea
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2014 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes * you may not use this file except in compliance with the License. 669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes * You may obtain a copy of the License at 769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 1269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes * See the License for the specific language governing permissions and 1469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server.am; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Service; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ActivityNotFoundException; 210795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopianimport android.content.Context; 220795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopianimport android.content.DialogInterface; 230795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopianimport android.content.Intent; 24f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kastenimport android.content.res.Resources; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Slog; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Dialog to show when a user switch it about to happen. The intent is to snapshot the screen 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * immediately after the dialog shows so that the user is informed that something is happening 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the background rather than just freeze the screen and not know if the user-switch affordance 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * was being handled. 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfinal class UserSwitchingDialog extends BaseErrorDialog { 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "ActivityManagerUserSwitchingDialog"; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MSG_START_USER = 1; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 416af763bec7c3f4d50fee8dd0046409bb8a7fe8f6Glenn Kasten private final ActivityManagerService mService; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final int mUserId; 43957e58670baad8c5995f1368e3b5280f0dbd891fSan Mehat 44160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate public UserSwitchingDialog(ActivityManagerService service, Context context, 45a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehat int userId, String userName, boolean aboveSystem) { 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context); 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate mService = service; 49160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate mUserId = userId; 50160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate Resources res = context.getResources(); 51160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate setCancelable(false); 52160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate setMessage(res.getString(com.android.internal.R.string.user_switching_message, userName)); 53f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten if (aboveSystem) { 54f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR); 556793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten } 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams attrs = getWindow().getAttributes(); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attrs.privateFlags = WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR | 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getWindow().setAttributes(attrs); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void show() { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.show(); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: Instead of just an arbitrary delay, wait for a signal that the window was fully 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // displayed by the window manager 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_START_USER), 250); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Handler mHandler = new Handler() { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (msg.what) { 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MSG_START_USER: 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.startUserInForeground(mUserId, UserSwitchingDialog.this); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 766793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten } 77e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat } 78e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat }; 79e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat} 80e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat