1b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen/*
2b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * Copyright (C) 2014 The Android Open Source Project
3b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen *
4b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * Licensed under the Apache License, Version 2.0 (the "License");
5b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * you may not use this file except in compliance with the License.
6b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * You may obtain a copy of the License at
7b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen *
8b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen *      http://www.apache.org/licenses/LICENSE-2.0
9b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen *
10b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * Unless required by applicable law or agreed to in writing, software
11b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * distributed under the License is distributed on an "AS IS" BASIS,
12b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * See the License for the specific language governing permissions and
14b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * limitations under the License.
15b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen */
16b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
17b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazenpackage android.support.v4.app;
18b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
19b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazenimport android.app.Notification;
20b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazenimport android.app.PendingIntent;
21ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazenimport android.app.RemoteInput;
22b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazenimport android.content.Context;
23b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazenimport android.graphics.Bitmap;
24b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazenimport android.os.Bundle;
252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport android.os.Parcelable;
26b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazenimport android.widget.RemoteViews;
27b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
28334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wrenimport java.util.ArrayList;
29334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren
30b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazenclass NotificationCompatApi20 {
31b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    public static class Builder implements NotificationBuilderWithBuilderAccessor,
32b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            NotificationBuilderWithActions {
33b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        private Notification.Builder b;
3443c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        private Bundle mExtras;
35c66cf89198b97dc7e62370e32010bfe4a98ce11eJulia Reynolds        private RemoteViews mContentView;
36c66cf89198b97dc7e62370e32010bfe4a98ce11eJulia Reynolds        private RemoteViews mBigContentView;
37b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
38b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Builder(Context context, Notification n,
39b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                CharSequence contentTitle, CharSequence contentText, CharSequence contentInfo,
40b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                RemoteViews tickerView, int number,
41b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                PendingIntent contentIntent, PendingIntent fullScreenIntent, Bitmap largeIcon,
4248d8878e34b0d9983166418378125b63faac9aabGriff Hazen                int progressMax, int progress, boolean progressIndeterminate, boolean showWhen,
43ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen                boolean useChronometer, int priority, CharSequence subText, boolean localOnly,
4443c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                ArrayList<String> people, Bundle extras, String groupKey, boolean groupSummary,
45c66cf89198b97dc7e62370e32010bfe4a98ce11eJulia Reynolds                String sortKey, RemoteViews contentView, RemoteViews bigContentView) {
46b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            b = new Notification.Builder(context)
47b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setWhen(n.when)
4848d8878e34b0d9983166418378125b63faac9aabGriff Hazen                .setShowWhen(showWhen)
49b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setSmallIcon(n.icon, n.iconLevel)
50b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setContent(n.contentView)
51b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setTicker(n.tickerText, tickerView)
52b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setSound(n.sound, n.audioStreamType)
53b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setVibrate(n.vibrate)
54b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setLights(n.ledARGB, n.ledOnMS, n.ledOffMS)
55b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setOngoing((n.flags & Notification.FLAG_ONGOING_EVENT) != 0)
56b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setOnlyAlertOnce((n.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0)
57b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setAutoCancel((n.flags & Notification.FLAG_AUTO_CANCEL) != 0)
58b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setDefaults(n.defaults)
59b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setContentTitle(contentTitle)
60b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setContentText(contentText)
61b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setSubText(subText)
62b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setContentInfo(contentInfo)
63b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setContentIntent(contentIntent)
64b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setDeleteIntent(n.deleteIntent)
65b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setFullScreenIntent(fullScreenIntent,
66b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        (n.flags & Notification.FLAG_HIGH_PRIORITY) != 0)
67b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setLargeIcon(largeIcon)
68b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setNumber(number)
69b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setUsesChronometer(useChronometer)
70b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setPriority(priority)
7143c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                .setProgress(progressMax, progress, progressIndeterminate)
72ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen                .setLocalOnly(localOnly)
73ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                .setGroup(groupKey)
74ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                .setGroupSummary(groupSummary)
75ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                .setSortKey(sortKey);
7643c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen            mExtras = new Bundle();
7743c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen            if (extras != null) {
7843c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                mExtras.putAll(extras);
7943c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen            }
8043c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen            if (people != null && !people.isEmpty()) {
8143c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                mExtras.putStringArray(Notification.EXTRA_PEOPLE,
8243c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                        people.toArray(new String[people.size()]));
83334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren            }
84c66cf89198b97dc7e62370e32010bfe4a98ce11eJulia Reynolds            mContentView = contentView;
85c66cf89198b97dc7e62370e32010bfe4a98ce11eJulia Reynolds            mBigContentView = bigContentView;
86b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
87b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
88b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
89ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public void addAction(NotificationCompatBase.Action action) {
9043c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen            NotificationCompatApi20.addAction(b, action);
91b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
92b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
93b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
94b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Notification.Builder getBuilder() {
95b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return b;
96b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
97b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
9810d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        @Override
99b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Notification build() {
10043c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen            b.setExtras(mExtras);
101c66cf89198b97dc7e62370e32010bfe4a98ce11eJulia Reynolds            Notification notification = b.build();
1023cf7cec91e0b038f9251273626a2237c802ecf67Julia Reynolds            if (mContentView != null) {
1033cf7cec91e0b038f9251273626a2237c802ecf67Julia Reynolds                notification.contentView = mContentView;
1043cf7cec91e0b038f9251273626a2237c802ecf67Julia Reynolds            }
1053cf7cec91e0b038f9251273626a2237c802ecf67Julia Reynolds            if (mBigContentView != null) {
1063cf7cec91e0b038f9251273626a2237c802ecf67Julia Reynolds                notification.bigContentView = mBigContentView;
1073cf7cec91e0b038f9251273626a2237c802ecf67Julia Reynolds            }
108c66cf89198b97dc7e62370e32010bfe4a98ce11eJulia Reynolds            return notification;
109b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
110b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    }
111b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
11243c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen    public static void addAction(Notification.Builder b, NotificationCompatBase.Action action) {
11343c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        Notification.Action.Builder actionBuilder = new Notification.Action.Builder(
11443c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                action.getIcon(), action.getTitle(), action.getActionIntent());
11543c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        if (action.getRemoteInputs() != null) {
11643c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen            for (RemoteInput remoteInput : RemoteInputCompatApi20.fromCompat(
11743c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                    action.getRemoteInputs())) {
11843c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                actionBuilder.addRemoteInput(remoteInput);
11943c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen            }
12043c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        }
121300828fd69bd2bfcefaf54795d03492938efd971Alex Hills        Bundle actionExtras;
12243c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        if (action.getExtras() != null) {
123300828fd69bd2bfcefaf54795d03492938efd971Alex Hills            actionExtras = new Bundle(action.getExtras());
124300828fd69bd2bfcefaf54795d03492938efd971Alex Hills        } else {
125300828fd69bd2bfcefaf54795d03492938efd971Alex Hills            actionExtras = new Bundle();
12643c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        }
127300828fd69bd2bfcefaf54795d03492938efd971Alex Hills        actionExtras.putBoolean(NotificationCompatJellybean.EXTRA_ALLOW_GENERATED_REPLIES,
128300828fd69bd2bfcefaf54795d03492938efd971Alex Hills                action.getAllowGeneratedReplies());
129b75bd093faa15b6308a29477f9cf6ce3607b3fe5Alex Hills        actionBuilder.addExtras(actionExtras);
13043c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        b.addAction(actionBuilder.build());
13143c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen    }
13243c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen
133ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static NotificationCompatBase.Action getAction(Notification notif,
1342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            int actionIndex, NotificationCompatBase.Action.Factory actionFactory,
1352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory) {
1362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        return getActionCompatFromAction(notif.actions[actionIndex], actionFactory, remoteInputFactory);
1372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    }
1382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
1392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    private static NotificationCompatBase.Action getActionCompatFromAction(
1402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            Notification.Action action, NotificationCompatBase.Action.Factory actionFactory,
141ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory) {
142ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        RemoteInputCompatBase.RemoteInput[] remoteInputs = RemoteInputCompatApi20.toCompat(
143ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                action.getRemoteInputs(), remoteInputFactory);
144300828fd69bd2bfcefaf54795d03492938efd971Alex Hills        boolean allowGeneratedReplies = action.getExtras().getBoolean(
145300828fd69bd2bfcefaf54795d03492938efd971Alex Hills                NotificationCompatJellybean.EXTRA_ALLOW_GENERATED_REPLIES);
1462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        return actionFactory.build(action.icon, action.title, action.actionIntent,
147300828fd69bd2bfcefaf54795d03492938efd971Alex Hills                action.getExtras(), remoteInputs, allowGeneratedReplies);
148300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    }
149300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    private static Notification.Action getActionFromActionCompat(
1512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            NotificationCompatBase.Action actionCompat) {
1522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        Notification.Action.Builder actionBuilder = new Notification.Action.Builder(
1532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                actionCompat.getIcon(), actionCompat.getTitle(), actionCompat.getActionIntent())
1542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                .addExtras(actionCompat.getExtras());
1552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        RemoteInputCompatBase.RemoteInput[] remoteInputCompats = actionCompat.getRemoteInputs();
1562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        if (remoteInputCompats != null) {
1572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            RemoteInput[] remoteInputs = RemoteInputCompatApi20.fromCompat(remoteInputCompats);
1582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            for (RemoteInput remoteInput : remoteInputs) {
1592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                actionBuilder.addRemoteInput(remoteInput);
1602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
1612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
1622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        return actionBuilder.build();
1632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    }
1642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
1652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    /**
1662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * Get a list of notification compat actions by parsing actions stored within a list of
1672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * parcelables using the {@link Bundle#getParcelableArrayList} function in the same
1682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * manner that framework code would do so. In API20, Using Action parcelable directly
1692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * is correct.
1702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     */
1712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    public static NotificationCompatBase.Action[] getActionsFromParcelableArrayList(
1722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            ArrayList<Parcelable> parcelables,
1732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            NotificationCompatBase.Action.Factory actionFactory,
1742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory) {
1752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        if (parcelables == null) {
1762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return null;
1772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
1782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        NotificationCompatBase.Action[] actions = actionFactory.newArray(parcelables.size());
1792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        for (int i = 0; i < actions.length; i++) {
1802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            Notification.Action action = (Notification.Action) parcelables.get(i);
1812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            actions[i] = getActionCompatFromAction(action, actionFactory, remoteInputFactory);
1822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
1832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        return actions;
1842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    }
1852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
1862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    /**
1872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * Get an array list of parcelables, suitable for {@link Bundle#putParcelableArrayList},
1882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * that matches what framework code would do to store an actions list in this way. In API20,
1892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * action parcelables were directly placed as entries in the array list.
1902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     */
1912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    public static ArrayList<Parcelable> getParcelableArrayListForActions(
1922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            NotificationCompatBase.Action[] actions) {
1932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        if (actions == null) {
1942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return null;
1952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
1962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        ArrayList<Parcelable> parcelables = new ArrayList<Parcelable>(actions.length);
1972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        for (NotificationCompatBase.Action action : actions) {
1982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            parcelables.add(getActionFromActionCompat(action));
1992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
2002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        return parcelables;
2012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    }
2022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
203b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    public static boolean getLocalOnly(Notification notif) {
204b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        return (notif.flags & Notification.FLAG_LOCAL_ONLY) != 0;
205b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    }
206ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
207ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static String getGroup(Notification notif) {
208ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return notif.getGroup();
209ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
210ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
211ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static boolean isGroupSummary(Notification notif) {
212ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return (notif.flags & Notification.FLAG_GROUP_SUMMARY) != 0;
213ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
214ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
215ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static String getSortKey(Notification notif) {
216ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return notif.getSortKey();
217ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
218b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen}
219