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