1/*
2 * Copyright (C) 2012 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
17package android.support.v4.app;
18
19import static android.support.v4.app.NotificationCompat.DEFAULT_SOUND;
20import static android.support.v4.app.NotificationCompat.DEFAULT_VIBRATE;
21import static android.support.v4.app.NotificationCompat.FLAG_GROUP_SUMMARY;
22import static android.support.v4.app.NotificationCompat.GROUP_ALERT_ALL;
23import static android.support.v4.app.NotificationCompat.GROUP_ALERT_CHILDREN;
24import static android.support.v4.app.NotificationCompat.GROUP_ALERT_SUMMARY;
25
26import android.app.Notification;
27import android.app.PendingIntent;
28import android.app.RemoteInput;
29import android.content.Context;
30import android.graphics.Bitmap;
31import android.net.Uri;
32import android.os.Bundle;
33import android.support.annotation.RequiresApi;
34import android.widget.RemoteViews;
35
36import java.util.ArrayList;
37import java.util.List;
38
39@RequiresApi(24)
40class NotificationCompatApi24 {
41
42    public static class Builder implements NotificationBuilderWithBuilderAccessor,
43            NotificationBuilderWithActions {
44        private Notification.Builder b;
45        private int mGroupAlertBehavior;
46
47        public Builder(Context context, Notification n,
48                CharSequence contentTitle, CharSequence contentText, CharSequence contentInfo,
49                RemoteViews tickerView, int number,
50                PendingIntent contentIntent, PendingIntent fullScreenIntent, Bitmap largeIcon,
51                int progressMax, int progress, boolean progressIndeterminate, boolean showWhen,
52                boolean useChronometer, int priority, CharSequence subText, boolean localOnly,
53                String category, ArrayList<String> people, Bundle extras, int color,
54                int visibility, Notification publicVersion, String groupKey, boolean groupSummary,
55                String sortKey, CharSequence[] remoteInputHistory, RemoteViews contentView,
56                RemoteViews bigContentView, RemoteViews headsUpContentView,
57                int groupAlertBehavior) {
58            b = new Notification.Builder(context)
59                    .setWhen(n.when)
60                    .setShowWhen(showWhen)
61                    .setSmallIcon(n.icon, n.iconLevel)
62                    .setContent(n.contentView)
63                    .setTicker(n.tickerText, tickerView)
64                    .setSound(n.sound, n.audioStreamType)
65                    .setVibrate(n.vibrate)
66                    .setLights(n.ledARGB, n.ledOnMS, n.ledOffMS)
67                    .setOngoing((n.flags & Notification.FLAG_ONGOING_EVENT) != 0)
68                    .setOnlyAlertOnce((n.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0)
69                    .setAutoCancel((n.flags & Notification.FLAG_AUTO_CANCEL) != 0)
70                    .setDefaults(n.defaults)
71                    .setContentTitle(contentTitle)
72                    .setContentText(contentText)
73                    .setSubText(subText)
74                    .setContentInfo(contentInfo)
75                    .setContentIntent(contentIntent)
76                    .setDeleteIntent(n.deleteIntent)
77                    .setFullScreenIntent(fullScreenIntent,
78                            (n.flags & Notification.FLAG_HIGH_PRIORITY) != 0)
79                    .setLargeIcon(largeIcon)
80                    .setNumber(number)
81                    .setUsesChronometer(useChronometer)
82                    .setPriority(priority)
83                    .setProgress(progressMax, progress, progressIndeterminate)
84                    .setLocalOnly(localOnly)
85                    .setExtras(extras)
86                    .setGroup(groupKey)
87                    .setGroupSummary(groupSummary)
88                    .setSortKey(sortKey)
89                    .setCategory(category)
90                    .setColor(color)
91                    .setVisibility(visibility)
92                    .setPublicVersion(publicVersion)
93                    .setRemoteInputHistory(remoteInputHistory);
94            if (contentView != null) {
95                b.setCustomContentView(contentView);
96            }
97            if (bigContentView != null) {
98                b.setCustomBigContentView(bigContentView);
99            }
100            if (headsUpContentView != null) {
101                b.setCustomHeadsUpContentView(headsUpContentView);
102            }
103            for (String person: people) {
104                b.addPerson(person);
105            }
106
107            mGroupAlertBehavior = groupAlertBehavior;
108        }
109
110        @Override
111        public void addAction(NotificationCompatBase.Action action) {
112            NotificationCompatApi24.addAction(b, action);
113        }
114
115        @Override
116        public Notification.Builder getBuilder() {
117            return b;
118        }
119
120        @Override
121        public Notification build() {
122            Notification notification =  b.build();
123
124            if (mGroupAlertBehavior != GROUP_ALERT_ALL) {
125                // if is summary and only children should alert
126                if (notification.getGroup() != null
127                        && (notification.flags & FLAG_GROUP_SUMMARY) != 0
128                        && mGroupAlertBehavior == GROUP_ALERT_CHILDREN) {
129                    removeSoundAndVibration(notification);
130                }
131                // if is group child and only summary should alert
132                if (notification.getGroup() != null
133                        && (notification.flags & FLAG_GROUP_SUMMARY) == 0
134                        && mGroupAlertBehavior == GROUP_ALERT_SUMMARY) {
135                    removeSoundAndVibration(notification);
136                }
137            }
138
139            return notification;
140        }
141
142        private void removeSoundAndVibration(Notification notification) {
143            notification.sound = null;
144            notification.vibrate = null;
145            notification.defaults &= ~DEFAULT_SOUND;
146            notification.defaults &= ~DEFAULT_VIBRATE;
147        }
148    }
149
150    public static void addMessagingStyle(NotificationBuilderWithBuilderAccessor b,
151            CharSequence userDisplayName, CharSequence conversationTitle, List<CharSequence> texts,
152            List<Long> timestamps, List<CharSequence> senders, List<String> dataMimeTypes,
153            List<Uri> dataUris) {
154        Notification.MessagingStyle style = new Notification.MessagingStyle(userDisplayName)
155                .setConversationTitle(conversationTitle);
156        for (int i = 0; i < texts.size(); i++) {
157            Notification.MessagingStyle.Message message = new Notification.MessagingStyle.Message(
158                    texts.get(i), timestamps.get(i), senders.get(i));
159            if (dataMimeTypes.get(i) != null) {
160                message.setData(dataMimeTypes.get(i), dataUris.get(i));
161            }
162            style.addMessage(message);
163        }
164        style.setBuilder(b.getBuilder());
165    }
166
167    public static void addAction(Notification.Builder b, NotificationCompatBase.Action action) {
168        Notification.Action.Builder actionBuilder = new Notification.Action.Builder(
169                action.getIcon(), action.getTitle(), action.getActionIntent());
170        if (action.getRemoteInputs() != null) {
171            for (RemoteInput remoteInput : RemoteInputCompatApi20.fromCompat(
172                    action.getRemoteInputs())) {
173                actionBuilder.addRemoteInput(remoteInput);
174            }
175        }
176        Bundle actionExtras;
177        if (action.getExtras() != null) {
178            actionExtras = new Bundle(action.getExtras());
179        } else {
180            actionExtras = new Bundle();
181        }
182        actionExtras.putBoolean(NotificationCompatJellybean.EXTRA_ALLOW_GENERATED_REPLIES,
183                action.getAllowGeneratedReplies());
184        actionBuilder.addExtras(actionExtras);
185        actionBuilder.setAllowGeneratedReplies(action.getAllowGeneratedReplies());
186        b.addAction(actionBuilder.build());
187    }
188}
189