DO NOT MERGE Revert "[3/n] Camera Compat UI: Add a camera compat control."

Revert submission 16468379

Reason for revert: Feature development is moving to T.

Reverted Changes:
Id9b9a8930:[3/n] Camera Compat UI: Add a camera compat contro...
Id6be4a954:Enable a camera app compat control on Large screen...
I083aa6718:[2/n] Camera Compat UI: Add interfaces for client-...

Bug: 206602997

Change-Id: I318b89b87cd3b05a3f3dcd428e3d80fe81465011
This commit is contained in:
Aurimas Liutikas
2022-01-05 22:09:57 +00:00
committed by Mariia Sandrikova
parent 103cb7d50c
commit aec26c4f68
21 changed files with 143 additions and 799 deletions

View File

@@ -1,33 +0,0 @@
<!--
Copyright (C) 2019 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.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="43dp"
android:viewportWidth="48"
android:viewportHeight="43">
<group>
<clip-path
android:pathData="M48,43l-48,-0l-0,-43l48,-0z"/>
<path
android:pathData="M24,43C37.2548,43 48,32.2548 48,19L48,0L0,-0L0,19C0,32.2548 10.7452,43 24,43Z"
android:fillColor="@color/compat_controls_background"
android:strokeAlpha="0.8"
android:fillAlpha="0.8"/>
<path
android:pathData="M31,12.41L29.59,11L24,16.59L18.41,11L17,12.41L22.59,18L17,23.59L18.41,25L24,19.41L29.59,25L31,23.59L25.41,18L31,12.41Z"
android:fillColor="@color/compat_controls_text"/>
</group>
</vector>

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2021 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.
-->
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/compat_background_ripple">
<item android:drawable="@drawable/camera_compat_dismiss_button"/>
</ripple>

View File

@@ -1,32 +0,0 @@
<!--
Copyright (C) 2019 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.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="43dp"
android:viewportWidth="48"
android:viewportHeight="43">
<path
android:pathData="M24,0C10.7452,0 0,10.7452 0,24V43H48V24C48,10.7452 37.2548,0 24,0Z"
android:fillColor="@color/compat_controls_background"
android:strokeAlpha="0.8"
android:fillAlpha="0.8"/>
<path
android:pathData="M32,17H28.83L27,15H21L19.17,17H16C14.9,17 14,17.9 14,19V31C14,32.1 14.9,33 16,33H32C33.1,33 34,32.1 34,31V19C34,17.9 33.1,17 32,17ZM32,31H16V19H32V31Z"
android:fillColor="@color/compat_controls_text"/>
<path
android:pathData="M24.6618,22C23.0436,22 21.578,22.6187 20.4483,23.625L18.25,21.375V27H23.7458L21.5353,24.7375C22.3841,24.0125 23.4649,23.5625 24.6618,23.5625C26.8235,23.5625 28.6616,25.0062 29.3028,27L30.75,26.5125C29.9012,23.8938 27.5013,22 24.6618,22Z"
android:fillColor="@color/compat_controls_text"/>
</vector>

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2021 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.
-->
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/compat_background_ripple">
<item android:drawable="@drawable/camera_compat_treatment_applied_button"/>
</ripple>

View File

@@ -1,53 +0,0 @@
<!--
Copyright (C) 2019 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.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="43dp"
android:viewportWidth="48"
android:viewportHeight="43">
<path
android:pathData="M24,0C10.7452,0 0,10.7452 0,24V43H48V24C48,10.7452 37.2548,0 24,0Z"
android:fillColor="@color/compat_controls_background"
android:strokeAlpha="0.8"
android:fillAlpha="0.8"/>
<path
android:pathData="M32,17H28.83L27,15H21L19.17,17H16C14.9,17 14,17.9 14,19V31C14,32.1 14.9,33 16,33H32C33.1,33 34,32.1 34,31V19C34,17.9 33.1,17 32,17ZM32,31H16V19H32V31Z"
android:fillColor="@color/compat_controls_text"/>
<path
android:pathData="M18,29L18,25.5L19.5,25.5L19.5,29L18,29Z"
android:fillColor="@color/compat_controls_text"/>
<path
android:pathData="M30,29L30,25.5L28.5,25.5L28.5,29L30,29Z"
android:fillColor="@color/compat_controls_text"/>
<path
android:pathData="M30,21L30,24.5L28.5,24.5L28.5,21L30,21Z"
android:fillColor="@color/compat_controls_text"/>
<path
android:pathData="M18,21L18,24.5L19.5,24.5L19.5,21L18,21Z"
android:fillColor="@color/compat_controls_text"/>
<path
android:pathData="M18,27.5L21.5,27.5L21.5,29L18,29L18,27.5Z"
android:fillColor="@color/compat_controls_text"/>
<path
android:pathData="M30,27.5L26.5,27.5L26.5,29L30,29L30,27.5Z"
android:fillColor="@color/compat_controls_text"/>
<path
android:pathData="M30,22.5L26.5,22.5L26.5,21L30,21L30,22.5Z"
android:fillColor="@color/compat_controls_text"/>
<path
android:pathData="M18,22.5L21.5,22.5L21.5,21L18,21L18,22.5Z"
android:fillColor="@color/compat_controls_text"/>
</vector>

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2021 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.
-->
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/compat_background_ripple">
<item android:drawable="@drawable/camera_compat_treatment_suggested_button"/>
</ripple>

View File

@@ -21,9 +21,7 @@
android:viewportHeight="48">
<path
android:fillColor="@color/compat_controls_background"
android:strokeAlpha="0.8"
android:fillAlpha="0.8"
android:pathData="M0,24 a24,24 0 1,0 48,0 a24,24 0 1,0 -48,0"/>
android:pathData="M0,24 a24,24 0 1,0 48,0 a24,24 0 1,0 -48,0" />
<group
android:translateX="12"
android:translateY="12">

View File

@@ -15,6 +15,6 @@
~ limitations under the License.
-->
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/compat_background_ripple">
android:color="@color/size_compat_background_ripple">
<item android:drawable="@drawable/size_compat_restart_button"/>
</ripple>

View File

@@ -16,7 +16,7 @@
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:clipToPadding="false"
@@ -26,7 +26,7 @@
<TextView
android:id="@+id/compat_mode_hint_text"
android:layout_width="match_parent"
android:layout_width="188dp"
android:layout_height="wrap_content"
android:lineSpacingExtra="4sp"
android:background="@drawable/compat_hint_bubble"

View File

@@ -21,47 +21,11 @@
android:orientation="vertical"
android:gravity="bottom|end">
<include android:id="@+id/camera_compat_hint"
android:visibility="gone"
android:layout_width="@dimen/camera_compat_hint_width"
android:layout_height="wrap_content"
layout="@layout/compat_mode_hint"/>
<LinearLayout
android:id="@+id/camera_compat_control"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:layout_marginEnd="@dimen/compat_button_margin"
android:layout_marginBottom="@dimen/compat_button_margin"
android:orientation="vertical">
<ImageButton
android:id="@+id/camera_compat_treatment_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"/>
<ImageButton
android:id="@+id/camera_compat_dismiss_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/camera_compat_dismiss_ripple"
android:background="@android:color/transparent"
android:contentDescription="@string/camera_compat_dismiss_button_description"/>
</LinearLayout>
<include android:id="@+id/size_compat_hint"
android:visibility="gone"
android:layout_width="@dimen/size_compat_hint_width"
android:layout_height="wrap_content"
layout="@layout/compat_mode_hint"/>
layout="@layout/compat_mode_hint"/>
<ImageButton
android:id="@+id/size_compat_restart_button"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/compat_button_margin"

View File

@@ -213,12 +213,6 @@
+ compat_button_margin - compat_hint_corner_radius - compat_hint_point_width / 2). -->
<dimen name="compat_hint_padding_end">7dp</dimen>
<!-- The width of the size compat hint. -->
<dimen name="size_compat_hint_width">188dp</dimen>
<!-- The width of the camera compat hint. -->
<dimen name="camera_compat_hint_width">143dp</dimen>
<!-- The width of the brand image on staring surface. -->
<dimen name="starting_surface_brand_image_width">200dp</dimen>

View File

@@ -158,17 +158,4 @@
<!-- Description of the restart button in the hint of size compatibility mode. [CHAR LIMIT=NONE] -->
<string name="restart_button_description">Tap to restart this app and go full screen.</string>
<!-- Description of the camera compat button for applying stretched issues treatment in the hint for
compatibility control. [CHAR LIMIT=NONE] -->
<string name="camera_compat_treatment_suggested_button_description">Camera issues?\nTap to refit</string>
<!-- Description of the camera compat button for reverting stretched issues treatment in the hint for
compatibility control. [CHAR LIMIT=NONE] -->
<string name="camera_compat_treatment_applied_button_description">Didn\u2019t fix it?\nTap to revert</string>
<!-- Accessibillity description of the camera dismiss button for stretched issues in the hint for
compatibility control. [CHAR LIMIT=NONE] -->
<string name="camera_compat_dismiss_button_description">No camera issues? Tap to dismiss.</string>
</resources>

View File

@@ -607,19 +607,6 @@ public class ShellTaskOrganizer extends TaskOrganizer implements
restartTaskTopActivityProcessIfVisible(info.getTaskInfo().token);
}
@Override
public void onCameraControlStateUpdated(
int taskId, @TaskInfo.CameraCompatControlState int state) {
final TaskAppearedInfo info;
synchronized (mLock) {
info = mTasks.get(taskId);
}
if (info == null) {
return;
}
updateCameraCompatControlState(info.getTaskInfo().token, state);
}
private void logSizeCompatRestartButtonEventReported(@NonNull TaskAppearedInfo info,
int event) {
ActivityInfo topActivityInfo = info.getTaskInfo().topActivityInfo;
@@ -647,10 +634,13 @@ public class ShellTaskOrganizer extends TaskOrganizer implements
// on this Task if there is any.
if (taskListener == null || !taskListener.supportCompatUI()
|| !taskInfo.hasCompatUI() || !taskInfo.isVisible) {
mCompatUI.onCompatInfoChanged(taskInfo, null /* taskListener */);
mCompatUI.onCompatInfoChanged(taskInfo.displayId, taskInfo.taskId,
null /* taskConfig */, null /* taskListener */);
return;
}
mCompatUI.onCompatInfoChanged(taskInfo, taskListener);
mCompatUI.onCompatInfoChanged(taskInfo.displayId, taskInfo.taskId,
taskInfo.configuration, taskListener);
}
private TaskListener getTaskListener(RunningTaskInfo runningTaskInfo) {

View File

@@ -17,8 +17,6 @@
package com.android.wm.shell.compatui;
import android.annotation.Nullable;
import android.app.TaskInfo;
import android.app.TaskInfo.CameraCompatControlState;
import android.content.Context;
import android.content.res.Configuration;
import android.hardware.display.DisplayManager;
@@ -55,14 +53,12 @@ import java.util.function.Predicate;
public class CompatUIController implements OnDisplaysChangedListener,
DisplayImeController.ImePositionProcessor {
/** Callback for compat UI interaction. */
/** Callback for size compat UI interaction. */
public interface CompatUICallback {
/** Called when the size compat restart button appears. */
void onSizeCompatRestartButtonAppeared(int taskId);
/** Called when the size compat restart button is clicked. */
void onSizeCompatRestartButtonClicked(int taskId);
/** Called when the camera compat control state is updated. */
void onCameraControlStateUpdated(int taskId, @CameraCompatControlState int state);
}
private static final String TAG = "CompatUIController";
@@ -90,12 +86,10 @@ public class CompatUIController implements OnDisplaysChangedListener,
private CompatUICallback mCallback;
// Only show once automatically in the process life.
private boolean mHasShownSizeCompatHint;
private boolean mHasShownCameraCompatHint;
// Indicates if the keyguard is currently occluded, in which case compat UIs shouldn't
// be shown.
/** Only show once automatically in the process life. */
private boolean mHasShownHint;
/** Indicates if the keyguard is currently occluded, in which case compat UIs shouldn't
* be shown. */
private boolean mKeyguardOccluded;
public CompatUIController(Context context,
@@ -128,20 +122,23 @@ public class CompatUIController implements OnDisplaysChangedListener,
* Called when the Task info changed. Creates and updates the compat UI if there is an
* activity in size compat, or removes the UI if there is no size compat activity.
*
* @param taskInfo {@link TaskInfo} task the activity is in.
* @param displayId display the task and activity are in.
* @param taskId task the activity is in.
* @param taskConfig task config to place the compat UI with.
* @param taskListener listener to handle the Task Surface placement.
*/
public void onCompatInfoChanged(TaskInfo taskInfo,
public void onCompatInfoChanged(int displayId, int taskId,
@Nullable Configuration taskConfig,
@Nullable ShellTaskOrganizer.TaskListener taskListener) {
if (taskInfo.configuration == null || taskListener == null) {
if (taskConfig == null || taskListener == null) {
// Null token means the current foreground activity is not in compatibility mode.
removeLayout(taskInfo.taskId);
} else if (mActiveLayouts.contains(taskInfo.taskId)) {
removeLayout(taskId);
} else if (mActiveLayouts.contains(taskId)) {
// UI already exists, update the UI layout.
updateLayout(taskInfo, taskListener);
updateLayout(taskId, taskConfig, taskListener);
} else {
// Create a new compat UI.
createLayout(taskInfo, taskListener);
createLayout(displayId, taskId, taskConfig, taskListener);
}
}
@@ -218,45 +215,38 @@ public class CompatUIController implements OnDisplaysChangedListener,
return mDisplaysWithIme.contains(displayId);
}
private void createLayout(TaskInfo taskInfo, ShellTaskOrganizer.TaskListener taskListener) {
final Context context = getOrCreateDisplayContext(taskInfo.displayId);
private void createLayout(int displayId, int taskId, Configuration taskConfig,
ShellTaskOrganizer.TaskListener taskListener) {
final Context context = getOrCreateDisplayContext(displayId);
if (context == null) {
Log.e(TAG, "Cannot get context for display " + taskInfo.displayId);
Log.e(TAG, "Cannot get context for display " + displayId);
return;
}
final CompatUIWindowManager compatUIWindowManager =
createLayout(context, taskInfo, taskListener);
mActiveLayouts.put(taskInfo.taskId, compatUIWindowManager);
compatUIWindowManager.createLayout(showOnDisplay(taskInfo.displayId),
taskInfo.topActivityInSizeCompat, taskInfo.cameraCompatControlState);
createLayout(context, displayId, taskId, taskConfig, taskListener);
mActiveLayouts.put(taskId, compatUIWindowManager);
compatUIWindowManager.createLayout(showOnDisplay(displayId));
}
@VisibleForTesting
CompatUIWindowManager createLayout(Context context, TaskInfo taskInfo,
ShellTaskOrganizer.TaskListener taskListener) {
CompatUIWindowManager createLayout(Context context, int displayId, int taskId,
Configuration taskConfig, ShellTaskOrganizer.TaskListener taskListener) {
final CompatUIWindowManager compatUIWindowManager = new CompatUIWindowManager(context,
taskInfo.configuration, mSyncQueue, mCallback, taskInfo.taskId, taskListener,
mDisplayController.getDisplayLayout(taskInfo.displayId), mHasShownSizeCompatHint,
mHasShownCameraCompatHint);
// Only show hints for the first time.
if (taskInfo.topActivityInSizeCompat) {
mHasShownSizeCompatHint = true;
}
if (taskInfo.hasCameraCompatControl()) {
mHasShownCameraCompatHint = true;
}
taskConfig, mSyncQueue, mCallback, taskId, taskListener,
mDisplayController.getDisplayLayout(displayId), mHasShownHint);
// Only show hint for the first time.
mHasShownHint = true;
return compatUIWindowManager;
}
private void updateLayout(TaskInfo taskInfo, ShellTaskOrganizer.TaskListener taskListener) {
final CompatUIWindowManager layout = mActiveLayouts.get(taskInfo.taskId);
private void updateLayout(int taskId, Configuration taskConfig,
ShellTaskOrganizer.TaskListener taskListener) {
final CompatUIWindowManager layout = mActiveLayouts.get(taskId);
if (layout == null) {
return;
}
layout.updateCompatInfo(taskInfo.configuration, taskListener,
showOnDisplay(layout.getDisplayId()), taskInfo.topActivityInSizeCompat,
taskInfo.cameraCompatControlState);
layout.updateCompatInfo(taskConfig, taskListener, showOnDisplay(layout.getDisplayId()));
}
private void removeLayout(int taskId) {

View File

@@ -16,9 +16,6 @@
package com.android.wm.shell.compatui;
import android.annotation.IdRes;
import android.app.TaskInfo;
import android.app.TaskInfo.CameraCompatControlState;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
@@ -56,53 +53,6 @@ public class CompatUILayout extends LinearLayout {
mWindowManager = windowManager;
}
void updateCameraTreatmentButton(@CameraCompatControlState int newState) {
int buttonBkgId = newState == TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED
? R.drawable.camera_compat_treatment_suggested_ripple
: R.drawable.camera_compat_treatment_applied_ripple;
int hintStringId = newState == TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED
? R.string.camera_compat_treatment_suggested_button_description
: R.string.camera_compat_treatment_applied_button_description;
final ImageButton button = findViewById(R.id.camera_compat_treatment_button);
button.setImageResource(buttonBkgId);
button.setContentDescription(getResources().getString(hintStringId));
final LinearLayout hint = findViewById(R.id.camera_compat_hint);
((TextView) hint.findViewById(R.id.compat_mode_hint_text)).setText(hintStringId);
}
void setSizeCompatHintVisibility(boolean show) {
setViewVisibility(R.id.size_compat_hint, show);
}
void setCameraCompatHintVisibility(boolean show) {
setViewVisibility(R.id.camera_compat_hint, show);
}
void setRestartButtonVisibility(boolean show) {
setViewVisibility(R.id.size_compat_restart_button, show);
// Hint should never be visible without button.
if (!show) {
setSizeCompatHintVisibility(/* show= */ false);
}
}
void setCameraControlVisibility(boolean show) {
setViewVisibility(R.id.camera_compat_control, show);
// Hint should never be visible without button.
if (!show) {
setCameraCompatHintVisibility(/* show= */ false);
}
}
private void setViewVisibility(@IdRes int resId, boolean show) {
final View view = findViewById(resId);
int visibility = show ? View.VISIBLE : View.GONE;
if (view.getVisibility() == visibility) {
return;
}
view.setVisibility(visibility);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
@@ -111,6 +61,15 @@ public class CompatUILayout extends LinearLayout {
mWindowManager.relayout();
}
void setSizeCompatHintVisibility(boolean show) {
final LinearLayout sizeCompatHint = findViewById(R.id.size_compat_hint);
int visibility = show ? View.VISIBLE : View.GONE;
if (sizeCompatHint.getVisibility() == visibility) {
return;
}
sizeCompatHint.setVisibility(visibility);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
@@ -126,26 +85,5 @@ public class CompatUILayout extends LinearLayout {
((TextView) sizeCompatHint.findViewById(R.id.compat_mode_hint_text))
.setText(R.string.restart_button_description);
sizeCompatHint.setOnClickListener(view -> setSizeCompatHintVisibility(/* show= */ false));
final ImageButton cameraTreatmentButton =
findViewById(R.id.camera_compat_treatment_button);
cameraTreatmentButton.setOnClickListener(
view -> mWindowManager.onCameraTreatmentButtonClicked());
cameraTreatmentButton.setOnLongClickListener(view -> {
mWindowManager.onCameraButtonLongClicked();
return true;
});
final ImageButton cameraDismissButton = findViewById(R.id.camera_compat_dismiss_button);
cameraDismissButton.setOnClickListener(
view -> mWindowManager.onCameraDismissButtonClicked());
cameraDismissButton.setOnLongClickListener(view -> {
mWindowManager.onCameraButtonLongClicked();
return true;
});
final LinearLayout cameraCompatHint = findViewById(R.id.camera_compat_hint);
cameraCompatHint.setOnClickListener(
view -> setCameraCompatHintVisibility(/* show= */ false));
}
}

View File

@@ -16,10 +16,6 @@
package com.android.wm.shell.compatui;
import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED;
import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN;
import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED;
import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION;
@@ -27,7 +23,6 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERL
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
import android.annotation.Nullable;
import android.app.TaskInfo.CameraCompatControlState;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.PixelFormat;
@@ -68,17 +63,8 @@ class CompatUIWindowManager extends WindowlessWindowManager {
private ShellTaskOrganizer.TaskListener mTaskListener;
private DisplayLayout mDisplayLayout;
// Remember the last reported states in case visibility changes due to keyguard or
// IME updates.
@VisibleForTesting
boolean mHasSizeCompat;
@CameraCompatControlState
private int mCameraCompatControlState = CAMERA_COMPAT_CONTROL_HIDDEN;
@VisibleForTesting
boolean mShouldShowSizeCompatHint;
@VisibleForTesting
boolean mShouldShowCameraCompatHint;
boolean mShouldShowHint;
@Nullable
@VisibleForTesting
@@ -92,7 +78,7 @@ class CompatUIWindowManager extends WindowlessWindowManager {
CompatUIWindowManager(Context context, Configuration taskConfig,
SyncTransactionQueue syncQueue, CompatUIController.CompatUICallback callback,
int taskId, ShellTaskOrganizer.TaskListener taskListener, DisplayLayout displayLayout,
boolean hasShownSizeCompatHint, boolean hasShownCameraCompatHint) {
boolean hasShownHint) {
super(taskConfig, null /* rootSurface */, null /* hostInputToken */);
mContext = context;
mSyncQueue = syncQueue;
@@ -102,8 +88,7 @@ class CompatUIWindowManager extends WindowlessWindowManager {
mTaskId = taskId;
mTaskListener = taskListener;
mDisplayLayout = displayLayout;
mShouldShowSizeCompatHint = !hasShownSizeCompatHint;
mShouldShowCameraCompatHint = !hasShownCameraCompatHint;
mShouldShowHint = !hasShownHint;
mStableBounds = new Rect();
mDisplayLayout.getStableBounds(mStableBounds);
}
@@ -128,10 +113,7 @@ class CompatUIWindowManager extends WindowlessWindowManager {
}
/** Creates the layout for compat controls. */
void createLayout(boolean show, boolean hasSizeCompat,
@CameraCompatControlState int cameraCompatControlState) {
mHasSizeCompat = hasSizeCompat;
mCameraCompatControlState = cameraCompatControlState;
void createLayout(boolean show) {
if (!show || mCompatUILayout != null) {
// Wait until compat controls should be visible.
return;
@@ -140,27 +122,16 @@ class CompatUIWindowManager extends WindowlessWindowManager {
initCompatUi();
updateSurfacePosition();
if (hasSizeCompat) {
mCallback.onSizeCompatRestartButtonAppeared(mTaskId);
}
}
private void createLayout(boolean show) {
createLayout(show, mHasSizeCompat, mCameraCompatControlState);
mCallback.onSizeCompatRestartButtonAppeared(mTaskId);
}
/** Called when compat info changed. */
void updateCompatInfo(Configuration taskConfig,
ShellTaskOrganizer.TaskListener taskListener, boolean show, boolean hasSizeCompat,
@CameraCompatControlState int cameraCompatControlState) {
ShellTaskOrganizer.TaskListener taskListener, boolean show) {
final Configuration prevTaskConfig = mTaskConfig;
final ShellTaskOrganizer.TaskListener prevTaskListener = mTaskListener;
mTaskConfig = taskConfig;
mTaskListener = taskListener;
final boolean prevHasSizeCompat = mHasSizeCompat;
final int prevCameraCompatControlState = mCameraCompatControlState;
mHasSizeCompat = hasSizeCompat;
mCameraCompatControlState = cameraCompatControlState;
// Update configuration.
mContext = mContext.createConfigurationContext(taskConfig);
@@ -173,11 +144,6 @@ class CompatUIWindowManager extends WindowlessWindowManager {
return;
}
if (prevHasSizeCompat != mHasSizeCompat
|| prevCameraCompatControlState != mCameraCompatControlState) {
updateVisibilityOfViews();
}
if (!taskConfig.windowConfiguration.getBounds()
.equals(prevTaskConfig.windowConfiguration.getBounds())) {
// Reposition the UI surfaces.
@@ -189,7 +155,6 @@ class CompatUIWindowManager extends WindowlessWindowManager {
mCompatUILayout.setLayoutDirection(taskConfig.getLayoutDirection());
updateSurfacePosition();
}
}
/** Called when the visibility of the UI should change. */
@@ -230,34 +195,6 @@ class CompatUIWindowManager extends WindowlessWindowManager {
mCallback.onSizeCompatRestartButtonClicked(mTaskId);
}
/** Called when the camera treatment button is clicked. */
void onCameraTreatmentButtonClicked() {
if (!shouldShowCameraControl()) {
Log.w(TAG, "Camera compat shouldn't receive clicks in the hidden state.");
return;
}
// When a camera control is shown, only two states are allowed: "treament applied" and
// "treatment suggested". Clicks on the conrol's treatment button toggle between these
// two states.
mCameraCompatControlState =
mCameraCompatControlState == CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED
? CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED
: CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED;
mCallback.onCameraControlStateUpdated(mTaskId, mCameraCompatControlState);
mCompatUILayout.updateCameraTreatmentButton(mCameraCompatControlState);
}
/** Called when the camera dismiss button is clicked. */
void onCameraDismissButtonClicked() {
if (!shouldShowCameraControl()) {
Log.w(TAG, "Camera compat shouldn't receive clicks in the hidden state.");
return;
}
mCameraCompatControlState = CAMERA_COMPAT_CONTROL_DISMISSED;
mCallback.onCameraControlStateUpdated(mTaskId, CAMERA_COMPAT_CONTROL_DISMISSED);
mCompatUILayout.setCameraControlVisibility(/* show= */ false);
}
/** Called when the restart button is long clicked. */
void onRestartButtonLongClicked() {
if (mCompatUILayout == null) {
@@ -266,14 +203,6 @@ class CompatUIWindowManager extends WindowlessWindowManager {
mCompatUILayout.setSizeCompatHintVisibility(/* show= */ true);
}
/** Called when either dismiss or treatment camera buttons is long clicked. */
void onCameraButtonLongClicked() {
if (mCompatUILayout == null) {
return;
}
mCompatUILayout.setCameraCompatHintVisibility(/* show= */ true);
}
int getDisplayId() {
return mDisplayId;
}
@@ -284,8 +213,6 @@ class CompatUIWindowManager extends WindowlessWindowManager {
/** Releases the surface control and tears down the view hierarchy. */
void release() {
// Hiding before releasing to avoid flickering when transitioning to the Home screen.
mCompatUILayout.setVisibility(View.GONE);
mCompatUILayout = null;
if (mViewHost != null) {
@@ -356,35 +283,12 @@ class CompatUIWindowManager extends WindowlessWindowManager {
mCompatUILayout = inflateCompatUILayout();
mCompatUILayout.inject(this);
updateVisibilityOfViews();
mCompatUILayout.setSizeCompatHintVisibility(mShouldShowHint);
mViewHost.setView(mCompatUILayout, getWindowLayoutParams());
}
private void updateVisibilityOfViews() {
// Size Compat mode restart button.
mCompatUILayout.setRestartButtonVisibility(mHasSizeCompat);
if (mHasSizeCompat && mShouldShowSizeCompatHint) {
mCompatUILayout.setSizeCompatHintVisibility(/* show= */ true);
// Only show by default for the first time.
mShouldShowSizeCompatHint = false;
}
// Camera control for stretched issues.
mCompatUILayout.setCameraControlVisibility(shouldShowCameraControl());
if (shouldShowCameraControl() && mShouldShowCameraCompatHint) {
mCompatUILayout.setCameraCompatHintVisibility(/* show= */ true);
// Only show by default for the first time.
mShouldShowCameraCompatHint = false;
}
if (shouldShowCameraControl()) {
mCompatUILayout.updateCameraTreatmentButton(mCameraCompatControlState);
}
}
private boolean shouldShowCameraControl() {
return mCameraCompatControlState != CAMERA_COMPAT_CONTROL_HIDDEN
&& mCameraCompatControlState != CAMERA_COMPAT_CONTROL_DISMISSED;
// Only show by default for the first time.
mShouldShowHint = false;
}
@VisibleForTesting

View File

@@ -335,7 +335,8 @@ public class ShellTaskOrganizerTests {
mOrganizer.onTaskAppeared(taskInfo1, null);
// sizeCompatActivity is null if top activity is not in size compat.
verify(mCompatUI).onCompatInfoChanged(taskInfo1, null /* taskListener */);
verify(mCompatUI).onCompatInfoChanged(taskInfo1.displayId, taskInfo1.taskId,
null /* taskConfig */, null /* taskListener */);
// sizeCompatActivity is non-null if top activity is in size compat.
clearInvocations(mCompatUI);
@@ -345,7 +346,8 @@ public class ShellTaskOrganizerTests {
taskInfo2.topActivityInSizeCompat = true;
taskInfo2.isVisible = true;
mOrganizer.onTaskInfoChanged(taskInfo2);
verify(mCompatUI).onCompatInfoChanged(taskInfo2, taskListener);
verify(mCompatUI).onCompatInfoChanged(taskInfo1.displayId, taskInfo1.taskId,
taskInfo1.configuration, taskListener);
// Not show size compat UI if task is not visible.
clearInvocations(mCompatUI);
@@ -355,11 +357,13 @@ public class ShellTaskOrganizerTests {
taskInfo3.topActivityInSizeCompat = true;
taskInfo3.isVisible = false;
mOrganizer.onTaskInfoChanged(taskInfo3);
verify(mCompatUI).onCompatInfoChanged(taskInfo3, null /* taskListener */);
verify(mCompatUI).onCompatInfoChanged(taskInfo1.displayId, taskInfo1.taskId,
null /* taskConfig */, null /* taskListener */);
clearInvocations(mCompatUI);
mOrganizer.onTaskVanished(taskInfo1);
verify(mCompatUI).onCompatInfoChanged(taskInfo1, null /* taskListener */);
verify(mCompatUI).onCompatInfoChanged(taskInfo1.displayId, taskInfo1.taskId,
null /* taskConfig */, null /* taskListener */);
}
@Test
@@ -373,7 +377,8 @@ public class ShellTaskOrganizerTests {
// Task listener sent to compat UI is null if top activity doesn't request a camera
// compat control.
verify(mCompatUI).onCompatInfoChanged(taskInfo1, null /* taskListener */);
verify(mCompatUI).onCompatInfoChanged(taskInfo1.displayId, taskInfo1.taskId,
null /* taskConfig */, null /* taskListener */);
// Task linster is non-null when request a camera compat control for a visible task.
clearInvocations(mCompatUI);
@@ -383,7 +388,8 @@ public class ShellTaskOrganizerTests {
taskInfo2.cameraCompatControlState = TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED;
taskInfo2.isVisible = true;
mOrganizer.onTaskInfoChanged(taskInfo2);
verify(mCompatUI).onCompatInfoChanged(taskInfo2, taskListener);
verify(mCompatUI).onCompatInfoChanged(taskInfo1.displayId, taskInfo1.taskId,
taskInfo1.configuration, taskListener);
// CompatUIController#onCompatInfoChanged is called when requested state for a camera
// compat control changes for a visible task.
@@ -394,7 +400,8 @@ public class ShellTaskOrganizerTests {
taskInfo3.cameraCompatControlState = TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED;
taskInfo3.isVisible = true;
mOrganizer.onTaskInfoChanged(taskInfo3);
verify(mCompatUI).onCompatInfoChanged(taskInfo3, taskListener);
verify(mCompatUI).onCompatInfoChanged(taskInfo1.displayId, taskInfo1.taskId,
taskInfo1.configuration, taskListener);
// CompatUIController#onCompatInfoChanged is called when a top activity goes in size compat
// mode for a visible task that has a compat control.
@@ -406,7 +413,8 @@ public class ShellTaskOrganizerTests {
taskInfo4.cameraCompatControlState = TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED;
taskInfo4.isVisible = true;
mOrganizer.onTaskInfoChanged(taskInfo4);
verify(mCompatUI).onCompatInfoChanged(taskInfo4, taskListener);
verify(mCompatUI).onCompatInfoChanged(taskInfo1.displayId, taskInfo1.taskId,
taskInfo1.configuration, taskListener);
// Task linster is null when a camera compat control is dimissed for a visible task.
clearInvocations(mCompatUI);
@@ -416,7 +424,8 @@ public class ShellTaskOrganizerTests {
taskInfo5.cameraCompatControlState = TaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED;
taskInfo5.isVisible = true;
mOrganizer.onTaskInfoChanged(taskInfo5);
verify(mCompatUI).onCompatInfoChanged(taskInfo5, null /* taskListener */);
verify(mCompatUI).onCompatInfoChanged(taskInfo1.displayId, taskInfo1.taskId,
null /* taskConfig */, null /* taskListener */);
// Task linster is null when request a camera compat control for a invisible task.
clearInvocations(mCompatUI);
@@ -426,11 +435,13 @@ public class ShellTaskOrganizerTests {
taskInfo6.cameraCompatControlState = TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED;
taskInfo6.isVisible = false;
mOrganizer.onTaskInfoChanged(taskInfo6);
verify(mCompatUI).onCompatInfoChanged(taskInfo6, null /* taskListener */);
verify(mCompatUI).onCompatInfoChanged(taskInfo1.displayId, taskInfo1.taskId,
null /* taskConfig */, null /* taskListener */);
clearInvocations(mCompatUI);
mOrganizer.onTaskVanished(taskInfo1);
verify(mCompatUI).onCompatInfoChanged(taskInfo1, null /* taskListener */);
verify(mCompatUI).onCompatInfoChanged(taskInfo1.displayId, taskInfo1.taskId,
null /* taskConfig */, null /* taskListener */);
}
@Test

View File

@@ -16,10 +16,6 @@
package com.android.wm.shell.compatui;
import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED;
import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN;
import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED;
import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED;
import static android.view.InsetsState.ITYPE_EXTRA_NAVIGATION_BAR;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
@@ -33,9 +29,6 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.TaskInfo;
import android.app.TaskInfo.CameraCompatControlState;
import android.content.Context;
import android.content.res.Configuration;
import android.testing.AndroidTestingRunner;
@@ -97,8 +90,8 @@ public class CompatUIControllerTest extends ShellTestCase {
mController = new CompatUIController(mContext, mMockDisplayController,
mMockDisplayInsetsController, mMockImeController, mMockSyncQueue, mMockExecutor) {
@Override
CompatUIWindowManager createLayout(Context context, TaskInfo taskInfo,
ShellTaskOrganizer.TaskListener taskListener) {
CompatUIWindowManager createLayout(Context context, int displayId, int taskId,
Configuration taskConfig, ShellTaskOrganizer.TaskListener taskListener) {
return mMockLayout;
}
};
@@ -113,59 +106,23 @@ public class CompatUIControllerTest extends ShellTestCase {
@Test
public void testOnCompatInfoChanged() {
TaskInfo taskInfo = createTaskInfo(DISPLAY_ID, TASK_ID, true /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_HIDDEN);
final Configuration taskConfig = new Configuration();
// Verify that the restart button is added with non-null size compat info.
mController.onCompatInfoChanged(taskInfo, mMockTaskListener);
mController.onCompatInfoChanged(DISPLAY_ID, TASK_ID, taskConfig, mMockTaskListener);
verify(mController).createLayout(any(), eq(taskInfo), eq(mMockTaskListener));
verify(mController).createLayout(any(), eq(DISPLAY_ID), eq(TASK_ID), eq(taskConfig),
eq(mMockTaskListener));
// Verify that the restart button is updated with non-null new size compat info.
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN),
mMockTaskListener);
final Configuration newTaskConfig = new Configuration();
mController.onCompatInfoChanged(DISPLAY_ID, TASK_ID, newTaskConfig, mMockTaskListener);
verify(mMockLayout).updateCompatInfo(new Configuration(), mMockTaskListener,
true /* show */, true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN);
verify(mMockLayout).updateCompatInfo(taskConfig, mMockTaskListener,
true /* show */);
// Verify that the restart button is updated with new camera state.
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED),
mMockTaskListener);
verify(mMockLayout).updateCompatInfo(new Configuration(), mMockTaskListener,
true /* show */, true /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED);
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED),
mMockTaskListener);
verify(mMockLayout).updateCompatInfo(new Configuration(), mMockTaskListener,
true /* show */, true /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
// Verify that compat controls are removed with null compat info.
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
false /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN),
null /* taskListener */);
verify(mMockLayout).release();
clearInvocations(mMockLayout);
clearInvocations(mController);
// Verify that compat controls are removed with dismissed camera state.
taskInfo = createTaskInfo(DISPLAY_ID, TASK_ID,
true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
mController.onCompatInfoChanged(taskInfo, mMockTaskListener);
verify(mController).createLayout(any(), eq(taskInfo), eq(mMockTaskListener));
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
false /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_DISMISSED),
null /* taskListener */);
// Verify that the restart button is removed with null size compat info.
mController.onCompatInfoChanged(DISPLAY_ID, TASK_ID, null, mMockTaskListener);
verify(mMockLayout).release();
}
@@ -182,8 +139,8 @@ public class CompatUIControllerTest extends ShellTestCase {
@Test
public void testOnDisplayRemoved() {
mController.onDisplayAdded(DISPLAY_ID);
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN),
final Configuration taskConfig = new Configuration();
mController.onCompatInfoChanged(DISPLAY_ID, TASK_ID, taskConfig,
mMockTaskListener);
mController.onDisplayRemoved(DISPLAY_ID + 1);
@@ -200,14 +157,16 @@ public class CompatUIControllerTest extends ShellTestCase {
@Test
public void testOnDisplayConfigurationChanged() {
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
final Configuration taskConfig = new Configuration();
mController.onCompatInfoChanged(DISPLAY_ID, TASK_ID, taskConfig,
mMockTaskListener);
mController.onDisplayConfigurationChanged(DISPLAY_ID + 1, new Configuration());
final Configuration newTaskConfig = new Configuration();
mController.onDisplayConfigurationChanged(DISPLAY_ID + 1, newTaskConfig);
verify(mMockLayout, never()).updateDisplayLayout(any());
mController.onDisplayConfigurationChanged(DISPLAY_ID, new Configuration());
mController.onDisplayConfigurationChanged(DISPLAY_ID, newTaskConfig);
verify(mMockLayout).updateDisplayLayout(mMockDisplayLayout);
}
@@ -215,8 +174,9 @@ public class CompatUIControllerTest extends ShellTestCase {
@Test
public void testInsetsChanged() {
mController.onDisplayAdded(DISPLAY_ID);
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
final Configuration taskConfig = new Configuration();
mController.onCompatInfoChanged(DISPLAY_ID, TASK_ID, taskConfig,
mMockTaskListener);
InsetsState insetsState = new InsetsState();
InsetsSource insetsSource = new InsetsSource(ITYPE_EXTRA_NAVIGATION_BAR);
insetsSource.setFrame(0, 0, 1000, 1000);
@@ -236,8 +196,8 @@ public class CompatUIControllerTest extends ShellTestCase {
@Test
public void testChangeButtonVisibilityOnImeShowHide() {
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
final Configuration taskConfig = new Configuration();
mController.onCompatInfoChanged(DISPLAY_ID, TASK_ID, taskConfig, mMockTaskListener);
// Verify that the restart button is hidden after IME is showing.
mController.onImeVisibilityChanged(DISPLAY_ID, true /* isShowing */);
@@ -245,11 +205,10 @@ public class CompatUIControllerTest extends ShellTestCase {
verify(mMockLayout).updateVisibility(false);
// Verify button remains hidden while IME is showing.
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
mController.onCompatInfoChanged(DISPLAY_ID, TASK_ID, taskConfig, mMockTaskListener);
verify(mMockLayout).updateCompatInfo(new Configuration(), mMockTaskListener,
false /* show */, true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN);
verify(mMockLayout).updateCompatInfo(taskConfig, mMockTaskListener,
false /* show */);
// Verify button is shown after IME is hidden.
mController.onImeVisibilityChanged(DISPLAY_ID, false /* isShowing */);
@@ -259,8 +218,8 @@ public class CompatUIControllerTest extends ShellTestCase {
@Test
public void testChangeButtonVisibilityOnKeyguardOccludedChanged() {
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
final Configuration taskConfig = new Configuration();
mController.onCompatInfoChanged(DISPLAY_ID, TASK_ID, taskConfig, mMockTaskListener);
// Verify that the restart button is hidden after keyguard becomes occluded.
mController.onKeyguardOccludedChanged(true);
@@ -268,11 +227,10 @@ public class CompatUIControllerTest extends ShellTestCase {
verify(mMockLayout).updateVisibility(false);
// Verify button remains hidden while keyguard is occluded.
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
mController.onCompatInfoChanged(DISPLAY_ID, TASK_ID, taskConfig, mMockTaskListener);
verify(mMockLayout).updateCompatInfo(new Configuration(), mMockTaskListener,
false /* show */, true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN);
verify(mMockLayout).updateCompatInfo(taskConfig, mMockTaskListener,
false /* show */);
// Verify button is shown after keyguard becomes not occluded.
mController.onKeyguardOccludedChanged(false);
@@ -282,8 +240,8 @@ public class CompatUIControllerTest extends ShellTestCase {
@Test
public void testButtonRemainsHiddenOnKeyguardOccludedFalseWhenImeIsShowing() {
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
final Configuration taskConfig = new Configuration();
mController.onCompatInfoChanged(DISPLAY_ID, TASK_ID, taskConfig, mMockTaskListener);
mController.onImeVisibilityChanged(DISPLAY_ID, true /* isShowing */);
mController.onKeyguardOccludedChanged(true);
@@ -305,8 +263,8 @@ public class CompatUIControllerTest extends ShellTestCase {
@Test
public void testButtonRemainsHiddenOnImeHideWhenKeyguardIsOccluded() {
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
final Configuration taskConfig = new Configuration();
mController.onCompatInfoChanged(DISPLAY_ID, TASK_ID, taskConfig, mMockTaskListener);
mController.onImeVisibilityChanged(DISPLAY_ID, true /* isShowing */);
mController.onKeyguardOccludedChanged(true);
@@ -325,14 +283,4 @@ public class CompatUIControllerTest extends ShellTestCase {
verify(mMockLayout).updateVisibility(true);
}
private static TaskInfo createTaskInfo(int displayId, int taskId, boolean hasSizeCompat,
@CameraCompatControlState int cameraCompatControlState) {
RunningTaskInfo taskInfo = new RunningTaskInfo();
taskInfo.taskId = taskId;
taskInfo.displayId = displayId;
taskInfo.topActivityInSizeCompat = hasSizeCompat;
taskInfo.cameraCompatControlState = cameraCompatControlState;
return taskInfo;
}
}

View File

@@ -16,11 +16,6 @@
package com.android.wm.shell.compatui;
import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED;
import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN;
import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED;
import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static org.mockito.Mockito.doNothing;
@@ -74,7 +69,7 @@ public class CompatUILayoutTest extends ShellTestCase {
mWindowManager = new CompatUIWindowManager(mContext, new Configuration(),
mSyncTransactionQueue, mCallback, TASK_ID, mTaskListener, new DisplayLayout(),
false /* hasShownSizeCompatHint */, false /* hasShownCameraCompatHint */);
false /* hasShownHint */);
mCompatUILayout = (CompatUILayout)
LayoutInflater.from(mContext).inflate(R.layout.compat_ui_layout, null);
@@ -83,7 +78,6 @@ public class CompatUILayoutTest extends ShellTestCase {
spyOn(mWindowManager);
spyOn(mCompatUILayout);
doReturn(mViewHost).when(mWindowManager).createSurfaceViewHost();
doReturn(mCompatUILayout).when(mWindowManager).inflateCompatUILayout();
}
@Test
@@ -92,6 +86,7 @@ public class CompatUILayoutTest extends ShellTestCase {
button.performClick();
verify(mWindowManager).onRestartButtonClicked();
doReturn(mCompatUILayout).when(mWindowManager).inflateCompatUILayout();
verify(mCallback).onSizeCompatRestartButtonClicked(TASK_ID);
}
@@ -107,92 +102,10 @@ public class CompatUILayoutTest extends ShellTestCase {
@Test
public void testOnClickForSizeCompatHint() {
mWindowManager.createLayout(true /* show */, true /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_HIDDEN);
mWindowManager.createLayout(true /* show */);
final LinearLayout sizeCompatHint = mCompatUILayout.findViewById(R.id.size_compat_hint);
sizeCompatHint.performClick();
verify(mCompatUILayout).setSizeCompatHintVisibility(/* show= */ false);
}
@Test
public void testUpdateCameraTreatmentButton_treatmentAppliedByDefault() {
mWindowManager.createLayout(true /* show */, true /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED);
final ImageButton button =
mCompatUILayout.findViewById(R.id.camera_compat_treatment_button);
button.performClick();
verify(mWindowManager).onCameraTreatmentButtonClicked();
verify(mCallback).onCameraControlStateUpdated(
TASK_ID, CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
button.performClick();
verify(mCallback).onCameraControlStateUpdated(
TASK_ID, CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED);
}
@Test
public void testUpdateCameraTreatmentButton_treatmentSuggestedByDefault() {
mWindowManager.createLayout(true /* show */, true /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
final ImageButton button =
mCompatUILayout.findViewById(R.id.camera_compat_treatment_button);
button.performClick();
verify(mWindowManager).onCameraTreatmentButtonClicked();
verify(mCallback).onCameraControlStateUpdated(
TASK_ID, CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED);
button.performClick();
verify(mCallback).onCameraControlStateUpdated(
TASK_ID, CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
}
@Test
public void testOnCameraDismissButtonClicked() {
mWindowManager.createLayout(true /* show */, true /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
final ImageButton button =
mCompatUILayout.findViewById(R.id.camera_compat_dismiss_button);
button.performClick();
verify(mWindowManager).onCameraDismissButtonClicked();
verify(mCallback).onCameraControlStateUpdated(
TASK_ID, CAMERA_COMPAT_CONTROL_DISMISSED);
verify(mCompatUILayout).setCameraControlVisibility(/* show */ false);
}
@Test
public void testOnLongClickForCameraTreatementButton() {
doNothing().when(mWindowManager).onCameraButtonLongClicked();
final ImageButton button =
mCompatUILayout.findViewById(R.id.camera_compat_treatment_button);
button.performLongClick();
verify(mWindowManager).onCameraButtonLongClicked();
}
@Test
public void testOnLongClickForCameraDismissButton() {
doNothing().when(mWindowManager).onCameraButtonLongClicked();
final ImageButton button = mCompatUILayout.findViewById(R.id.camera_compat_dismiss_button);
button.performLongClick();
verify(mWindowManager).onCameraButtonLongClicked();
}
@Test
public void testOnClickForCameraCompatHint() {
mWindowManager.createLayout(true /* show */, false /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
final LinearLayout hint = mCompatUILayout.findViewById(R.id.camera_compat_hint);
hint.performClick();
verify(mCompatUILayout).setCameraCompatHintVisibility(/* show= */ false);
}
}

View File

@@ -16,10 +16,6 @@
package com.android.wm.shell.compatui;
import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED;
import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN;
import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED;
import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED;
import static android.view.InsetsState.ITYPE_EXTRA_NAVIGATION_BAR;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
@@ -27,7 +23,6 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
@@ -86,7 +81,7 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
mWindowManager = new CompatUIWindowManager(mContext, new Configuration(),
mSyncTransactionQueue, mCallback, TASK_ID, mTaskListener, new DisplayLayout(),
false /* hasShownSizeCompatHint */, false /* hasShownSizeCompatHint */);
false /* hasShownHint */);
spyOn(mWindowManager);
doReturn(mCompatUILayout).when(mWindowManager).inflateCompatUILayout();
@@ -96,35 +91,31 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
@Test
public void testCreateSizeCompatButton() {
// Not create layout if show is false.
mWindowManager.createLayout(false /* show */, true /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_HIDDEN);
mWindowManager.createLayout(false /* show */);
verify(mWindowManager, never()).inflateCompatUILayout();
// Not create hint popup.
mWindowManager.mShouldShowSizeCompatHint = false;
mWindowManager.createLayout(true /* show */, true /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_HIDDEN);
mWindowManager.mShouldShowHint = false;
mWindowManager.createLayout(true /* show */);
verify(mWindowManager).inflateCompatUILayout();
verify(mCompatUILayout, never()).setSizeCompatHintVisibility(true /* show */);
verify(mCompatUILayout).setSizeCompatHintVisibility(false /* show */);
// Create hint popup.
mWindowManager.release();
mWindowManager.mShouldShowSizeCompatHint = true;
mWindowManager.createLayout(true /* show */, true /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_HIDDEN);
mWindowManager.mShouldShowHint = true;
mWindowManager.createLayout(true /* show */);
verify(mWindowManager, times(2)).inflateCompatUILayout();
assertNotNull(mCompatUILayout);
verify(mCompatUILayout).setSizeCompatHintVisibility(true /* show */);
assertFalse(mWindowManager.mShouldShowSizeCompatHint);
assertFalse(mWindowManager.mShouldShowHint);
}
@Test
public void testRelease() {
mWindowManager.createLayout(true /* show */, true /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_HIDDEN);
mWindowManager.createLayout(true /* show */);
verify(mWindowManager).inflateCompatUILayout();
@@ -135,60 +126,32 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
@Test
public void testUpdateCompatInfo() {
mWindowManager.createLayout(true /* show */, true /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_HIDDEN);
mWindowManager.createLayout(true /* show */);
// No diff
clearInvocations(mWindowManager);
mWindowManager.updateCompatInfo(mTaskConfig, mTaskListener, true /* show */,
true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN);
mWindowManager.updateCompatInfo(mTaskConfig, mTaskListener, true /* show */);
verify(mWindowManager, never()).updateSurfacePosition();
verify(mWindowManager, never()).release();
verify(mWindowManager, never()).createLayout(anyBoolean(), anyBoolean(), anyInt());
verify(mWindowManager, never()).createLayout(anyBoolean());
// Change task listener, recreate button.
clearInvocations(mWindowManager);
final ShellTaskOrganizer.TaskListener newTaskListener = mock(
ShellTaskOrganizer.TaskListener.class);
mWindowManager.updateCompatInfo(mTaskConfig, newTaskListener,
true /* show */, true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN);
true /* show */);
verify(mWindowManager).release();
verify(mWindowManager).createLayout(anyBoolean(), anyBoolean(), anyInt());
// Change Camera Compat state, show a control.
mWindowManager.updateCompatInfo(mTaskConfig, newTaskListener, true /* show */,
true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED);
verify(mCompatUILayout).setCameraControlVisibility(/* show */ true);
verify(mCompatUILayout).updateCameraTreatmentButton(
CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED);
clearInvocations(mWindowManager);
clearInvocations(mCompatUILayout);
// Change Camera Compat state, update a control.
mWindowManager.updateCompatInfo(mTaskConfig, newTaskListener, true /* show */,
true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
verify(mCompatUILayout).setCameraControlVisibility(/* show */ true);
verify(mCompatUILayout).updateCameraTreatmentButton(
CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
clearInvocations(mWindowManager);
clearInvocations(mCompatUILayout);
// Change Camera Compat state to hidden, hide a control.
mWindowManager.updateCompatInfo(mTaskConfig, newTaskListener,
true /* show */, true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN);
verify(mCompatUILayout).setCameraControlVisibility(/* show */ false);
verify(mWindowManager).createLayout(anyBoolean());
// Change task bounds, update position.
clearInvocations(mWindowManager);
final Configuration newTaskConfiguration = new Configuration();
newTaskConfiguration.windowConfiguration.setBounds(new Rect(0, 1000, 0, 2000));
mWindowManager.updateCompatInfo(newTaskConfiguration, newTaskListener,
true /* show */, true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN);
true /* show */);
verify(mWindowManager).updateSurfacePosition();
}
@@ -238,25 +201,23 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
public void testUpdateVisibility() {
// Create button if it is not created.
mWindowManager.mCompatUILayout = null;
mWindowManager.mHasSizeCompat = true;
mWindowManager.updateVisibility(true /* show */);
verify(mWindowManager).createLayout(true /* show */, true /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_HIDDEN);
verify(mWindowManager).createLayout(true /* show */);
// Hide button.
clearInvocations(mWindowManager);
doReturn(View.VISIBLE).when(mCompatUILayout).getVisibility();
mWindowManager.updateVisibility(false /* show */);
verify(mWindowManager, never()).createLayout(anyBoolean(), anyBoolean(), anyInt());
verify(mWindowManager, never()).createLayout(anyBoolean());
verify(mCompatUILayout).setVisibility(View.GONE);
// Show button.
doReturn(View.GONE).when(mCompatUILayout).getVisibility();
mWindowManager.updateVisibility(true /* show */);
verify(mWindowManager, never()).createLayout(anyBoolean(), anyBoolean(), anyInt());
verify(mWindowManager, never()).createLayout(anyBoolean());
verify(mCompatUILayout).setVisibility(View.VISIBLE);
}
@@ -268,37 +229,6 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
verify(mTaskListener).attachChildSurfaceToTask(TASK_ID, b);
}
@Test
public void testOnCameraDismissButtonClicked() {
mWindowManager.createLayout(true /* show */, true /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
clearInvocations(mCompatUILayout);
mWindowManager.onCameraDismissButtonClicked();
verify(mCallback).onCameraControlStateUpdated(TASK_ID, CAMERA_COMPAT_CONTROL_DISMISSED);
verify(mCompatUILayout).setCameraControlVisibility(/* show= */ false);
}
@Test
public void testOnCameraTreatmentButtonClicked() {
mWindowManager.createLayout(true /* show */, true /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
clearInvocations(mCompatUILayout);
mWindowManager.onCameraTreatmentButtonClicked();
verify(mCallback).onCameraControlStateUpdated(
TASK_ID, CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED);
verify(mCompatUILayout).updateCameraTreatmentButton(
CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED);
mWindowManager.onCameraTreatmentButtonClicked();
verify(mCallback).onCameraControlStateUpdated(
TASK_ID, CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
verify(mCompatUILayout).updateCameraTreatmentButton(
CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
}
@Test
public void testOnRestartButtonClicked() {
mWindowManager.onRestartButtonClicked();
@@ -309,60 +239,15 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
@Test
public void testOnRestartButtonLongClicked_showHint() {
// Not create hint popup.
mWindowManager.mShouldShowSizeCompatHint = false;
mWindowManager.createLayout(true /* show */, true /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_HIDDEN);
mWindowManager.mShouldShowHint = false;
mWindowManager.createLayout(true /* show */);
verify(mWindowManager).inflateCompatUILayout();
verify(mCompatUILayout, never()).setSizeCompatHintVisibility(true /* show */);
verify(mCompatUILayout).setSizeCompatHintVisibility(false /* show */);
mWindowManager.onRestartButtonLongClicked();
verify(mCompatUILayout).setSizeCompatHintVisibility(true /* show */);
}
@Test
public void testOnCamerControlLongClicked_showHint() {
// Not create hint popup.
mWindowManager.mShouldShowCameraCompatHint = false;
mWindowManager.createLayout(true /* show */, false /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
verify(mWindowManager).inflateCompatUILayout();
verify(mCompatUILayout, never()).setCameraCompatHintVisibility(true /* show */);
mWindowManager.onCameraButtonLongClicked();
verify(mCompatUILayout).setCameraCompatHintVisibility(true /* show */);
}
@Test
public void testCreateCameraCompatControl() {
// Not create layout if show is false.
mWindowManager.createLayout(false /* show */, false /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
verify(mWindowManager, never()).inflateCompatUILayout();
// Not create hint popup.
mWindowManager.mShouldShowCameraCompatHint = false;
mWindowManager.createLayout(true /* show */, false /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
verify(mWindowManager).inflateCompatUILayout();
verify(mCompatUILayout, never()).setCameraCompatHintVisibility(true /* show */);
verify(mCompatUILayout).setCameraControlVisibility(true /* show */);
// Create hint popup.
mWindowManager.release();
mWindowManager.mShouldShowCameraCompatHint = true;
mWindowManager.createLayout(true /* show */, false /* hasSizeCompat */,
CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
verify(mWindowManager, times(2)).inflateCompatUILayout();
assertNotNull(mCompatUILayout);
verify(mCompatUILayout, times(2)).setCameraControlVisibility(true /* show */);
assertFalse(mWindowManager.mShouldShowCameraCompatHint);
}
}