Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e763a26c authored by Jason Monk's avatar Jason Monk
Browse files

Fix screen pinning in seascape

Test: visual
Change-Id: I7792d0f5f98e83f0b2fd57a831e82efa07533c2b
Fixes: 34072199
parent 2d008a5f
Loading
Loading
Loading
Loading
+143 −0
Original line number Diff line number Diff line
<?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>
+36 −0
Original line number Diff line number Diff line
<?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>
+4 −0
Original line number Diff line number Diff line
@@ -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
+32 −14
Original line number Diff line number Diff line
@@ -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)));
                }
            }
        };