Disable component alias

This feature is no longer used.

Bug: 273746590
Test: atest ComponentAliasTests ComponentAliasTests1 ComponentAliasTests2
    and make sure they all fail with:
    "Timeout: Wait until component alias is actually enabled"
Change-Id: Iabdec50fedbd45ab295eca32df8a308ede6ff21e
This commit is contained in:
Makoto Onuki
2023-03-20 17:17:02 -07:00
parent 6bbd3e99e3
commit ec3fd8e3a4
28 changed files with 8 additions and 1567 deletions

View File

@@ -30,7 +30,6 @@ import android.content.pm.PackageManagerInternal;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.Binder;
import android.os.Build;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.text.TextUtils;
@@ -43,7 +42,6 @@ import com.android.internal.content.PackageMonitor;
import com.android.internal.os.BackgroundThread;
import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.compat.CompatChange;
import com.android.server.compat.PlatformCompat;
import java.io.PrintWriter;
@@ -52,26 +50,11 @@ import java.util.Objects;
import java.util.function.Supplier;
/**
* Manages and handles component aliases, which is an experimental feature.
* @deprecated This feature is no longer used. Delete this class.
*
* NOTE: THIS CLASS IS PURELY EXPERIMENTAL AND WILL BE REMOVED IN FUTURE ANDROID VERSIONS.
* DO NOT USE IT.
*
* "Component alias" allows an android manifest component (for now only broadcasts and services)
* to be defined in one android package while having the implementation in a different package.
*
* When/if this becomes a real feature, it will be most likely implemented very differently,
* which is why this shouldn't be used.
*
* For now, because this is an experimental feature to evaluate feasibility, the implementation is
* "quick & dirty". For example, to define aliases, we use a regular intent filter and meta-data
* in the manifest, instead of adding proper tags/attributes to AndroidManifest.xml.
*
* This feature is disabled by default.
*
* Also, for now, aliases can be defined across packages with different certificates, but
* in a final version this will most likely be tightened.
* Also delete Intnt.(set|get)OriginalIntent.
*/
@Deprecated
public class ComponentAliasResolver {
private static final String TAG = "ComponentAliasResolver";
private static final boolean DEBUG = true;
@@ -149,11 +132,6 @@ public class ComponentAliasResolver {
}
};
private final CompatChange.ChangeListener mCompatChangeListener = (packageName) -> {
if (DEBUG) Slog.d(TAG, "USE_EXPERIMENTAL_COMPONENT_ALIAS changed.");
BackgroundThread.getHandler().post(this::refresh);
};
/**
* Call this on systemRead().
*/
@@ -161,8 +139,6 @@ public class ComponentAliasResolver {
synchronized (mLock) {
mPlatformCompat = (PlatformCompat) ServiceManager.getService(
Context.PLATFORM_COMPAT_SERVICE);
mPlatformCompat.registerListener(USE_EXPERIMENTAL_COMPONENT_ALIAS,
mCompatChangeListener);
}
if (DEBUG) Slog.d(TAG, "Compat listener set.");
update(enabledByDeviceConfig, overrides);
@@ -176,10 +152,8 @@ public class ComponentAliasResolver {
if (mPlatformCompat == null) {
return; // System not ready.
}
final boolean enabled = Build.isDebuggable()
&& (enabledByDeviceConfig
|| mPlatformCompat.isChangeEnabledByPackageName(
USE_EXPERIMENTAL_COMPONENT_ALIAS, "android", UserHandle.USER_SYSTEM));
// Never enable it.
final boolean enabled = false;
if (enabled != mEnabled) {
Slog.i(TAG, (enabled ? "Enabling" : "Disabling") + " component aliases...");
FgThread.getHandler().post(() -> {

View File

@@ -16,6 +16,9 @@ package {
default_applicable_licenses: ["Android-Apache-2.0"],
}
// TODO: Delete this file. It's no longer needed, but removing it on udc-dev will cause
// a conflict on master.
java_defaults {
name: "ComponentAliasTests_defaults",
static_libs: [
@@ -34,54 +37,3 @@ java_defaults {
],
platform_apis: true, // We use hidden APIs in the test.
}
// We build three APKs from the exact same source files, so these APKs contain the exact same tests.
// And we run the tests on each APK, so that we can test various situations:
// - When the alias is in the same package, target in the same package.
// - When the alias is in the same package, target in another package.
// - When the alias is in another package, which also contains the target.
// - When the alias is in another package, and the target is in yet another package.
// etc etc...
android_test {
name: "ComponentAliasTests",
defaults: [
"ComponentAliasTests_defaults",
],
package_name: "android.content.componentalias.tests",
manifest: "AndroidManifest.xml",
additional_manifests: [
"AndroidManifest_main.xml",
"AndroidManifest_service_aliases.xml",
"AndroidManifest_service_targets.xml",
],
test_config_template: "AndroidTest-template.xml",
}
android_test {
name: "ComponentAliasTests1",
defaults: [
"ComponentAliasTests_defaults",
],
package_name: "android.content.componentalias.tests.sub1",
manifest: "AndroidManifest.xml",
additional_manifests: [
"AndroidManifest_sub1.xml",
"AndroidManifest_service_targets.xml",
],
test_config_template: "AndroidTest-template.xml",
}
android_test {
name: "ComponentAliasTests2",
defaults: [
"ComponentAliasTests_defaults",
],
package_name: "android.content.componentalias.tests.sub2",
manifest: "AndroidManifest.xml",
additional_manifests: [
"AndroidManifest_sub2.xml",
"AndroidManifest_service_targets.xml",
],
test_config_template: "AndroidTest-template.xml",
}

View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
* Copyright (C) 2021 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.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.content.componentalias.tests" >
<application>
<uses-library android:name="android.test.runner" />
<property android:name="com.android.EXPERIMENTAL_COMPONENT_ALIAS_OPT_IN" android:value="true" />
</application>
</manifest>

View File

@@ -1,28 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
* Copyright (C) 2021 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.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.content.componentalias.tests" >
<application>
</application>
<instrumentation
android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="android.content.componentalias.tests" >
</instrumentation>
</manifest>

View File

@@ -1,81 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
* Copyright (C) 2021 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.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.content.componentalias.tests" >
<application>
<!--
Note the alias components are essentially just placeholders, so the APKs don't have to
have the implementation classes.
-->
<service android:name=".s.Alias00" android:exported="true" android:enabled="true" >
<meta-data android:name="alias_target" android:value="android.content.componentalias.tests/android.content.componentalias.tests.s.Target00" />
<intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
<intent-filter><action android:name="android.content.componentalias.tests.IS_ALIAS_00" /></intent-filter>
</service>
<service android:name=".s.Alias01" android:exported="true" android:enabled="true" >
<meta-data android:name="alias_target" android:value="android.content.componentalias.tests.sub1/android.content.componentalias.tests.s.Target01" />
<intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
<intent-filter><action android:name="android.content.componentalias.tests.IS_ALIAS_01" /></intent-filter>
</service>
<service android:name=".s.Alias02" android:exported="true" android:enabled="true" >
<meta-data android:name="alias_target" android:value="android.content.componentalias.tests.sub2/android.content.componentalias.tests.s.Target02" />
<intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
<intent-filter><action android:name="android.content.componentalias.tests.IS_ALIAS_02" /></intent-filter>
</service>
<service android:name=".s.Alias03" android:exported="true" android:enabled="true" >
<meta-data android:name="alias_target" android:value="android.content.componentalias.tests.sub1/android.content.componentalias.tests.s.Target03" />
<intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
<intent-filter><action android:name="android.content.componentalias.tests.IS_ALIAS_03" /></intent-filter>
</service>
<service android:name=".s.Alias04" android:exported="true" android:enabled="true" >
<meta-data android:name="alias_target" android:value="android.content.componentalias.tests.sub2/android.content.componentalias.tests.s.Target04" />
<intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
<intent-filter><action android:name="android.content.componentalias.tests.IS_ALIAS_04" /></intent-filter>
</service>
<receiver android:name=".b.Alias00" android:exported="true" android:enabled="true" >
<meta-data android:name="alias_target" android:value="android.content.componentalias.tests/android.content.componentalias.tests.b.Target00" />
<intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
<intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_00" /></intent-filter>
<intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
</receiver>
<receiver android:name=".b.Alias01" android:exported="true" android:enabled="true" >
<meta-data android:name="alias_target" android:value="android.content.componentalias.tests.sub1/android.content.componentalias.tests.b.Target01" />
<intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
<intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_01" /></intent-filter>
<intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
</receiver>
<receiver android:name=".b.Alias02" android:exported="true" android:enabled="true" >
<meta-data android:name="alias_target" android:value="android.content.componentalias.tests.sub2/android.content.componentalias.tests.b.Target02" />
<intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
<intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_02" /></intent-filter>
<intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
</receiver>
<receiver android:name=".b.Alias03" android:exported="true" android:enabled="true" >
<meta-data android:name="alias_target" android:value="android.content.componentalias.tests.sub1/android.content.componentalias.tests.b.Target03" />
<intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
<intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_03" /></intent-filter>
<intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
</receiver>
<receiver android:name=".b.Alias04" android:exported="true" android:enabled="true" >
<meta-data android:name="alias_target" android:value="android.content.componentalias.tests.sub2/android.content.componentalias.tests.b.Target04" />
<intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
<intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_04" /></intent-filter>
<intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
</receiver>
</application>
</manifest>

View File

@@ -1,57 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
* Copyright (C) 2021 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.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.content.componentalias.tests" >
<application>
<service android:name=".s.Target00" android:exported="true" android:enabled="true" >
</service>
<service android:name=".s.Target01" android:exported="true" android:enabled="true" >
</service>
<service android:name=".s.Target02" android:exported="true" android:enabled="true" >
</service>
<service android:name=".s.Target03" android:exported="true" android:enabled="true" >
</service>
<service android:name=".s.Target04" android:exported="true" android:enabled="true" >
</service>
<!--
Due to http://go/intents-match-intent-filters-guide, the target intent has to have
an intent filter that matches the original intent. (modulo the package name)
This restriction shouldn't exist in the final version.
-->
<receiver android:name=".b.Target00" android:exported="true" android:enabled="true" >
<intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_00" /></intent-filter>
<intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
</receiver>
<receiver android:name=".b.Target01" android:exported="true" android:enabled="true" >
<intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_01" /></intent-filter>
<intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
</receiver>
<receiver android:name=".b.Target02" android:exported="true" android:enabled="true" >
<intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_02" /></intent-filter>
<intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
</receiver>
<receiver android:name=".b.Target03" android:exported="true" android:enabled="true" >
<intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_03" /></intent-filter>
<intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
</receiver>
<receiver android:name=".b.Target04" android:exported="true" android:enabled="true" >
<intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_04" /></intent-filter>
<intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
</receiver>
</application>
</manifest>

View File

@@ -1,28 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
* Copyright (C) 2021 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.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.content.componentalias.tests" >
<application>
</application>
<instrumentation
android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="android.content.componentalias.tests.sub1" >
</instrumentation>
</manifest>

View File

@@ -1,28 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
* Copyright (C) 2021 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.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.content.componentalias.tests" >
<application>
</application>
<instrumentation
android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="android.content.componentalias.tests.sub2" >
</instrumentation>
</manifest>

View File

@@ -1,38 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2021 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.
-->
<configuration>
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
<option name="cleanup-apks" value="true" />
<option name="test-file-name" value="ComponentAliasTests.apk" />
<option name="test-file-name" value="ComponentAliasTests1.apk" />
<option name="test-file-name" value="ComponentAliasTests2.apk" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
<!-- Exempt the helper APKs from the BG restriction, so they can start BG services. -->
<option name="run-command" value="cmd deviceidle whitelist +android.content.componentalias.tests" />
<option name="run-command" value="cmd deviceidle whitelist +android.content.componentalias.tests.sub1" />
<option name="run-command" value="cmd deviceidle whitelist +android.content.componentalias.tests.sub2" />
<option name="teardown-command" value="cmd deviceidle whitelist -android.content.componentalias.tests" />
<option name="teardown-command" value="cmd deviceidle whitelist -android.content.componentalias.tests.sub1" />
<option name="teardown-command" value="cmd deviceidle whitelist -android.content.componentalias.tests.sub2" />
</target_preparer>
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="{PACKAGE}" />
<option name="runtime-hint" value="2m" />
<option name="isolated-storage" value="false" />
</test>
</configuration>

View File

@@ -1,103 +0,0 @@
/*
* Copyright (C) 2021 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 android.content.componentalias.tests;
import android.content.ComponentName;
import android.content.Context;
import android.os.Build;
import android.provider.DeviceConfig;
import android.util.Log;
import androidx.test.InstrumentationRegistry;
import com.android.compatibility.common.util.DeviceConfigStateHelper;
import com.android.compatibility.common.util.ShellUtils;
import com.android.compatibility.common.util.TestUtils;
import org.junit.AfterClass;
import org.junit.Assume;
import org.junit.Before;
import java.util.function.Consumer;
public class BaseComponentAliasTest {
protected static final Context sContext = InstrumentationRegistry.getTargetContext();
protected static final DeviceConfigStateHelper sDeviceConfig = new DeviceConfigStateHelper(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_COMPONENT_ALIAS);
@Before
public void enableComponentAliasWithCompatFlag() throws Exception {
Assume.assumeTrue(Build.isDebuggable());
ShellUtils.runShellCommand(
"am compat enable --no-kill USE_EXPERIMENTAL_COMPONENT_ALIAS android");
sDeviceConfig.set("enable_experimental_component_alias", "");
sDeviceConfig.set("component_alias_overrides", "");
// Make sure the feature is actually enabled, and the aliases are loaded.
TestUtils.waitUntil("Wait until component alias is actually enabled", () -> {
String out = ShellUtils.runShellCommand("dumpsys activity component-alias");
return out.contains("Enabled: true")
&& out.contains("android.content.componentalias.tests/.b.Alias04")
&& out.contains("android.content.componentalias.tests/.s.Alias04");
});
ShellUtils.runShellCommand("am wait-for-broadcast-idle");
}
@AfterClass
public static void restoreDeviceConfig() throws Exception {
ShellUtils.runShellCommand(
"am compat disable --no-kill USE_EXPERIMENTAL_COMPONENT_ALIAS android");
sDeviceConfig.close();
}
protected static void log(String message) {
Log.i(ComponentAliasTestCommon.TAG, "[" + sContext.getPackageName() + "] " + message);
}
/**
* Defines a test target.
*/
public static class Combo {
public final ComponentName alias;
public final ComponentName target;
public final String action;
public Combo(ComponentName alias, ComponentName target, String action) {
this.alias = alias;
this.target = target;
this.action = action;
}
@Override
public String toString() {
return "Combo{"
+ "alias=" + toString(alias)
+ ", target=" + toString(target)
+ ", action='" + action + '\''
+ '}';
}
private static String toString(ComponentName cn) {
return cn == null ? "[null]" : cn.flattenToShortString();
}
public void apply(Consumer<Combo> callback) {
log("Testing for: " + this);
callback.accept(this);
}
}
}

View File

@@ -1,110 +0,0 @@
/*
* Copyright (C) 2021 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 android.content.componentalias.tests;
import static android.content.componentalias.tests.ComponentAliasTestCommon.MAIN_PACKAGE;
import static android.content.componentalias.tests.ComponentAliasTestCommon.SUB1_PACKAGE;
import static android.content.componentalias.tests.ComponentAliasTestCommon.SUB2_PACKAGE;
import static android.content.componentalias.tests.ComponentAliasTestCommon.TAG;
import static com.google.common.truth.Truth.assertThat;
import android.content.ComponentName;
import android.content.Intent;
import com.android.compatibility.common.util.BroadcastMessenger.Receiver;
import org.junit.Test;
import java.util.function.Consumer;
public class ComponentAliasBroadcastTest extends BaseComponentAliasTest {
private void forEachCombo(Consumer<Combo> callback) {
new Combo(
new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".b.Alias00"),
new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".b.Target00"),
MAIN_PACKAGE + ".IS_RECEIVER_00").apply(callback);
new Combo(
new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".b.Alias01"),
new ComponentName(SUB1_PACKAGE, MAIN_PACKAGE + ".b.Target01"),
MAIN_PACKAGE + ".IS_RECEIVER_01").apply(callback);
new Combo(
new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".b.Alias02"),
new ComponentName(SUB2_PACKAGE, MAIN_PACKAGE + ".b.Target02"),
MAIN_PACKAGE + ".IS_RECEIVER_02").apply(callback);
}
@Test
public void testBroadcast_explicitComponentName() {
forEachCombo((c) -> {
Intent i = new Intent().setComponent(c.alias);
i.setAction("ACTION_BROADCAST");
ComponentAliasMessage m;
try (Receiver<ComponentAliasMessage> receiver = new Receiver<>(sContext, TAG)) {
log("Sending: " + i);
sContext.sendBroadcast(i);
m = receiver.waitForNextMessage();
assertThat(m.getMethodName()).isEqualTo("onReceive");
assertThat(m.getSenderIdentity()).isEqualTo(c.target.flattenToShortString());
// The broadcast intent will always have the receiving component name set.
assertThat(m.getIntent().getComponent()).isEqualTo(c.target);
receiver.ensureNoMoreMessages();
}
});
}
@Test
public void testBroadcast_explicitPackageName() {
forEachCombo((c) -> {
// In this test, we only set the package name to the intent.
// If the alias and target are the same package, the intent will be sent to both of them
// *and* the one to the alias is redirected to the target, so the target will receive
// the intent twice. This case is haled at *1 below.
Intent i = new Intent().setPackage(c.alias.getPackageName());
i.setAction(c.action);
ComponentAliasMessage m;
try (Receiver<ComponentAliasMessage> receiver = new Receiver<>(sContext, TAG)) {
log("Sending broadcast: " + i);
sContext.sendBroadcast(i);
m = receiver.waitForNextMessage();
assertThat(m.getMethodName()).isEqualTo("onReceive");
assertThat(m.getSenderIdentity()).isEqualTo(c.target.flattenToShortString());
assertThat(m.getIntent().getComponent()).isEqualTo(c.target);
// *1 -- if the alias and target are in the same package, we expect one more
// message.
if (c.alias.getPackageName().equals(c.target.getPackageName())) {
m = receiver.waitForNextMessage();
assertThat(m.getMethodName()).isEqualTo("onReceive");
assertThat(m.getSenderIdentity()).isEqualTo(c.target.flattenToShortString());
assertThat(m.getIntent().getComponent()).isEqualTo(c.target);
}
receiver.ensureNoMoreMessages();
}
});
}
}

View File

@@ -1,63 +0,0 @@
/*
* Copyright (C) 2022 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 android.content.componentalias.tests;
import android.os.Build;
import android.provider.DeviceConfig;
import com.android.compatibility.common.util.DeviceConfigStateHelper;
import com.android.compatibility.common.util.ShellUtils;
import com.android.compatibility.common.util.TestUtils;
import org.junit.AfterClass;
import org.junit.Assume;
import org.junit.Test;
public class ComponentAliasEnableWithDeviceConfigTest {
protected static final DeviceConfigStateHelper sDeviceConfig = new DeviceConfigStateHelper(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_COMPONENT_ALIAS);
@AfterClass
public static void restoreDeviceConfig() throws Exception {
sDeviceConfig.close();
}
@Test
public void enableComponentAliasWithCompatFlag() throws Exception {
Assume.assumeTrue(Build.isDebuggable());
sDeviceConfig.set("component_alias_overrides", "");
// First, disable with both compat-id and device config.
ShellUtils.runShellCommand(
"am compat disable --no-kill USE_EXPERIMENTAL_COMPONENT_ALIAS android");
sDeviceConfig.set("enable_experimental_component_alias", "");
TestUtils.waitUntil("Wait until component alias is actually enabled", () -> {
return ShellUtils.runShellCommand("dumpsys activity component-alias")
.indexOf("Enabled: false") > 0;
});
// Then, enable by device config.
sDeviceConfig.set("enable_experimental_component_alias", "true");
// Make sure the feature is actually enabled.
TestUtils.waitUntil("Wait until component alias is actually enabled", () -> {
return ShellUtils.runShellCommand("dumpsys activity component-alias")
.indexOf("Enabled: true") > 0;
});
}
}

View File

@@ -1,215 +0,0 @@
/*
* Copyright (C) 2021 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 android.content.componentalias.tests;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Parcel;
import android.os.Parcelable;
import com.android.internal.util.DataClass;
/**
* Parcelabe containing a "message" that's meant to be delivered via BroadcastMessenger.
*
* To add a new field, just add a private member field, and run:
* codegen $ANDROID_BUILD_TOP/frameworks/base/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasMessage.java
*/
@DataClass(
genConstructor = false,
genSetters = true,
genToString = true,
genAidl = false)
public final class ComponentAliasMessage implements Parcelable {
public ComponentAliasMessage() {
}
@Nullable
private String mMessage;
@Nullable
private String mMethodName;
@Nullable
private String mSenderIdentity;
@Nullable
private Intent mIntent;
@Nullable
private ComponentName mComponent;
// Code below generated by codegen v1.0.23.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
//
// To regenerate run:
// $ codegen $ANDROID_BUILD_TOP/frameworks/base/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasMessage.java
//
// To exclude the generated code from IntelliJ auto-formatting enable (one-time):
// Settings > Editor > Code Style > Formatter Control
//@formatter:off
@DataClass.Generated.Member
public @Nullable String getMessage() {
return mMessage;
}
@DataClass.Generated.Member
public @Nullable String getMethodName() {
return mMethodName;
}
@DataClass.Generated.Member
public @Nullable String getSenderIdentity() {
return mSenderIdentity;
}
@DataClass.Generated.Member
public @Nullable Intent getIntent() {
return mIntent;
}
@DataClass.Generated.Member
public @Nullable ComponentName getComponent() {
return mComponent;
}
@DataClass.Generated.Member
public @NonNull ComponentAliasMessage setMessage(@NonNull String value) {
mMessage = value;
return this;
}
@DataClass.Generated.Member
public @NonNull ComponentAliasMessage setMethodName(@NonNull String value) {
mMethodName = value;
return this;
}
@DataClass.Generated.Member
public @NonNull ComponentAliasMessage setSenderIdentity(@NonNull String value) {
mSenderIdentity = value;
return this;
}
@DataClass.Generated.Member
public @NonNull ComponentAliasMessage setIntent(@NonNull Intent value) {
mIntent = value;
return this;
}
@DataClass.Generated.Member
public @NonNull ComponentAliasMessage setComponent(@NonNull ComponentName value) {
mComponent = value;
return this;
}
@Override
@DataClass.Generated.Member
public String toString() {
// You can override field toString logic by defining methods like:
// String fieldNameToString() { ... }
return "ComponentAliasMessage { " +
"message = " + mMessage + ", " +
"methodName = " + mMethodName + ", " +
"senderIdentity = " + mSenderIdentity + ", " +
"intent = " + mIntent + ", " +
"component = " + mComponent +
" }";
}
@Override
@DataClass.Generated.Member
public void writeToParcel(@NonNull Parcel dest, int flags) {
// You can override field parcelling by defining methods like:
// void parcelFieldName(Parcel dest, int flags) { ... }
byte flg = 0;
if (mMessage != null) flg |= 0x1;
if (mMethodName != null) flg |= 0x2;
if (mSenderIdentity != null) flg |= 0x4;
if (mIntent != null) flg |= 0x8;
if (mComponent != null) flg |= 0x10;
dest.writeByte(flg);
if (mMessage != null) dest.writeString(mMessage);
if (mMethodName != null) dest.writeString(mMethodName);
if (mSenderIdentity != null) dest.writeString(mSenderIdentity);
if (mIntent != null) dest.writeTypedObject(mIntent, flags);
if (mComponent != null) dest.writeTypedObject(mComponent, flags);
}
@Override
@DataClass.Generated.Member
public int describeContents() { return 0; }
/** @hide */
@SuppressWarnings({"unchecked", "RedundantCast"})
@DataClass.Generated.Member
/* package-private */ ComponentAliasMessage(@NonNull Parcel in) {
// You can override field unparcelling by defining methods like:
// static FieldType unparcelFieldName(Parcel in) { ... }
byte flg = in.readByte();
String message = (flg & 0x1) == 0 ? null : in.readString();
String methodName = (flg & 0x2) == 0 ? null : in.readString();
String senderIdentity = (flg & 0x4) == 0 ? null : in.readString();
Intent intent = (flg & 0x8) == 0 ? null : (Intent) in.readTypedObject(Intent.CREATOR);
ComponentName component = (flg & 0x10) == 0 ? null : (ComponentName) in.readTypedObject(ComponentName.CREATOR);
this.mMessage = message;
this.mMethodName = methodName;
this.mSenderIdentity = senderIdentity;
this.mIntent = intent;
this.mComponent = component;
// onConstructed(); // You can define this method to get a callback
}
@DataClass.Generated.Member
public static final @NonNull Parcelable.Creator<ComponentAliasMessage> CREATOR
= new Parcelable.Creator<ComponentAliasMessage>() {
@Override
public ComponentAliasMessage[] newArray(int size) {
return new ComponentAliasMessage[size];
}
@Override
public ComponentAliasMessage createFromParcel(@NonNull Parcel in) {
return new ComponentAliasMessage(in);
}
};
@DataClass.Generated(
time = 1630098801203L,
codegenVersion = "1.0.23",
sourceFile = "frameworks/base/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasMessage.java",
inputSignatures = "private @android.annotation.Nullable java.lang.String mMessage\nprivate @android.annotation.Nullable java.lang.String mMethodName\nprivate @android.annotation.Nullable java.lang.String mSenderIdentity\nprivate @android.annotation.Nullable android.content.Intent mIntent\nprivate @android.annotation.Nullable android.content.ComponentName mComponent\nclass ComponentAliasMessage extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genConstructor=false, genSetters=true, genToString=true, genAidl=false)")
@Deprecated
private void __metadata() {}
//@formatter:on
// End of generated code
}

View File

@@ -1,60 +0,0 @@
/*
* Copyright (C) 2022 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 android.content.componentalias.tests;
import static com.google.common.truth.Truth.assertThat;
import android.os.Build;
import android.provider.DeviceConfig;
import com.android.compatibility.common.util.DeviceConfigStateHelper;
import com.android.compatibility.common.util.ShellUtils;
import org.junit.AfterClass;
import org.junit.Assume;
import org.junit.Test;
/**
* Test to make sure component-alias can't be enabled on user builds.
*/
public class ComponentAliasNotSupportedOnUserBuildTest {
protected static final DeviceConfigStateHelper sDeviceConfig = new DeviceConfigStateHelper(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_COMPONENT_ALIAS);
@AfterClass
public static void restoreDeviceConfig() throws Exception {
sDeviceConfig.close();
}
@Test
public void enableComponentAliasWithCompatFlag() throws Exception {
Assume.assumeFalse(Build.isDebuggable());
// Try to enable it by both the device config and compat-id.
sDeviceConfig.set("enable_experimental_component_alias", "true");
ShellUtils.runShellCommand(
"am compat enable --no-kill USE_EXPERIMENTAL_COMPONENT_ALIAS android");
// Sleep for an arbitrary amount of time, so the config would sink in, if there was
// no "not on user builds" check.
Thread.sleep(5000);
// Make sure the feature is still disabled.
assertThat(ShellUtils.runShellCommand("dumpsys activity component-alias")
.indexOf("Enabled: false") > 0).isTrue();
}
}

View File

@@ -1,315 +0,0 @@
/*
* Copyright (C) 2021 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 android.content.componentalias.tests;
import static android.content.Context.BIND_AUTO_CREATE;
import static android.content.componentalias.tests.ComponentAliasTestCommon.MAIN_PACKAGE;
import static android.content.componentalias.tests.ComponentAliasTestCommon.SUB1_PACKAGE;
import static android.content.componentalias.tests.ComponentAliasTestCommon.SUB2_PACKAGE;
import static android.content.componentalias.tests.ComponentAliasTestCommon.TAG;
import static com.google.common.truth.Truth.assertThat;
import static org.hamcrest.core.IsNot.not;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import com.android.compatibility.common.util.BroadcastMessenger;
import com.android.compatibility.common.util.BroadcastMessenger.Receiver;
import com.android.compatibility.common.util.ShellUtils;
import com.android.compatibility.common.util.TestUtils;
import org.junit.Assume;
import org.junit.Test;
import java.util.function.Consumer;
/**
* Test for the experimental "Component alias" feature.
*
* Note this test exercises the relevant APIs, but don't actually check if the aliases are
* resolved.
*
* Note all the helper APKs are battery-exempted (via AndroidTest.xml), so they can run
* BG services.
*/
public class ComponentAliasServiceTest extends BaseComponentAliasTest {
/**
* Service connection used throughout the tests. It sends a message for each callback via
* the messenger.
*/
private static final ServiceConnection sServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
log("onServiceConnected: " + name);
ComponentAliasMessage m = new ComponentAliasMessage()
.setSenderIdentity("sServiceConnection")
.setMethodName("onServiceConnected")
.setComponent(name);
BroadcastMessenger.send(sContext, TAG, m);
}
@Override
public void onServiceDisconnected(ComponentName name) {
log("onServiceDisconnected: " + name);
ComponentAliasMessage m = new ComponentAliasMessage()
.setSenderIdentity("sServiceConnection")
.setMethodName("onServiceDisconnected")
.setComponent(name);
BroadcastMessenger.send(sContext, TAG, m);
}
@Override
public void onBindingDied(ComponentName name) {
log("onBindingDied: " + name);
ComponentAliasMessage m = new ComponentAliasMessage()
.setSenderIdentity("sServiceConnection")
.setMethodName("onBindingDied");
BroadcastMessenger.send(sContext, TAG, m);
}
@Override
public void onNullBinding(ComponentName name) {
log("onNullBinding: " + name);
ComponentAliasMessage m = new ComponentAliasMessage()
.setSenderIdentity("sServiceConnection")
.setMethodName("onNullBinding");
BroadcastMessenger.send(sContext, TAG, m);
}
};
private void testStartAndStopService_common(
Intent originalIntent,
ComponentName componentNameForClient,
ComponentName componentNameForTarget) {
ComponentAliasMessage m;
try (Receiver<ComponentAliasMessage> receiver = new Receiver<>(sContext, TAG)) {
// Start the service.
ComponentName result = sContext.startService(originalIntent);
assertThat(result).isEqualTo(componentNameForClient);
// Check
m = receiver.waitForNextMessage();
assertThat(m.getMethodName()).isEqualTo("onStartCommand");
// The app sees the rewritten intent.
assertThat(m.getIntent().getComponent()).isEqualTo(componentNameForTarget);
// Verify the original intent.
assertThat(m.getIntent().getOriginalIntent().getComponent())
.isEqualTo(originalIntent.getComponent());
assertThat(m.getIntent().getOriginalIntent().getPackage())
.isEqualTo(originalIntent.getPackage());
// Stop the service.
sContext.stopService(originalIntent);
// Check
m = receiver.waitForNextMessage();
assertThat(m.getMethodName()).isEqualTo("onDestroy");
receiver.ensureNoMoreMessages();
}
}
private void forEachCombo(Consumer<Combo> callback) {
new Combo(
new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".s.Alias00"),
new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".s.Target00"),
MAIN_PACKAGE + ".IS_ALIAS_00").apply(callback);
new Combo(
new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".s.Alias01"),
new ComponentName(SUB1_PACKAGE, MAIN_PACKAGE + ".s.Target01"),
MAIN_PACKAGE + ".IS_ALIAS_01").apply(callback);
new Combo(
new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".s.Alias02"),
new ComponentName(SUB2_PACKAGE, MAIN_PACKAGE + ".s.Target02"),
MAIN_PACKAGE + ".IS_ALIAS_02").apply(callback);
}
@Test
public void testStartAndStopService_explicitComponentName() {
forEachCombo((c) -> {
Intent i = new Intent().setComponent(c.alias);
testStartAndStopService_common(i, c.alias, c.target);
});
}
@Test
public void testStartAndStopService_explicitPackageName() {
forEachCombo((c) -> {
Intent i = new Intent().setPackage(c.alias.getPackageName());
i.setAction(c.action);
testStartAndStopService_common(i, c.alias, c.target);
});
}
@Test
public void testStartAndStopService_override() throws Exception {
Intent i = new Intent().setPackage(MAIN_PACKAGE);
i.setAction(MAIN_PACKAGE + ".IS_ALIAS_01");
// Change some of the aliases from what's defined in <meta-data>.
ComponentName aliasA = new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".s.Alias01");
ComponentName targetA = new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".s.Target02");
ComponentName aliasB = new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".s.Alias02");
ComponentName targetB = new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".s.Target01");
sDeviceConfig.set("component_alias_overrides",
aliasA.flattenToShortString() + ":" + targetA.flattenToShortString()
+ ","
+ aliasB.flattenToShortString() + ":" + targetB.flattenToShortString());
TestUtils.waitUntil("Wait until component alias is actually enabled", () -> {
return ShellUtils.runShellCommand("dumpsys activity component-alias")
.indexOf(aliasA.flattenToShortString()
+ " -> " + targetA.flattenToShortString()) > 0;
});
testStartAndStopService_common(i, aliasA, targetA);
}
private void testBindAndUnbindService_common(
Intent originalIntent,
ComponentName componentNameForClient,
ComponentName componentNameForTarget) {
ComponentAliasMessage m;
try (Receiver<ComponentAliasMessage> receiver = new Receiver<>(sContext, TAG)) {
// Bind to the service.
assertThat(sContext.bindService(
originalIntent, sServiceConnection, BIND_AUTO_CREATE)).isTrue();
// Check the target side behavior.
m = receiver.waitForNextMessage();
assertThat(m.getMethodName()).isEqualTo("onBind");
// The app sees the rewritten intent.
assertThat(m.getIntent().getComponent()).isEqualTo(componentNameForTarget);
// Verify the original intent.
assertThat(m.getIntent().getOriginalIntent().getComponent())
.isEqualTo(originalIntent.getComponent());
assertThat(m.getIntent().getOriginalIntent().getPackage())
.isEqualTo(originalIntent.getPackage());
// Check the client side behavior.
m = receiver.waitForNextMessage();
assertThat(m.getMethodName()).isEqualTo("onServiceConnected");
// The app sees the rewritten intent.
assertThat(m.getComponent()).isEqualTo(componentNameForClient);
// Unbind.
sContext.unbindService(sServiceConnection);
// Check the target side behavior.
m = receiver.waitForNextMessage();
assertThat(m.getMethodName()).isEqualTo("onDestroy");
// Note onServiceDisconnected() won't be called in this case.
receiver.ensureNoMoreMessages();
}
}
@Test
public void testBindService_explicitComponentName() {
forEachCombo((c) -> {
Intent i = new Intent().setComponent(c.alias);
testBindAndUnbindService_common(i, c.alias, c.target);
});
}
@Test
public void testBindService_explicitPackageName() {
forEachCombo((c) -> {
Intent i = new Intent().setPackage(c.alias.getPackageName());
i.setAction(c.action);
testBindAndUnbindService_common(i, c.alias, c.target);
});
}
/**
* Make sure, when the service process is killed, the client will get a callback with the
* right component name.
*/
@Test
public void testBindService_serviceKilled() {
// We need to kill SUB2_PACKAGE, don't run it for this package.
Assume.assumeThat(sContext.getPackageName(), not(SUB2_PACKAGE));
Intent originalIntent = new Intent().setPackage(MAIN_PACKAGE);
originalIntent.setAction(MAIN_PACKAGE + ".IS_ALIAS_02");
final ComponentName componentNameForClient =
new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".s.Alias02");
final ComponentName componentNameForTarget =
new ComponentName(SUB2_PACKAGE, MAIN_PACKAGE + ".s.Target02");
ComponentAliasMessage m;
try (Receiver<ComponentAliasMessage> receiver = new Receiver<>(sContext, TAG)) {
// Bind to the service.
assertThat(sContext.bindService(
originalIntent, sServiceConnection, BIND_AUTO_CREATE)).isTrue();
// Check the target side behavior.
m = receiver.waitForNextMessage();
assertThat(m.getMethodName()).isEqualTo("onBind");
m = receiver.waitForNextMessage();
assertThat(m.getMethodName()).isEqualTo("onServiceConnected");
assertThat(m.getComponent()).isEqualTo(componentNameForClient);
// We don't need to check all the fields because these are tested else where.
// Now kill the service process.
ShellUtils.runShellCommand("su 0 killall %s", SUB2_PACKAGE);
// Check the target side behavior.
m = receiver.waitForNextMessage();
assertThat(m.getMethodName()).isEqualTo("onServiceDisconnected");
assertThat(m.getComponent()).isEqualTo(componentNameForClient);
receiver.ensureNoMoreMessages();
}
}
}

View File

@@ -1,28 +0,0 @@
/*
* Copyright (C) 2021 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 android.content.componentalias.tests;
public final class ComponentAliasTestCommon {
private ComponentAliasTestCommon() {
}
public static final String TAG = "ComponentAliasTest";
public static final String MAIN_PACKAGE = "android.content.componentalias.tests";
public static final String SUB1_PACKAGE = "android.content.componentalias.tests.sub1";
public static final String SUB2_PACKAGE = "android.content.componentalias.tests.sub2";
}

View File

@@ -1,44 +0,0 @@
/*
* Copyright (C) 2021 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 android.content.componentalias.tests.b;
import static android.content.componentalias.tests.ComponentAliasTestCommon.TAG;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.componentalias.tests.ComponentAliasMessage;
import android.util.Log;
import com.android.compatibility.common.util.BroadcastMessenger;
public class BaseReceiver extends BroadcastReceiver {
private String getMyIdentity(Context context) {
return (new ComponentName(context.getPackageName(), this.getClass().getCanonicalName()))
.flattenToShortString();
}
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "onReceive: on " + getMyIdentity(context) + " intent=" + intent);
ComponentAliasMessage m = new ComponentAliasMessage()
.setSenderIdentity(getMyIdentity(context))
.setMethodName("onReceive")
.setIntent(intent);
BroadcastMessenger.send(context, TAG, m);
}
}

View File

@@ -1,21 +0,0 @@
/*
* Copyright (C) 2021 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 android.content.componentalias.tests.b;
import android.content.componentalias.tests.s.BaseService;
public class Target00 extends BaseReceiver {
}

View File

@@ -1,19 +0,0 @@
/*
* Copyright (C) 2021 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 android.content.componentalias.tests.b;
public class Target01 extends BaseReceiver {
}

View File

@@ -1,19 +0,0 @@
/*
* Copyright (C) 2021 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 android.content.componentalias.tests.b;
public class Target02 extends BaseReceiver {
}

View File

@@ -1,19 +0,0 @@
/*
* Copyright (C) 2021 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 android.content.componentalias.tests.b;
public class Target03 extends BaseReceiver {
}

View File

@@ -1,19 +0,0 @@
/*
* Copyright (C) 2021 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 android.content.componentalias.tests.b;
public class Target04 extends BaseReceiver {
}

View File

@@ -1,70 +0,0 @@
/*
* Copyright (C) 2021 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 android.content.componentalias.tests.s;
import static android.content.componentalias.tests.ComponentAliasTestCommon.TAG;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.componentalias.tests.ComponentAliasMessage;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import com.android.compatibility.common.util.BroadcastMessenger;
public class BaseService extends Service {
private String getMyIdentity() {
return (new ComponentName(this.getPackageName(), this.getClass().getCanonicalName()))
.flattenToShortString();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "onStartCommand: on " + getMyIdentity() + " intent=" + intent);
ComponentAliasMessage m = new ComponentAliasMessage()
.setSenderIdentity(getMyIdentity())
.setMethodName("onStartCommand")
.setIntent(intent);
BroadcastMessenger.send(this, TAG, m);
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
Log.i(TAG, "onDestroy: on " + getMyIdentity());
ComponentAliasMessage m = new ComponentAliasMessage()
.setSenderIdentity(getMyIdentity())
.setMethodName("onDestroy");
BroadcastMessenger.send(this, TAG, m);
}
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "onBind: on " + getMyIdentity() + " intent=" + intent);
ComponentAliasMessage m = new ComponentAliasMessage()
.setSenderIdentity(getMyIdentity())
.setMethodName("onBind")
.setIntent(intent);
BroadcastMessenger.send(this, TAG, m);
return new Binder();
}
}

View File

@@ -1,19 +0,0 @@
/*
* Copyright (C) 2021 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 android.content.componentalias.tests.s;
public class Target00 extends BaseService {
}

View File

@@ -1,19 +0,0 @@
/*
* Copyright (C) 2021 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 android.content.componentalias.tests.s;
public class Target01 extends BaseService {
}

View File

@@ -1,19 +0,0 @@
/*
* Copyright (C) 2021 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 android.content.componentalias.tests.s;
public class Target02 extends BaseService {
}

View File

@@ -1,19 +0,0 @@
/*
* Copyright (C) 2021 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 android.content.componentalias.tests.s;
public class Target03 extends BaseService {
}

View File

@@ -1,19 +0,0 @@
/*
* Copyright (C) 2021 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 android.content.componentalias.tests.s;
public class Target04 extends BaseService {
}