147702147608084fec16a50640da54b412c737b9cGriff Hazen/*
247702147608084fec16a50640da54b412c737b9cGriff Hazen * Copyright (C) 2014 The Android Open Source Project
347702147608084fec16a50640da54b412c737b9cGriff Hazen *
447702147608084fec16a50640da54b412c737b9cGriff Hazen * Licensed under the Apache License, Version 2.0 (the "License");
547702147608084fec16a50640da54b412c737b9cGriff Hazen * you may not use this file except in compliance with the License.
647702147608084fec16a50640da54b412c737b9cGriff Hazen * You may obtain a copy of the License at
747702147608084fec16a50640da54b412c737b9cGriff Hazen *
847702147608084fec16a50640da54b412c737b9cGriff Hazen *      http://www.apache.org/licenses/LICENSE-2.0
947702147608084fec16a50640da54b412c737b9cGriff Hazen *
1047702147608084fec16a50640da54b412c737b9cGriff Hazen * Unless required by applicable law or agreed to in writing, software
1147702147608084fec16a50640da54b412c737b9cGriff Hazen * distributed under the License is distributed on an "AS IS" BASIS,
1247702147608084fec16a50640da54b412c737b9cGriff Hazen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1347702147608084fec16a50640da54b412c737b9cGriff Hazen * See the License for the specific language governing permissions and
1447702147608084fec16a50640da54b412c737b9cGriff Hazen * limitations under the License.
1547702147608084fec16a50640da54b412c737b9cGriff Hazen */
1647702147608084fec16a50640da54b412c737b9cGriff Hazen
1747702147608084fec16a50640da54b412c737b9cGriff Hazenpackage android.support.v4.app;
1847702147608084fec16a50640da54b412c737b9cGriff Hazen
1947702147608084fec16a50640da54b412c737b9cGriff Hazenimport android.app.Notification;
2047702147608084fec16a50640da54b412c737b9cGriff Hazenimport android.app.PendingIntent;
2147702147608084fec16a50640da54b412c737b9cGriff Hazenimport android.content.Context;
2247702147608084fec16a50640da54b412c737b9cGriff Hazenimport android.graphics.Bitmap;
2347702147608084fec16a50640da54b412c737b9cGriff Hazenimport android.os.Bundle;
24300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazenimport android.util.SparseArray;
2547702147608084fec16a50640da54b412c737b9cGriff Hazenimport android.widget.RemoteViews;
2647702147608084fec16a50640da54b412c737b9cGriff Hazen
27334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wrenimport java.util.ArrayList;
28300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazenimport java.util.List;
29334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren
3047702147608084fec16a50640da54b412c737b9cGriff Hazenclass NotificationCompatKitKat {
3147702147608084fec16a50640da54b412c737b9cGriff Hazen    public static class Builder implements NotificationBuilderWithBuilderAccessor,
3247702147608084fec16a50640da54b412c737b9cGriff Hazen            NotificationBuilderWithActions {
3347702147608084fec16a50640da54b412c737b9cGriff Hazen        private Notification.Builder b;
3447702147608084fec16a50640da54b412c737b9cGriff Hazen        private Bundle mExtras;
35300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        private List<Bundle> mActionExtrasList = new ArrayList<Bundle>();
36c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds        private RemoteViews mContentView;
37c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds        private RemoteViews mBigContentView;
3847702147608084fec16a50640da54b412c737b9cGriff Hazen
3947702147608084fec16a50640da54b412c737b9cGriff Hazen        public Builder(Context context, Notification n,
4047702147608084fec16a50640da54b412c737b9cGriff Hazen                CharSequence contentTitle, CharSequence contentText, CharSequence contentInfo,
4147702147608084fec16a50640da54b412c737b9cGriff Hazen                RemoteViews tickerView, int number,
4247702147608084fec16a50640da54b412c737b9cGriff Hazen                PendingIntent contentIntent, PendingIntent fullScreenIntent, Bitmap largeIcon,
4348d8878e34b0d9983166418378125b63faac9aabGriff Hazen                int progressMax, int progress, boolean progressIndeterminate, boolean showWhen,
4447702147608084fec16a50640da54b412c737b9cGriff Hazen                boolean useChronometer, int priority, CharSequence subText, boolean localOnly,
45cd05a19c0775e69e93e4c93b0a48ab044b531d7aGriff Hazen                ArrayList<String> people, Bundle extras, String groupKey, boolean groupSummary,
46c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds                String sortKey, RemoteViews contentView, RemoteViews bigContentView) {
4747702147608084fec16a50640da54b412c737b9cGriff Hazen            b = new Notification.Builder(context)
4847702147608084fec16a50640da54b412c737b9cGriff Hazen                .setWhen(n.when)
4948d8878e34b0d9983166418378125b63faac9aabGriff Hazen                .setShowWhen(showWhen)
5047702147608084fec16a50640da54b412c737b9cGriff Hazen                .setSmallIcon(n.icon, n.iconLevel)
5147702147608084fec16a50640da54b412c737b9cGriff Hazen                .setContent(n.contentView)
5247702147608084fec16a50640da54b412c737b9cGriff Hazen                .setTicker(n.tickerText, tickerView)
5347702147608084fec16a50640da54b412c737b9cGriff Hazen                .setSound(n.sound, n.audioStreamType)
5447702147608084fec16a50640da54b412c737b9cGriff Hazen                .setVibrate(n.vibrate)
5547702147608084fec16a50640da54b412c737b9cGriff Hazen                .setLights(n.ledARGB, n.ledOnMS, n.ledOffMS)
5647702147608084fec16a50640da54b412c737b9cGriff Hazen                .setOngoing((n.flags & Notification.FLAG_ONGOING_EVENT) != 0)
5747702147608084fec16a50640da54b412c737b9cGriff Hazen                .setOnlyAlertOnce((n.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0)
5847702147608084fec16a50640da54b412c737b9cGriff Hazen                .setAutoCancel((n.flags & Notification.FLAG_AUTO_CANCEL) != 0)
5947702147608084fec16a50640da54b412c737b9cGriff Hazen                .setDefaults(n.defaults)
6047702147608084fec16a50640da54b412c737b9cGriff Hazen                .setContentTitle(contentTitle)
6147702147608084fec16a50640da54b412c737b9cGriff Hazen                .setContentText(contentText)
6247702147608084fec16a50640da54b412c737b9cGriff Hazen                .setSubText(subText)
6347702147608084fec16a50640da54b412c737b9cGriff Hazen                .setContentInfo(contentInfo)
6447702147608084fec16a50640da54b412c737b9cGriff Hazen                .setContentIntent(contentIntent)
6547702147608084fec16a50640da54b412c737b9cGriff Hazen                .setDeleteIntent(n.deleteIntent)
6647702147608084fec16a50640da54b412c737b9cGriff Hazen                .setFullScreenIntent(fullScreenIntent,
6747702147608084fec16a50640da54b412c737b9cGriff Hazen                        (n.flags & Notification.FLAG_HIGH_PRIORITY) != 0)
6847702147608084fec16a50640da54b412c737b9cGriff Hazen                .setLargeIcon(largeIcon)
6947702147608084fec16a50640da54b412c737b9cGriff Hazen                .setNumber(number)
7047702147608084fec16a50640da54b412c737b9cGriff Hazen                .setUsesChronometer(useChronometer)
7147702147608084fec16a50640da54b412c737b9cGriff Hazen                .setPriority(priority)
7243c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                .setProgress(progressMax, progress, progressIndeterminate);
73ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            mExtras = new Bundle();
74ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            if (extras != null) {
75ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                mExtras.putAll(extras);
76ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            }
77ef9064724c669d8f72a8682b6e7b122008921d43Chris Wren            if (people != null && !people.isEmpty()) {
78cd05a19c0775e69e93e4c93b0a48ab044b531d7aGriff Hazen                mExtras.putStringArray(Notification.EXTRA_PEOPLE,
79ef9064724c669d8f72a8682b6e7b122008921d43Chris Wren                        people.toArray(new String[people.size()]));
80ef9064724c669d8f72a8682b6e7b122008921d43Chris Wren            }
8147702147608084fec16a50640da54b412c737b9cGriff Hazen            if (localOnly) {
82ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                mExtras.putBoolean(NotificationCompatJellybean.EXTRA_LOCAL_ONLY, true);
83ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            }
84ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            if (groupKey != null) {
85ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                mExtras.putString(NotificationCompatJellybean.EXTRA_GROUP_KEY, groupKey);
86ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                if (groupSummary) {
87ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    mExtras.putBoolean(NotificationCompatJellybean.EXTRA_GROUP_SUMMARY, true);
88ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                } else {
89ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    mExtras.putBoolean(NotificationCompatJellybean.EXTRA_USE_SIDE_CHANNEL, true);
90ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                }
91ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            }
92ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            if (sortKey != null) {
93ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                mExtras.putString(NotificationCompatJellybean.EXTRA_SORT_KEY, sortKey);
9447702147608084fec16a50640da54b412c737b9cGriff Hazen            }
95c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            mContentView = contentView;
96c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            mBigContentView = bigContentView;
9747702147608084fec16a50640da54b412c737b9cGriff Hazen        }
9847702147608084fec16a50640da54b412c737b9cGriff Hazen
9947702147608084fec16a50640da54b412c737b9cGriff Hazen        @Override
100ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public void addAction(NotificationCompatBase.Action action) {
101ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            mActionExtrasList.add(NotificationCompatJellybean.writeActionAndGetExtras(b, action));
10247702147608084fec16a50640da54b412c737b9cGriff Hazen        }
10347702147608084fec16a50640da54b412c737b9cGriff Hazen
10447702147608084fec16a50640da54b412c737b9cGriff Hazen        @Override
10547702147608084fec16a50640da54b412c737b9cGriff Hazen        public Notification.Builder getBuilder() {
10647702147608084fec16a50640da54b412c737b9cGriff Hazen            return b;
10747702147608084fec16a50640da54b412c737b9cGriff Hazen        }
10847702147608084fec16a50640da54b412c737b9cGriff Hazen
10910d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        @Override
11047702147608084fec16a50640da54b412c737b9cGriff Hazen        public Notification build() {
111300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            SparseArray<Bundle> actionExtrasMap = NotificationCompatJellybean.buildActionExtrasMap(
112300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                    mActionExtrasList);
113300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            if (actionExtrasMap != null) {
114300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                // Add the action extras sparse array if any action was added with extras.
115ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                mExtras.putSparseParcelableArray(
116300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                        NotificationCompatJellybean.EXTRA_ACTION_EXTRAS, actionExtrasMap);
117300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
118ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            b.setExtras(mExtras);
119c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            Notification notification = b.build();
120c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            if (mContentView != null) {
121c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds                notification.contentView = mContentView;
122c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            }
123c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            if (mBigContentView != null) {
124c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds                notification.bigContentView = mBigContentView;
125c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            }
126c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            return notification;
12747702147608084fec16a50640da54b412c737b9cGriff Hazen        }
12847702147608084fec16a50640da54b412c737b9cGriff Hazen    }
12947702147608084fec16a50640da54b412c737b9cGriff Hazen
13047702147608084fec16a50640da54b412c737b9cGriff Hazen    public static Bundle getExtras(Notification notif) {
13147702147608084fec16a50640da54b412c737b9cGriff Hazen        return notif.extras;
13247702147608084fec16a50640da54b412c737b9cGriff Hazen    }
13347702147608084fec16a50640da54b412c737b9cGriff Hazen
134300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    public static int getActionCount(Notification notif) {
135300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        return notif.actions != null ? notif.actions.length : 0;
136300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    }
137300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
138ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static NotificationCompatBase.Action getAction(Notification notif,
139ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            int actionIndex, NotificationCompatBase.Action.Factory factory,
140ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory) {
141300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        Notification.Action action = notif.actions[actionIndex];
142300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        Bundle actionExtras = null;
143300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        SparseArray<Bundle> actionExtrasMap = notif.extras.getSparseParcelableArray(
144300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                NotificationCompatJellybean.EXTRA_ACTION_EXTRAS);
145300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        if (actionExtrasMap != null) {
146300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            actionExtras = actionExtrasMap.get(actionIndex);
147300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
148ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return NotificationCompatJellybean.readAction(factory, remoteInputFactory,
149ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                action.icon, action.title, action.actionIntent, actionExtras);
150300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    }
151300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
15247702147608084fec16a50640da54b412c737b9cGriff Hazen    public static boolean getLocalOnly(Notification notif) {
153ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return notif.extras.getBoolean(NotificationCompatJellybean.EXTRA_LOCAL_ONLY);
154ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
155ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
156ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static String getGroup(Notification notif) {
157ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return notif.extras.getString(NotificationCompatJellybean.EXTRA_GROUP_KEY);
158ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
159ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
160ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static boolean isGroupSummary(Notification notif) {
161ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return notif.extras.getBoolean(NotificationCompatJellybean.EXTRA_GROUP_SUMMARY);
162ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
163ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
164ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static String getSortKey(Notification notif) {
165ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return notif.extras.getString(NotificationCompatJellybean.EXTRA_SORT_KEY);
16647702147608084fec16a50640da54b412c737b9cGriff Hazen    }
16747702147608084fec16a50640da54b412c737b9cGriff Hazen}
168