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