blob: 5827d2b8f187760326eb5129d2300bccd27dba38 [file] [log] [blame]
/*
* 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.devicepolicy.cts;
import static android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertThrows;
import android.app.admin.DevicePolicyDrawableResource;
import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyResources;
import android.app.admin.DevicePolicyStringResource;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import com.android.bedstead.harrier.BedsteadJUnit4;
import com.android.bedstead.harrier.DeviceState;
import com.android.bedstead.harrier.annotations.EnsureDoesNotHavePermission;
import com.android.bedstead.harrier.annotations.EnsureHasPermission;
import com.android.bedstead.harrier.annotations.Postsubmit;
import com.android.bedstead.nene.TestApis;
import com.android.compatibility.common.util.BlockingBroadcastReceiver;
import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Set;
import java.util.function.Supplier;
// TODO(b/208084779): Add more tests to cover calling from other packages after adding support for
// the new APIs in the test sdk.
@RunWith(BedsteadJUnit4.class)
public class DevicePolicyResourcesTest {
private static final String TAG = "DevicePolicyResourcesTests";
private static final Context sContext = TestApis.context().instrumentedContext();
private static final DevicePolicyManager sDpm =
sContext.getSystemService(DevicePolicyManager.class);
private static final String UPDATABLE_DRAWABLE_ID_1 = "UPDATABLE_DRAWABLE_ID_1";
private static final String UPDATABLE_DRAWABLE_ID_2 = "UPDATABLE_DRAWABLE_ID_2";
private static final String DRAWABLE_STYLE_1 = "DRAWABLE_STYLE_1";
private static final String DRAWABLE_STYLE_2 = "DRAWABLE_STYLE_2";
private static final String DRAWABLE_SOURCE_1 = "DRAWABLE_SOURCE_1";
private static final String DRAWABLE_SOURCE_2 = "DRAWABLE_SOURCE_2";
private static final String UPDATABLE_STRING_ID_1 = "UPDATABLE_STRING_ID_1";
private static final String UPDATABLE_STRING_ID_2 = "UPDATABLE_STRING_ID_2";
private static final int INVALID_RESOURCE_ID = -1;
@ClassRule
@Rule
public static final DeviceState sDeviceState = new DeviceState();
@After
public void tearDown() {
resetAllResources();
}
@Before
public void setup() {
resetAllResources();
}
private void resetAllResources() {
TestApis.devicePolicy().resources().drawables().reset(
UPDATABLE_DRAWABLE_ID_1, UPDATABLE_DRAWABLE_ID_2);
TestApis.devicePolicy().resources().strings().reset(
UPDATABLE_STRING_ID_1, UPDATABLE_STRING_ID_2);
}
@Test
@Postsubmit(reason = "New test")
@EnsureDoesNotHavePermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setDrawables_withoutRequiredPermission_throwsSecurityException() {
assertThrows(SecurityException.class, () ->
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1)));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setDrawables_withRequiredPermission_doesNotThrowSecurityException() {
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setDrawables_updatesCorrectUpdatableDrawable() {
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1));
Drawable drawable = sDpm.getResources().getDrawable(
UPDATABLE_DRAWABLE_ID_1,
DRAWABLE_STYLE_1,
/* default= */ () -> null);
assertThat(areSameDrawables(drawable, sContext.getDrawable(R.drawable.test_drawable_1)))
.isTrue();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setDrawables_updatesCurrentlyUpdatedDrawable() {
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1));
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_2));
Drawable drawable = sDpm.getResources().getDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, /* default= */ () -> null);
assertThat(areSameDrawables(drawable, sContext.getDrawable(R.drawable.test_drawable_2)))
.isTrue();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setDrawables_doesNotUpdateOtherUpdatableDrawables() {
Drawable defaultDrawable = sContext.getDrawable(R.drawable.test_drawable_2);
sDpm.getResources().resetDrawables(Set.of(UPDATABLE_DRAWABLE_ID_2));
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1));
Drawable drawable = sDpm.getResources().getDrawable(
UPDATABLE_DRAWABLE_ID_2, DRAWABLE_STYLE_1, /* default= */ () -> defaultDrawable);
assertThat(drawable).isEqualTo(defaultDrawable);
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setDrawables_updateForSource_updatesCorrectly() {
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1));
sDpm.getResources().setDrawables(createDrawableForSource(
DRAWABLE_SOURCE_1, UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1,
R.drawable.test_drawable_2));
Drawable drawable = sDpm.getResources().getDrawable(
UPDATABLE_DRAWABLE_ID_1,
DRAWABLE_STYLE_1,
DRAWABLE_SOURCE_1,
/* default= */ () -> null);
assertThat(areSameDrawables(drawable, sContext.getDrawable(R.drawable.test_drawable_2)))
.isTrue();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setDrawables_updateForMultipleSources_updatesCorrectly() {
sDpm.getResources().setDrawables(createDrawableForSource(
DRAWABLE_SOURCE_1, UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1,
R.drawable.test_drawable_1));
sDpm.getResources().setDrawables(createDrawableForSource(
DRAWABLE_SOURCE_2, UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1,
R.drawable.test_drawable_2));
Drawable drawable1 = sDpm.getResources().getDrawable(
UPDATABLE_DRAWABLE_ID_1,
DRAWABLE_STYLE_1,
DRAWABLE_SOURCE_1,
/* default= */ () -> null);
assertThat(areSameDrawables(drawable1, sContext.getDrawable(R.drawable.test_drawable_1)))
.isTrue();
Drawable drawable2 = sDpm.getResources().getDrawable(
UPDATABLE_DRAWABLE_ID_1,
DRAWABLE_STYLE_1,
DRAWABLE_SOURCE_2,
/* default= */ () -> null);
assertThat(areSameDrawables(drawable2, sContext.getDrawable(R.drawable.test_drawable_2)))
.isTrue();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setDrawables_updateForSource_returnsGenericForUndefinedSource() {
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1));
sDpm.getResources().setDrawables(createDrawableForSource(
DRAWABLE_SOURCE_1, UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1,
R.drawable.test_drawable_2));
Drawable drawable = sDpm.getResources().getDrawable(
UPDATABLE_DRAWABLE_ID_1,
DRAWABLE_STYLE_1,
/* default= */ () -> null);
assertThat(areSameDrawables(drawable, sContext.getDrawable(R.drawable.test_drawable_1)))
.isTrue();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setDrawables_updateForSource_returnsGenericForUndefinedStyle() {
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1));
sDpm.getResources().setDrawables(createDrawableForSource(
DRAWABLE_SOURCE_1, UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_2,
R.drawable.test_drawable_2));
Drawable drawable = sDpm.getResources().getDrawable(
UPDATABLE_DRAWABLE_ID_1,
DRAWABLE_STYLE_1,
DRAWABLE_SOURCE_1,
/* default= */ () -> null);
assertThat(areSameDrawables(drawable, sContext.getDrawable(R.drawable.test_drawable_1)))
.isTrue();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setDrawables_drawableChangedFromNull_sendsBroadcast() {
sDpm.getResources().resetDrawables(Set.of(UPDATABLE_DRAWABLE_ID_1));
BlockingBroadcastReceiver broadcastReceiver = sDeviceState.registerBroadcastReceiver(
DevicePolicyManager.ACTION_DEVICE_POLICY_RESOURCE_UPDATED);
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1));
broadcastReceiver.awaitForBroadcastOrFail();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setDrawables_drawableChangedFromOtherDrawable_sendsBroadcast() {
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1));
BlockingBroadcastReceiver broadcastReceiver = sDeviceState.registerBroadcastReceiver(
DevicePolicyManager.ACTION_DEVICE_POLICY_RESOURCE_UPDATED);
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_2));
broadcastReceiver.awaitForBroadcastOrFail();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
@Ignore("b/208237942")
public void setDrawables_drawableNotChanged_doesNotSendBroadcast() {
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1));
BlockingBroadcastReceiver broadcastReceiver = sDeviceState.registerBroadcastReceiver(
DevicePolicyManager.ACTION_DEVICE_POLICY_RESOURCE_UPDATED);
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1));
assertThat(broadcastReceiver.awaitForBroadcast()).isNull();
}
@Test
@Postsubmit(reason = "New test")
@EnsureDoesNotHavePermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void resetDrawables_withoutRequiredPermission_throwsSecurityException() {
assertThrows(SecurityException.class, () -> sDpm.getResources().resetDrawables(
Set.of(UPDATABLE_DRAWABLE_ID_1)));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void resetDrawables_withRequiredPermission_doesNotThrowSecurityException() {
sDpm.getResources().resetDrawables(Set.of(UPDATABLE_DRAWABLE_ID_1));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void resetDrawables_removesPreviouslySetDrawables() {
Drawable defaultDrawable = sContext.getDrawable(R.drawable.test_drawable_2);
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1));
sDpm.getResources().resetDrawables(Set.of(UPDATABLE_DRAWABLE_ID_1));
Drawable drawable = sDpm.getResources().getDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, /* default= */ () -> defaultDrawable);
assertThat(drawable).isEqualTo(defaultDrawable);
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void resetDrawables_doesNotResetOtherSetDrawables() {
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1));
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_2, DRAWABLE_STYLE_1, R.drawable.test_drawable_2));
sDpm.getResources().resetDrawables(Set.of(UPDATABLE_DRAWABLE_ID_1));
Drawable drawable = sDpm.getResources().getDrawable(
UPDATABLE_DRAWABLE_ID_2, DRAWABLE_STYLE_1, /* default= */ () -> null);
assertThat(areSameDrawables(drawable, sContext.getDrawable(R.drawable.test_drawable_2)))
.isTrue();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void resetDrawables_drawableChanged_sendsBroadcast() {
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1));
BlockingBroadcastReceiver broadcastReceiver = sDeviceState.registerBroadcastReceiver(
DevicePolicyManager.ACTION_DEVICE_POLICY_RESOURCE_UPDATED);
sDpm.getResources().resetDrawables(Set.of(UPDATABLE_DRAWABLE_ID_1));
broadcastReceiver.awaitForBroadcastOrFail();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
@Ignore("b/208237942")
public void resetDrawables_drawableNotChanged_doesNotSendBroadcast() {
sDpm.getResources().resetDrawables(Set.of(UPDATABLE_DRAWABLE_ID_1));
BlockingBroadcastReceiver broadcastReceiver = sDeviceState.registerBroadcastReceiver(
DevicePolicyManager.ACTION_DEVICE_POLICY_RESOURCE_UPDATED);
sDpm.getResources().resetDrawables(Set.of(UPDATABLE_DRAWABLE_ID_1));
assertThat(broadcastReceiver.awaitForBroadcast()).isNull();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void getDrawable_drawableIsSet_returnsUpdatedDrawable() {
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1));
Drawable drawable = sDpm.getResources().getDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, /* default= */ () -> null);
assertThat(areSameDrawables(drawable, sContext.getDrawable(R.drawable.test_drawable_1)))
.isTrue();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void getDrawable_drawableIsNotSet_returnsDefaultDrawable() {
Drawable defaultDrawable = sContext.getDrawable(R.drawable.test_drawable_1);
sDpm.getResources().resetDrawables(Set.of(UPDATABLE_DRAWABLE_ID_1));
Drawable drawable = sDpm.getResources().getDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, /* default= */ () -> defaultDrawable);
assertThat(drawable).isEqualTo(defaultDrawable);
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void getDrawable_defaultLoaderIsNull_throwsException() {
sDpm.getResources().resetDrawables(Set.of(UPDATABLE_DRAWABLE_ID_1));
assertThrows(NullPointerException.class, () -> sDpm.getResources().getDrawable(
UPDATABLE_DRAWABLE_ID_1,
DRAWABLE_STYLE_1,
/* default= */ (Supplier<Drawable>) null));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void getDrawable_defaultLoaderReturnsNull_returnsNull() {
sDpm.getResources().resetDrawables(Set.of(UPDATABLE_DRAWABLE_ID_1));
assertThat(sDpm.getResources().getDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, /* default= */ () -> null)).isNull();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void getDrawableForDensity_drawableIsSet_returnsUpdatedDrawable() {
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1));
Drawable drawable = sDpm.getResources().getDrawableForDensity(
UPDATABLE_DRAWABLE_ID_1,
DRAWABLE_STYLE_1,
/* density= */ 0,
/* default= */ () -> null);
assertThat(areSameDrawables(drawable, sContext.getDrawable(R.drawable.test_drawable_1)))
.isTrue();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void getDrawableForDensity_drawableIsNotSet_returnsDefaultDrawable() {
Drawable defaultDrawable = sContext.getDrawable(R.drawable.test_drawable_1);
sDpm.getResources().resetDrawables(Set.of(UPDATABLE_DRAWABLE_ID_1));
Drawable drawable = sDpm.getResources().getDrawableForDensity(
UPDATABLE_DRAWABLE_ID_1,
DRAWABLE_STYLE_1,
/* density= */ 0,
/* default= */ () -> defaultDrawable);
assertThat(drawable).isEqualTo(defaultDrawable);
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void getDrawable_drawableIsSet_returnsUpdatedIcon() {
sDpm.getResources().setDrawables(createDrawable(
UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1));
Icon icon = sDpm.getResources().getDrawableAsIcon(
UPDATABLE_DRAWABLE_ID_1,
DRAWABLE_STYLE_1,
/* default= */ Icon.createWithResource(sContext, R.drawable.test_drawable_2));
assertThat(icon.getResId()).isEqualTo(R.drawable.test_drawable_1);
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void getDrawable_drawableIsNotSet_returnsDefaultIcon() {
Icon defaultIcon = Icon.createWithResource(sContext, R.drawable.test_drawable_2);
sDpm.getResources().resetDrawables(Set.of(UPDATABLE_DRAWABLE_ID_1));
Icon icon = sDpm.getResources().getDrawableAsIcon(
UPDATABLE_DRAWABLE_ID_1,
DRAWABLE_STYLE_1,
defaultIcon);
assertThat(icon).isEqualTo(defaultIcon);
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void constructDevicePolicyDrawableResource_withNonExistentDrawable_throwsIllegalStateException() {
assertThrows(IllegalStateException.class, () -> new DevicePolicyDrawableResource(
sContext, UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, INVALID_RESOURCE_ID));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void constructDevicePolicyDrawableResource_withNonDrawableResource_throwsIllegalStateException() {
assertThrows(IllegalStateException.class, () -> new DevicePolicyDrawableResource(
sContext, UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.string.test_string_1));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void getDrawableId_returnsCorrectValue() {
DevicePolicyDrawableResource resource = new DevicePolicyDrawableResource(
sContext, UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1);
assertThat(resource.getDrawableId()).isEqualTo(UPDATABLE_DRAWABLE_ID_1);
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void getDrawableStyle_returnsCorrectValue() {
DevicePolicyDrawableResource resource = new DevicePolicyDrawableResource(
sContext, UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1);
assertThat(resource.getDrawableStyle()).isEqualTo(DRAWABLE_STYLE_1);
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void getDrawableStyle_sourceNotSpecified_returnsUndefined() {
DevicePolicyDrawableResource resource = new DevicePolicyDrawableResource(
sContext, UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1);
assertThat(resource.getDrawableSource()).isEqualTo(
DevicePolicyResources.UNDEFINED);
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void getDrawableStyle_sourceSpecified_returnsCorrectValue() {
DevicePolicyDrawableResource resource = new DevicePolicyDrawableResource(
sContext, UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, DRAWABLE_SOURCE_1,
R.drawable.test_drawable_1);
assertThat(resource.getDrawableSource()).isEqualTo(DRAWABLE_SOURCE_1);
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void devicePolicyDrawableResource_getResourceIdInCallingPackage_returnsCorrectValue() {
DevicePolicyDrawableResource resource = new DevicePolicyDrawableResource(
sContext, UPDATABLE_DRAWABLE_ID_1, DRAWABLE_STYLE_1, R.drawable.test_drawable_1);
assertThat(resource.getResourceIdInCallingPackage()).isEqualTo(R.drawable.test_drawable_1);
}
// TODO(b/16348282): extract to a common place to make it reusable.
private static boolean areSameDrawables(Drawable drawable1, Drawable drawable2) {
return drawable1 == drawable2 || getBitmap(drawable1).sameAs(getBitmap(drawable2));
}
private static Bitmap getBitmap(Drawable drawable) {
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
// Some drawables have no intrinsic width - e.g. solid colours.
if (width <= 0) {
width = 1;
}
if (height <= 0) {
height = 1;
}
Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return result;
}
private Set<DevicePolicyDrawableResource> createDrawable(
String updatableDrawableId, String style, int resourceId) {
return Set.of(new DevicePolicyDrawableResource(
sContext, updatableDrawableId, style, resourceId));
}
private Set<DevicePolicyDrawableResource> createDrawableForSource(
String source, String updatableDrawableId, String style, int resourceId) {
return Set.of(new DevicePolicyDrawableResource(
sContext, updatableDrawableId, style, source, resourceId));
}
@Test
@Postsubmit(reason = "New test")
@EnsureDoesNotHavePermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setStrings_withoutRequiredPermission_throwsSecurityException() {
assertThrows(SecurityException.class, () -> sDpm.getResources().setStrings(
createString(UPDATABLE_STRING_ID_1, R.string.test_string_1)));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setStrings_withRequiredPermission_doesNotThrowSecurityException() {
sDpm.getResources().setStrings(createString(UPDATABLE_STRING_ID_1, R.string.test_string_1));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setStrings_updatesCorrectUpdatableString() {
sDpm.getResources().setStrings(createString(UPDATABLE_STRING_ID_1, R.string.test_string_1));
String string = sDpm.getResources().getString(
UPDATABLE_STRING_ID_1, /* default= */ () -> null);
assertThat(string).isEqualTo(sContext.getString(R.string.test_string_1));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setStrings_updatesCurrentlyUpdatedString() {
sDpm.getResources().setStrings(createString(UPDATABLE_STRING_ID_1, R.string.test_string_1));
sDpm.getResources().setStrings(createString(UPDATABLE_STRING_ID_1, R.string.test_string_2));
String string = sDpm.getResources().getString(
UPDATABLE_STRING_ID_1, /* default= */ () -> null);
assertThat(string).isEqualTo(sContext.getString(R.string.test_string_2));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setStrings_doesNotUpdateOtherUpdatableStrings() {
sDpm.getResources().resetStrings(Set.of(UPDATABLE_STRING_ID_2));
String defaultString = sContext.getString(R.string.test_string_2);
sDpm.getResources().setStrings(createString(UPDATABLE_STRING_ID_1, R.string.test_string_1));
assertThat(sDpm.getResources().getString(
UPDATABLE_STRING_ID_2, /* default= */ () -> defaultString))
.isEqualTo(defaultString);
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setStrings_stringChangedFromNull_sendsBroadcast() {
sDpm.getResources().resetStrings(Set.of(UPDATABLE_STRING_ID_1));
BlockingBroadcastReceiver broadcastReceiver = sDeviceState.registerBroadcastReceiver(
DevicePolicyManager.ACTION_DEVICE_POLICY_RESOURCE_UPDATED);
sDpm.getResources().setStrings(createString(UPDATABLE_STRING_ID_1, R.string.test_string_1));
broadcastReceiver.awaitForBroadcastOrFail();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setStrings_stringChangedFromOtherString_sendsBroadcast() {
sDpm.getResources().setStrings(createString(UPDATABLE_STRING_ID_1, R.string.test_string_1));
BlockingBroadcastReceiver broadcastReceiver = sDeviceState.registerBroadcastReceiver(
DevicePolicyManager.ACTION_DEVICE_POLICY_RESOURCE_UPDATED);
sDpm.getResources().setStrings(createString(UPDATABLE_STRING_ID_1, R.string.test_string_2));
broadcastReceiver.awaitForBroadcastOrFail();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
@Ignore("b/208237942")
public void setStrings_stringNotChanged_doesNotSendBroadcast() {
sDpm.getResources().setStrings(createString(UPDATABLE_STRING_ID_1, R.string.test_string_1));
BlockingBroadcastReceiver broadcastReceiver = sDeviceState.registerBroadcastReceiver(
DevicePolicyManager.ACTION_DEVICE_POLICY_RESOURCE_UPDATED);
sDpm.getResources().setStrings(createString(UPDATABLE_STRING_ID_1, R.string.test_string_1));
assertThat(broadcastReceiver.awaitForBroadcast()).isNull();
}
@Test
@Postsubmit(reason = "New test")
@EnsureDoesNotHavePermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void resetStrings_withoutRequiredPermission_throwsSecurityException() {
assertThrows(SecurityException.class,
() -> sDpm.getResources().resetStrings(Set.of(UPDATABLE_STRING_ID_1)));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void resetStrings_withRequiredPermission_doesNotThrowSecurityException() {
sDpm.getResources().resetStrings(Set.of(UPDATABLE_STRING_ID_1));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void resetStrings_removesPreviouslySetStrings() {
String defaultString = sContext.getString(R.string.test_string_2);
sDpm.getResources().setStrings(createString(UPDATABLE_STRING_ID_1, R.string.test_string_1));
sDpm.getResources().resetStrings(Set.of(UPDATABLE_STRING_ID_1));
assertThat(sDpm.getResources().getString(
UPDATABLE_STRING_ID_1, /* default= */ () -> defaultString))
.isEqualTo(defaultString);
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void resetStrings_doesNotResetOtherSetStrings() {
sDpm.getResources().setStrings(createString(UPDATABLE_STRING_ID_1, R.string.test_string_1));
sDpm.getResources().setStrings(createString(UPDATABLE_STRING_ID_2, R.string.test_string_2));
sDpm.getResources().resetStrings(Set.of(UPDATABLE_STRING_ID_1));
String string = sDpm.getResources().getString(
UPDATABLE_STRING_ID_2, /* default= */ () -> null);
assertThat(string).isEqualTo(sContext.getString(R.string.test_string_2));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void resetStrings_stringChanged_sendsBroadcast() {
sDpm.getResources().setStrings(createString(UPDATABLE_STRING_ID_1, R.string.test_string_1));
BlockingBroadcastReceiver broadcastReceiver = sDeviceState.registerBroadcastReceiver(
DevicePolicyManager.ACTION_DEVICE_POLICY_RESOURCE_UPDATED);
sDpm.getResources().resetStrings(Set.of(UPDATABLE_STRING_ID_1));
broadcastReceiver.awaitForBroadcastOrFail();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
@Ignore("b/208237942")
public void resetStrings_stringNotChanged_doesNotSendBroadcast() {
sDpm.getResources().resetStrings(Set.of(UPDATABLE_STRING_ID_1));
BlockingBroadcastReceiver broadcastReceiver = sDeviceState.registerBroadcastReceiver(
DevicePolicyManager.ACTION_DEVICE_POLICY_RESOURCE_UPDATED);
sDpm.getResources().resetStrings(Set.of(UPDATABLE_STRING_ID_1));
assertThat(broadcastReceiver.awaitForBroadcast()).isNull();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void getString_stringIsSet_returnsUpdatedString() {
sDpm.getResources().setStrings(createString(UPDATABLE_STRING_ID_1, R.string.test_string_1));
String string = sDpm.getResources().getString(
UPDATABLE_STRING_ID_1, /* default= */ () -> null);
assertThat(string).isEqualTo(sContext.getString(R.string.test_string_1));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void getString_stringIsNotSet_returnsDefaultString() {
sDpm.getResources().resetStrings(Set.of(UPDATABLE_STRING_ID_1));
String defaultString = sContext.getString(R.string.test_string_1);
String string = sDpm.getResources().getString(
UPDATABLE_STRING_ID_1, /* default= */ () -> defaultString);
assertThat(string).isEqualTo(defaultString);
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void getString_defaultLoaderIsNull_throwsException() {
sDpm.getResources().resetStrings(Set.of(UPDATABLE_STRING_ID_1));
assertThrows(NullPointerException.class,
() -> sDpm.getResources().getString(
UPDATABLE_STRING_ID_1, /* default= */ null));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void getString_defaultLoaderReturnsNull_returnsNull() {
sDpm.getResources().resetStrings(Set.of(UPDATABLE_STRING_ID_1));
assertThat(sDpm.getResources().getString(UPDATABLE_STRING_ID_1, /* default= */ () -> null))
.isNull();
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void getString_stringWithArgs_returnsFormattedString() {
sDpm.getResources().setStrings(
createString(UPDATABLE_STRING_ID_1, R.string.test_string_with_arg));
String testArg = "test arg";
String string = sDpm.getResources().getString(
UPDATABLE_STRING_ID_1, /* default= */ () -> null, testArg);
assertThat(string).isEqualTo(sContext.getString(R.string.test_string_with_arg, testArg));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void constructDevicePolicyStringResource_withNonExistentString_throwsIllegalStateException() {
assertThrows(IllegalStateException.class, () -> new DevicePolicyStringResource(
sContext, UPDATABLE_STRING_ID_1, INVALID_RESOURCE_ID));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void constructDevicePolicyStringResource_withNonStringResource_throwsIllegalStateException() {
assertThrows(IllegalStateException.class, () -> new DevicePolicyStringResource(
sContext, UPDATABLE_STRING_ID_1, R.drawable.test_drawable_2));
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void getStringId_returnsCorrectValue() {
DevicePolicyStringResource resource = new DevicePolicyStringResource(
sContext, UPDATABLE_STRING_ID_1, R.string.test_string_1);
assertThat(resource.getStringId()).isEqualTo(UPDATABLE_STRING_ID_1);
}
@Test
@Postsubmit(reason = "New test")
@EnsureHasPermission(UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void devicePolicyStringResource_getResourceIdInCallingPackage_returnsCorrectValue() {
DevicePolicyStringResource resource = new DevicePolicyStringResource(
sContext, UPDATABLE_STRING_ID_1, R.string.test_string_1);
assertThat(resource.getResourceIdInCallingPackage()).isEqualTo(R.string.test_string_1);
}
private Set<DevicePolicyStringResource> createString(
String updatableStringId, int resourceId) {
return Set.of(new DevicePolicyStringResource(
sContext, updatableStringId, resourceId));
}
}