1 /* 2 * Copyright (C) 2024 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.aconfigd; 18 19 import java.util.Objects; 20 21 /** @hide */ 22 public class AconfigdFlagInfo { 23 24 private String mPackageName; 25 private String mFlagName; 26 private String mServerFlagValue; 27 private String mLocalFlagValue; 28 private String mBootFlagValue; 29 private String mDefaultFlagValue; 30 private String mNamespace; 31 private boolean mHasServerOverride; 32 private boolean mHasLocalOverride; 33 private boolean mIsReadWrite; 34 AconfigdFlagInfo(Builder builder)35 AconfigdFlagInfo(Builder builder) { 36 mPackageName = builder.mPackageName; 37 mFlagName = builder.mFlagName; 38 mServerFlagValue = builder.mServerFlagValue; 39 mLocalFlagValue = builder.mLocalFlagValue; 40 mDefaultFlagValue = builder.mDefaultFlagValue; 41 mHasServerOverride = builder.mHasServerOverride; 42 mHasLocalOverride = builder.mHasLocalOverride; 43 mIsReadWrite = builder.mIsReadWrite; 44 mBootFlagValue = builder.mBootFlagValue; 45 if (mBootFlagValue == null) { 46 updateBootFlagValue(); 47 } 48 mNamespace = builder.mNamespace; 49 } 50 getFullFlagName()51 public String getFullFlagName() { 52 StringBuilder ret = new StringBuilder(mPackageName); 53 return ret.append('.').append(mFlagName).toString(); 54 } 55 getPackageName()56 public String getPackageName() { 57 return mPackageName; 58 } 59 getFlagName()60 public String getFlagName() { 61 return mFlagName; 62 } 63 getServerFlagValue()64 public String getServerFlagValue() { 65 return mServerFlagValue; 66 } 67 getLocalFlagValue()68 public String getLocalFlagValue() { 69 return mLocalFlagValue; 70 } 71 getBootFlagValue()72 public String getBootFlagValue() { 73 return mBootFlagValue; 74 } 75 getDefaultFlagValue()76 public String getDefaultFlagValue() { 77 return mDefaultFlagValue; 78 } 79 getNamespace()80 public String getNamespace() { 81 return mNamespace; 82 } 83 getHasServerOverride()84 public boolean getHasServerOverride() { 85 return mHasServerOverride; 86 } 87 getHasLocalOverride()88 public boolean getHasLocalOverride() { 89 return mHasLocalOverride; 90 } 91 getIsReadWrite()92 public boolean getIsReadWrite() { 93 return mIsReadWrite; 94 } 95 setLocalFlagValue(String localFlagValue)96 public void setLocalFlagValue(String localFlagValue) { 97 if (!mIsReadWrite) { 98 return; 99 } 100 mLocalFlagValue = localFlagValue; 101 mHasLocalOverride = true; 102 updateBootFlagValue(); 103 } 104 setServerFlagValue(String serverFlagValue)105 public void setServerFlagValue(String serverFlagValue) { 106 if (!mIsReadWrite) { 107 return; 108 } 109 mServerFlagValue = serverFlagValue; 110 mHasServerOverride = true; 111 updateBootFlagValue(); 112 } 113 updateBootFlagValue()114 private void updateBootFlagValue() { 115 mBootFlagValue = mDefaultFlagValue == null ? mBootFlagValue : mDefaultFlagValue; 116 if (mIsReadWrite) { 117 mBootFlagValue = mServerFlagValue == null ? mBootFlagValue : mServerFlagValue; 118 mBootFlagValue = mLocalFlagValue == null ? mBootFlagValue : mLocalFlagValue; 119 } 120 } 121 122 @Override equals(Object obj)123 public boolean equals(Object obj) { 124 if (this == obj) { 125 return true; 126 } 127 if (obj == null || !(obj instanceof AconfigdFlagInfo)) { 128 return false; 129 } 130 AconfigdFlagInfo other = (AconfigdFlagInfo) obj; 131 return Objects.equals(mPackageName, other.mPackageName) 132 && Objects.equals(mFlagName, other.mFlagName) 133 && Objects.equals(mServerFlagValue, other.mServerFlagValue) 134 && Objects.equals(mLocalFlagValue, other.mLocalFlagValue) 135 && Objects.equals(mBootFlagValue, other.mBootFlagValue) 136 && Objects.equals(mDefaultFlagValue, other.mDefaultFlagValue) 137 && mHasServerOverride == other.mHasServerOverride 138 && mHasLocalOverride == other.mHasLocalOverride 139 && mIsReadWrite == other.mIsReadWrite; 140 } 141 142 @Override hashCode()143 public int hashCode() { 144 return Objects.hash( 145 mPackageName, 146 mFlagName, 147 mServerFlagValue, 148 mLocalFlagValue, 149 mBootFlagValue, 150 mDefaultFlagValue, 151 mHasServerOverride, 152 mHasLocalOverride, 153 mIsReadWrite); 154 } 155 dump()156 public String dump() { 157 return String.format( 158 "packageName: %s, flagName: %s, serverFlagValue: %s, localFlagValue: %s," 159 + " bootFlagValue: %s, defaultFlagValue: %s, hasServerOverride: %s," 160 + " hasLocalOverride: %s, isReadWrite: %s", 161 mPackageName, 162 mFlagName, 163 mServerFlagValue, 164 mLocalFlagValue, 165 mBootFlagValue, 166 mDefaultFlagValue, 167 mHasServerOverride, 168 mHasLocalOverride, 169 mIsReadWrite); 170 } 171 dumpDiff(AconfigdFlagInfo other)172 public String dumpDiff(AconfigdFlagInfo other) { 173 StringBuilder ret = new StringBuilder(); 174 if (!Objects.equals(mPackageName, other.mPackageName)) { 175 ret.append(String.format("packageName: %s -> %s\n", mPackageName, other.mPackageName)); 176 return ret.toString(); 177 } 178 if (!Objects.equals(mFlagName, other.mFlagName)) { 179 ret.append(String.format("flagName: %s -> %s\n", mFlagName, other.mFlagName)); 180 return ret.toString(); 181 } 182 if (!Objects.equals(mBootFlagValue, other.mBootFlagValue)) { 183 ret.append( 184 String.format( 185 "bootFlagValue: %s -> %s\n", mBootFlagValue, other.mBootFlagValue)); 186 } 187 if (!Objects.equals(mDefaultFlagValue, other.mDefaultFlagValue)) { 188 ret.append( 189 String.format( 190 "defaultFlagValue: %s -> %s\n", 191 mDefaultFlagValue, other.mDefaultFlagValue)); 192 } 193 if (mIsReadWrite != other.mIsReadWrite) { 194 ret.append(String.format("isReadWrite: %s -> %s\n", mIsReadWrite, other.mIsReadWrite)); 195 } 196 if (mIsReadWrite && other.mIsReadWrite) { 197 if (!Objects.equals(mServerFlagValue, other.mServerFlagValue)) { 198 ret.append( 199 String.format( 200 "serverFlagValue: %s -> %s\n", 201 mServerFlagValue, other.mServerFlagValue)); 202 } 203 if (!Objects.equals(mLocalFlagValue, other.mLocalFlagValue)) { 204 ret.append( 205 String.format( 206 "localFlagValue: %s -> %s\n", 207 mLocalFlagValue, other.mLocalFlagValue)); 208 } 209 if (mHasServerOverride != other.mHasServerOverride) { 210 ret.append( 211 String.format( 212 "hasServerOverride: %s -> %s\n", 213 mHasServerOverride, other.mHasServerOverride)); 214 } 215 if (mHasLocalOverride != other.mHasLocalOverride) { 216 ret.append( 217 String.format( 218 "hasLocalOverride: %s -> %s\n", 219 mHasLocalOverride, other.mHasLocalOverride)); 220 } 221 } 222 return ret.toString(); 223 } 224 newBuilder()225 public static Builder newBuilder() { 226 return new Builder(); 227 } 228 229 public static class Builder { 230 private String mPackageName; 231 private String mFlagName; 232 private String mServerFlagValue; 233 private String mLocalFlagValue; 234 private String mBootFlagValue; 235 private String mDefaultFlagValue; 236 private String mNamespace; 237 private boolean mHasServerOverride; 238 private boolean mHasLocalOverride; 239 private boolean mIsReadWrite; 240 setPackageName(String packageName)241 public Builder setPackageName(String packageName) { 242 mPackageName = packageName; 243 return this; 244 } 245 setFlagName(String flagName)246 public Builder setFlagName(String flagName) { 247 mFlagName = flagName; 248 return this; 249 } 250 setServerFlagValue(String serverFlagValue)251 public Builder setServerFlagValue(String serverFlagValue) { 252 mServerFlagValue = nullOrEmpty(serverFlagValue) ? null : serverFlagValue; 253 return this; 254 } 255 setLocalFlagValue(String localFlagValue)256 public Builder setLocalFlagValue(String localFlagValue) { 257 mLocalFlagValue = nullOrEmpty(localFlagValue) ? null : localFlagValue; 258 return this; 259 } 260 setBootFlagValue(String bootFlagValue)261 public Builder setBootFlagValue(String bootFlagValue) { 262 mBootFlagValue = nullOrEmpty(bootFlagValue) ? null : bootFlagValue; 263 return this; 264 } 265 setDefaultFlagValue(String defaultFlagValue)266 public Builder setDefaultFlagValue(String defaultFlagValue) { 267 mDefaultFlagValue = nullOrEmpty(defaultFlagValue) ? null : defaultFlagValue; 268 return this; 269 } 270 setNamespace(String namespace)271 public Builder setNamespace(String namespace) { 272 mNamespace = namespace; 273 return this; 274 } 275 setHasServerOverride(boolean hasServerOverride)276 public Builder setHasServerOverride(boolean hasServerOverride) { 277 mHasServerOverride = hasServerOverride; 278 return this; 279 } 280 setHasLocalOverride(boolean hasLocalOverride)281 public Builder setHasLocalOverride(boolean hasLocalOverride) { 282 mHasLocalOverride = hasLocalOverride; 283 return this; 284 } 285 setIsReadWrite(boolean isReadWrite)286 public Builder setIsReadWrite(boolean isReadWrite) { 287 mIsReadWrite = isReadWrite; 288 return this; 289 } 290 build()291 public AconfigdFlagInfo build() { 292 return new AconfigdFlagInfo(this); 293 } 294 nullOrEmpty(String str)295 private boolean nullOrEmpty(String str) { 296 return str == null || str.isEmpty(); 297 } 298 } 299 } 300