1 /*
2  * Copyright (C) 2019 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.systemui.statusbar;
18 
19 import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
20 
21 import android.annotation.NonNull;
22 import android.app.Notification;
23 import android.app.NotificationChannel;
24 import android.app.NotificationManager.Importance;
25 import android.content.pm.ShortcutInfo;
26 import android.service.notification.NotificationListenerService.Ranking;
27 import android.service.notification.SnoozeCriterion;
28 
29 import java.util.ArrayList;
30 import java.util.Arrays;
31 import java.util.List;
32 
33 /**
34  * Standard builder class for Ranking objects. For use in tests that need to craft the underlying
35  * Ranking object of a NotificationEntry.
36  */
37 public class RankingBuilder {
38     private String mKey = "test_key";
39     private int mRank = 0;
40     private boolean mMatchesInterruptionFilter = false;
41     private int mVisibilityOverride = 0;
42     private int mSuppressedVisualEffects = 0;
43     @Importance private int mImportance = 0;
44     private CharSequence mExplanation = "test_explanation";
45     private String mOverrideGroupKey = null;
46     private NotificationChannel mChannel = null;
47     private ArrayList<String> mAdditionalPeople = null;
48     private ArrayList<SnoozeCriterion> mSnoozeCriteria = null;
49     private boolean mCanShowBadge = false;
50     private int mUserSentiment = 0;
51     private boolean mIsSuspended = false;
52     private long mLastAudiblyAlertedMs = 0;
53     private boolean mNoisy = false;
54     private ArrayList<Notification.Action> mSmartActions = new ArrayList<>();
55     private ArrayList<CharSequence> mSmartReplies = new ArrayList<>();
56     private boolean mCanBubble = false;
57     private boolean mIsTextChanged = false;
58     private boolean mIsConversation = false;
59     private ShortcutInfo mShortcutInfo = null;
60     private int mRankingAdjustment = 0;
61     private boolean mIsBubble = false;
62     private int mProposedImportance = IMPORTANCE_UNSPECIFIED;
63     private boolean mSensitiveContent = false;
64 
RankingBuilder()65     public RankingBuilder() {
66     }
67 
RankingBuilder(Ranking ranking)68     public RankingBuilder(Ranking ranking) {
69         mKey = ranking.getKey();
70         mRank = ranking.getRank();
71         mMatchesInterruptionFilter = ranking.matchesInterruptionFilter();
72         mVisibilityOverride = ranking.getLockscreenVisibilityOverride();
73         mSuppressedVisualEffects = ranking.getSuppressedVisualEffects();
74         mImportance = ranking.getImportance();
75         mExplanation = ranking.getImportanceExplanation();
76         mOverrideGroupKey = ranking.getOverrideGroupKey();
77         mChannel = ranking.getChannel();
78         mAdditionalPeople = copyList(ranking.getAdditionalPeople());
79         mSnoozeCriteria = copyList(ranking.getSnoozeCriteria());
80         mCanShowBadge = ranking.canShowBadge();
81         mUserSentiment = ranking.getUserSentiment();
82         mIsSuspended = ranking.isSuspended();
83         mLastAudiblyAlertedMs = ranking.getLastAudiblyAlertedMillis();
84         mNoisy = ranking.isNoisy();
85         mSmartActions = copyList(ranking.getSmartActions());
86         mSmartReplies = copyList(ranking.getSmartReplies());
87         mCanBubble = ranking.canBubble();
88         mIsTextChanged = ranking.isTextChanged();
89         mIsConversation = ranking.isConversation();
90         mShortcutInfo = ranking.getConversationShortcutInfo();
91         mRankingAdjustment = ranking.getRankingAdjustment();
92         mIsBubble = ranking.isBubble();
93         mProposedImportance = ranking.getProposedImportance();
94         mSensitiveContent = ranking.hasSensitiveContent();
95     }
96 
build()97     public Ranking build() {
98         final Ranking ranking = new Ranking();
99         ranking.populate(
100                 mKey,
101                 mRank,
102                 mMatchesInterruptionFilter,
103                 mVisibilityOverride,
104                 mSuppressedVisualEffects,
105                 mImportance,
106                 mExplanation,
107                 mOverrideGroupKey,
108                 mChannel,
109                 mAdditionalPeople,
110                 mSnoozeCriteria,
111                 mCanShowBadge,
112                 mUserSentiment,
113                 mIsSuspended,
114                 mLastAudiblyAlertedMs,
115                 mNoisy,
116                 mSmartActions,
117                 mSmartReplies,
118                 mCanBubble,
119                 mIsTextChanged,
120                 mIsConversation,
121                 mShortcutInfo,
122                 mRankingAdjustment,
123                 mIsBubble,
124                 mProposedImportance,
125                 mSensitiveContent);
126         return ranking;
127     }
128 
setKey(String key)129     public RankingBuilder setKey(String key) {
130         mKey = key;
131         return this;
132     }
133 
setRank(int rank)134     public RankingBuilder setRank(int rank) {
135         mRank = rank;
136         return this;
137     }
138 
setMatchesInterruptionFilter(boolean matchesInterruptionFilter)139     public RankingBuilder setMatchesInterruptionFilter(boolean matchesInterruptionFilter) {
140         mMatchesInterruptionFilter = matchesInterruptionFilter;
141         return this;
142     }
143 
setVisibilityOverride(int visibilityOverride)144     public RankingBuilder setVisibilityOverride(int visibilityOverride) {
145         mVisibilityOverride = visibilityOverride;
146         return this;
147     }
148 
setSuppressedVisualEffects(int suppressedVisualEffects)149     public RankingBuilder setSuppressedVisualEffects(int suppressedVisualEffects) {
150         mSuppressedVisualEffects = suppressedVisualEffects;
151         return this;
152     }
153 
setExplanation(CharSequence explanation)154     public RankingBuilder setExplanation(CharSequence explanation) {
155         mExplanation = explanation;
156         return this;
157     }
158 
setOverrideGroupKey(String overrideGroupKey)159     public RankingBuilder setOverrideGroupKey(String overrideGroupKey) {
160         mOverrideGroupKey = overrideGroupKey;
161         return this;
162     }
163 
setAdditionalPeople(ArrayList<String> additionalPeople)164     public RankingBuilder setAdditionalPeople(ArrayList<String> additionalPeople) {
165         mAdditionalPeople = additionalPeople;
166         return this;
167     }
168 
setSnoozeCriteria( ArrayList<SnoozeCriterion> snoozeCriteria)169     public RankingBuilder setSnoozeCriteria(
170             ArrayList<SnoozeCriterion> snoozeCriteria) {
171         mSnoozeCriteria = snoozeCriteria;
172         return this;
173     }
174 
setCanShowBadge(boolean canShowBadge)175     public RankingBuilder setCanShowBadge(boolean canShowBadge) {
176         mCanShowBadge = canShowBadge;
177         return this;
178     }
179 
setSuspended(boolean suspended)180     public RankingBuilder setSuspended(boolean suspended) {
181         mIsSuspended = suspended;
182         return this;
183     }
184 
setLastAudiblyAlertedMs(long lastAudiblyAlertedMs)185     public RankingBuilder setLastAudiblyAlertedMs(long lastAudiblyAlertedMs) {
186         mLastAudiblyAlertedMs = lastAudiblyAlertedMs;
187         return this;
188     }
189 
setNoisy(boolean noisy)190     public RankingBuilder setNoisy(boolean noisy) {
191         mNoisy = noisy;
192         return this;
193     }
194 
setCanBubble(boolean canBubble)195     public RankingBuilder setCanBubble(boolean canBubble) {
196         mCanBubble = canBubble;
197         return this;
198     }
199 
setTextChanged(boolean textChanged)200     public RankingBuilder setTextChanged(boolean textChanged) {
201         mIsTextChanged = textChanged;
202         return this;
203     }
204 
setIsConversation(boolean isConversation)205     public RankingBuilder setIsConversation(boolean isConversation) {
206         mIsConversation = isConversation;
207         return this;
208     }
209 
setShortcutInfo(ShortcutInfo shortcutInfo)210     public RankingBuilder setShortcutInfo(ShortcutInfo shortcutInfo) {
211         mShortcutInfo = shortcutInfo;
212         return this;
213     }
214 
setRankingAdjustment(int rankingAdjustment)215     public RankingBuilder setRankingAdjustment(int rankingAdjustment) {
216         mRankingAdjustment = rankingAdjustment;
217         return this;
218     }
219 
setImportance(@mportance int importance)220     public RankingBuilder setImportance(@Importance int importance) {
221         mImportance = importance;
222         return this;
223     }
224 
setProposedImportance(@mportance int importance)225     public RankingBuilder setProposedImportance(@Importance int importance) {
226         mProposedImportance = importance;
227         return this;
228     }
229 
setSensitiveContent(boolean sensitiveContent)230     public RankingBuilder setSensitiveContent(boolean sensitiveContent) {
231         mSensitiveContent = sensitiveContent;
232         return this;
233     }
234 
setUserSentiment(int userSentiment)235     public RankingBuilder setUserSentiment(int userSentiment) {
236         mUserSentiment = userSentiment;
237         return this;
238     }
239 
setChannel(NotificationChannel channel)240     public RankingBuilder setChannel(NotificationChannel channel) {
241         mChannel = channel;
242         return this;
243     }
244 
setSmartActions(@onNull ArrayList<Notification.Action> smartActions)245     public RankingBuilder setSmartActions(@NonNull ArrayList<Notification.Action> smartActions) {
246         mSmartActions = smartActions;
247         return this;
248     }
249 
setSmartActions(Notification.Action... smartActions)250     public RankingBuilder setSmartActions(Notification.Action... smartActions) {
251         mSmartActions = new ArrayList<>(Arrays.asList(smartActions));
252         return this;
253     }
254 
setSmartReplies(@onNull ArrayList<CharSequence> smartReplies)255     public RankingBuilder setSmartReplies(@NonNull ArrayList<CharSequence> smartReplies) {
256         mSmartReplies = smartReplies;
257         return this;
258     }
259 
setSmartReplies(CharSequence... smartReplies)260     public RankingBuilder setSmartReplies(CharSequence... smartReplies) {
261         mSmartReplies = new ArrayList<>(Arrays.asList(smartReplies));
262         return this;
263     }
264 
copyList(List<E> list)265     private static <E> ArrayList<E> copyList(List<E> list) {
266         if (list == null) {
267             return null;
268         } else {
269             return new ArrayList<>(list);
270         }
271     }
272 }
273