Downgrade Window JetPack
Add window sidecar aar.
Add settings implementation of SidecarInterface.
Bug: 157477145
Test: use a device with sidecar and not window extensions.
atest CtsWindowManagerJetpackTestCases:ExtensionTest
Change-Id: Iade7a4ba5a75ba7301cd151b54a95820a3d4bdde
This commit is contained in:
@@ -13,26 +13,26 @@
|
||||
// limitations under the License.
|
||||
|
||||
android_library_import {
|
||||
name: "window-extensions",
|
||||
aars: ["window-extensions-release.aar"],
|
||||
name: "window-sidecar",
|
||||
aars: ["window-sidecar-release.aar"],
|
||||
sdk_version: "current",
|
||||
}
|
||||
|
||||
java_library {
|
||||
name: "androidx.window.extensions",
|
||||
name: "androidx.window.sidecar",
|
||||
srcs: ["src/**/*.java"],
|
||||
static_libs: ["window-extensions"],
|
||||
static_libs: ["window-sidecar"],
|
||||
installable: true,
|
||||
sdk_version: "core_platform",
|
||||
vendor: true,
|
||||
libs: ["framework", "androidx.annotation_annotation",],
|
||||
required: ["androidx.window.extensions.xml",],
|
||||
required: ["androidx.window.sidecar.xml",],
|
||||
}
|
||||
|
||||
prebuilt_etc {
|
||||
name: "androidx.window.extensions.xml",
|
||||
name: "androidx.window.sidecar.xml",
|
||||
vendor: true,
|
||||
sub_dir: "permissions",
|
||||
src: "androidx.window.extensions.xml",
|
||||
src: "androidx.window.sidecar.xml",
|
||||
filename_from_src: true,
|
||||
}
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2020 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.
|
||||
-->
|
||||
<permissions>
|
||||
<library
|
||||
name="androidx.window.extensions"
|
||||
file="/vendor/framework/androidx.window.extensions.jar"/>
|
||||
</permissions>
|
||||
21
libs/WindowManager/Jetpack/androidx.window.sidecar.xml
Normal file
21
libs/WindowManager/Jetpack/androidx.window.sidecar.xml
Normal file
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
~ Copyright (C) 2020 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.
|
||||
-->
|
||||
<permissions>
|
||||
<library
|
||||
name="androidx.window.sidecar"
|
||||
file="/vendor/framework/androidx.window.sidecar.jar"/>
|
||||
</permissions>
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2020 The Android Open Source Project
|
||||
* Copyright (C) 2020 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.
|
||||
@@ -14,14 +14,14 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package androidx.window.extensions;
|
||||
package androidx.window.sidecar;
|
||||
|
||||
import static android.view.Display.DEFAULT_DISPLAY;
|
||||
|
||||
import static androidx.window.extensions.ExtensionHelper.getWindowDisplay;
|
||||
import static androidx.window.extensions.ExtensionHelper.isInMultiWindow;
|
||||
import static androidx.window.extensions.ExtensionHelper.rotateRectToDisplayRotation;
|
||||
import static androidx.window.extensions.ExtensionHelper.transformToWindowSpaceRect;
|
||||
import static androidx.window.sidecar.SidecarHelper.getWindowDisplay;
|
||||
import static androidx.window.sidecar.SidecarHelper.isInMultiWindow;
|
||||
import static androidx.window.sidecar.SidecarHelper.rotateRectToDisplayRotation;
|
||||
import static androidx.window.sidecar.SidecarHelper.transformToWindowSpaceRect;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
@@ -42,8 +42,8 @@ import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
class SettingsExtensionImpl extends StubExtension {
|
||||
private static final String TAG = "SettingsExtension";
|
||||
class SettingsSidecarImpl extends StubSidecar {
|
||||
private static final String TAG = "SettingsSidecar";
|
||||
|
||||
private static final String DEVICE_POSTURE = "device_posture";
|
||||
private static final String DISPLAY_FEATURES = "display_features";
|
||||
@@ -106,7 +106,7 @@ class SettingsExtensionImpl extends StubExtension {
|
||||
}
|
||||
}
|
||||
|
||||
SettingsExtensionImpl(Context context) {
|
||||
SettingsSidecarImpl(Context context) {
|
||||
mContext = context;
|
||||
mSettingsObserver = new SettingsObserver();
|
||||
}
|
||||
@@ -118,29 +118,33 @@ class SettingsExtensionImpl extends StubExtension {
|
||||
/** Update display features with values read from settings. */
|
||||
private void updateDisplayFeatures() {
|
||||
for (IBinder windowToken : getWindowsListeningForLayoutChanges()) {
|
||||
ExtensionWindowLayoutInfo newLayout = getWindowLayoutInfo(windowToken);
|
||||
SidecarWindowLayoutInfo newLayout = getWindowLayoutInfo(windowToken);
|
||||
updateWindowLayout(windowToken, newLayout);
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public ExtensionDeviceState getDeviceState() {
|
||||
public SidecarDeviceState getDeviceState() {
|
||||
ContentResolver resolver = mContext.getContentResolver();
|
||||
int posture = Settings.Global.getInt(resolver, DEVICE_POSTURE,
|
||||
ExtensionDeviceState.POSTURE_UNKNOWN);
|
||||
return new ExtensionDeviceState(posture);
|
||||
SidecarDeviceState.POSTURE_UNKNOWN);
|
||||
SidecarDeviceState deviceState = new SidecarDeviceState();
|
||||
deviceState.posture = posture;
|
||||
return deviceState;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public ExtensionWindowLayoutInfo getWindowLayoutInfo(@NonNull IBinder windowToken) {
|
||||
List<ExtensionDisplayFeature> displayFeatures = readDisplayFeatures(windowToken);
|
||||
return new ExtensionWindowLayoutInfo(displayFeatures);
|
||||
public SidecarWindowLayoutInfo getWindowLayoutInfo(@NonNull IBinder windowToken) {
|
||||
List<SidecarDisplayFeature> displayFeatures = readDisplayFeatures(windowToken);
|
||||
SidecarWindowLayoutInfo windowLayoutInfo = new SidecarWindowLayoutInfo();
|
||||
windowLayoutInfo.displayFeatures = displayFeatures;
|
||||
return windowLayoutInfo;
|
||||
}
|
||||
|
||||
private List<ExtensionDisplayFeature> readDisplayFeatures(IBinder windowToken) {
|
||||
List<ExtensionDisplayFeature> features = new ArrayList<ExtensionDisplayFeature>();
|
||||
private List<SidecarDisplayFeature> readDisplayFeatures(IBinder windowToken) {
|
||||
List<SidecarDisplayFeature> features = new ArrayList<SidecarDisplayFeature>();
|
||||
int displayId = getWindowDisplay(windowToken);
|
||||
if (displayId != DEFAULT_DISPLAY) {
|
||||
Log.w(TAG, "This sample doesn't support display features on secondary displays");
|
||||
@@ -170,10 +174,10 @@ class SettingsExtensionImpl extends StubExtension {
|
||||
int type;
|
||||
switch (featureType) {
|
||||
case FEATURE_TYPE_FOLD:
|
||||
type = ExtensionDisplayFeature.TYPE_FOLD;
|
||||
type = SidecarDisplayFeature.TYPE_FOLD;
|
||||
break;
|
||||
case FEATURE_TYPE_HINGE:
|
||||
type = ExtensionDisplayFeature.TYPE_HINGE;
|
||||
type = SidecarDisplayFeature.TYPE_HINGE;
|
||||
break;
|
||||
default: {
|
||||
Log.e(TAG, "Malformed feature type: " + featureType);
|
||||
@@ -189,8 +193,9 @@ class SettingsExtensionImpl extends StubExtension {
|
||||
rotateRectToDisplayRotation(featureRect, displayId);
|
||||
transformToWindowSpaceRect(featureRect, windowToken);
|
||||
if (!featureRect.isEmpty()) {
|
||||
ExtensionDisplayFeature feature =
|
||||
new ExtensionDisplayFeature(featureRect, type);
|
||||
SidecarDisplayFeature feature = new SidecarDisplayFeature();
|
||||
feature.setRect(featureRect);
|
||||
feature.setType(type);
|
||||
features.add(feature);
|
||||
} else {
|
||||
Log.w(TAG, "Failed to adjust feature to window");
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2020 The Android Open Source Project
|
||||
* Copyright (C) 2020 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.
|
||||
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package androidx.window.extensions;
|
||||
package androidx.window.sidecar;
|
||||
|
||||
import static android.view.Display.INVALID_DISPLAY;
|
||||
import static android.view.Surface.ROTATION_0;
|
||||
@@ -32,12 +32,7 @@ import android.view.Surface;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
/**
|
||||
* Toolkit class for calculation of the display feature bounds within the window.
|
||||
* NOTE: This sample implementation only works for Activity windows, because there is no public APIs
|
||||
* to obtain layout params or bounds for arbitrary windows.
|
||||
*/
|
||||
class ExtensionHelper {
|
||||
class SidecarHelper {
|
||||
/**
|
||||
* Rotate the input rectangle specified in default display orientation to the current display
|
||||
* rotation.
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2020 The Android Open Source Project
|
||||
* Copyright (C) 2020 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.
|
||||
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package androidx.window.extensions;
|
||||
package androidx.window.sidecar;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
@@ -22,14 +22,13 @@ import android.content.Context;
|
||||
* Provider class that will instantiate the library implementation. It must be included in the
|
||||
* vendor library, and the vendor implementation must match the signature of this class.
|
||||
*/
|
||||
public class ExtensionProvider {
|
||||
|
||||
public class SidecarProvider {
|
||||
/**
|
||||
* The support library will instantiate the vendor implementation using this interface.
|
||||
* @return An implementation of {@link ExtensionInterface}.
|
||||
* Provide a simple implementation of {@link SidecarInterface} that can be replaced by
|
||||
* an OEM by overriding this method.
|
||||
*/
|
||||
public static ExtensionInterface getExtensionImpl(Context context) {
|
||||
return new SettingsExtensionImpl(context);
|
||||
public static SidecarInterface getSidecarImpl(Context context) {
|
||||
return new SettingsSidecarImpl(context);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -37,6 +36,6 @@ public class ExtensionProvider {
|
||||
* @return API version string in MAJOR.MINOR.PATCH-description format.
|
||||
*/
|
||||
public static String getApiVersion() {
|
||||
return "1.0.0-settings_sample";
|
||||
return "0.1.0-settings_sample";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Copyright (C) 2020 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.
|
||||
*/
|
||||
|
||||
package androidx.window.sidecar;
|
||||
|
||||
import android.os.IBinder;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Basic implementation of the {@link SidecarInterface}. An OEM can choose to use it as the base
|
||||
* class for their implementation.
|
||||
*/
|
||||
abstract class StubSidecar implements SidecarInterface {
|
||||
|
||||
private SidecarCallback mSidecarCallback;
|
||||
private final Set<IBinder> mWindowLayoutChangeListenerTokens = new HashSet<>();
|
||||
private boolean mDeviceStateChangeListenerRegistered;
|
||||
|
||||
StubSidecar() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSidecarCallback(@NonNull SidecarCallback sidecarCallback) {
|
||||
this.mSidecarCallback = sidecarCallback;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onWindowLayoutChangeListenerAdded(@NonNull IBinder iBinder) {
|
||||
this.mWindowLayoutChangeListenerTokens.add(iBinder);
|
||||
this.onListenersChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onWindowLayoutChangeListenerRemoved(@NonNull IBinder iBinder) {
|
||||
this.mWindowLayoutChangeListenerTokens.remove(iBinder);
|
||||
this.onListenersChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeviceStateListenersChanged(boolean isEmpty) {
|
||||
this.mDeviceStateChangeListenerRegistered = !isEmpty;
|
||||
this.onListenersChanged();
|
||||
}
|
||||
|
||||
void updateDeviceState(SidecarDeviceState newState) {
|
||||
if (this.mSidecarCallback != null) {
|
||||
mSidecarCallback.onDeviceStateChanged(newState);
|
||||
}
|
||||
}
|
||||
|
||||
void updateWindowLayout(@NonNull IBinder windowToken,
|
||||
@NonNull SidecarWindowLayoutInfo newLayout) {
|
||||
if (this.mSidecarCallback != null) {
|
||||
mSidecarCallback.onWindowLayoutChanged(windowToken, newLayout);
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
Set<IBinder> getWindowsListeningForLayoutChanges() {
|
||||
return mWindowLayoutChangeListenerTokens;
|
||||
}
|
||||
|
||||
protected boolean hasListeners() {
|
||||
return !mWindowLayoutChangeListenerTokens.isEmpty() || mDeviceStateChangeListenerRegistered;
|
||||
}
|
||||
|
||||
protected abstract void onListenersChanged();
|
||||
}
|
||||
Binary file not shown.
BIN
libs/WindowManager/Jetpack/window-sidecar-release.aar
Normal file
BIN
libs/WindowManager/Jetpack/window-sidecar-release.aar
Normal file
Binary file not shown.
Reference in New Issue
Block a user