ScreenPinningRequest.java revision d61f2271c40cd7b3b10f39d8ffdaf8c527cb78be
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; 2918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.graphics.drawable.ColorDrawable; 30823c7bc5c5790b87926b267a0ce15ee114d5b196Jason Monkimport android.os.RemoteException; 3118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.util.DisplayMetrics; 3218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.view.Gravity; 3318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.view.View; 3418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.view.ViewGroup; 3518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.view.WindowManager; 3618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.view.accessibility.AccessibilityManager; 3718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.view.animation.DecelerateInterpolator; 3818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.widget.Button; 3918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.widget.FrameLayout; 4018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.widget.LinearLayout; 4118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport android.widget.TextView; 4218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 4318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport com.android.systemui.R; 4418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 4518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkimport java.util.ArrayList; 4618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 4718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monkpublic class ScreenPinningRequest implements View.OnClickListener { 4818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk private final Context mContext; 4918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 5018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk private final AccessibilityManager mAccessibilityService; 5118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk private final WindowManager mWindowManager; 5218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 5318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk private RequestWindowView mRequestWindow; 5418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 5518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk public ScreenPinningRequest(Context context) { 5618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mContext = context; 5718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mAccessibilityService = (AccessibilityManager) 5818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mContext.getSystemService(Context.ACCESSIBILITY_SERVICE); 5918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mWindowManager = (WindowManager) 6018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mContext.getSystemService(Context.WINDOW_SERVICE); 6118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 6218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 6318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk public void clearPrompt() { 6418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk if (mRequestWindow != null) { 6518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mWindowManager.removeView(mRequestWindow); 6618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mRequestWindow = null; 6718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 6818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 6918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 7018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk public void showPrompt(boolean allowCancel) { 7118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk clearPrompt(); 7218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 7318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mRequestWindow = new RequestWindowView(mContext, allowCancel); 7418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 7518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mRequestWindow.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE); 7618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 7718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk // show the confirmation 7818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk WindowManager.LayoutParams lp = getWindowLayoutParams(); 7918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mWindowManager.addView(mRequestWindow, lp); 8018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 8118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 8218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk public void onConfigurationChanged() { 8318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk if (mRequestWindow != null) { 8418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mRequestWindow.onConfigurationChanged(); 8518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 8618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 8718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 8818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk private WindowManager.LayoutParams getWindowLayoutParams() { 8918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk final WindowManager.LayoutParams lp = new WindowManager.LayoutParams( 9018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk ViewGroup.LayoutParams.MATCH_PARENT, 9118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk ViewGroup.LayoutParams.MATCH_PARENT, 9218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL, 9318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 0 9418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 9518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 9618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED 9718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk , 9818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk PixelFormat.TRANSLUCENT); 9918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS; 10018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk lp.setTitle("ScreenPinningConfirmation"); 10118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk lp.gravity = Gravity.FILL; 10218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk return lp; 10318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 10418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 10518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk @Override 10618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk public void onClick(View v) { 10718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk if (v.getId() == R.id.screen_pinning_ok_button || mRequestWindow == v) { 10818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk try { 10918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk ActivityManagerNative.getDefault().startLockTaskModeOnCurrent(); 11018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } catch (RemoteException e) {} 11118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 11218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk clearPrompt(); 11318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 11418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 11518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk public FrameLayout.LayoutParams getRequestLayoutParams(boolean isLandscape) { 11618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk return new FrameLayout.LayoutParams( 11718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk ViewGroup.LayoutParams.WRAP_CONTENT, 11818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk ViewGroup.LayoutParams.WRAP_CONTENT, 11918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk isLandscape ? (Gravity.CENTER_VERTICAL | Gravity.RIGHT) 12018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk : (Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM)); 12118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 12218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 12318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk private class RequestWindowView extends FrameLayout { 12418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk private static final int OFFSET_DP = 96; 12518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 12618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk private final ColorDrawable mColor = new ColorDrawable(0); 12718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk private ValueAnimator mColorAnim; 12818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk private ViewGroup mLayout; 12918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk private boolean mShowCancel; 13018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 13118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk public RequestWindowView(Context context, boolean showCancel) { 13218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk super(context); 13318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk setClickable(true); 13418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk setOnClickListener(ScreenPinningRequest.this); 13518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk setBackground(mColor); 13618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mShowCancel = showCancel; 13718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 13818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 13918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk @Override 14018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk public void onAttachedToWindow() { 14118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk DisplayMetrics metrics = new DisplayMetrics(); 14218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mWindowManager.getDefaultDisplay().getMetrics(metrics); 14318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk float density = metrics.density; 14418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk boolean isLandscape = isLandscapePhone(mContext); 14518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 14618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk inflateView(isLandscape); 14718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk int bgColor = mContext.getResources().getColor( 14818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk R.color.screen_pinning_request_window_bg); 14918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk if (ActivityManager.isHighEndGfx()) { 15018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mLayout.setAlpha(0f); 15118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk if (isLandscape) { 15218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mLayout.setTranslationX(OFFSET_DP * density); 15318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } else { 15418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mLayout.setTranslationY(OFFSET_DP * density); 15518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 15618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mLayout.animate() 15718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk .alpha(1f) 15818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk .translationX(0) 15918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk .translationY(0) 16018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk .setDuration(300) 16118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk .setInterpolator(new DecelerateInterpolator()) 16218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk .start(); 16318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 16418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mColorAnim = ValueAnimator.ofObject(new ArgbEvaluator(), 0, bgColor); 16518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mColorAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 16618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk @Override 16718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk public void onAnimationUpdate(ValueAnimator animation) { 16818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk final int c = (Integer) animation.getAnimatedValue(); 16918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mColor.setColor(c); 17018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 17118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk }); 17218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mColorAnim.setDuration(1000); 17318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mColorAnim.start(); 17418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } else { 17518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mColor.setColor(bgColor); 17618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 17718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 17818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk IntentFilter filter = new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED); 17918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk filter.addAction(Intent.ACTION_USER_SWITCHED); 18018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk filter.addAction(Intent.ACTION_SCREEN_OFF); 18118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mContext.registerReceiver(mReceiver, filter); 18218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 18318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 18418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk private boolean isLandscapePhone(Context context) { 18518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk Configuration config = mContext.getResources().getConfiguration(); 18618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk return config.orientation == Configuration.ORIENTATION_LANDSCAPE 18718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk && config.smallestScreenWidthDp < 600; 18818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 18918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 19018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk private void inflateView(boolean isLandscape) { 19118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk // We only want this landscape orientation on <600dp, so rather than handle 19218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk // resource overlay for -land and -sw600dp-land, just inflate this 19318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk // other view for this single case. 19418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mLayout = (ViewGroup) View.inflate(getContext(), isLandscape 19518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk ? R.layout.screen_pinning_request_land_phone : R.layout.screen_pinning_request, 19618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk null); 19718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk // Catch touches so they don't trigger cancel/activate, like outside does. 19818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mLayout.setClickable(true); 19918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk // Status bar is always on the right. 20018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mLayout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR); 20118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk // Buttons and text do switch sides though. 20218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk View buttons = mLayout.findViewById(R.id.screen_pinning_buttons); 20318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk buttons.setLayoutDirection(View.LAYOUT_DIRECTION_LOCALE); 20418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mLayout.findViewById(R.id.screen_pinning_text_area) 20518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk .setLayoutDirection(View.LAYOUT_DIRECTION_LOCALE); 20618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk swapChildrenIfRtlAndVertical(buttons); 20718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 20818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk ((Button) mLayout.findViewById(R.id.screen_pinning_ok_button)) 20918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk .setOnClickListener(ScreenPinningRequest.this); 21018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk if (mShowCancel) { 21118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk ((Button) mLayout.findViewById(R.id.screen_pinning_cancel_button)) 21218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk .setOnClickListener(ScreenPinningRequest.this); 21318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } else { 21418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk ((Button) mLayout.findViewById(R.id.screen_pinning_cancel_button)) 21518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk .setVisibility(View.INVISIBLE); 21618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 21718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 21818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk final int description = mAccessibilityService.isEnabled() 21918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk ? R.string.screen_pinning_description_accessible 22018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk : R.string.screen_pinning_description; 22118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk ((TextView) mLayout.findViewById(R.id.screen_pinning_description)) 22218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk .setText(description); 22318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk final int backBgVisibility = 22418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mAccessibilityService.isEnabled() ? View.INVISIBLE : View.VISIBLE; 22518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mLayout.findViewById(R.id.screen_pinning_back_bg).setVisibility(backBgVisibility); 22618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mLayout.findViewById(R.id.screen_pinning_back_bg_light).setVisibility(backBgVisibility); 22718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 22818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk addView(mLayout, getRequestLayoutParams(isLandscape)); 22918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 23018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 23118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk private void swapChildrenIfRtlAndVertical(View group) { 23218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk if (mContext.getResources().getConfiguration().getLayoutDirection() 23318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk != View.LAYOUT_DIRECTION_RTL) { 23418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk return; 23518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 23618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk LinearLayout linearLayout = (LinearLayout) group; 23718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk if (linearLayout.getOrientation() == LinearLayout.VERTICAL) { 23818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk int childCount = linearLayout.getChildCount(); 23918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk ArrayList<View> childList = new ArrayList<>(childCount); 24018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk for (int i = 0; i < childCount; i++) { 24118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk childList.add(linearLayout.getChildAt(i)); 24218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 24318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk linearLayout.removeAllViews(); 24418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk for (int i = childCount - 1; i >= 0; i--) { 24518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk linearLayout.addView(childList.get(i)); 24618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 24718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 24818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 24918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 25018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk @Override 25118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk public void onDetachedFromWindow() { 25218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mContext.unregisterReceiver(mReceiver); 25318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 25418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 25518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk protected void onConfigurationChanged() { 25618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk removeAllViews(); 25718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk inflateView(isLandscapePhone(mContext)); 25818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 25918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 26018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk private final Runnable mUpdateLayoutRunnable = new Runnable() { 26118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk @Override 26218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk public void run() { 26318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk if (mLayout != null && mLayout.getParent() != null) { 26418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk mLayout.setLayoutParams(getRequestLayoutParams(isLandscapePhone(mContext))); 26518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 26618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 26718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk }; 26818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 26918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 27018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk @Override 27118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk public void onReceive(Context context, Intent intent) { 27218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk if (intent.getAction().equals(Intent.ACTION_CONFIGURATION_CHANGED)) { 27318f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk post(mUpdateLayoutRunnable); 27418f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } else if (intent.getAction().equals(Intent.ACTION_USER_SWITCHED) 27518f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk || intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 27618f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk clearPrompt(); 27718f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 27818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 27918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk }; 28018f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 28118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 28218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk} 283