Merge "Add ResourceId validation helper method" into oc-dev

This commit is contained in:
Adam Lesinski
2017-05-26 18:45:24 +00:00
committed by Android (Google) Code Review
5 changed files with 53 additions and 6 deletions

View File

@@ -25,6 +25,7 @@ import android.annotation.StringRes;
import android.annotation.StyleRes;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.ResourceId;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
@@ -204,7 +205,7 @@ public class AlertDialog extends Dialog implements DialogInterface {
mAlert = AlertController.create(getContext(), this, getWindow());
}
static int resolveDialogTheme(Context context, int themeResId) {
static @StyleRes int resolveDialogTheme(Context context, @StyleRes int themeResId) {
if (themeResId == THEME_TRADITIONAL) {
return R.style.Theme_Dialog_Alert;
} else if (themeResId == THEME_HOLO_DARK) {
@@ -215,7 +216,7 @@ public class AlertDialog extends Dialog implements DialogInterface {
return R.style.Theme_DeviceDefault_Dialog_Alert;
} else if (themeResId == THEME_DEVICE_DEFAULT_LIGHT) {
return R.style.Theme_DeviceDefault_Light_Dialog_Alert;
} else if (Integer.compareUnsigned(themeResId, 0x01000000) >= 0) {
} else if (ResourceId.isValid(themeResId)) {
// start of real resource IDs.
return themeResId;
} else {
@@ -450,7 +451,7 @@ public class AlertDialog extends Dialog implements DialogInterface {
* @param context the parent context
*/
public Builder(Context context) {
this(context, resolveDialogTheme(context, 0));
this(context, resolveDialogTheme(context, ResourceId.ID_NULL));
}
/**

View File

@@ -34,6 +34,7 @@ import android.content.ContextWrapper;
import android.content.DialogInterface;
import android.content.res.Configuration;
import android.content.pm.ApplicationInfo;
import android.content.res.ResourceId;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
@@ -169,7 +170,7 @@ public class Dialog implements DialogInterface, Window.Callback,
Dialog(@NonNull Context context, @StyleRes int themeResId, boolean createContextThemeWrapper) {
if (createContextThemeWrapper) {
if (themeResId == 0) {
if (themeResId == ResourceId.ID_NULL) {
final TypedValue outValue = new TypedValue();
context.getTheme().resolveAttribute(R.attr.dialogTheme, outValue, true);
themeResId = outValue.resourceId;

View File

@@ -20,6 +20,7 @@ import android.annotation.NonNull;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.res.ResourceId;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
@@ -368,7 +369,7 @@ public class AppWidgetProviderInfo implements Parcelable {
try {
Resources resources = context.getPackageManager().getResourcesForApplication(
providerInfo.applicationInfo);
if (resourceId != 0) {
if (ResourceId.isValid(resourceId)) {
if (density < 0) {
density = 0;
}

View File

@@ -0,0 +1,44 @@
/*
* Copyright (C) 2017 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.res;
import android.annotation.AnyRes;
/**
* Provides a set of utility methods for dealing with Resource IDs.
* @hide
*/
public final class ResourceId {
/**
* The {@code null} resource ID.
*/
public static final @AnyRes int ID_NULL = 0;
/**
* Checks whether the integer {@code id} is a valid resource ID, as generated by AAPT.
* <p>Note that a negative integer is not necessarily an invalid resource ID, and custom
* validations that compare the {@code id} against {@code 0} are incorrect.</p>
* @param id The integer to validate.
* @return {@code true} if the integer is a valid resource ID.
*/
public static boolean isValid(@AnyRes int id) {
// With the introduction of packages with IDs > 0x7f, resource IDs can be negative when
// represented as a signed Java int. Some legacy code assumes -1 is an invalid resource ID,
// despite the existing documentation.
return id != -1 && (id & 0xff000000) != 0 && (id & 0x00ff0000) != 0;
}
}

View File

@@ -151,7 +151,7 @@ public class Resources {
/** @hide */
public static int selectSystemTheme(int curTheme, int targetSdkVersion, int orig, int holo,
int dark, int deviceDefault) {
if (curTheme != 0) {
if (curTheme != ResourceId.ID_NULL) {
return curTheme;
}
if (targetSdkVersion < Build.VERSION_CODES.HONEYCOMB) {