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