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 android.aconfigd.Aconfigd.StorageRequestMessage; 20*20733378SAndroid Build Coastguard Worker import android.aconfigd.Aconfigd.StorageRequestMessages; 21*20733378SAndroid Build Coastguard Worker import android.aconfigd.Aconfigd.StorageReturnMessage; 22*20733378SAndroid Build Coastguard Worker import android.aconfigd.Aconfigd.StorageReturnMessages; 23*20733378SAndroid Build Coastguard Worker import android.util.Slog; 24*20733378SAndroid Build Coastguard Worker import android.util.proto.ProtoInputStream; 25*20733378SAndroid Build Coastguard Worker import android.util.proto.ProtoOutputStream; 26*20733378SAndroid Build Coastguard Worker 27*20733378SAndroid Build Coastguard Worker import java.io.IOException; 28*20733378SAndroid Build Coastguard Worker import java.io.InputStream; 29*20733378SAndroid Build Coastguard Worker import java.util.ArrayDeque; 30*20733378SAndroid Build Coastguard Worker import java.util.Deque; 31*20733378SAndroid Build Coastguard Worker import java.util.HashMap; 32*20733378SAndroid Build Coastguard Worker import java.util.Map; 33*20733378SAndroid Build Coastguard Worker 34*20733378SAndroid Build Coastguard Worker /** @hide */ 35*20733378SAndroid Build Coastguard Worker public class AconfigdJavaUtils { 36*20733378SAndroid Build Coastguard Worker 37*20733378SAndroid Build Coastguard Worker private static String TAG = "AconfigdJavaUtils"; 38*20733378SAndroid Build Coastguard Worker getAconfigdClientSocket()39*20733378SAndroid Build Coastguard Worker public static AconfigdClientSocket getAconfigdClientSocket() { 40*20733378SAndroid Build Coastguard Worker return new AconfigdClientSocketImpl(); 41*20733378SAndroid Build Coastguard Worker } 42*20733378SAndroid Build Coastguard Worker 43*20733378SAndroid Build Coastguard Worker /** 44*20733378SAndroid Build Coastguard Worker * serialize a storage reset request proto via proto output stream 45*20733378SAndroid Build Coastguard Worker * 46*20733378SAndroid Build Coastguard Worker * @param proto 47*20733378SAndroid Build Coastguard Worker * @hide 48*20733378SAndroid Build Coastguard Worker */ writeResetStorageRequest(ProtoOutputStream proto)49*20733378SAndroid Build Coastguard Worker public static void writeResetStorageRequest(ProtoOutputStream proto) { 50*20733378SAndroid Build Coastguard Worker long msgsToken = proto.start(StorageRequestMessages.MSGS); 51*20733378SAndroid Build Coastguard Worker long msgToken = proto.start(StorageRequestMessage.RESET_STORAGE_MESSAGE); 52*20733378SAndroid Build Coastguard Worker proto.write(StorageRequestMessage.ResetStorageMessage.ALL, true); 53*20733378SAndroid Build Coastguard Worker proto.end(msgToken); 54*20733378SAndroid Build Coastguard Worker proto.end(msgsToken); 55*20733378SAndroid Build Coastguard Worker } 56*20733378SAndroid Build Coastguard Worker 57*20733378SAndroid Build Coastguard Worker /** 58*20733378SAndroid Build Coastguard Worker * deserialize a flag input proto stream and log 59*20733378SAndroid Build Coastguard Worker * 60*20733378SAndroid Build Coastguard Worker * @param proto 61*20733378SAndroid Build Coastguard Worker * @hide 62*20733378SAndroid Build Coastguard Worker */ writeFlagOverrideRequest( ProtoOutputStream proto, String packageName, String flagName, String flagValue, long overrideType)63*20733378SAndroid Build Coastguard Worker public static void writeFlagOverrideRequest( 64*20733378SAndroid Build Coastguard Worker ProtoOutputStream proto, 65*20733378SAndroid Build Coastguard Worker String packageName, 66*20733378SAndroid Build Coastguard Worker String flagName, 67*20733378SAndroid Build Coastguard Worker String flagValue, 68*20733378SAndroid Build Coastguard Worker long overrideType) { 69*20733378SAndroid Build Coastguard Worker long msgsToken = proto.start(StorageRequestMessages.MSGS); 70*20733378SAndroid Build Coastguard Worker long msgToken = proto.start(StorageRequestMessage.FLAG_OVERRIDE_MESSAGE); 71*20733378SAndroid Build Coastguard Worker proto.write(StorageRequestMessage.FlagOverrideMessage.PACKAGE_NAME, packageName); 72*20733378SAndroid Build Coastguard Worker proto.write(StorageRequestMessage.FlagOverrideMessage.FLAG_NAME, flagName); 73*20733378SAndroid Build Coastguard Worker proto.write(StorageRequestMessage.FlagOverrideMessage.FLAG_VALUE, flagValue); 74*20733378SAndroid Build Coastguard Worker proto.write(StorageRequestMessage.FlagOverrideMessage.OVERRIDE_TYPE, overrideType); 75*20733378SAndroid Build Coastguard Worker proto.end(msgToken); 76*20733378SAndroid Build Coastguard Worker proto.end(msgsToken); 77*20733378SAndroid Build Coastguard Worker } 78*20733378SAndroid Build Coastguard Worker 79*20733378SAndroid Build Coastguard Worker /** 80*20733378SAndroid Build Coastguard Worker * Send a request to aconfig storage to remove a flag local override. 81*20733378SAndroid Build Coastguard Worker * 82*20733378SAndroid Build Coastguard Worker * @param proto 83*20733378SAndroid Build Coastguard Worker * @param packageName the package of the flag 84*20733378SAndroid Build Coastguard Worker * @param flagName the name of the flag 85*20733378SAndroid Build Coastguard Worker * 86*20733378SAndroid Build Coastguard Worker * @hide 87*20733378SAndroid Build Coastguard Worker */ writeFlagOverrideRemovalRequest( ProtoOutputStream proto, String packageName, String flagName)88*20733378SAndroid Build Coastguard Worker public static void writeFlagOverrideRemovalRequest( 89*20733378SAndroid Build Coastguard Worker ProtoOutputStream proto, String packageName, String flagName) { 90*20733378SAndroid Build Coastguard Worker long msgsToken = proto.start(StorageRequestMessages.MSGS); 91*20733378SAndroid Build Coastguard Worker long msgToken = proto.start(StorageRequestMessage.REMOVE_LOCAL_OVERRIDE_MESSAGE); 92*20733378SAndroid Build Coastguard Worker proto.write(StorageRequestMessage.RemoveLocalOverrideMessage.PACKAGE_NAME, packageName); 93*20733378SAndroid Build Coastguard Worker proto.write(StorageRequestMessage.RemoveLocalOverrideMessage.FLAG_NAME, flagName); 94*20733378SAndroid Build Coastguard Worker proto.write(StorageRequestMessage.RemoveLocalOverrideMessage.REMOVE_ALL, false); 95*20733378SAndroid Build Coastguard Worker proto.end(msgToken); 96*20733378SAndroid Build Coastguard Worker proto.end(msgsToken); 97*20733378SAndroid Build Coastguard Worker } 98*20733378SAndroid Build Coastguard Worker 99*20733378SAndroid Build Coastguard Worker /** 100*20733378SAndroid Build Coastguard Worker * deserialize a flag input proto stream and log 101*20733378SAndroid Build Coastguard Worker * 102*20733378SAndroid Build Coastguard Worker * @param inputStream 103*20733378SAndroid Build Coastguard Worker * @hide 104*20733378SAndroid Build Coastguard Worker */ parseAndLogAconfigdReturn(InputStream inputStream)105*20733378SAndroid Build Coastguard Worker public static void parseAndLogAconfigdReturn(InputStream inputStream) throws IOException { 106*20733378SAndroid Build Coastguard Worker ProtoInputStream proto = new ProtoInputStream(inputStream); 107*20733378SAndroid Build Coastguard Worker while (true) { 108*20733378SAndroid Build Coastguard Worker switch (proto.nextField()) { 109*20733378SAndroid Build Coastguard Worker case (int) StorageReturnMessages.MSGS: 110*20733378SAndroid Build Coastguard Worker long msgsToken = proto.start(StorageReturnMessages.MSGS); 111*20733378SAndroid Build Coastguard Worker switch (proto.nextField()) { 112*20733378SAndroid Build Coastguard Worker case (int) StorageReturnMessage.FLAG_OVERRIDE_MESSAGE: 113*20733378SAndroid Build Coastguard Worker Slog.i(TAG, "successfully handled override requests"); 114*20733378SAndroid Build Coastguard Worker long msgToken = proto.start(StorageReturnMessage.FLAG_OVERRIDE_MESSAGE); 115*20733378SAndroid Build Coastguard Worker proto.end(msgToken); 116*20733378SAndroid Build Coastguard Worker break; 117*20733378SAndroid Build Coastguard Worker case (int) StorageReturnMessage.ERROR_MESSAGE: 118*20733378SAndroid Build Coastguard Worker String errmsg = proto.readString(StorageReturnMessage.ERROR_MESSAGE); 119*20733378SAndroid Build Coastguard Worker Slog.i(TAG, "override request failed: " + errmsg); 120*20733378SAndroid Build Coastguard Worker break; 121*20733378SAndroid Build Coastguard Worker case ProtoInputStream.NO_MORE_FIELDS: 122*20733378SAndroid Build Coastguard Worker break; 123*20733378SAndroid Build Coastguard Worker default: 124*20733378SAndroid Build Coastguard Worker Slog.e( 125*20733378SAndroid Build Coastguard Worker TAG, 126*20733378SAndroid Build Coastguard Worker "invalid message type, expecting only flag override return or" 127*20733378SAndroid Build Coastguard Worker + " error message"); 128*20733378SAndroid Build Coastguard Worker break; 129*20733378SAndroid Build Coastguard Worker } 130*20733378SAndroid Build Coastguard Worker proto.end(msgsToken); 131*20733378SAndroid Build Coastguard Worker break; 132*20733378SAndroid Build Coastguard Worker case ProtoInputStream.NO_MORE_FIELDS: 133*20733378SAndroid Build Coastguard Worker return; 134*20733378SAndroid Build Coastguard Worker default: 135*20733378SAndroid Build Coastguard Worker Slog.e(TAG, "invalid message type, expect storage return message"); 136*20733378SAndroid Build Coastguard Worker break; 137*20733378SAndroid Build Coastguard Worker } 138*20733378SAndroid Build Coastguard Worker } 139*20733378SAndroid Build Coastguard Worker } 140*20733378SAndroid Build Coastguard Worker 141*20733378SAndroid Build Coastguard Worker /** 142*20733378SAndroid Build Coastguard Worker * this method will new flag value into new storage, and stage the new values 143*20733378SAndroid Build Coastguard Worker * 144*20733378SAndroid Build Coastguard Worker * @param propsToStage the map of flags <namespace, <flagName, value>> 145*20733378SAndroid Build Coastguard Worker * @param isLocal indicates whether this is a local override 146*20733378SAndroid Build Coastguard Worker * @hide 147*20733378SAndroid Build Coastguard Worker */ stageFlagsInNewStorage( AconfigdClientSocket localSocket, Map<String, Map<String, String>> propsToStage, boolean isLocal)148*20733378SAndroid Build Coastguard Worker public static void stageFlagsInNewStorage( 149*20733378SAndroid Build Coastguard Worker AconfigdClientSocket localSocket, 150*20733378SAndroid Build Coastguard Worker Map<String, Map<String, String>> propsToStage, 151*20733378SAndroid Build Coastguard Worker boolean isLocal) { 152*20733378SAndroid Build Coastguard Worker // write aconfigd requests proto to proto output stream 153*20733378SAndroid Build Coastguard Worker int num_requests = 0; 154*20733378SAndroid Build Coastguard Worker ProtoOutputStream requests = new ProtoOutputStream(); 155*20733378SAndroid Build Coastguard Worker for (Map.Entry<String, Map<String, String>> entry : propsToStage.entrySet()) { 156*20733378SAndroid Build Coastguard Worker String actualNamespace = entry.getKey(); 157*20733378SAndroid Build Coastguard Worker Map<String, String> flagValuesToStage = entry.getValue(); 158*20733378SAndroid Build Coastguard Worker for (String fullFlagName : flagValuesToStage.keySet()) { 159*20733378SAndroid Build Coastguard Worker String stagedValue = flagValuesToStage.get(fullFlagName); 160*20733378SAndroid Build Coastguard Worker int idx = fullFlagName.lastIndexOf("."); 161*20733378SAndroid Build Coastguard Worker if (idx == -1) { 162*20733378SAndroid Build Coastguard Worker Slog.i(TAG, "invalid flag name: " + fullFlagName); 163*20733378SAndroid Build Coastguard Worker continue; 164*20733378SAndroid Build Coastguard Worker } 165*20733378SAndroid Build Coastguard Worker String packageName = fullFlagName.substring(0, idx); 166*20733378SAndroid Build Coastguard Worker String flagName = fullFlagName.substring(idx + 1); 167*20733378SAndroid Build Coastguard Worker long overrideType = 168*20733378SAndroid Build Coastguard Worker isLocal 169*20733378SAndroid Build Coastguard Worker ? StorageRequestMessage.LOCAL_ON_REBOOT 170*20733378SAndroid Build Coastguard Worker : StorageRequestMessage.SERVER_ON_REBOOT; 171*20733378SAndroid Build Coastguard Worker writeFlagOverrideRequest(requests, packageName, flagName, stagedValue, 172*20733378SAndroid Build Coastguard Worker overrideType); 173*20733378SAndroid Build Coastguard Worker ++num_requests; 174*20733378SAndroid Build Coastguard Worker } 175*20733378SAndroid Build Coastguard Worker } 176*20733378SAndroid Build Coastguard Worker 177*20733378SAndroid Build Coastguard Worker if (num_requests == 0) { 178*20733378SAndroid Build Coastguard Worker return; 179*20733378SAndroid Build Coastguard Worker } 180*20733378SAndroid Build Coastguard Worker 181*20733378SAndroid Build Coastguard Worker // send requests to aconfigd and obtain the return 182*20733378SAndroid Build Coastguard Worker InputStream returns = localSocket.send(requests.getBytes()); 183*20733378SAndroid Build Coastguard Worker 184*20733378SAndroid Build Coastguard Worker // deserialize back using proto input stream 185*20733378SAndroid Build Coastguard Worker try { 186*20733378SAndroid Build Coastguard Worker parseAndLogAconfigdReturn(returns); 187*20733378SAndroid Build Coastguard Worker } catch (IOException ioe) { 188*20733378SAndroid Build Coastguard Worker Slog.e(TAG, "failed to parse aconfigd return", ioe); 189*20733378SAndroid Build Coastguard Worker } 190*20733378SAndroid Build Coastguard Worker } 191*20733378SAndroid Build Coastguard Worker 192*20733378SAndroid Build Coastguard Worker /** @hide */ listFlagsValueInNewStorage( AconfigdClientSocket localSocket)193*20733378SAndroid Build Coastguard Worker public static Map<String, AconfigdFlagInfo> listFlagsValueInNewStorage( 194*20733378SAndroid Build Coastguard Worker AconfigdClientSocket localSocket) { 195*20733378SAndroid Build Coastguard Worker 196*20733378SAndroid Build Coastguard Worker ProtoOutputStream requests = new ProtoOutputStream(); 197*20733378SAndroid Build Coastguard Worker long msgsToken = requests.start(StorageRequestMessages.MSGS); 198*20733378SAndroid Build Coastguard Worker long msgToken = requests.start(StorageRequestMessage.LIST_STORAGE_MESSAGE); 199*20733378SAndroid Build Coastguard Worker requests.write(StorageRequestMessage.ListStorageMessage.ALL, 1); 200*20733378SAndroid Build Coastguard Worker requests.end(msgToken); 201*20733378SAndroid Build Coastguard Worker requests.end(msgsToken); 202*20733378SAndroid Build Coastguard Worker 203*20733378SAndroid Build Coastguard Worker InputStream inputStream = localSocket.send(requests.getBytes()); 204*20733378SAndroid Build Coastguard Worker ProtoInputStream res = new ProtoInputStream(inputStream); 205*20733378SAndroid Build Coastguard Worker Map<String, AconfigdFlagInfo> flagMap = new HashMap<>(); 206*20733378SAndroid Build Coastguard Worker Deque<Long> tokens = new ArrayDeque<>(); 207*20733378SAndroid Build Coastguard Worker try { 208*20733378SAndroid Build Coastguard Worker while (res.nextField() != ProtoInputStream.NO_MORE_FIELDS) { 209*20733378SAndroid Build Coastguard Worker switch (res.getFieldNumber()) { 210*20733378SAndroid Build Coastguard Worker case (int) StorageReturnMessages.MSGS: 211*20733378SAndroid Build Coastguard Worker tokens.push(res.start(StorageReturnMessages.MSGS)); 212*20733378SAndroid Build Coastguard Worker break; 213*20733378SAndroid Build Coastguard Worker case (int) StorageReturnMessage.LIST_STORAGE_MESSAGE: 214*20733378SAndroid Build Coastguard Worker tokens.push(res.start(StorageReturnMessage.LIST_STORAGE_MESSAGE)); 215*20733378SAndroid Build Coastguard Worker while (res.nextField() != ProtoInputStream.NO_MORE_FIELDS) { 216*20733378SAndroid Build Coastguard Worker switch (res.getFieldNumber()) { 217*20733378SAndroid Build Coastguard Worker case (int) StorageReturnMessage.ListStorageReturnMessage.FLAGS: 218*20733378SAndroid Build Coastguard Worker tokens.push( 219*20733378SAndroid Build Coastguard Worker res.start( 220*20733378SAndroid Build Coastguard Worker StorageReturnMessage.ListStorageReturnMessage 221*20733378SAndroid Build Coastguard Worker .FLAGS)); 222*20733378SAndroid Build Coastguard Worker AconfigdFlagInfo flagQueryReturnMessage = readFromProto(res); 223*20733378SAndroid Build Coastguard Worker flagMap.put( 224*20733378SAndroid Build Coastguard Worker flagQueryReturnMessage.getFullFlagName(), 225*20733378SAndroid Build Coastguard Worker flagQueryReturnMessage); 226*20733378SAndroid Build Coastguard Worker res.end(tokens.pop()); 227*20733378SAndroid Build Coastguard Worker break; 228*20733378SAndroid Build Coastguard Worker default: 229*20733378SAndroid Build Coastguard Worker Slog.i( 230*20733378SAndroid Build Coastguard Worker TAG, 231*20733378SAndroid Build Coastguard Worker "Could not read undefined field: " 232*20733378SAndroid Build Coastguard Worker + res.getFieldNumber()); 233*20733378SAndroid Build Coastguard Worker } 234*20733378SAndroid Build Coastguard Worker } 235*20733378SAndroid Build Coastguard Worker break; 236*20733378SAndroid Build Coastguard Worker case (int) StorageReturnMessage.ERROR_MESSAGE: 237*20733378SAndroid Build Coastguard Worker String errmsg = res.readString(StorageReturnMessage.ERROR_MESSAGE); 238*20733378SAndroid Build Coastguard Worker Slog.w(TAG, "list request failed: " + errmsg); 239*20733378SAndroid Build Coastguard Worker break; 240*20733378SAndroid Build Coastguard Worker default: 241*20733378SAndroid Build Coastguard Worker Slog.i(TAG, "Could not read undefined field: " + res.getFieldNumber()); 242*20733378SAndroid Build Coastguard Worker } 243*20733378SAndroid Build Coastguard Worker } 244*20733378SAndroid Build Coastguard Worker } catch (IOException e) { 245*20733378SAndroid Build Coastguard Worker Slog.e(TAG, "Failed to read protobuf input stream.", e); 246*20733378SAndroid Build Coastguard Worker } 247*20733378SAndroid Build Coastguard Worker 248*20733378SAndroid Build Coastguard Worker while (!tokens.isEmpty()) { 249*20733378SAndroid Build Coastguard Worker res.end(tokens.pop()); 250*20733378SAndroid Build Coastguard Worker } 251*20733378SAndroid Build Coastguard Worker return flagMap; 252*20733378SAndroid Build Coastguard Worker } 253*20733378SAndroid Build Coastguard Worker readFromProto(ProtoInputStream protoInputStream)254*20733378SAndroid Build Coastguard Worker private static AconfigdFlagInfo readFromProto(ProtoInputStream protoInputStream) 255*20733378SAndroid Build Coastguard Worker throws IOException { 256*20733378SAndroid Build Coastguard Worker AconfigdFlagInfo.Builder builder = new AconfigdFlagInfo.Builder(); 257*20733378SAndroid Build Coastguard Worker while (protoInputStream.nextField() != ProtoInputStream.NO_MORE_FIELDS) { 258*20733378SAndroid Build Coastguard Worker switch (protoInputStream.getFieldNumber()) { 259*20733378SAndroid Build Coastguard Worker case (int) StorageReturnMessage.FlagQueryReturnMessage.PACKAGE_NAME: 260*20733378SAndroid Build Coastguard Worker builder.setPackageName( 261*20733378SAndroid Build Coastguard Worker protoInputStream.readString( 262*20733378SAndroid Build Coastguard Worker StorageReturnMessage.FlagQueryReturnMessage.PACKAGE_NAME)); 263*20733378SAndroid Build Coastguard Worker break; 264*20733378SAndroid Build Coastguard Worker case (int) StorageReturnMessage.FlagQueryReturnMessage.FLAG_NAME: 265*20733378SAndroid Build Coastguard Worker builder.setFlagName( 266*20733378SAndroid Build Coastguard Worker protoInputStream.readString( 267*20733378SAndroid Build Coastguard Worker StorageReturnMessage.FlagQueryReturnMessage.FLAG_NAME)); 268*20733378SAndroid Build Coastguard Worker break; 269*20733378SAndroid Build Coastguard Worker case (int) StorageReturnMessage.FlagQueryReturnMessage.SERVER_FLAG_VALUE: 270*20733378SAndroid Build Coastguard Worker builder.setServerFlagValue( 271*20733378SAndroid Build Coastguard Worker protoInputStream.readString( 272*20733378SAndroid Build Coastguard Worker StorageReturnMessage.FlagQueryReturnMessage.SERVER_FLAG_VALUE)); 273*20733378SAndroid Build Coastguard Worker break; 274*20733378SAndroid Build Coastguard Worker case (int) StorageReturnMessage.FlagQueryReturnMessage.LOCAL_FLAG_VALUE: 275*20733378SAndroid Build Coastguard Worker builder.setLocalFlagValue( 276*20733378SAndroid Build Coastguard Worker protoInputStream.readString( 277*20733378SAndroid Build Coastguard Worker StorageReturnMessage.FlagQueryReturnMessage.LOCAL_FLAG_VALUE)); 278*20733378SAndroid Build Coastguard Worker break; 279*20733378SAndroid Build Coastguard Worker case (int) StorageReturnMessage.FlagQueryReturnMessage.BOOT_FLAG_VALUE: 280*20733378SAndroid Build Coastguard Worker builder.setBootFlagValue( 281*20733378SAndroid Build Coastguard Worker protoInputStream.readString( 282*20733378SAndroid Build Coastguard Worker StorageReturnMessage.FlagQueryReturnMessage.BOOT_FLAG_VALUE)); 283*20733378SAndroid Build Coastguard Worker break; 284*20733378SAndroid Build Coastguard Worker case (int) StorageReturnMessage.FlagQueryReturnMessage.DEFAULT_FLAG_VALUE: 285*20733378SAndroid Build Coastguard Worker builder.setDefaultFlagValue( 286*20733378SAndroid Build Coastguard Worker protoInputStream.readString( 287*20733378SAndroid Build Coastguard Worker StorageReturnMessage.FlagQueryReturnMessage 288*20733378SAndroid Build Coastguard Worker .DEFAULT_FLAG_VALUE)); 289*20733378SAndroid Build Coastguard Worker break; 290*20733378SAndroid Build Coastguard Worker case (int) StorageReturnMessage.FlagQueryReturnMessage.HAS_SERVER_OVERRIDE: 291*20733378SAndroid Build Coastguard Worker builder.setHasServerOverride( 292*20733378SAndroid Build Coastguard Worker protoInputStream.readBoolean( 293*20733378SAndroid Build Coastguard Worker StorageReturnMessage.FlagQueryReturnMessage 294*20733378SAndroid Build Coastguard Worker .HAS_SERVER_OVERRIDE)); 295*20733378SAndroid Build Coastguard Worker break; 296*20733378SAndroid Build Coastguard Worker case (int) StorageReturnMessage.FlagQueryReturnMessage.HAS_LOCAL_OVERRIDE: 297*20733378SAndroid Build Coastguard Worker builder.setHasLocalOverride( 298*20733378SAndroid Build Coastguard Worker protoInputStream.readBoolean( 299*20733378SAndroid Build Coastguard Worker StorageReturnMessage.FlagQueryReturnMessage 300*20733378SAndroid Build Coastguard Worker .HAS_LOCAL_OVERRIDE)); 301*20733378SAndroid Build Coastguard Worker break; 302*20733378SAndroid Build Coastguard Worker case (int) StorageReturnMessage.FlagQueryReturnMessage.IS_READWRITE: 303*20733378SAndroid Build Coastguard Worker builder.setIsReadWrite( 304*20733378SAndroid Build Coastguard Worker protoInputStream.readBoolean( 305*20733378SAndroid Build Coastguard Worker StorageReturnMessage.FlagQueryReturnMessage.IS_READWRITE)); 306*20733378SAndroid Build Coastguard Worker break; 307*20733378SAndroid Build Coastguard Worker default: 308*20733378SAndroid Build Coastguard Worker Slog.i( 309*20733378SAndroid Build Coastguard Worker TAG, 310*20733378SAndroid Build Coastguard Worker "Could not read undefined field: " + protoInputStream.getFieldNumber()); 311*20733378SAndroid Build Coastguard Worker } 312*20733378SAndroid Build Coastguard Worker } 313*20733378SAndroid Build Coastguard Worker return builder.build(); 314*20733378SAndroid Build Coastguard Worker } 315*20733378SAndroid Build Coastguard Worker } 316