1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.app.admin; 18 19 import android.annotation.DrawableRes; 20 import android.annotation.NonNull; 21 import android.annotation.Nullable; 22 import android.annotation.SystemApi; 23 import android.content.Context; 24 import android.os.Parcel; 25 import android.os.Parcelable; 26 27 import java.util.Objects; 28 29 /** 30 * Used to pass in the required information for updating an enterprise drawable resource using 31 * {@link DevicePolicyResourcesManager#setDrawables}. 32 * 33 * @hide 34 */ 35 @SystemApi 36 public final class DevicePolicyDrawableResource implements Parcelable { 37 @NonNull private final String mDrawableId; 38 @NonNull private final String mDrawableStyle; 39 @NonNull private final String mDrawableSource; 40 private final @DrawableRes int mResourceIdInCallingPackage; 41 @NonNull private ParcelableResource mResource; 42 43 /** 44 * Creates an object containing the required information for updating an enterprise drawable 45 * resource using {@link DevicePolicyResourcesManager#setDrawables}. 46 * 47 * <p>It will be used to update the drawable defined by {@code drawableId} with style 48 * {@code drawableStyle} located in source {@code drawableSource} to the drawable with ID 49 * {@code resourceIdInCallingPackage} in the calling package</p> 50 * 51 * @param drawableId The ID of the drawable to update. 52 * @param drawableStyle The style of the drawable to update. 53 * @param drawableSource The source of the drawable to update. 54 * @param resourceIdInCallingPackage The ID of the drawable resource in the calling package to 55 * use as an updated resource. 56 * 57 * @throws IllegalStateException if the resource with ID 58 * {@code resourceIdInCallingPackage} doesn't exist in the {@code context} package. 59 */ DevicePolicyDrawableResource( @onNull Context context, @NonNull String drawableId, @NonNull String drawableStyle, @NonNull String drawableSource, @DrawableRes int resourceIdInCallingPackage)60 public DevicePolicyDrawableResource( 61 @NonNull Context context, 62 @NonNull String drawableId, 63 @NonNull String drawableStyle, 64 @NonNull String drawableSource, 65 @DrawableRes int resourceIdInCallingPackage) { 66 this(drawableId, drawableStyle, drawableSource, resourceIdInCallingPackage, 67 new ParcelableResource(context, resourceIdInCallingPackage, 68 ParcelableResource.RESOURCE_TYPE_DRAWABLE)); 69 } 70 DevicePolicyDrawableResource( @onNull String drawableId, @NonNull String drawableStyle, @NonNull String drawableSource, @DrawableRes int resourceIdInCallingPackage, @NonNull ParcelableResource resource)71 private DevicePolicyDrawableResource( 72 @NonNull String drawableId, 73 @NonNull String drawableStyle, 74 @NonNull String drawableSource, 75 @DrawableRes int resourceIdInCallingPackage, 76 @NonNull ParcelableResource resource) { 77 78 Objects.requireNonNull(drawableId); 79 Objects.requireNonNull(drawableStyle); 80 Objects.requireNonNull(drawableSource); 81 Objects.requireNonNull(resource); 82 83 this.mDrawableId = drawableId; 84 this.mDrawableStyle = drawableStyle; 85 this.mDrawableSource = drawableSource; 86 this.mResourceIdInCallingPackage = resourceIdInCallingPackage; 87 this.mResource = resource; 88 } 89 90 /** 91 * Creates an object containing the required information for updating an enterprise drawable 92 * resource using {@link DevicePolicyResourcesManager#setDrawables}. 93 * <p>It will be used to update the drawable defined by {@code drawableId} with style 94 * {@code drawableStyle} to the drawable with ID {@code resourceIdInCallingPackage} in the 95 * calling package</p> 96 * 97 * @param drawableId The ID of the drawable to update. 98 * @param drawableStyle The style of the drawable to update. 99 * @param resourceIdInCallingPackage The ID of the drawable resource in the calling package to 100 * use as an updated resource. 101 * 102 * @throws IllegalStateException if the resource with ID 103 * {@code resourceIdInCallingPackage} doesn't exist in the calling package. 104 */ DevicePolicyDrawableResource( @onNull Context context, @NonNull String drawableId, @NonNull String drawableStyle, @DrawableRes int resourceIdInCallingPackage)105 public DevicePolicyDrawableResource( 106 @NonNull Context context, 107 @NonNull String drawableId, 108 @NonNull String drawableStyle, 109 @DrawableRes int resourceIdInCallingPackage) { 110 this(context, drawableId, drawableStyle, DevicePolicyResources.UNDEFINED, 111 resourceIdInCallingPackage); 112 } 113 114 /** 115 * Returns the ID of the drawable to update. 116 */ 117 @NonNull getDrawableId()118 public String getDrawableId() { 119 return mDrawableId; 120 } 121 122 /** 123 * Returns the style of the drawable to update 124 */ 125 @NonNull getDrawableStyle()126 public String getDrawableStyle() { 127 return mDrawableStyle; 128 } 129 130 /** 131 * Returns the source of the drawable to update. 132 */ 133 @NonNull getDrawableSource()134 public String getDrawableSource() { 135 return mDrawableSource; 136 } 137 138 /** 139 * Returns the ID of the drawable resource in the calling package to use as an updated 140 * resource. 141 */ 142 @DrawableRes getResourceIdInCallingPackage()143 public int getResourceIdInCallingPackage() { 144 return mResourceIdInCallingPackage; 145 } 146 147 /** 148 * Returns the {@link ParcelableResource} of the drawable. 149 * 150 * @hide 151 */ 152 @NonNull getResource()153 public ParcelableResource getResource() { 154 return mResource; 155 } 156 157 @Override equals(@ullable Object o)158 public boolean equals(@Nullable Object o) { 159 if (this == o) return true; 160 if (o == null || getClass() != o.getClass()) return false; 161 DevicePolicyDrawableResource other = (DevicePolicyDrawableResource) o; 162 return mDrawableId.equals(other.mDrawableId) 163 && mDrawableStyle.equals(other.mDrawableStyle) 164 && mDrawableSource.equals(other.mDrawableSource) 165 && mResourceIdInCallingPackage == other.mResourceIdInCallingPackage 166 && mResource.equals(other.mResource); 167 } 168 169 @Override hashCode()170 public int hashCode() { 171 return Objects.hash(mDrawableId, mDrawableStyle, mDrawableSource, 172 mResourceIdInCallingPackage, mResource); 173 } 174 175 @Override describeContents()176 public int describeContents() { 177 return 0; 178 } 179 180 @Override writeToParcel(@onNull Parcel dest, int flags)181 public void writeToParcel(@NonNull Parcel dest, int flags) { 182 dest.writeString(mDrawableId); 183 dest.writeString(mDrawableStyle); 184 dest.writeString(mDrawableSource); 185 dest.writeInt(mResourceIdInCallingPackage); 186 dest.writeTypedObject(mResource, flags); 187 } 188 189 public static final @NonNull Creator<DevicePolicyDrawableResource> CREATOR = 190 new Creator<DevicePolicyDrawableResource>() { 191 @Override 192 public DevicePolicyDrawableResource createFromParcel(Parcel in) { 193 String drawableId = in.readString(); 194 String drawableStyle = in.readString(); 195 String drawableSource = in.readString(); 196 int resourceIdInCallingPackage = in.readInt(); 197 ParcelableResource resource = in.readTypedObject(ParcelableResource.CREATOR); 198 199 return new DevicePolicyDrawableResource( 200 drawableId, drawableStyle, drawableSource, resourceIdInCallingPackage, 201 resource); 202 } 203 204 @Override 205 public DevicePolicyDrawableResource[] newArray(int size) { 206 return new DevicePolicyDrawableResource[size]; 207 } 208 }; 209 } 210