blob: 4c81363122b9233692861b52975123a549f0e8a3 [file] [log] [blame]
/*
* 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 com.android.sdkext.extensions.apps;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.ext.SdkExtensions;
import android.os.ext.testing.Test;
import android.util.Log;
import com.android.modules.utils.build.SdkLevel;
public class Receiver extends BroadcastReceiver {
private static final String ACTION_GET_SDK_VERSION =
"com.android.sdkext.extensions.apps.GET_SDK_VERSION";
private static final String ACTION_IS_AT_LEAST =
"com.android.sdkext.extensions.apps.IS_AT_LEAST";
private static final String ACTION_MAKE_CALLS_DEFAULT =
"com.android.sdkext.extensions.apps.MAKE_CALLS_DEFAULT";
private static final String ACTION_MAKE_CALLS_45 =
"com.android.sdkext.extensions.apps.MAKE_CALLS_45";
private static int dessertLetterToInt(char letter) {
switch (letter) {
case 'r': return Build.VERSION_CODES.R;
case 's': return Build.VERSION_CODES.S;
}
throw new IllegalArgumentException(String.valueOf(letter));
}
private static boolean isAtLeast(char letter) {
switch (letter) {
case 'r': return true; // our min sdk version is 30
case 's': return SdkLevel.isAtLeastS();
}
return false;
}
@Override
public void onReceive(Context context, Intent intent) {
try {
switch (intent.getAction()) {
case ACTION_GET_SDK_VERSION:
int extension = dessertLetterToInt(intent.getStringExtra("extra").charAt(0));
int sdkVersion = SdkExtensions.getExtensionVersion(extension);
setResultData(String.valueOf(sdkVersion));
break;
case ACTION_IS_AT_LEAST:
boolean value = isAtLeast(intent.getStringExtra("extra").charAt(0));
setResultData(String.valueOf(value));
break;
case ACTION_MAKE_CALLS_DEFAULT:
makeCallsDefault();
setResultData("true");
break;
case ACTION_MAKE_CALLS_45:
makeCallsVersion45();
setResultData("true");
break;
}
} catch (Throwable e) {
Log.e("SdkExtensionsE2E", "Unexpected error/exception", e);
setResultData(e.toString());
}
}
private static void makeCallsDefault() {
expectException(NoClassDefFoundError.class, "test class", () -> new Test() );
expectException(NoClassDefFoundError.class, "test class", () -> Test.staticPublicMethod() );
expectException(NoClassDefFoundError.class, "test class",
() -> Test.staticSystemApiMethod() );
expectException(NoClassDefFoundError.class, "test class",
() -> Test.staticModuleLibsApiMethod() );
expectException(NoClassDefFoundError.class, "test class", () -> Test.staticHiddenMethod() );
}
private static void makeCallsVersion45() {
Test test = new Test();
test.publicMethod();
test.systemApiMethod();
expectException(NoSuchMethodError.class, "module method", () -> test.moduleLibsApiMethod());
expectException(NoSuchMethodError.class, "testapi method", () -> test.testApiMethod());
expectException(NoSuchMethodError.class, "hidden method", () -> test.hiddenMethod());
Test.staticPublicMethod();
Test.staticSystemApiMethod();
expectException(NoSuchMethodError.class, "static module-libs method",
() -> Test.staticModuleLibsApiMethod());
expectException(NoSuchMethodError.class, "static testapi method",
() -> Test.staticTestApiMethod());
expectException(NoSuchMethodError.class, "static hidden method",
() -> Test.staticHiddenMethod());
}
private static void expectException(Class exceptionClass, String type, Runnable runnable) {
boolean success = false;
try {
runnable.run();
success = true;
} catch (Throwable e) {
if (!e.getClass().equals(exceptionClass)) {
throw new IllegalStateException("Saw unexpected exception", e);
}
}
if (success) {
throw new IllegalStateException("Accessed " + type + ", but shouldn't be able to");
}
}
}