1 /* 2 * Copyright (C) 2013 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.content.res; 18 19 import android.annotation.NonNull; 20 import android.annotation.Nullable; 21 import android.text.TextUtils; 22 23 import java.util.Arrays; 24 import java.util.Objects; 25 26 /** @hide */ 27 public final class ResourcesKey { 28 @Nullable 29 public final String mResDir; 30 31 @Nullable 32 public final String[] mSplitResDirs; 33 34 @Nullable 35 public final String[] mOverlayDirs; 36 37 @Nullable 38 public final String[] mLibDirs; 39 40 public final int mDisplayId; 41 42 @NonNull 43 public final Configuration mOverrideConfiguration; 44 45 @NonNull 46 public final CompatibilityInfo mCompatInfo; 47 48 private final int mHash; 49 ResourcesKey(@ullable String resDir, @Nullable String[] splitResDirs, @Nullable String[] overlayDirs, @Nullable String[] libDirs, int displayId, @Nullable Configuration overrideConfig, @Nullable CompatibilityInfo compatInfo)50 public ResourcesKey(@Nullable String resDir, 51 @Nullable String[] splitResDirs, 52 @Nullable String[] overlayDirs, 53 @Nullable String[] libDirs, 54 int displayId, 55 @Nullable Configuration overrideConfig, 56 @Nullable CompatibilityInfo compatInfo) { 57 mResDir = resDir; 58 mSplitResDirs = splitResDirs; 59 mOverlayDirs = overlayDirs; 60 mLibDirs = libDirs; 61 mDisplayId = displayId; 62 mOverrideConfiguration = new Configuration(overrideConfig != null 63 ? overrideConfig : Configuration.EMPTY); 64 mCompatInfo = compatInfo != null ? compatInfo : CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO; 65 66 int hash = 17; 67 hash = 31 * hash + Objects.hashCode(mResDir); 68 hash = 31 * hash + Arrays.hashCode(mSplitResDirs); 69 hash = 31 * hash + Arrays.hashCode(mOverlayDirs); 70 hash = 31 * hash + Arrays.hashCode(mLibDirs); 71 hash = 31 * hash + mDisplayId; 72 hash = 31 * hash + Objects.hashCode(mOverrideConfiguration); 73 hash = 31 * hash + Objects.hashCode(mCompatInfo); 74 mHash = hash; 75 } 76 hasOverrideConfiguration()77 public boolean hasOverrideConfiguration() { 78 return !Configuration.EMPTY.equals(mOverrideConfiguration); 79 } 80 isPathReferenced(String path)81 public boolean isPathReferenced(String path) { 82 if (mResDir != null && mResDir.startsWith(path)) { 83 return true; 84 } else { 85 return anyStartsWith(mSplitResDirs, path) || anyStartsWith(mOverlayDirs, path) 86 || anyStartsWith(mLibDirs, path); 87 } 88 } 89 anyStartsWith(String[] list, String prefix)90 private static boolean anyStartsWith(String[] list, String prefix) { 91 if (list != null) { 92 for (String s : list) { 93 if (s != null && s.startsWith(prefix)) { 94 return true; 95 } 96 } 97 } 98 return false; 99 } 100 101 @Override hashCode()102 public int hashCode() { 103 return mHash; 104 } 105 106 @Override equals(Object obj)107 public boolean equals(Object obj) { 108 if (!(obj instanceof ResourcesKey)) { 109 return false; 110 } 111 112 ResourcesKey peer = (ResourcesKey) obj; 113 if (mHash != peer.mHash) { 114 // If the hashes don't match, the objects can't match. 115 return false; 116 } 117 118 if (!Objects.equals(mResDir, peer.mResDir)) { 119 return false; 120 } 121 if (!Arrays.equals(mSplitResDirs, peer.mSplitResDirs)) { 122 return false; 123 } 124 if (!Arrays.equals(mOverlayDirs, peer.mOverlayDirs)) { 125 return false; 126 } 127 if (!Arrays.equals(mLibDirs, peer.mLibDirs)) { 128 return false; 129 } 130 if (mDisplayId != peer.mDisplayId) { 131 return false; 132 } 133 if (!Objects.equals(mOverrideConfiguration, peer.mOverrideConfiguration)) { 134 return false; 135 } 136 if (!Objects.equals(mCompatInfo, peer.mCompatInfo)) { 137 return false; 138 } 139 return true; 140 } 141 142 @Override toString()143 public String toString() { 144 StringBuilder builder = new StringBuilder().append("ResourcesKey{"); 145 builder.append(" mHash=").append(Integer.toHexString(mHash)); 146 builder.append(" mResDir=").append(mResDir); 147 builder.append(" mSplitDirs=["); 148 if (mSplitResDirs != null) { 149 builder.append(TextUtils.join(",", mSplitResDirs)); 150 } 151 builder.append("]"); 152 builder.append(" mOverlayDirs=["); 153 if (mOverlayDirs != null) { 154 builder.append(TextUtils.join(",", mOverlayDirs)); 155 } 156 builder.append("]"); 157 builder.append(" mLibDirs=["); 158 if (mLibDirs != null) { 159 builder.append(TextUtils.join(",", mLibDirs)); 160 } 161 builder.append("]"); 162 builder.append(" mDisplayId=").append(mDisplayId); 163 builder.append(" mOverrideConfig=").append(Configuration.resourceQualifierString( 164 mOverrideConfiguration)); 165 builder.append(" mCompatInfo=").append(mCompatInfo); 166 builder.append("}"); 167 return builder.toString(); 168 } 169 } 170