Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9553fb32 authored by Adam Lesinski's avatar Adam Lesinski
Browse files

Add ResourceId validation helper method

An invalid, 'null' resource ID is defined as 0. Apps often use -1.

Add a helper method that makes checking valid IDs easy and more
centralized.

Eventually make it public API.

Bug: 38393777
Test: manual
Change-Id: I969ec4a45e86bdab3d7f57d357d475b77c7f8a78
parent 0418b72f
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -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));
        }

        /**
+2 −1
Original line number Diff line number Diff line
@@ -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;
+2 −1
Original line number Diff line number Diff line
@@ -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;
                }
+44 −0
Original line number Diff line number Diff line
/*
 * 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;
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -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) {