OSDN Git Service

Fix screen pinning in seascape
authorJason Monk <jmonk@google.com>
Tue, 28 Mar 2017 20:25:08 +0000 (16:25 -0400)
committerJason Monk <jmonk@google.com>
Tue, 11 Apr 2017 14:16:06 +0000 (14:16 +0000)
Test: visual
Change-Id: I7792d0f5f98e83f0b2fd57a831e82efa07533c2b
Fixes: 34072199

packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml [new file with mode: 0644]
packages/SystemUI/res/layout/screen_pinning_request_sea_phone.xml [new file with mode: 0644]
packages/SystemUI/res/values/dimens.xml
packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java

diff --git a/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml b/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml
new file mode 100644 (file)
index 0000000..f3a6d44
--- /dev/null
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2014, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<!-- Note all width/height dimensions are switched here to handle landspace
+     rather than duplicating them all.
+     This layout matches the structure of navigation_bar.xml (rot90) and
+     will need to be kept up to sync with changes there.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/screen_pinning_buttons"
+    android:layout_height="match_parent"
+    android:layout_width="@dimen/screen_pinning_request_button_height"
+    android:background="?android:attr/colorAccent"
+    android:orientation="vertical">
+
+    <View
+        android:layout_height="@dimen/screen_pinning_request_side_width"
+        android:layout_width="match_parent"
+        android:layout_weight="0"
+        android:visibility="invisible" />
+
+    <FrameLayout
+        android:id="@+id/screen_pinning_back_group"
+        android:layout_height="@dimen/screen_pinning_request_button_width"
+        android:layout_width="@dimen/screen_pinning_request_button_height"
+        android:layout_weight="0"
+        android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent">
+
+        <ImageView
+            android:id="@+id/screen_pinning_back_bg_light"
+            android:layout_height="match_parent"
+            android:layout_width="match_parent"
+            android:scaleType="matrix"
+            android:layout_marginLeft="@dimen/screen_pinning_request_seascape_padding_negative"
+            android:src="@drawable/screen_pinning_light_bg_circ" />
+
+        <ImageView
+            android:id="@+id/screen_pinning_back_bg"
+            android:layout_height="match_parent"
+            android:layout_width="match_parent"
+            android:scaleType="matrix"
+            android:layout_marginLeft="@dimen/screen_pinning_request_seascape_button_offset"
+            android:paddingRight="@dimen/screen_pinning_request_inner_padding"
+            android:paddingTop="@dimen/screen_pinning_request_inner_padding"
+            android:paddingBottom="@dimen/screen_pinning_request_inner_padding"
+            android:src="@drawable/screen_pinning_bg_circ" />
+
+        <ImageView
+            android:layout_height="match_parent"
+            android:layout_width="match_parent"
+            android:scaleType="center"
+            android:paddingRight="@dimen/screen_pinning_request_nav_icon_padding"
+            android:paddingTop="@dimen/screen_pinning_request_nav_side_padding"
+            android:paddingBottom="@dimen/screen_pinning_request_nav_side_padding"
+            android:src="@drawable/ic_sysbar_back" />
+    </FrameLayout>
+
+    <View
+        android:layout_height="match_parent"
+        android:layout_width="match_parent"
+        android:layout_weight="1"
+        android:visibility="invisible" />
+
+    <FrameLayout
+        android:id="@+id/screen_pinning_home_group"
+        android:layout_height="@dimen/screen_pinning_request_button_width"
+        android:layout_width="@dimen/screen_pinning_request_button_height"
+        android:layout_weight="0" >
+
+        <ImageView
+            android:layout_height="match_parent"
+            android:layout_width="match_parent"
+            android:scaleType="center"
+            android:paddingRight="@dimen/screen_pinning_request_nav_icon_padding"
+            android:paddingTop="@dimen/screen_pinning_request_nav_side_padding"
+            android:paddingBottom="@dimen/screen_pinning_request_nav_side_padding"
+            android:src="@drawable/ic_sysbar_home" />
+    </FrameLayout>
+
+    <View
+        android:layout_height="match_parent"
+        android:layout_width="match_parent"
+        android:layout_weight="1"
+        android:visibility="invisible" />
+
+    <FrameLayout
+        android:id="@+id/screen_pinning_recents_group"
+        android:layout_height="@dimen/screen_pinning_request_button_width"
+        android:layout_width="@dimen/screen_pinning_request_button_height"
+        android:layout_weight="0"
+        android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent">
+
+        <ImageView
+            android:id="@+id/screen_pinning_recents_bg_light"
+            android:layout_height="match_parent"
+            android:layout_width="match_parent"
+            android:scaleType="matrix"
+            android:layout_marginLeft="@dimen/screen_pinning_request_seascape_padding_negative"
+            android:src="@drawable/screen_pinning_light_bg_circ" />
+
+        <ImageView
+            android:id="@+id/screen_pinning_recents_bg"
+            android:layout_height="match_parent"
+            android:layout_width="match_parent"
+            android:scaleType="matrix"
+            android:layout_marginLeft="@dimen/screen_pinning_request_seascape_button_offset"
+            android:paddingRight="@dimen/screen_pinning_request_inner_padding"
+            android:paddingTop="@dimen/screen_pinning_request_inner_padding"
+            android:paddingBottom="@dimen/screen_pinning_request_inner_padding"
+            android:src="@drawable/screen_pinning_bg_circ" />
+
+        <ImageView
+            android:layout_height="match_parent"
+            android:layout_width="match_parent"
+            android:scaleType="center"
+            android:paddingRight="@dimen/screen_pinning_request_nav_icon_padding"
+            android:paddingTop="@dimen/screen_pinning_request_nav_side_padding"
+            android:paddingBottom="@dimen/screen_pinning_request_nav_side_padding"
+            android:src="@drawable/ic_sysbar_recent" />
+    </FrameLayout>
+
+    <View
+        android:layout_height="@dimen/screen_pinning_request_side_width"
+        android:layout_width="match_parent"
+        android:layout_weight="0"
+        android:visibility="invisible" />
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/screen_pinning_request_sea_phone.xml b/packages/SystemUI/res/layout/screen_pinning_request_sea_phone.xml
new file mode 100644 (file)
index 0000000..770cead
--- /dev/null
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2014, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_height="@dimen/screen_pinning_request_width"
+    android:layout_width="wrap_content"
+    android:gravity="left|center_vertical"
+    android:orientation="horizontal"
+    android:theme="@android:style/Theme.DeviceDefault.Light">
+
+    <include
+        android:layout_width="wrap_content"
+        android:layout_height="@dimen/screen_pinning_request_width"
+        layout="@layout/screen_pinning_request_buttons_sea" />
+
+    <include
+        android:layout_width="360dp"
+        android:layout_height="@dimen/screen_pinning_request_width"
+        layout="@layout/screen_pinning_request_text_area" />
+
+</LinearLayout>
index ac4bdfc..809648a 100644 (file)
     <dimen name="screen_pinning_request_button_width">84dp</dimen>
     <!-- Screen pinning request padding on top of inner circle -->
     <dimen name="screen_pinning_request_inner_padding">14dp</dimen>
+    <!-- Screen pinning request seascape negative padding -->
+    <dimen name="screen_pinning_request_seascape_padding_negative">-18dp</dimen>
+    <!-- Screen pinning request seascape button offset -->
+    <dimen name="screen_pinning_request_seascape_button_offset">-4dp</dimen>
     <!-- Screen pinning request padding on top of icons -->
     <dimen name="screen_pinning_request_nav_icon_padding">18dp</dimen>
     <!-- Screen pinning request padding on side of icons
index 0336905..521157d 100644 (file)
@@ -31,6 +31,7 @@ import android.os.Binder;
 import android.os.RemoteException;
 import android.util.DisplayMetrics;
 import android.view.Gravity;
+import android.view.Surface;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.WindowManager;
@@ -46,6 +47,11 @@ import com.android.systemui.R;
 import java.util.ArrayList;
 
 public class ScreenPinningRequest implements View.OnClickListener {
+
+    private static final int ROTATION_NONE = 0;
+    private static final int ROTATION_LANDSCAPE = 1;
+    private static final int ROTATION_SEASCAPE = 2;
+
     private final Context mContext;
 
     private final AccessibilityManager mAccessibilityService;
@@ -124,11 +130,12 @@ public class ScreenPinningRequest implements View.OnClickListener {
         clearPrompt();
     }
 
-    public FrameLayout.LayoutParams getRequestLayoutParams(boolean isLandscape) {
+    public FrameLayout.LayoutParams getRequestLayoutParams(int rotation) {
         return new FrameLayout.LayoutParams(
                 ViewGroup.LayoutParams.WRAP_CONTENT,
                 ViewGroup.LayoutParams.WRAP_CONTENT,
-                isLandscape ? (Gravity.CENTER_VERTICAL | Gravity.RIGHT)
+                rotation == ROTATION_SEASCAPE ? (Gravity.CENTER_VERTICAL | Gravity.LEFT) :
+                rotation == ROTATION_LANDSCAPE ? (Gravity.CENTER_VERTICAL | Gravity.RIGHT)
                             : (Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM));
     }
 
@@ -153,14 +160,16 @@ public class ScreenPinningRequest implements View.OnClickListener {
             DisplayMetrics metrics = new DisplayMetrics();
             mWindowManager.getDefaultDisplay().getMetrics(metrics);
             float density = metrics.density;
-            boolean isLandscape = isLandscapePhone(mContext);
+            int rotation = getRotation(mContext);
 
-            inflateView(isLandscape);
+            inflateView(rotation);
             int bgColor = mContext.getColor(
                     R.color.screen_pinning_request_window_bg);
             if (ActivityManager.isHighEndGfx()) {
                 mLayout.setAlpha(0f);
-                if (isLandscape) {
+                if (rotation == ROTATION_SEASCAPE) {
+                    mLayout.setTranslationX(-OFFSET_DP * density);
+                } else if (rotation == ROTATION_LANDSCAPE) {
                     mLayout.setTranslationX(OFFSET_DP * density);
                 } else {
                     mLayout.setTranslationY(OFFSET_DP * density);
@@ -193,18 +202,27 @@ public class ScreenPinningRequest implements View.OnClickListener {
             mContext.registerReceiver(mReceiver, filter);
         }
 
-        private boolean isLandscapePhone(Context context) {
+        private int getRotation(Context context) {
             Configuration config = mContext.getResources().getConfiguration();
-            return config.orientation == Configuration.ORIENTATION_LANDSCAPE
-                    && config.smallestScreenWidthDp < 600;
+            int rot = context.getDisplay().getRotation();
+            if (config.smallestScreenWidthDp < 600) {
+                if (rot == Surface.ROTATION_90) {
+                    return ROTATION_LANDSCAPE;
+                } else if (rot == Surface.ROTATION_270) {
+                    return ROTATION_SEASCAPE;
+                }
+            }
+            return ROTATION_NONE;
         }
 
-        private void inflateView(boolean isLandscape) {
+        private void inflateView(int rotation) {
             // We only want this landscape orientation on <600dp, so rather than handle
             // resource overlay for -land and -sw600dp-land, just inflate this
             // other view for this single case.
-            mLayout = (ViewGroup) View.inflate(getContext(), isLandscape
-                    ? R.layout.screen_pinning_request_land_phone : R.layout.screen_pinning_request,
+            mLayout = (ViewGroup) View.inflate(getContext(),
+                    rotation == ROTATION_SEASCAPE ? R.layout.screen_pinning_request_sea_phone :
+                    rotation == ROTATION_LANDSCAPE ? R.layout.screen_pinning_request_land_phone
+                            : R.layout.screen_pinning_request,
                     null);
             // Catch touches so they don't trigger cancel/activate, like outside does.
             mLayout.setClickable(true);
@@ -240,7 +258,7 @@ public class ScreenPinningRequest implements View.OnClickListener {
             mLayout.findViewById(R.id.screen_pinning_back_bg).setVisibility(backBgVisibility);
             mLayout.findViewById(R.id.screen_pinning_back_bg_light).setVisibility(backBgVisibility);
 
-            addView(mLayout, getRequestLayoutParams(isLandscape));
+            addView(mLayout, getRequestLayoutParams(rotation));
         }
 
         private void swapChildrenIfRtlAndVertical(View group) {
@@ -269,14 +287,14 @@ public class ScreenPinningRequest implements View.OnClickListener {
 
         protected void onConfigurationChanged() {
             removeAllViews();
-            inflateView(isLandscapePhone(mContext));
+            inflateView(getRotation(mContext));
         }
 
         private final Runnable mUpdateLayoutRunnable = new Runnable() {
             @Override
             public void run() {
                 if (mLayout != null && mLayout.getParent() != null) {
-                    mLayout.setLayoutParams(getRequestLayoutParams(isLandscapePhone(mContext)));
+                    mLayout.setLayoutParams(getRequestLayoutParams(getRotation(mContext)));
                 }
             }
         };