19553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski/*
29553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski * Copyright (C) 2017 The Android Open Source Project
39553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski *
49553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); you may not
59553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski * use this file except in compliance with the License. You may obtain a copy
69553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski * of the License at
79553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski *
89553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0
99553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski *
109553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski * Unless required by applicable law or agreed to in writing, software
119553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
129553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
139553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski * License for the specific language governing permissions and limitations
149553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski * under the License.
159553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski */
169553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinskipackage android.content.res;
179553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski
189553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinskiimport android.annotation.AnyRes;
199553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski
209553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski/**
219553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski * Provides a set of utility methods for dealing with Resource IDs.
229553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski * @hide
239553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski */
249553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinskipublic final class ResourceId {
259553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski
269553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski    /**
279553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski     * The {@code null} resource ID.
289553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski     */
299553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski    public static final @AnyRes int ID_NULL = 0;
309553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski
319553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski    /**
329553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski     * Checks whether the integer {@code id} is a valid resource ID, as generated by AAPT.
339553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski     * <p>Note that a negative integer is not necessarily an invalid resource ID, and custom
349553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski     * validations that compare the {@code id} against {@code 0} are incorrect.</p>
359553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski     * @param id The integer to validate.
369553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski     * @return {@code true} if the integer is a valid resource ID.
379553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski     */
389553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski    public static boolean isValid(@AnyRes int id) {
399553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski        // With the introduction of packages with IDs > 0x7f, resource IDs can be negative when
409553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski        // represented as a signed Java int. Some legacy code assumes -1 is an invalid resource ID,
419553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski        // despite the existing documentation.
429553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski        return id != -1 && (id & 0xff000000) != 0 && (id & 0x00ff0000) != 0;
439553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski    }
449553fb3240f6d2e52012f94fb59271348a07b94dAdam Lesinski}
45