Allow checking if an activity is embedded
Adds a public API to check if an activity is being embedded
by any process. Its presentation can be changed by the host
and shown anywhere within its task window.
Bug: 204399167
Relnote: A public API to check if an activity is being embedded.
Test: Manual, using demo app
Change-Id: I39eb7a9e5c5c0be78e0acdfe71eed3c17bd483a0
diff --git a/window/extensions/extensions/api/public_plus_experimental_current.txt b/window/extensions/extensions/api/public_plus_experimental_current.txt
index 00f6e8c..6a28e00 100644
--- a/window/extensions/extensions/api/public_plus_experimental_current.txt
+++ b/window/extensions/extensions/api/public_plus_experimental_current.txt
@@ -19,6 +19,7 @@
package androidx.window.extensions.embedding {
@androidx.window.extensions.ExperimentalWindowExtensionsApi public interface ActivityEmbeddingComponent {
+ method public boolean isActivityEmbedded(android.app.Activity);
method public void setEmbeddingRules(java.util.Set<androidx.window.extensions.embedding.EmbeddingRule!>);
method public void setSplitInfoCallback(java.util.function.Consumer<java.util.List<androidx.window.extensions.embedding.SplitInfo!>!>);
}
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityEmbeddingComponent.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityEmbeddingComponent.java
index 811d0b3..f4dd8a4 100644
--- a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityEmbeddingComponent.java
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityEmbeddingComponent.java
@@ -16,6 +16,8 @@
package androidx.window.extensions.embedding;
+import android.app.Activity;
+
import androidx.annotation.NonNull;
import androidx.window.extensions.ExperimentalWindowExtensionsApi;
@@ -44,4 +46,10 @@
*/
@SuppressWarnings("ExecutorRegistration") // Jetpack will post it on the app-provided executor.
void setSplitInfoCallback(@NonNull Consumer<List<SplitInfo>> consumer);
+
+ /**
+ * Checks if an activity's' presentation is customized by its or any other process and only
+ * occupies a portion of Task bounds.
+ */
+ boolean isActivityEmbedded(@NonNull Activity activity);
}
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityBase.java b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityBase.java
index c357aa9..8dfe232 100644
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityBase.java
+++ b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityBase.java
@@ -22,6 +22,7 @@
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Intent;
+import android.content.res.Configuration;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.LayoutDirection;
@@ -120,6 +121,7 @@
super.onStart();
mCallback = new SplitInfoCallback();
mSplitController.addSplitListener(this, Runnable::run, mCallback);
+ updateEmbeddedStatus();
}
@Override
@@ -129,6 +131,12 @@
mCallback = null;
}
+ @Override
+ public void onConfigurationChanged(@NonNull Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ updateEmbeddedStatus();
+ }
+
class SplitInfoCallback implements Consumer<List<SplitInfo>> {
@Override
public void accept(List<SplitInfo> splitInfoList) {
@@ -322,4 +330,13 @@
DisplayMetrics dm = getResources().getDisplayMetrics();
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, MIN_SPLIT_WIDTH_DP, dm);
}
+
+ /** Updates the status label that says when an activity is embedded. */
+ private void updateEmbeddedStatus() {
+ if (mSplitController.isActivityEmbedded(this)) {
+ mViewBinding.activityEmbeddedStatusTextView.setVisibility(View.VISIBLE);
+ } else {
+ mViewBinding.activityEmbeddedStatusTextView.setVisibility(View.GONE);
+ }
+ }
}
diff --git a/window/window-samples/src/main/res/layout/activity_split_activity_layout.xml b/window/window-samples/src/main/res/layout/activity_split_activity_layout.xml
index 3f5a029..d67eefc 100644
--- a/window/window-samples/src/main/res/layout/activity_split_activity_layout.xml
+++ b/window/window-samples/src/main/res/layout/activity_split_activity_layout.xml
@@ -23,6 +23,12 @@
android:orientation="vertical"
android:padding="10dp">
+ <TextView
+ android:id="@+id/activity_embedded_status_text_view"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="Activity is embedded" />
+
<CheckBox
android:id="@+id/splitMainCheckBox"
android:layout_width="match_parent"
diff --git a/window/window/api/public_plus_experimental_current.txt b/window/window/api/public_plus_experimental_current.txt
index b13fa71..e166e4b 100644
--- a/window/window/api/public_plus_experimental_current.txt
+++ b/window/window/api/public_plus_experimental_current.txt
@@ -41,6 +41,7 @@
method public static androidx.window.embedding.SplitController getInstance();
method public java.util.Set<androidx.window.embedding.EmbeddingRule> getSplitRules();
method public static void initialize(android.content.Context context, int staticRuleResourceId);
+ method public boolean isActivityEmbedded(android.app.Activity activity);
method public boolean isSplitSupported();
method public void registerRule(androidx.window.embedding.EmbeddingRule rule);
method public void removeSplitListener(androidx.core.util.Consumer<java.util.List<androidx.window.embedding.SplitInfo>> consumer);
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingBackend.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingBackend.kt
index 6cfbe4a..9e420d5 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingBackend.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingBackend.kt
@@ -43,4 +43,6 @@
)
fun isSplitSupported(): Boolean
+
+ fun isActivityEmbedded(activity: Activity): Boolean
}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt
index f2129b9..91c28f4 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt
@@ -16,6 +16,7 @@
package androidx.window.embedding
+import android.app.Activity
import android.util.Log
import androidx.window.core.ConsumerAdapter
import androidx.window.core.ExperimentalWindowApi
@@ -52,6 +53,10 @@
}
}
+ override fun isActivityEmbedded(activity: Activity): Boolean {
+ return embeddingExtension.isActivityEmbedded(activity)
+ }
+
companion object {
const val DEBUG = true
private const val TAG = "EmbeddingCompat"
@@ -103,4 +108,4 @@
}
}
}
-}
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingInterfaceCompat.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingInterfaceCompat.kt
index 8bd6d07..33f8f7c 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingInterfaceCompat.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingInterfaceCompat.kt
@@ -16,6 +16,7 @@
package androidx.window.embedding
+import android.app.Activity
import androidx.window.core.ExperimentalWindowApi
import androidx.window.extensions.embedding.ActivityEmbeddingComponent
@@ -33,4 +34,6 @@
interface EmbeddingCallbackInterface {
fun onSplitInfoChanged(splitInfo: List<SplitInfo>)
}
+
+ fun isActivityEmbedded(activity: Activity): Boolean
}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/ExtensionEmbeddingBackend.kt b/window/window/src/main/java/androidx/window/embedding/ExtensionEmbeddingBackend.kt
index a134c8e..8a02162 100644
--- a/window/window/src/main/java/androidx/window/embedding/ExtensionEmbeddingBackend.kt
+++ b/window/window/src/main/java/androidx/window/embedding/ExtensionEmbeddingBackend.kt
@@ -216,4 +216,8 @@
override fun isSplitSupported(): Boolean {
return embeddingExtension != null
}
+
+ override fun isActivityEmbedded(activity: Activity): Boolean {
+ return embeddingExtension?.isActivityEmbedded(activity) ?: false
+ }
}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitController.kt b/window/window/src/main/java/androidx/window/embedding/SplitController.kt
index 90cbe20..cf5aa4a 100644
--- a/window/window/src/main/java/androidx/window/embedding/SplitController.kt
+++ b/window/window/src/main/java/androidx/window/embedding/SplitController.kt
@@ -116,6 +116,15 @@
embeddingBackend.setSplitRules(staticRules)
}
+ /**
+ * Checks if an activity is embedded and its presentation may be customized by its or any other
+ * process.
+ */
+ // TODO(b/204399167) Migrate to a Flow
+ fun isActivityEmbedded(activity: Activity): Boolean {
+ return embeddingBackend.isActivityEmbedded(activity)
+ }
+
companion object {
@Volatile
private var globalInstance: SplitController? = null