ImmersiveModeConfirmation.java revision 34e13d90eda9bfda7a70998d190a95c88aa3d3d1
134e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock/* 234e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock * Copyright (C) 2013 The Android Open Source Project 334e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock * 434e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock * Licensed under the Apache License, Version 2.0 (the "License"); 534e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock * you may not use this file except in compliance with the License. 634e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock * You may obtain a copy of the License at 734e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock * 834e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock * http://www.apache.org/licenses/LICENSE-2.0 934e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock * 1034e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock * Unless required by applicable law or agreed to in writing, software 1134e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock * distributed under the License is distributed on an "AS IS" BASIS, 1234e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1334e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock * See the License for the specific language governing permissions and 1434e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock * limitations under the License. 1534e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock */ 1634e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock 1734e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlockpackage com.android.internal.policy.impl; 1834e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock 1934e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlockimport android.content.Context; 2034e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlockimport android.os.Handler; 2134e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlockimport android.util.ArraySet; 2234e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlockimport android.util.Slog; 2334e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlockimport android.view.View; 2434e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlockimport android.widget.Toast; 2534e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock 2634e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlockimport com.android.internal.R; 2734e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock 2834e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock/** 2934e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock * Helper to manage showing/hiding a confirmation prompt when the transient navigation bar 3034e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock * is hidden. 3134e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock */ 3234e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlockpublic class TransientNavigationConfirmation { 3334e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock private final String TAG = "TransientNavigationConfirmation"; 3434e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock private final boolean DEBUG = false; 3534e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock 3634e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock private final Context mContext; 3734e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock private final Handler mHandler; 3834e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock private final ArraySet<String> mConfirmedUserPackages = new ArraySet<String>(); 3934e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock 4034e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock private final Runnable mHandleDismiss = new Runnable() { 4134e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock @Override 4234e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock public void run() { 4334e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock if (mToast != null) { 4434e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock mToast.cancel(); 4534e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock mToast = null; 4634e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock } 4734e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock } 4834e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock }; 4934e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock 5034e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock private Toast mToast; 5134e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock private String mLastUserPackage; 5234e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock 5334e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock public TransientNavigationConfirmation(Context context, Handler handler) { 5434e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock mContext = context; 5534e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock mHandler = handler; 5634e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock } 5734e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock 5834e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock public void transientNavigationChanged(int userId, String pkg, boolean isNavTransient) { 5934e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock if (pkg == null) { 6034e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock return; 6134e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock } 6234e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock String userPkg = userId + ":" + pkg; 6334e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock if (isNavTransient) { 6434e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock mLastUserPackage = userPkg; 6534e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock if (!mConfirmedUserPackages.contains(userPkg)) { 6634e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock if (DEBUG) Slog.d(TAG, "Showing transient navigation confirmation for " + userPkg); 6734e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock mHandler.post(handleShowConfirmation(userPkg)); 6834e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock } 6934e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock } else { 7034e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock mLastUserPackage = null; 7134e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock if (DEBUG) Slog.d(TAG, "Hiding transient navigation confirmation for " + userPkg); 7234e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock mHandler.post(mHandleDismiss); 7334e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock } 7434e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock } 7534e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock 7634e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock public void unconfirmLastPackage() { 7734e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock if (mLastUserPackage != null) { 7834e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock if (DEBUG) Slog.d(TAG, "Unconfirming transient navigation for " + mLastUserPackage); 7934e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock mConfirmedUserPackages.remove(mLastUserPackage); 8034e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock } 8134e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock } 8234e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock 8334e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock private Runnable handleShowConfirmation(final String userPkg) { 8434e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock return new Runnable() { 8534e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock @Override 8634e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock public void run() { 8734e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock // create the confirmation toast bar 8834e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock final int msg = R.string.transient_navigation_confirmation; 8934e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock mToast = Toast.makeBar(mContext, msg, Toast.LENGTH_INFINITE); 9034e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock mToast.setAction(R.string.ok, confirmAction(userPkg)); 9134e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock 9234e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock // we will be hiding the nav bar, so layout as if it's already hidden 9334e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock mToast.getView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); 9434e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock 9534e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock // show the confirmation 9634e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock mToast.show(); 9734e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock } 9834e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock }; 9934e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock } 10034e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock 10134e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock private Runnable confirmAction(final String userPkg) { 10234e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock return new Runnable() { 10334e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock @Override 10434e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock public void run() { 10534e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock mConfirmedUserPackages.add(userPkg); 10634e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock mHandleDismiss.run(); 10734e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock } 10834e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock }; 10934e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock } 11034e13d90eda9bfda7a70998d190a95c88aa3d3d1John Spurlock} 111