Merge "Disable component alias" into udc-dev
This commit is contained in:
@@ -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(() -> {
|
||||
|
||||
@@ -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",
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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";
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -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 {
|
||||
}
|
||||
Reference in New Issue
Block a user