Merge "Fix screen pinning in seascape" into oc-dev

This commit is contained in:
Jason Monk
2017-04-11 17:09:51 +00:00
committed by Android (Google) Code Review
4 changed files with 215 additions and 14 deletions

View File

@@ -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>

View File

@@ -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>

View File

@@ -563,6 +563,10 @@
<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

View 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)));
}
}
};