1 /* 2 * Copyright (C) 2021 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.pm.overlay; 18 19 import android.annotation.NonNull; 20 import android.annotation.Nullable; 21 22 import com.android.internal.util.DataClass; 23 24 import java.util.ArrayList; 25 import java.util.List; 26 import java.util.Objects; 27 28 /** @hide */ 29 @DataClass(genConstructor = false, genBuilder = false, genHiddenBuilder = false, 30 genEqualsHashCode = true, genToString = true) 31 public class OverlayPaths { 32 /** 33 * Represents {@link android.content.pm.ApplicationInfo#resourceDirs}. 34 * Only contains paths to APKs of overlays that can have their idmap resolved from their base 35 * APK path. Currently all overlay APKs can have their idmap path resolved from their idmap 36 * path. 37 */ 38 @NonNull 39 private final List<String> mResourceDirs = new ArrayList<>(); 40 41 /** 42 * Represents {@link android.content.pm.ApplicationInfo#overlayPaths}. 43 * Contains the contents of {@link #getResourceDirs()} and along with paths for overlays 44 * that are not APKs. 45 */ 46 @NonNull 47 private final List<String> mOverlayPaths = new ArrayList<>(); 48 49 public static class Builder { 50 final OverlayPaths mPaths = new OverlayPaths(); 51 52 /** 53 * Adds a non-APK path to the contents of {@link OverlayPaths#getOverlayPaths()}. 54 */ addNonApkPath(@onNull String idmapPath)55 public Builder addNonApkPath(@NonNull String idmapPath) { 56 mPaths.mOverlayPaths.add(idmapPath); 57 return this; 58 } 59 60 /** 61 * Adds a overlay APK path to the contents of {@link OverlayPaths#getResourceDirs()} and 62 * {@link OverlayPaths#getOverlayPaths()}. 63 */ addApkPath(@onNull String overlayPath)64 public Builder addApkPath(@NonNull String overlayPath) { 65 addUniquePath(mPaths.mResourceDirs, overlayPath); 66 addUniquePath(mPaths.mOverlayPaths, overlayPath); 67 return this; 68 } 69 addAll(@ullable OverlayPaths other)70 public Builder addAll(@Nullable OverlayPaths other) { 71 if (other != null) { 72 for (final String path : other.getResourceDirs()) { 73 addUniquePath(mPaths.mResourceDirs, path); 74 } 75 for (final String path : other.getOverlayPaths()) { 76 addUniquePath(mPaths.mOverlayPaths, path); 77 } 78 } 79 return this; 80 } 81 build()82 public OverlayPaths build() { 83 return mPaths; 84 } 85 addUniquePath(@onNull List<String> paths, @NonNull String path)86 private static void addUniquePath(@NonNull List<String> paths, @NonNull String path) { 87 if (!paths.contains(path)) { 88 paths.add(path); 89 } 90 } 91 } 92 93 /** 94 * Returns whether {@link #getOverlayPaths()} and {@link #getOverlayPaths} are empty. 95 */ isEmpty()96 public boolean isEmpty() { 97 return mResourceDirs.isEmpty() && mOverlayPaths.isEmpty(); 98 } 99 OverlayPaths()100 private OverlayPaths() { 101 } 102 103 104 105 // Code below generated by codegen v1.0.22. 106 // 107 // DO NOT MODIFY! 108 // CHECKSTYLE:OFF Generated code 109 // 110 // To regenerate run: 111 // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/content/pm/overlay/OverlayPaths.java 112 // 113 // To exclude the generated code from IntelliJ auto-formatting enable (one-time): 114 // Settings > Editor > Code Style > Formatter Control 115 //@formatter:off 116 117 118 /** 119 * Represents {@link android.content.pm.ApplicationInfo#resourceDirs}. 120 * Only contains paths to APKs of overlays that can have their idmap resolved from their base 121 * APK path. Currently all overlay APKs can have their idmap path resolved from their idmap 122 * path. 123 */ 124 @DataClass.Generated.Member getResourceDirs()125 public @NonNull List<String> getResourceDirs() { 126 return mResourceDirs; 127 } 128 129 /** 130 * Represents {@link android.content.pm.ApplicationInfo#overlayPaths}. 131 * Contains the contents of {@link #getResourceDirs()} and along with paths for overlays 132 * that are not APKs. 133 */ 134 @DataClass.Generated.Member getOverlayPaths()135 public @NonNull List<String> getOverlayPaths() { 136 return mOverlayPaths; 137 } 138 139 @Override 140 @DataClass.Generated.Member toString()141 public String toString() { 142 // You can override field toString logic by defining methods like: 143 // String fieldNameToString() { ... } 144 145 return "OverlayPaths { " + 146 "resourceDirs = " + mResourceDirs + ", " + 147 "overlayPaths = " + mOverlayPaths + 148 " }"; 149 } 150 151 @Override 152 @DataClass.Generated.Member equals(@ndroid.annotation.Nullable Object o)153 public boolean equals(@android.annotation.Nullable Object o) { 154 // You can override field equality logic by defining either of the methods like: 155 // boolean fieldNameEquals(OverlayPaths other) { ... } 156 // boolean fieldNameEquals(FieldType otherValue) { ... } 157 158 if (this == o) return true; 159 if (o == null || getClass() != o.getClass()) return false; 160 @SuppressWarnings("unchecked") 161 OverlayPaths that = (OverlayPaths) o; 162 //noinspection PointlessBooleanExpression 163 return true 164 && Objects.equals(mResourceDirs, that.mResourceDirs) 165 && Objects.equals(mOverlayPaths, that.mOverlayPaths); 166 } 167 168 @Override 169 @DataClass.Generated.Member hashCode()170 public int hashCode() { 171 // You can override field hashCode logic by defining methods like: 172 // int fieldNameHashCode() { ... } 173 174 int _hash = 1; 175 _hash = 31 * _hash + Objects.hashCode(mResourceDirs); 176 _hash = 31 * _hash + Objects.hashCode(mOverlayPaths); 177 return _hash; 178 } 179 180 @DataClass.Generated( 181 time = 1612307813586L, 182 codegenVersion = "1.0.22", 183 sourceFile = "frameworks/base/core/java/android/content/pm/overlay/OverlayPaths.java", 184 inputSignatures = "private final @android.annotation.NonNull java.util.List<java.lang.String> mResourceDirs\nprivate final @android.annotation.NonNull java.util.List<java.lang.String> mOverlayPaths\npublic boolean isEmpty()\nclass OverlayPaths extends java.lang.Object implements []\nfinal android.content.pm.overlay.OverlayPaths mPaths\npublic android.content.pm.overlay.OverlayPaths.Builder addNonApkPath(java.lang.String)\npublic android.content.pm.overlay.OverlayPaths.Builder addApkPath(java.lang.String)\npublic android.content.pm.overlay.OverlayPaths.Builder addAll(android.content.pm.overlay.OverlayPaths)\npublic android.content.pm.overlay.OverlayPaths build()\nprivate static void addUniquePath(java.util.List<java.lang.String>,java.lang.String)\nclass Builder extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=false, genHiddenBuilder=false, genEqualsHashCode=true, genToString=true)") 185 @Deprecated __metadata()186 private void __metadata() {} 187 188 189 //@formatter:on 190 // End of generated code 191 192 } 193