1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.usage;
18 
19 import android.annotation.IntRange;
20 import android.annotation.NonNull;
21 import android.annotation.Nullable;
22 import android.app.usage.BroadcastResponseStats;
23 import android.util.ArrayMap;
24 
25 import com.android.internal.util.IndentingPrintWriter;
26 
27 import java.util.List;
28 
29 class UserBroadcastResponseStats {
30     /**
31      * Contains the mapping of a BroadcastEvent type to it's aggregated stats.
32      */
33     private ArrayMap<BroadcastEvent, BroadcastResponseStats> mResponseStats =
34             new ArrayMap<>();
35 
getBroadcastResponseStats( BroadcastEvent broadcastEvent)36     @Nullable BroadcastResponseStats getBroadcastResponseStats(
37             BroadcastEvent broadcastEvent) {
38         return mResponseStats.get(broadcastEvent);
39     }
40 
getOrCreateBroadcastResponseStats( BroadcastEvent broadcastEvent)41     @NonNull BroadcastResponseStats getOrCreateBroadcastResponseStats(
42             BroadcastEvent broadcastEvent) {
43         BroadcastResponseStats responseStats = mResponseStats.get(broadcastEvent);
44         if (responseStats == null) {
45             responseStats = new BroadcastResponseStats(broadcastEvent.getTargetPackage(),
46                     broadcastEvent.getIdForResponseEvent());
47             mResponseStats.put(broadcastEvent, responseStats);
48         }
49         return responseStats;
50     }
51 
populateAllBroadcastResponseStats( @onNull List<BroadcastResponseStats> broadcastResponseStatsList, @Nullable String packageName, @IntRange(from = 0) long id)52     void populateAllBroadcastResponseStats(
53             @NonNull List<BroadcastResponseStats> broadcastResponseStatsList,
54             @Nullable String packageName, @IntRange(from = 0) long id) {
55         for (int i = mResponseStats.size() - 1; i >= 0; --i) {
56             final BroadcastEvent broadcastEvent = mResponseStats.keyAt(i);
57             if (id != 0 && id != broadcastEvent.getIdForResponseEvent()) {
58                 continue;
59             }
60             if (packageName != null && !packageName.equals(broadcastEvent.getTargetPackage())) {
61                 continue;
62             }
63             broadcastResponseStatsList.add(mResponseStats.valueAt(i));
64         }
65     }
66 
clearBroadcastResponseStats(@ullable String packageName, @IntRange(from = 0) long id)67     void clearBroadcastResponseStats(@Nullable String packageName, @IntRange(from = 0) long id) {
68         for (int i = mResponseStats.size() - 1; i >= 0; --i) {
69             final BroadcastEvent broadcastEvent = mResponseStats.keyAt(i);
70             if (id != 0 && id != broadcastEvent.getIdForResponseEvent()) {
71                 continue;
72             }
73             if (packageName != null && !packageName.equals(broadcastEvent.getTargetPackage())) {
74                 continue;
75             }
76             mResponseStats.removeAt(i);
77         }
78     }
79 
onPackageRemoved(@onNull String packageName)80     void onPackageRemoved(@NonNull String packageName) {
81         for (int i = mResponseStats.size() - 1; i >= 0; --i) {
82             if (mResponseStats.keyAt(i).getTargetPackage().equals(packageName)) {
83                 mResponseStats.removeAt(i);
84             }
85         }
86     }
87 
dump(@onNull IndentingPrintWriter ipw)88     void dump(@NonNull IndentingPrintWriter ipw) {
89         for (int i = 0; i < mResponseStats.size(); ++i) {
90             final BroadcastEvent broadcastEvent = mResponseStats.keyAt(i);
91             final BroadcastResponseStats responseStats = mResponseStats.valueAt(i);
92             ipw.print(broadcastEvent);
93             ipw.print(" -> ");
94             ipw.println(responseStats);
95         }
96     }
97 }
98