[go: nahoru, domu]

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