summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/WindowManager/Jetpack/src/androidx/window/sidecar/SidecarImpl.java (renamed from libs/WindowManager/Jetpack/src/androidx/window/sidecar/SampleSidecarImpl.java)103
-rw-r--r--libs/WindowManager/Jetpack/src/androidx/window/sidecar/SidecarProvider.java2
-rw-r--r--libs/WindowManager/Jetpack/src/androidx/window/sidecar/StubSidecar.java96
3 files changed, 85 insertions, 116 deletions
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/sidecar/SampleSidecarImpl.java b/libs/WindowManager/Jetpack/src/androidx/window/sidecar/SidecarImpl.java
index 60bc7bedf2ed..a1de2062e906 100644
--- a/libs/WindowManager/Jetpack/src/androidx/window/sidecar/SampleSidecarImpl.java
+++ b/libs/WindowManager/Jetpack/src/androidx/window/sidecar/SidecarImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020 The Android Open Source Project
+ * Copyright (C) 2024 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.
@@ -16,6 +16,7 @@
package androidx.window.sidecar;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Activity;
import android.app.Application;
@@ -23,8 +24,9 @@ import android.content.Context;
import android.hardware.devicestate.DeviceStateManager;
import android.os.Bundle;
import android.os.IBinder;
+import android.util.ArraySet;
+import android.util.Log;
-import androidx.annotation.NonNull;
import androidx.window.common.BaseDataProducer;
import androidx.window.common.DeviceStateManagerFoldingFeatureProducer;
import androidx.window.common.EmptyLifecycleCallbacksAdapter;
@@ -33,17 +35,27 @@ import androidx.window.common.layout.CommonFoldingFeature;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
+import java.util.Set;
/**
- * Reference implementation of androidx.window.sidecar OEM interface for use with
- * WindowManager Jetpack.
+ * Basic implementation of the {@link SidecarInterface}. An OEM can choose to use it as the base
+ * class for their implementation.
*/
-class SampleSidecarImpl extends StubSidecar {
+class SidecarImpl implements SidecarInterface {
+
+ private static final String TAG = "WindowManagerSidecar";
+
+ @Nullable
+ private SidecarCallback mSidecarCallback;
+ private final ArraySet<IBinder> mWindowLayoutChangeListenerTokens = new ArraySet<>();
+ private boolean mDeviceStateChangeListenerRegistered;
+ @NonNull
private List<CommonFoldingFeature> mStoredFeatures = new ArrayList<>();
- SampleSidecarImpl(Context context) {
+ SidecarImpl(Context context) {
((Application) context.getApplicationContext())
- .registerActivityLifecycleCallbacks(new NotifyOnConfigurationChanged());
+ .registerActivityLifecycleCallbacks(new SidecarImpl.NotifyOnConfigurationChanged());
RawFoldingFeatureProducer settingsFeatureProducer = new RawFoldingFeatureProducer(context);
BaseDataProducer<List<CommonFoldingFeature>> foldingFeatureProducer =
new DeviceStateManagerFoldingFeatureProducer(context,
@@ -53,11 +65,46 @@ class SampleSidecarImpl extends StubSidecar {
foldingFeatureProducer.addDataChangedCallback(this::onDisplayFeaturesChanged);
}
- private void setStoredFeatures(List<CommonFoldingFeature> storedFeatures) {
- mStoredFeatures = storedFeatures;
+ @NonNull
+ @Override
+ public SidecarDeviceState getDeviceState() {
+ return SidecarHelper.calculateDeviceState(mStoredFeatures);
+ }
+
+ @NonNull
+ @Override
+ public SidecarWindowLayoutInfo getWindowLayoutInfo(@NonNull IBinder windowToken) {
+ return SidecarHelper.calculateWindowLayoutInfo(windowToken, mStoredFeatures);
+ }
+
+ @Override
+ public void setSidecarCallback(@NonNull SidecarCallback sidecarCallback) {
+ mSidecarCallback = sidecarCallback;
+ }
+
+ @Override
+ public void onWindowLayoutChangeListenerAdded(@NonNull IBinder iBinder) {
+ mWindowLayoutChangeListenerTokens.add(iBinder);
+ onListenersChanged();
+ }
+
+ @Override
+ public void onWindowLayoutChangeListenerRemoved(@NonNull IBinder iBinder) {
+ mWindowLayoutChangeListenerTokens.remove(iBinder);
+ onListenersChanged();
+ }
+
+ @Override
+ public void onDeviceStateListenersChanged(boolean isEmpty) {
+ mDeviceStateChangeListenerRegistered = !isEmpty;
+ onListenersChanged();
+ }
+
+ private void setStoredFeatures(@NonNull List<CommonFoldingFeature> storedFeatures) {
+ mStoredFeatures = Objects.requireNonNull(storedFeatures);
}
- private void onDisplayFeaturesChanged(List<CommonFoldingFeature> storedFeatures) {
+ private void onDisplayFeaturesChanged(@NonNull List<CommonFoldingFeature> storedFeatures) {
setStoredFeatures(storedFeatures);
updateDeviceState(getDeviceState());
for (IBinder windowToken : getWindowsListeningForLayoutChanges()) {
@@ -66,25 +113,43 @@ class SampleSidecarImpl extends StubSidecar {
}
}
- @NonNull
- @Override
- public SidecarDeviceState getDeviceState() {
- return SidecarHelper.calculateDeviceState(mStoredFeatures);
+ void updateDeviceState(@NonNull SidecarDeviceState newState) {
+ if (mSidecarCallback != null) {
+ try {
+ mSidecarCallback.onDeviceStateChanged(newState);
+ } catch (AbstractMethodError e) {
+ Log.e(TAG, "App is using an outdated Window Jetpack library", e);
+ }
+ }
+ }
+
+ void updateWindowLayout(@NonNull IBinder windowToken,
+ @NonNull SidecarWindowLayoutInfo newLayout) {
+ if (mSidecarCallback != null) {
+ try {
+ mSidecarCallback.onWindowLayoutChanged(windowToken, newLayout);
+ } catch (AbstractMethodError e) {
+ Log.e(TAG, "App is using an outdated Window Jetpack library", e);
+ }
+ }
}
@NonNull
- @Override
- public SidecarWindowLayoutInfo getWindowLayoutInfo(@NonNull IBinder windowToken) {
- return SidecarHelper.calculateWindowLayoutInfo(windowToken, mStoredFeatures);
+ private Set<IBinder> getWindowsListeningForLayoutChanges() {
+ return mWindowLayoutChangeListenerTokens;
}
- @Override
- protected void onListenersChanged() {
+ protected boolean hasListeners() {
+ return !mWindowLayoutChangeListenerTokens.isEmpty() || mDeviceStateChangeListenerRegistered;
+ }
+
+ private void onListenersChanged() {
if (hasListeners()) {
onDisplayFeaturesChanged(mStoredFeatures);
}
}
+
private final class NotifyOnConfigurationChanged extends EmptyLifecycleCallbacksAdapter {
@Override
public void onActivityCreated(@NonNull Activity activity,
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/sidecar/SidecarProvider.java b/libs/WindowManager/Jetpack/src/androidx/window/sidecar/SidecarProvider.java
index 686a31b6be04..1e306fcebda0 100644
--- a/libs/WindowManager/Jetpack/src/androidx/window/sidecar/SidecarProvider.java
+++ b/libs/WindowManager/Jetpack/src/androidx/window/sidecar/SidecarProvider.java
@@ -36,7 +36,7 @@ public class SidecarProvider {
@Nullable
public static SidecarInterface getSidecarImpl(Context context) {
return isWindowExtensionsEnabled()
- ? new SampleSidecarImpl(context.getApplicationContext())
+ ? new SidecarImpl(context.getApplicationContext())
: null;
}
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/sidecar/StubSidecar.java b/libs/WindowManager/Jetpack/src/androidx/window/sidecar/StubSidecar.java
deleted file mode 100644
index 46c1f3ba4691..000000000000
--- a/libs/WindowManager/Jetpack/src/androidx/window/sidecar/StubSidecar.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * 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 android.util.Log;
-
-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 static final String TAG = "WindowManagerSidecar";
-
- private SidecarCallback mSidecarCallback;
- 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) {
- try {
- mSidecarCallback.onDeviceStateChanged(newState);
- } catch (AbstractMethodError e) {
- Log.e(TAG, "App is using an outdated Window Jetpack library", e);
- }
- }
- }
-
- void updateWindowLayout(@NonNull IBinder windowToken,
- @NonNull SidecarWindowLayoutInfo newLayout) {
- if (this.mSidecarCallback != null) {
- try {
- mSidecarCallback.onWindowLayoutChanged(windowToken, newLayout);
- } catch (AbstractMethodError e) {
- Log.e(TAG, "App is using an outdated Window Jetpack library", e);
- }
- }
- }
-
- @NonNull
- Set<IBinder> getWindowsListeningForLayoutChanges() {
- return mWindowLayoutChangeListenerTokens;
- }
-
- protected boolean hasListeners() {
- return !mWindowLayoutChangeListenerTokens.isEmpty() || mDeviceStateChangeListenerRegistered;
- }
-
- protected abstract void onListenersChanged();
-}