1f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme/**
2f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * Copyright (c) 2016, The Android Open Source Project
3f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme *
4f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * Licensed under the Apache License, Version 2.0 (the "License");
5f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * you may not use this file except in compliance with the License.
6f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * You may obtain a copy of the License at
7f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme *
8f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme *     http://www.apache.org/licenses/LICENSE-2.0
9f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme *
10f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * Unless required by applicable law or agreed to in writing, software
11f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * distributed under the License is distributed on an "AS IS" BASIS,
12f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * See the License for the specific language governing permissions and
14f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * limitations under the License.
15f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme */
16f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
17f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemepackage com.android.server.utils;
18f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
19e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nairimport android.annotation.IntDef;
20e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair
21f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemeimport java.io.FileDescriptor;
22f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemeimport java.io.PrintWriter;
23e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nairimport java.lang.annotation.Retention;
24e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nairimport java.lang.annotation.RetentionPolicy;
25e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nairimport java.util.ArrayList;
26e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nairimport java.util.Arrays;
27e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nairimport java.util.Iterator;
28f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
29f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme/**
30f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * Helper for {@link android.os.Binder#dump(java.io.FileDescriptor, String[])} that supports the
31e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair * {@link #PRIORITY_ARG} and {@link #PROTO_ARG} arguments.
32f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * <p>
33f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * Typical usage:
34f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme *
35f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * <pre><code>
36f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemepublic class SpringfieldNuclearPowerPlant extends Binder {
37f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
38f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme private final PriorityDump.PriorityDumper mPriorityDumper = new PriorityDump.PriorityDumper() {
39f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
40f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme     @Override
41e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair     public void dumpCritical(FileDescriptor fd, PrintWriter pw, String[] args, boolean asProto) {
42e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair       if (asProto) {
43e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair         ProtoOutputStream proto = new ProtoOutputStream(fd);
44e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair         proto.write(SpringfieldProto.DONUTS, 1);
45e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair         proto.flush();
46e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair       } else {
47e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair         pw.println("Donuts in the box: 1");
48e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair       }
49f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme     }
50f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
51f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme     @Override
52f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme     public void dumpNormal(FileDescriptor fd, PrintWriter pw, String[] args) {
53e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        if (asProto) {
54e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair          ProtoOutputStream proto = new ProtoOutputStream(fd);
55e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair          proto.write(SpringfieldProto.REACTOR_STATUS, DANGER_MELTDOWN_IMMINENT);
56e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair          proto.flush();
57e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        } else {
58e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair          pw.println("Nuclear reactor status: DANGER - MELTDOWN IMMINENT");
59e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        }
60f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme     }
61f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme  };
62f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
63f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme  @Override
64f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme  protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
65f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme      PriorityDump.dump(mPriorityDumper, fd, pw, args);
66f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme  }
67f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme}
68f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
69f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * </code></pre>
70f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme *
71f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * <strong>Disclaimer</strong>: a real-life service should prioritize core status over donuts :-)
72f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme *
73f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * <p>Then to invoke it:
74f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme *
75f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * <pre><code>
76f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme *
77f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme    $ adb shell dumpsys snpp
78f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme    Donuts in the box: 1
79f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme    Nuclear reactor status: DANGER - MELTDOWN IMMINENT
80f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
81f3648e04f431b39524b469c75fa2c77a3e771faeVishnu Nair    $ adb shell dumpsys snpp --dump-priority CRITICAL
82f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme    Donuts in the box: 1
83f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
84f3648e04f431b39524b469c75fa2c77a3e771faeVishnu Nair    $ adb shell dumpsys snpp --dump-priority NORMAL
85f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme    Nuclear reactor status: DANGER - MELTDOWN IMMINENT
86f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
87e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair    $ adb shell dumpsys snpp --dump-priority CRITICAL --proto
88e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair    //binary output
89e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair
90f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * </code></pre>
91f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme *
92f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme *
93f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme *
94f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * <p>To run the unit tests:
95f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * <pre><code>
96f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme *
97e3e4d251b9ed680e56e18684a2a24feb94b9cd21Vishnu Nair atest FrameworksServicesTests:PriorityDumpTest
98f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * </code></pre>
99f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme *
100f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme *
101f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * @hide
102f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme */
103f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemepublic final class PriorityDump {
104f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
105f3648e04f431b39524b469c75fa2c77a3e771faeVishnu Nair    public static final String PRIORITY_ARG = "--dump-priority";
106e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair    public static final String PROTO_ARG = "--proto";
107e3e4d251b9ed680e56e18684a2a24feb94b9cd21Vishnu Nair    public static final String PRIORITY_ARG_CRITICAL = "CRITICAL";
108e3e4d251b9ed680e56e18684a2a24feb94b9cd21Vishnu Nair    public static final String PRIORITY_ARG_HIGH = "HIGH";
109e3e4d251b9ed680e56e18684a2a24feb94b9cd21Vishnu Nair    public static final String PRIORITY_ARG_NORMAL = "NORMAL";
110f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
111f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme    private PriorityDump() {
112f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme        throw new UnsupportedOperationException();
113f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme    }
114f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
115e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair    /** Enum to switch through supported priority types */
116e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair    @Retention(RetentionPolicy.SOURCE)
117e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair    @IntDef({PRIORITY_TYPE_INVALID, PRIORITY_TYPE_CRITICAL, PRIORITY_TYPE_HIGH,
118e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            PRIORITY_TYPE_NORMAL})
119e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair    private @interface PriorityType { }
120e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair    private static final int PRIORITY_TYPE_INVALID = 0;
121e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair    private static final int PRIORITY_TYPE_CRITICAL = 1;
122e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair    private static final int PRIORITY_TYPE_HIGH = 2;
123e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair    private static final int PRIORITY_TYPE_NORMAL = 3;
124e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair
125f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme    /**
126e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair     * Parses {@code args} matching {@code --dump-priority} and/or {@code --proto}. The matching
127e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair     * arguments are stripped.
128e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair     * <p>
129e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair     * If priority args are passed as an argument, it will call the appropriate method and if proto
130e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair     * args are passed then the {@code asProto} flag is set.
131f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme     * <p>
132f3648e04f431b39524b469c75fa2c77a3e771faeVishnu Nair     * For example, if called as {@code --dump-priority HIGH arg1 arg2 arg3}, it will call
133e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair     * <code>dumper.dumpHigh(fd, pw, {"arg1", "arg2", "arg3"}, false) </code>
134f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme     * <p>
135f3648e04f431b39524b469c75fa2c77a3e771faeVishnu Nair     * If the {@code --dump-priority} is not set, it calls
136e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair     * {@link PriorityDumper#dump(FileDescriptor, PrintWriter, String[], boolean)} passing the whole
137f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme     * {@code args} instead.
138f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme     */
139f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme    public static void dump(PriorityDumper dumper, FileDescriptor fd, PrintWriter pw,
140f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme            String[] args) {
141e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        boolean asProto = false;
142e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        @PriorityType int priority = PRIORITY_TYPE_INVALID;
143e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair
144e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        if (args == null) {
145e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            dumper.dump(fd, pw, args, asProto);
146e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            return;
147e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        }
148e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair
149e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        String[] strippedArgs = new String[args.length];
150e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        int strippedCount = 0;
151e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        for (int argIndex = 0; argIndex < args.length; argIndex++) {
152e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            if (args[argIndex].equals(PROTO_ARG)) {
153e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair                asProto = true;
154e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            } else if (args[argIndex].equals(PRIORITY_ARG)) {
155e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair                if (argIndex + 1 < args.length) {
156e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair                    argIndex++;
157e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair                    priority = getPriorityType(args[argIndex]);
158f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme                }
159e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            } else {
160e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair                strippedArgs[strippedCount++] = args[argIndex];
161e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            }
162e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        }
163e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair
164e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        if (strippedCount < args.length) {
165e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            strippedArgs = Arrays.copyOf(strippedArgs, strippedCount);
166e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        }
167e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair
168e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        switch (priority) {
169e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            case PRIORITY_TYPE_CRITICAL: {
170e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair                dumper.dumpCritical(fd, pw, strippedArgs, asProto);
171e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair                return;
172e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            }
173e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            case PRIORITY_TYPE_HIGH: {
174e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair                dumper.dumpHigh(fd, pw, strippedArgs, asProto);
175e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair                return;
176e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            }
177e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            case PRIORITY_TYPE_NORMAL: {
178e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair                dumper.dumpNormal(fd, pw, strippedArgs, asProto);
179e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair                return;
180e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            }
181e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            default: {
182e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair                dumper.dump(fd, pw, strippedArgs, asProto);
183e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair                return;
184f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme            }
185f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme        }
186f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme    }
187f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
188f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme    /**
189e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair     * Converts priority argument type to enum.
190f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme     */
191e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair    private static @PriorityType int getPriorityType(String arg) {
192e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        switch (arg) {
193e3e4d251b9ed680e56e18684a2a24feb94b9cd21Vishnu Nair            case PRIORITY_ARG_CRITICAL: {
194e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair                return PRIORITY_TYPE_CRITICAL;
195e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            }
196e3e4d251b9ed680e56e18684a2a24feb94b9cd21Vishnu Nair            case PRIORITY_ARG_HIGH: {
197e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair                return PRIORITY_TYPE_HIGH;
198e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            }
199e3e4d251b9ed680e56e18684a2a24feb94b9cd21Vishnu Nair            case PRIORITY_ARG_NORMAL: {
200e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair                return PRIORITY_TYPE_NORMAL;
201e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            }
202e3e4d251b9ed680e56e18684a2a24feb94b9cd21Vishnu Nair            default: {
203e3e4d251b9ed680e56e18684a2a24feb94b9cd21Vishnu Nair                return PRIORITY_TYPE_INVALID;
204e3e4d251b9ed680e56e18684a2a24feb94b9cd21Vishnu Nair            }
205e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        }
206f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme    }
207f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
208f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme    /**
209f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme     * Helper for {@link android.os.Binder#dump(java.io.FileDescriptor, String[])} that supports the
210e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair     * {@link #PRIORITY_ARG} and {@link #PROTO_ARG} arguments.
211f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme     *
212f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme     * @hide
213f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme     */
214e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair    public interface PriorityDumper {
215f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
216f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme        /**
217f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme         * Dumps only the critical section.
218f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme         */
219f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme        @SuppressWarnings("unused")
220e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        default void dumpCritical(FileDescriptor fd, PrintWriter pw, String[] args,
221e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair                boolean asProto) {
222f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme        }
223f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
224f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme        /**
225f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme         * Dumps only the high-priority section.
226f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme         */
227f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme        @SuppressWarnings("unused")
228e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        default void dumpHigh(FileDescriptor fd, PrintWriter pw, String[] args, boolean asProto) {
229f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme        }
230f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
231f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme        /**
232f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme         * Dumps only the normal section.
233f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme         */
234f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme        @SuppressWarnings("unused")
235e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        default void dumpNormal(FileDescriptor fd, PrintWriter pw, String[] args, boolean asProto) {
236f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme        }
237f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme
238f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme        /**
239f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme         * Dumps all sections.
240f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme         * <p>
241f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme         * This method is called when
242e3e4d251b9ed680e56e18684a2a24feb94b9cd21Vishnu Nair         * {@link PriorityDump#dump(PriorityDumper, FileDescriptor, PrintWriter, String[])}
243e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair         * is called without priority arguments. By default, it calls the 3 {@code dumpTYPE}
244e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair         * methods, so sub-classes just need to implement the priority types they support.
245f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme         */
246f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme        @SuppressWarnings("unused")
247e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair        default void dump(FileDescriptor fd, PrintWriter pw, String[] args, boolean asProto) {
248e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            dumpCritical(fd, pw, args, asProto);
249e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            dumpHigh(fd, pw, args, asProto);
250e78b01ad2d7779ad3a6acfe5acd0068e4840665cVishnu Nair            dumpNormal(fd, pw, args, asProto);
251f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme        }
252f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme    }
253f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme}
254