xref: /aosp_15_r20/system/server_configurable_flags/aconfigd/srcs/AconfigdJavaUtils.java (revision 207333786ba243bc7d4d69ef6b05487aa7071806)
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