1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.server.wm.jetpack.signed;
18 
19 import static android.server.wm.jetpack.extensions.util.ExtensionsUtil.getWindowExtensions;
20 import static android.server.wm.jetpack.utils.ActivityEmbeddingUtil.EMBEDDED_ACTIVITY_ID;
21 import static android.server.wm.jetpack.utils.ActivityEmbeddingUtil.assumeActivityEmbeddingSupportedDevice;
22 import static android.server.wm.jetpack.utils.ActivityEmbeddingUtil.createSplitPairRuleBuilder;
23 import static android.server.wm.jetpack.utils.ActivityEmbeddingUtil.startActivityCrossUidInSplit;
24 import static android.server.wm.jetpack.utils.WindowManagerJetpackTestBase.EXTRA_EMBED_ACTIVITY;
25 import static android.server.wm.jetpack.utils.WindowManagerJetpackTestBase.EXTRA_SPLIT_RATIO;
26 
27 import android.app.Activity;
28 import android.content.ComponentName;
29 import android.content.Intent;
30 import android.os.Bundle;
31 import android.server.wm.jetpack.extensions.util.TestValueCountConsumer;
32 import android.server.wm.jetpack.utils.TestActivityKnownEmbeddingCerts;
33 
34 import androidx.window.extensions.embedding.ActivityEmbeddingComponent;
35 import androidx.window.extensions.embedding.SplitAttributes;
36 import androidx.window.extensions.embedding.SplitInfo;
37 import androidx.window.extensions.embedding.SplitPairRule;
38 
39 import org.junit.AssumptionViolatedException;
40 
41 import java.util.Collections;
42 import java.util.List;
43 
44 /**
45  * A test activity that attempts to embed {@link TestActivityKnownEmbeddingCerts} when created.
46  * The app it belongs to is signed with a certificate that is recognized by the target app as a
47  * trusted embedding host.
48  */
49 public class SignedEmbeddingActivity extends Activity {
50 
51     @Override
onCreate(Bundle savedInstanceState)52     protected void onCreate(Bundle savedInstanceState) {
53         super.onCreate(savedInstanceState);
54 
55         if (getIntent().getBooleanExtra(EXTRA_EMBED_ACTIVITY, false)) {
56             startActivityInSplit();
57         }
58     }
59 
60     @Override
onNewIntent(Intent intent)61     protected void onNewIntent(Intent intent) {
62         super.onNewIntent(intent);
63 
64         if (intent.getBooleanExtra(EXTRA_EMBED_ACTIVITY, false)) {
65             startActivityInSplit();
66         }
67     }
68 
startActivityInSplit()69     void startActivityInSplit() {
70         ActivityEmbeddingComponent embeddingComponent;
71         try {
72             assumeActivityEmbeddingSupportedDevice();
73             embeddingComponent = getWindowExtensions().getActivityEmbeddingComponent();
74         } catch (AssumptionViolatedException e) {
75             // Embedding not supported
76             finish();
77             return;
78         }
79 
80         TestValueCountConsumer<List<SplitInfo>> splitInfoConsumer = new TestValueCountConsumer<>();
81         embeddingComponent.setSplitInfoCallback(splitInfoConsumer);
82         SplitAttributes.SplitType splitType = new SplitAttributes.SplitType.RatioSplitType(
83                 getIntent().getFloatExtra(EXTRA_SPLIT_RATIO, 0.5f));
84 
85         SplitPairRule splitPairRule = createSplitPairRuleBuilder(
86                 activityActivityPair -> true /* activityActivityPredicate */,
87                 activityIntentPair -> true /* activityIntentPredicate */,
88                 parentWindowMetrics -> true /* parentWindowMetricsPredicate */)
89                 .setDefaultSplitAttributes(new SplitAttributes.Builder()
90                         .setSplitType(splitType).build())
91                 .build();
92         embeddingComponent.setEmbeddingRules(Collections.singleton(splitPairRule));
93 
94         // Launch an activity from a different UID that recognizes this package's signature and
95         // verify that it is split with this activity.
96         startActivityCrossUidInSplit(this,
97                 new ComponentName("android.server.wm.jetpack",
98                         "android.server.wm.jetpack.utils.TestActivityKnownEmbeddingCerts"),
99                 splitPairRule, splitInfoConsumer, EMBEDDED_ACTIVITY_ID, false /* verify */);
100     }
101 }
102