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