118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk/*
218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk * Copyright (C) 2014 The Android Open Source Project
318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk *
418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk * Licensed under the Apache License, Version 2.0 (the "License");
518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk * you may not use this file except in compliance with the License.
618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk * You may obtain a copy of the License at
718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk *
818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk *      http://www.apache.org/licenses/LICENSE-2.0
918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk *
1018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk * Unless required by applicable law or agreed to in writing, software
1118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk * distributed under the License is distributed on an "AS IS" BASIS,
1218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk * See the License for the specific language governing permissions and
1418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk * limitations under the License.
1518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk */
1618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
17d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggipackage com.android.systemui.recents;
1818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
1918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.animation.ArgbEvaluator;
2018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.animation.ValueAnimator;
2118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.app.ActivityManager;
2218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.app.ActivityManagerNative;
2318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.content.BroadcastReceiver;
2418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.content.Context;
2518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.content.Intent;
2618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.content.IntentFilter;
2718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.content.res.Configuration;
2818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.graphics.PixelFormat;
29b556811b86adf96f9dbca053c4f3b7dd55bc8851Winsonimport android.graphics.Rect;
3018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.graphics.drawable.ColorDrawable;
31823c7bc5c5790b87926b267a0ce15ee114d5b196Jason Monkimport android.os.RemoteException;
3218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.util.DisplayMetrics;
3318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.view.Gravity;
3418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.view.View;
3518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.view.ViewGroup;
3618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.view.WindowManager;
3718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.view.accessibility.AccessibilityManager;
3818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.view.animation.DecelerateInterpolator;
3918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.widget.Button;
4018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.widget.FrameLayout;
4118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.widget.LinearLayout;
4218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.widget.TextView;
43c0d7058b14c24cd07912f5629c26b39b7b4673d5Winson
4418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport com.android.systemui.R;
4518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
4618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport java.util.ArrayList;
4718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
4818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkpublic class ScreenPinningRequest implements View.OnClickListener {
4918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    private final Context mContext;
5018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
5118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    private final AccessibilityManager mAccessibilityService;
5218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    private final WindowManager mWindowManager;
5318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
5418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    private RequestWindowView mRequestWindow;
5518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
560f051f5abdb31024d862a954cc4c4716b1dde616Andrii Kulian    // Id of task to be pinned or locked.
570f051f5abdb31024d862a954cc4c4716b1dde616Andrii Kulian    private int taskId;
580f051f5abdb31024d862a954cc4c4716b1dde616Andrii Kulian
5918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    public ScreenPinningRequest(Context context) {
6018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        mContext = context;
6118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        mAccessibilityService = (AccessibilityManager)
6218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
6318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        mWindowManager = (WindowManager)
6418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                mContext.getSystemService(Context.WINDOW_SERVICE);
6518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    }
6618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
6718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    public void clearPrompt() {
6818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        if (mRequestWindow != null) {
6918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            mWindowManager.removeView(mRequestWindow);
7018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            mRequestWindow = null;
7118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        }
7218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    }
7318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
740f051f5abdb31024d862a954cc4c4716b1dde616Andrii Kulian    public void showPrompt(int taskId, boolean allowCancel) {
757555f335f4a96ac667786b206a1da1dbfd4e1ca8Winson        try {
767555f335f4a96ac667786b206a1da1dbfd4e1ca8Winson            clearPrompt();
777555f335f4a96ac667786b206a1da1dbfd4e1ca8Winson        } catch (IllegalArgumentException e) {
787555f335f4a96ac667786b206a1da1dbfd4e1ca8Winson            // If the call to show the prompt fails due to the request window not already being
797555f335f4a96ac667786b206a1da1dbfd4e1ca8Winson            // attached, then just ignore the error since we will be re-adding it below.
807555f335f4a96ac667786b206a1da1dbfd4e1ca8Winson        }
8118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
820f051f5abdb31024d862a954cc4c4716b1dde616Andrii Kulian        this.taskId = taskId;
830f051f5abdb31024d862a954cc4c4716b1dde616Andrii Kulian
8418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        mRequestWindow = new RequestWindowView(mContext, allowCancel);
8518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
8618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        mRequestWindow.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
8718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
8818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        // show the confirmation
8918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        WindowManager.LayoutParams lp = getWindowLayoutParams();
9018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        mWindowManager.addView(mRequestWindow, lp);
9118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    }
9218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
9318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    public void onConfigurationChanged() {
9418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        if (mRequestWindow != null) {
9518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            mRequestWindow.onConfigurationChanged();
9618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        }
9718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    }
9818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
9918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    private WindowManager.LayoutParams getWindowLayoutParams() {
10018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
10118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                ViewGroup.LayoutParams.MATCH_PARENT,
10218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                ViewGroup.LayoutParams.MATCH_PARENT,
10318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
10418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                0
10518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                        | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
10618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                        | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
10718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                        | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
10818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                ,
10918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                PixelFormat.TRANSLUCENT);
11018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
11118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        lp.setTitle("ScreenPinningConfirmation");
11218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        lp.gravity = Gravity.FILL;
11318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        return lp;
11418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    }
11518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
11618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    @Override
11718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    public void onClick(View v) {
11818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        if (v.getId() == R.id.screen_pinning_ok_button || mRequestWindow == v) {
11918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            try {
1200f051f5abdb31024d862a954cc4c4716b1dde616Andrii Kulian                ActivityManagerNative.getDefault().startSystemLockTaskMode(taskId);
12118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            } catch (RemoteException e) {}
12218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        }
12318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        clearPrompt();
12418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    }
12518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
12618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    public FrameLayout.LayoutParams getRequestLayoutParams(boolean isLandscape) {
12718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        return new FrameLayout.LayoutParams(
12818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                ViewGroup.LayoutParams.WRAP_CONTENT,
12918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                ViewGroup.LayoutParams.WRAP_CONTENT,
13018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                isLandscape ? (Gravity.CENTER_VERTICAL | Gravity.RIGHT)
13118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                            : (Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM));
13218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    }
13318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
13418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    private class RequestWindowView extends FrameLayout {
13518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        private static final int OFFSET_DP = 96;
13618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
13718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        private final ColorDrawable mColor = new ColorDrawable(0);
13818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        private ValueAnimator mColorAnim;
13918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        private ViewGroup mLayout;
14018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        private boolean mShowCancel;
14118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
14218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        public RequestWindowView(Context context, boolean showCancel) {
14318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            super(context);
14418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            setClickable(true);
14518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            setOnClickListener(ScreenPinningRequest.this);
14618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            setBackground(mColor);
14718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            mShowCancel = showCancel;
14818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        }
14918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
15018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        @Override
15118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        public void onAttachedToWindow() {
15218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            DisplayMetrics metrics = new DisplayMetrics();
15318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            mWindowManager.getDefaultDisplay().getMetrics(metrics);
15418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            float density = metrics.density;
15518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            boolean isLandscape = isLandscapePhone(mContext);
15618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
15718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            inflateView(isLandscape);
1584a357cd2e55293402d7172766f7f9419815fc1e8Alan Viverette            int bgColor = mContext.getColor(
15918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                    R.color.screen_pinning_request_window_bg);
16018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            if (ActivityManager.isHighEndGfx()) {
16118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                mLayout.setAlpha(0f);
16218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                if (isLandscape) {
16318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                    mLayout.setTranslationX(OFFSET_DP * density);
16418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                } else {
16518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                    mLayout.setTranslationY(OFFSET_DP * density);
16618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                }
16718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                mLayout.animate()
16818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                        .alpha(1f)
16918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                        .translationX(0)
17018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                        .translationY(0)
17118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                        .setDuration(300)
17218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                        .setInterpolator(new DecelerateInterpolator())
17318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                        .start();
17418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
17518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                mColorAnim = ValueAnimator.ofObject(new ArgbEvaluator(), 0, bgColor);
17618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                mColorAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
17718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                    @Override
17818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                    public void onAnimationUpdate(ValueAnimator animation) {
17918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                        final int c = (Integer) animation.getAnimatedValue();
18018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                        mColor.setColor(c);
18118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                    }
18218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                });
18318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                mColorAnim.setDuration(1000);
18418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                mColorAnim.start();
18518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            } else {
18618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                mColor.setColor(bgColor);
18718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            }
18818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
18918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            IntentFilter filter = new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED);
19018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            filter.addAction(Intent.ACTION_USER_SWITCHED);
19118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            filter.addAction(Intent.ACTION_SCREEN_OFF);
19218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            mContext.registerReceiver(mReceiver, filter);
19318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        }
19418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
19518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        private boolean isLandscapePhone(Context context) {
19618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            Configuration config = mContext.getResources().getConfiguration();
19718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            return config.orientation == Configuration.ORIENTATION_LANDSCAPE
19818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                    && config.smallestScreenWidthDp < 600;
19918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        }
20018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
20118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        private void inflateView(boolean isLandscape) {
20218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            // We only want this landscape orientation on <600dp, so rather than handle
20318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            // resource overlay for -land and -sw600dp-land, just inflate this
20418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            // other view for this single case.
20518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            mLayout = (ViewGroup) View.inflate(getContext(), isLandscape
20618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                    ? R.layout.screen_pinning_request_land_phone : R.layout.screen_pinning_request,
20718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                    null);
20818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            // Catch touches so they don't trigger cancel/activate, like outside does.
20918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            mLayout.setClickable(true);
21018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            // Status bar is always on the right.
21118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            mLayout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
21218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            // Buttons and text do switch sides though.
21318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            mLayout.findViewById(R.id.screen_pinning_text_area)
21418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                    .setLayoutDirection(View.LAYOUT_DIRECTION_LOCALE);
215b556811b86adf96f9dbca053c4f3b7dd55bc8851Winson            View buttons = mLayout.findViewById(R.id.screen_pinning_buttons);
216b556811b86adf96f9dbca053c4f3b7dd55bc8851Winson            if (Recents.getSystemServices().hasSoftNavigationBar()) {
217b556811b86adf96f9dbca053c4f3b7dd55bc8851Winson                buttons.setLayoutDirection(View.LAYOUT_DIRECTION_LOCALE);
218b556811b86adf96f9dbca053c4f3b7dd55bc8851Winson                swapChildrenIfRtlAndVertical(buttons);
219b556811b86adf96f9dbca053c4f3b7dd55bc8851Winson            } else {
220b556811b86adf96f9dbca053c4f3b7dd55bc8851Winson                buttons.setVisibility(View.GONE);
221b556811b86adf96f9dbca053c4f3b7dd55bc8851Winson            }
22218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
22318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            ((Button) mLayout.findViewById(R.id.screen_pinning_ok_button))
22418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                    .setOnClickListener(ScreenPinningRequest.this);
22518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            if (mShowCancel) {
22618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                ((Button) mLayout.findViewById(R.id.screen_pinning_cancel_button))
22718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                        .setOnClickListener(ScreenPinningRequest.this);
22818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            } else {
22918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                ((Button) mLayout.findViewById(R.id.screen_pinning_cancel_button))
23018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                        .setVisibility(View.INVISIBLE);
23118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            }
23218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
2334e723e60877d3557697fb097e42153fd59cdbd8fJorim Jaggi            boolean touchExplorationEnabled = mAccessibilityService.isTouchExplorationEnabled();
23418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            ((TextView) mLayout.findViewById(R.id.screen_pinning_description))
2354e723e60877d3557697fb097e42153fd59cdbd8fJorim Jaggi                    .setText(touchExplorationEnabled
2364e723e60877d3557697fb097e42153fd59cdbd8fJorim Jaggi                            ? R.string.screen_pinning_description_accessible
2374e723e60877d3557697fb097e42153fd59cdbd8fJorim Jaggi                            : R.string.screen_pinning_description);
2384e723e60877d3557697fb097e42153fd59cdbd8fJorim Jaggi            final int backBgVisibility = touchExplorationEnabled ? View.INVISIBLE : View.VISIBLE;
23918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            mLayout.findViewById(R.id.screen_pinning_back_bg).setVisibility(backBgVisibility);
24018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            mLayout.findViewById(R.id.screen_pinning_back_bg_light).setVisibility(backBgVisibility);
24118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
24218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            addView(mLayout, getRequestLayoutParams(isLandscape));
24318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        }
24418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
24518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        private void swapChildrenIfRtlAndVertical(View group) {
24618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            if (mContext.getResources().getConfiguration().getLayoutDirection()
24718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                    != View.LAYOUT_DIRECTION_RTL) {
24818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                return;
24918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            }
25018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            LinearLayout linearLayout = (LinearLayout) group;
25118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            if (linearLayout.getOrientation() == LinearLayout.VERTICAL) {
25218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                int childCount = linearLayout.getChildCount();
25318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                ArrayList<View> childList = new ArrayList<>(childCount);
25418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                for (int i = 0; i < childCount; i++) {
25518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                    childList.add(linearLayout.getChildAt(i));
25618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                }
25718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                linearLayout.removeAllViews();
25818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                for (int i = childCount - 1; i >= 0; i--) {
25918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                    linearLayout.addView(childList.get(i));
26018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                }
26118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            }
26218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        }
26318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
26418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        @Override
26518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        public void onDetachedFromWindow() {
26618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            mContext.unregisterReceiver(mReceiver);
26718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        }
26818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
26918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        protected void onConfigurationChanged() {
27018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            removeAllViews();
27118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            inflateView(isLandscapePhone(mContext));
27218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        }
27318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
27418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        private final Runnable mUpdateLayoutRunnable = new Runnable() {
27518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            @Override
27618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            public void run() {
27718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                if (mLayout != null && mLayout.getParent() != null) {
27818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                    mLayout.setLayoutParams(getRequestLayoutParams(isLandscapePhone(mContext)));
27918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                }
28018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            }
28118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        };
28218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
28318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
28418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            @Override
28518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            public void onReceive(Context context, Intent intent) {
28618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                if (intent.getAction().equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
28718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                    post(mUpdateLayoutRunnable);
28818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                } else if (intent.getAction().equals(Intent.ACTION_USER_SWITCHED)
28918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                        || intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
29018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                    clearPrompt();
29118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk                }
29218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk            }
29318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk        };
29418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    }
29518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
29618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk}
297