SampleSliceProvider.java revision ec2359f11170a2742cd1650900de320aa22eab58
1e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/*
2e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Copyright 2017 The Android Open Source Project
3e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
4e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * you may not use this file except in compliance with the License.
6e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * You may obtain a copy of the License at
7e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
8e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
10e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * See the License for the specific language governing permissions and
14e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * limitations under the License.
15e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project */
16e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
17e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectpackage com.example.androidx.slice.demos;
18e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
19e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport static android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
20eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross
21122c7191dbac60e0a79c24551c142c98597354cdColin Crossimport static androidx.slice.builders.ListBuilder.ICON_IMAGE;
22e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport static androidx.slice.builders.ListBuilder.INFINITY;
23e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport static androidx.slice.builders.ListBuilder.LARGE_IMAGE;
24e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport static androidx.slice.builders.ListBuilder.SMALL_IMAGE;
25e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
26e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport android.app.PendingIntent;
27e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport android.content.ContentResolver;
28e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport android.content.Context;
29e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport android.content.Intent;
30e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport android.net.Uri;
31e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport android.net.wifi.WifiManager;
32e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport android.os.Handler;
33e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport android.provider.Settings;
34e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport android.text.SpannableString;
35e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport android.text.TextUtils;
36e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport android.text.format.DateUtils;
37e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport android.text.style.ForegroundColorSpan;
38e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport android.util.SparseArray;
391154fe3bd09d22a39b657726e019d8644069ea94Mark Salyzyn
40e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport androidx.annotation.NonNull;
41e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport androidx.core.graphics.drawable.IconCompat;
42e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport androidx.slice.Slice;
43e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport androidx.slice.SliceProvider;
44e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport androidx.slice.builders.GridRowBuilder;
451154fe3bd09d22a39b657726e019d8644069ea94Mark Salyzynimport androidx.slice.builders.ListBuilder;
461154fe3bd09d22a39b657726e019d8644069ea94Mark Salyzynimport androidx.slice.builders.MessagingSliceBuilder;
47e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport androidx.slice.builders.SliceAction;
48e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
49e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport java.util.Arrays;
50e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport java.util.Calendar;
51e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectimport java.util.concurrent.TimeUnit;
52e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
53e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/**
54e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Examples of using slice template builders.
55e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project */
56e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectpublic class SampleSliceProvider extends SliceProvider {
57e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
58e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    private static final boolean TEST_CUSTOM_SEE_MORE = false;
59e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
60e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    public static final String ACTION_WIFI_CHANGED =
61e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            "com.example.androidx.slice.action.WIFI_CHANGED";
62e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    public static final String ACTION_TOAST =
63e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            "com.example.androidx.slice.action.TOAST";
64d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross    public static final String EXTRA_TOAST_MESSAGE = "com.example.androidx.extra.TOAST_MESSAGE";
65e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    public static final String ACTION_TOAST_RANGE_VALUE =
66e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            "com.example.androidx.slice.action.TOAST_RANGE_VALUE";
67e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
68e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    public static final String[] URI_PATHS = {"message", "wifi", "note", "ride", "toggle",
69e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            "toggle2", "contact", "gallery", "weather", "reservation", "loadlist", "loadgrid",
70e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            "inputrange", "range", "contact2", "subscription"};
71e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
721154fe3bd09d22a39b657726e019d8644069ea94Mark Salyzyn    /**
731154fe3bd09d22a39b657726e019d8644069ea94Mark Salyzyn     * @return Uri with the provided path
74e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project     */
75122c7191dbac60e0a79c24551c142c98597354cdColin Cross    public static Uri getUri(String path, Context context) {
761154fe3bd09d22a39b657726e019d8644069ea94Mark Salyzyn        return new Uri.Builder()
77e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .scheme(ContentResolver.SCHEME_CONTENT)
78e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .authority(context.getPackageName())
79122c7191dbac60e0a79c24551c142c98597354cdColin Cross                .appendPath(path)
80122c7191dbac60e0a79c24551c142c98597354cdColin Cross                .build();
81122c7191dbac60e0a79c24551c142c98597354cdColin Cross    }
82122c7191dbac60e0a79c24551c142c98597354cdColin Cross
83122c7191dbac60e0a79c24551c142c98597354cdColin Cross    @Override
84122c7191dbac60e0a79c24551c142c98597354cdColin Cross    public boolean onCreateSliceProvider() {
85122c7191dbac60e0a79c24551c142c98597354cdColin Cross        return true;
86122c7191dbac60e0a79c24551c142c98597354cdColin Cross    }
87122c7191dbac60e0a79c24551c142c98597354cdColin Cross
88e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    @NonNull
89e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    @Override
90e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    public Uri onMapIntentToUri(Intent intent) {
91e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        return getUri("wifi", getContext());
92e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
93e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
94573a3c5f7888e80d0d4e0fb75ddfe746d4bd9358Manoj Gupta    @Override
95e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    public Slice onBindSlice(Uri sliceUri) {
96e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        String path = sliceUri.getPath();
97e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        if (!path.equals("/loadlist")) {
98e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            mListSummaries.clear();
99e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            mListLastUpdate = 0;
100e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        }
101e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        if (!path.equals("/loadgrid")) {
102e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            mGridSummaries.clear();
103e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            mGridLastUpdate = 0;
104e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        }
105e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        switch (path) {
106e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            // TODO: add list / grid slices with 'see more' options
107e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            case "/message":
108e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                return createMessagingSlice(sliceUri);
109e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            case "/wifi":
110e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                return createWifiSlice(sliceUri);
111e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            case "/note":
112e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                return createNoteSlice(sliceUri);
113e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            case "/ride":
114e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                return createRideSlice(sliceUri);
115e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            case "/toggle":
116e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                return createCustomToggleSlice(sliceUri);
117e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            case "/toggle2":
118e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                return createTwoCustomToggleSlices(sliceUri);
119e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            case "/contact":
120e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                return createContact(sliceUri);
121e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            case "/contact2":
122e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                return createContact2(sliceUri);
123e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            case "/gallery":
124e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                return createGallery(sliceUri);
125e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            case "/weather":
126e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                return createWeather(sliceUri);
127e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            case "/reservation":
128e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                return createReservationSlice(sliceUri);
1291154fe3bd09d22a39b657726e019d8644069ea94Mark Salyzyn            case "/loadlist":
130e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                return createLoadingListSlice(sliceUri);
131e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            case "/loadgrid":
132e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                return createLoadingGridSlice(sliceUri);
133e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            case "/inputrange":
134e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                return createStarRatingInputRange(sliceUri);
135e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            case "/range":
136573a3c5f7888e80d0d4e0fb75ddfe746d4bd9358Manoj Gupta                return createDownloadProgressRange(sliceUri);
137e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            case "/subscription":
138e4f082022e93544c9b548e71e3df3a8fb87a2ba0Chih-Hung Hsieh                return createCatSlice(sliceUri, false /* customSeeMore */);
139e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        }
140e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        throw new IllegalArgumentException("Unknown uri " + sliceUri);
141e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
142e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
143e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    private Slice createWeather(Uri sliceUri) {
144e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        SliceAction primaryAction = new SliceAction(getBroadcastIntent(ACTION_TOAST,
145e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                "open weather app"),
146e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                IconCompat.createWithResource(getContext(), R.drawable.weather_1),
147e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                "Weather is happening!");
148e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        return new ListBuilder(getContext(), sliceUri, INFINITY)
149e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .addGrid(gb -> gb
150e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .setPrimaryAction(primaryAction)
151e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addCell(cb -> cb
152e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                .addImage(IconCompat.createWithResource(getContext(),
153e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                        R.drawable.weather_1),
154e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                        SMALL_IMAGE)
155e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                .addText("MON")
156e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                .addTitleText("69\u00B0"))
157e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addCell(cb -> cb
158e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                .addImage(IconCompat.createWithResource(getContext(),
159e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                        R.drawable.weather_2),
160e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                        SMALL_IMAGE)
161e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                .addText("TUE")
162e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                .addTitleText("71\u00B0"))
163e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addCell(cb -> cb
164e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                .addImage(IconCompat.createWithResource(getContext(),
165e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                        R.drawable.weather_3),
166e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                        SMALL_IMAGE)
1671154fe3bd09d22a39b657726e019d8644069ea94Mark Salyzyn                                .addText("WED")
168e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                .addTitleText("76\u00B0"))
169e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addCell(cb -> cb
170e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                .addImage(IconCompat.createWithResource(getContext(),
171e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                        R.drawable.weather_4),
172e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                        SMALL_IMAGE)
173e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                .addText("THU")
17472f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                                .addTitleText("72\u00B0"))
17572f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                        .addCell(cb -> cb
17672f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                                .addImage(IconCompat.createWithResource(getContext(),
17772f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                                        R.drawable.weather_1),
17872f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                                        SMALL_IMAGE)
17972f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                                .addText("FRI")
18072f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                                .addTitleText("68\u00B0")))
18172f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                .build();
18272f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross    }
18372f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross
18472f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross    private Slice createGallery(Uri sliceUri) {
18572f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross        return new ListBuilder(getContext(), sliceUri, INFINITY)
18672f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                .setColor(0xff4285F4)
18772f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                .addRow(b -> b
18872f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                        .setTitle("Family trip to Hawaii")
18972f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                        .setSubtitle("Sep 30, 2017 - Oct 2, 2017"))
19072f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                .addAction(new SliceAction(
19172f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                        getBroadcastIntent(ACTION_TOAST, "cast photo album"),
19272f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                        IconCompat.createWithResource(getContext(), R.drawable.ic_cast),
19372f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                        "Cast photo album"))
19472f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                .addAction(new SliceAction(
19572f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                        getBroadcastIntent(ACTION_TOAST, "share photo album"),
19672f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                        IconCompat.createWithResource(getContext(), R.drawable.ic_share),
19772f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                        "Share photo album"))
198e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .addGrid(b -> b
199e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addCell(cb -> cb
200e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                .addImage(IconCompat.createWithResource(getContext(),
201e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                        R.drawable.slices_1),
202e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                        LARGE_IMAGE))
203e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addCell(cb -> cb
204e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                .addImage(IconCompat.createWithResource(getContext(),
205e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                        R.drawable.slices_2),
206e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                        LARGE_IMAGE))
207e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addCell(cb -> cb
208e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                .addImage(IconCompat.createWithResource(getContext(),
209e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                        R.drawable.slices_3),
210e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                        LARGE_IMAGE))
211e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addCell(cb -> cb
212e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                .addImage(IconCompat.createWithResource(getContext(),
213373d3c7257fa815d0b9ee8f16874470a6002042eChih-Hung Hsieh                                        R.drawable.slices_4),
214373d3c7257fa815d0b9ee8f16874470a6002042eChih-Hung Hsieh                                        LARGE_IMAGE))
215e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addCell(cb -> cb
216e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                .addImage(IconCompat.createWithResource(getContext(),
2171154fe3bd09d22a39b657726e019d8644069ea94Mark Salyzyn                                        R.drawable.slices_2),
2181154fe3bd09d22a39b657726e019d8644069ea94Mark Salyzyn                                        LARGE_IMAGE))
21972f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                        .addCell(cb -> cb
220122c7191dbac60e0a79c24551c142c98597354cdColin Cross                                .addImage(IconCompat.createWithResource(getContext(),
221bd86b3b10f8c57788177b5132e7078236683f185Colin Cross                                        R.drawable.slices_3),
222bd86b3b10f8c57788177b5132e7078236683f185Colin Cross                                        LARGE_IMAGE))
223e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addCell(cb -> cb
224d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                                .addImage(IconCompat.createWithResource(getContext(),
225d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                                        R.drawable.slices_4),
22680cb15504324667c9934ff350afff48881613393JP Abgrall                                        LARGE_IMAGE))
227e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addSeeMoreAction(getBroadcastIntent(ACTION_TOAST, "see your gallery"))
228e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .setContentDescription("Images from your trip to Hawaii"))
229e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .build();
230e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
231eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross
23272f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross    private Slice createCatSlice(Uri sliceUri, boolean customSeeMore) {
233122c7191dbac60e0a79c24551c142c98597354cdColin Cross        ListBuilder b = new ListBuilder(getContext(), sliceUri, INFINITY);
234bd86b3b10f8c57788177b5132e7078236683f185Colin Cross        GridRowBuilder gb = new GridRowBuilder(b);
235bd86b3b10f8c57788177b5132e7078236683f185Colin Cross        PendingIntent pi = getBroadcastIntent(ACTION_TOAST, "See cats you follow");
236eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross        if (customSeeMore) {
237eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross            GridRowBuilder.CellBuilder cb = new GridRowBuilder.CellBuilder(gb);
238eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross            cb.addImage(IconCompat.createWithResource(getContext(), R.drawable.ic_right_caret),
239eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                    ICON_IMAGE);
240122c7191dbac60e0a79c24551c142c98597354cdColin Cross            cb.setContentIntent(pi);
241bd86b3b10f8c57788177b5132e7078236683f185Colin Cross            cb.addTitleText("All cats");
242bd86b3b10f8c57788177b5132e7078236683f185Colin Cross            gb.addSeeMoreCell(cb);
243479747be63f3c8c33220d3c2690cac6b674746eaColin Cross        } else {
244eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross            gb.addSeeMoreAction(pi);
245eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross        }
246eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross        gb.addCell(new GridRowBuilder.CellBuilder(gb)
247eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                .addImage(IconCompat.createWithResource(getContext(), R.drawable.cat_1),
248eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                        SMALL_IMAGE)
249d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                .addTitleText("Oreo"))
250eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                .addCell(new GridRowBuilder.CellBuilder(gb)
251eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                        .addImage(IconCompat.createWithResource(getContext(), R.drawable.cat_2),
25272f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                                SMALL_IMAGE)
253eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                        .addTitleText("Silver"))
254eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                .addCell(new GridRowBuilder.CellBuilder(gb)
255479747be63f3c8c33220d3c2690cac6b674746eaColin Cross                        .addImage(IconCompat.createWithResource(getContext(), R.drawable.cat_3),
256eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                                SMALL_IMAGE)
257eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                        .addTitleText("Drake"))
258eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                .addCell(new GridRowBuilder.CellBuilder(gb)
259eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                        .addImage(IconCompat.createWithResource(getContext(), R.drawable.cat_5),
260eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                                SMALL_IMAGE)
261122c7191dbac60e0a79c24551c142c98597354cdColin Cross                        .addTitleText("Olive"))
262122c7191dbac60e0a79c24551c142c98597354cdColin Cross                .addCell(new GridRowBuilder.CellBuilder(gb)
263122c7191dbac60e0a79c24551c142c98597354cdColin Cross                        .addImage(IconCompat.createWithResource(getContext(), R.drawable.cat_4),
264bd86b3b10f8c57788177b5132e7078236683f185Colin Cross                                SMALL_IMAGE)
265bd86b3b10f8c57788177b5132e7078236683f185Colin Cross                        .addTitleText("Lady Marmalade"))
2669eed624c760b9c70de9a8f75ff84c5f085d62fdcElliott Hughes                .addCell(new GridRowBuilder.CellBuilder(gb)
267bd86b3b10f8c57788177b5132e7078236683f185Colin Cross                        .addImage(IconCompat.createWithResource(getContext(), R.drawable.cat_6),
268bd86b3b10f8c57788177b5132e7078236683f185Colin Cross                                SMALL_IMAGE)
2699eed624c760b9c70de9a8f75ff84c5f085d62fdcElliott Hughes                        .addTitleText("Grapefruit"));
2709eed624c760b9c70de9a8f75ff84c5f085d62fdcElliott Hughes        return b.addGridRow(gb).build();
271bd86b3b10f8c57788177b5132e7078236683f185Colin Cross    }
272479747be63f3c8c33220d3c2690cac6b674746eaColin Cross
2739eed624c760b9c70de9a8f75ff84c5f085d62fdcElliott Hughes    private Slice createContact2(Uri sliceUri) {
2749eed624c760b9c70de9a8f75ff84c5f085d62fdcElliott Hughes        ListBuilder b = new ListBuilder(getContext(), sliceUri, INFINITY);
275479747be63f3c8c33220d3c2690cac6b674746eaColin Cross        ListBuilder.RowBuilder rb = new ListBuilder.RowBuilder(b);
276eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross        GridRowBuilder gb = new GridRowBuilder(b);
277eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross        return b.setColor(0xff3949ab)
278eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                .addRow(rb
27972f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                        .setTitle("Mady Pitza")
28072f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                        .setSubtitle("Frequently contacted contact")
28172f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                        .addEndItem(IconCompat.createWithResource(getContext(), R.drawable.mady),
282eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                                SMALL_IMAGE))
283eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                .addGridRow(gb
284eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                        .addCell(new GridRowBuilder.CellBuilder(gb)
285eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                                .addImage(IconCompat.createWithResource(getContext(),
286eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                                        R.drawable.ic_call),
287e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                        ICON_IMAGE)
288eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                                .addText("Call")
289eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                                .setContentIntent(getBroadcastIntent(ACTION_TOAST, "call")))
290eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                        .addCell(new GridRowBuilder.CellBuilder(gb)
291eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                                .addImage(IconCompat.createWithResource(getContext(),
292eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                                        R.drawable.ic_text),
293eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                                        ICON_IMAGE)
294eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                                .addText("Text")
295eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                                .setContentIntent(getBroadcastIntent(ACTION_TOAST, "text")))
296eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                        .addCell(new GridRowBuilder.CellBuilder(gb)
297eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                                .addImage(IconCompat.createWithResource(getContext(),
298d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                                        R.drawable.ic_video), ICON_IMAGE)
299d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                                .setContentIntent(getBroadcastIntent(ACTION_TOAST, "video"))
300d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                                .addText("Video"))
301eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                        .addCell(new GridRowBuilder.CellBuilder(gb)
302eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                                .addImage(IconCompat.createWithResource(getContext(),
303eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                                        R.drawable.ic_email), ICON_IMAGE)
304eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                                .addText("Email")
305eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                                .setContentIntent(getBroadcastIntent(ACTION_TOAST, "email"))))
306eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                .build();
307eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross    }
308eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross
309eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross    private Slice createContact(Uri sliceUri) {
310e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        final long lastCalled = System.currentTimeMillis() - 20 * DateUtils.MINUTE_IN_MILLIS;
311e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        CharSequence lastCalledString = DateUtils.getRelativeTimeSpanString(lastCalled,
312e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                Calendar.getInstance().getTimeInMillis(),
313eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                DateUtils.MINUTE_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE);
314eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross        SliceAction primaryAction = new SliceAction(getBroadcastIntent(ACTION_TOAST,
315eff57afe53f2cbdf48f988b692036a7c470c41faColin Cross                "See contact info"), IconCompat.createWithResource(getContext(),
316e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                R.drawable.mady), SMALL_IMAGE, "Mady");
317e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
31876617ddbd19525a8d82e7304a0e4b1c771438329Thierry Strudel        return new ListBuilder(getContext(), sliceUri, INFINITY)
319e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .setColor(0xff3949ab)
320e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .setHeader(b -> b
321e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .setTitle("Mady Pitza")
322e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .setSummarySubtitle("Called " + lastCalledString)
323e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .setPrimaryAction(primaryAction))
324e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .addRow(b -> b
325e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .setTitleItem(
326e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                IconCompat.createWithResource(getContext(), R.drawable.ic_call),
327e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                ICON_IMAGE)
328e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .setTitle("314-259-2653")
329e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .setSubtitle("Call lasted 1 hr 17 min")
330e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addEndItem(lastCalled))
331e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .addRow(b -> b
332e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .setTitleItem(
333e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                IconCompat.createWithResource(getContext(), R.drawable.ic_text),
334e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                ICON_IMAGE)
335e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .setTitle("You: Coooooool see you then")
336e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addEndItem(System.currentTimeMillis() - 40 * DateUtils.MINUTE_IN_MILLIS))
337e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .addAction(new SliceAction(getBroadcastIntent(ACTION_TOAST, "call"),
338e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        IconCompat.createWithResource(getContext(), R.drawable.ic_call),
3391154fe3bd09d22a39b657726e019d8644069ea94Mark Salyzyn                        "Call mady"))
340e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .addAction(new SliceAction(getBroadcastIntent(ACTION_TOAST, "text"),
341e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        IconCompat.createWithResource(getContext(), R.drawable.ic_text),
342e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        "Text mady"))
343e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .addAction(new SliceAction(getBroadcastIntent(ACTION_TOAST, "video"),
344e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        IconCompat.createWithResource(getContext(), R.drawable.ic_video),
345e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        "Video call mady"))
346e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .addAction(new SliceAction(getBroadcastIntent(ACTION_TOAST, "email"),
347e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        IconCompat.createWithResource(getContext(), R.drawable.ic_email),
348e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        "Email mady"))
349e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .build();
350e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
351e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
35272f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross    private Slice createMessagingSlice(Uri sliceUri) {
35372f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross        // TODO: Remote input.
35472f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross        return new MessagingSliceBuilder(getContext(), sliceUri)
355122c7191dbac60e0a79c24551c142c98597354cdColin Cross                .add(b -> b
356e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addText("yo home \uD83C\uDF55, I emailed you the info")
357e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addTimestamp(System.currentTimeMillis() - 20 * DateUtils.MINUTE_IN_MILLIS)
358e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addSource(IconCompat.createWithResource(getContext(), R.drawable.mady)))
359e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .add(b -> b
3601154fe3bd09d22a39b657726e019d8644069ea94Mark Salyzyn                        .addText("just bought my tickets")
361bd86b3b10f8c57788177b5132e7078236683f185Colin Cross                        .addTimestamp(System.currentTimeMillis() - 10 * DateUtils.MINUTE_IN_MILLIS))
362bd86b3b10f8c57788177b5132e7078236683f185Colin Cross                .add(b -> b
363e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addText("yay! can't wait for getContext() weekend!\n"
364e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                + "\uD83D\uDE00")
365e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addTimestamp(System.currentTimeMillis() - 5 * DateUtils.MINUTE_IN_MILLIS)
366e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addSource(IconCompat.createWithResource(getContext(), R.drawable.mady)))
367e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .build();
368e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
369d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross    }
370d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross
371d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross    private Slice createNoteSlice(Uri sliceUri) {
372d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross        // TODO: Remote input.
373d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross        return new ListBuilder(getContext(), sliceUri, INFINITY)
374e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .setColor(0xfff4b400)
375e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .addRow(b -> b.setTitle("Create new note"))
376e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .addAction(new SliceAction(getBroadcastIntent(ACTION_TOAST, "create note"),
377e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        IconCompat.createWithResource(getContext(), R.drawable.ic_create),
378e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        "Create note"))
37976617ddbd19525a8d82e7304a0e4b1c771438329Thierry Strudel                .addAction(new SliceAction(getBroadcastIntent(ACTION_TOAST, "voice note"),
380d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                        IconCompat.createWithResource(getContext(), R.drawable.ic_voice),
381d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                        "Voice note"))
382d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                .addAction(new SliceAction(getIntent("android.media.action.IMAGE_CAPTURE"),
383d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                        IconCompat.createWithResource(getContext(), R.drawable.ic_camera),
384d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                        "Photo note"))
385d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                .build();
386e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
387e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
388e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    private Slice createReservationSlice(Uri sliceUri) {
389e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        return new ListBuilder(getContext(), sliceUri, INFINITY)
390e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .setColor(0xffFF5252)
391e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .setHeader(b -> b
392e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .setTitle("Upcoming trip to Seattle")
39376617ddbd19525a8d82e7304a0e4b1c771438329Thierry Strudel                        .setSubtitle("Feb 1 - 19 | 2 guests"))
394d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                .addAction(new SliceAction(
395d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                        getBroadcastIntent(ACTION_TOAST, "show location on map"),
396d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                        IconCompat.createWithResource(getContext(), R.drawable.ic_location),
397d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                        "Show reservation location"))
398e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .addAction(new SliceAction(getBroadcastIntent(ACTION_TOAST, "contact host"),
399e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        IconCompat.createWithResource(getContext(), R.drawable.ic_text),
400e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        "Contact host"))
401e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .addGrid(b -> b
402e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addCell(cb -> cb
403e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                .addImage(IconCompat.createWithResource(getContext(),
404e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                        R.drawable.reservation),
40576617ddbd19525a8d82e7304a0e4b1c771438329Thierry Strudel                                        LARGE_IMAGE)
406e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                .setContentDescription("Image of your reservation in Seattle")))
407e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .addGrid(b -> b
408e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addCell(cb -> cb
409d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                                .addTitleText("Check In")
410d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                                .addText("12:00 PM, Feb 1"))
4111154fe3bd09d22a39b657726e019d8644069ea94Mark Salyzyn                        .addCell(cb -> cb
412d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                                .addTitleText("Check Out")
413d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                                .addText("11:00 AM, Feb 19")))
414e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .build();
415e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
416e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
417e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    private Slice createRideSlice(Uri sliceUri) {
418e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        final ForegroundColorSpan colorSpan = new ForegroundColorSpan(0xff0F9D58);
419e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        SpannableString headerSubtitle = new SpannableString("Ride in 4 min");
420e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        headerSubtitle.setSpan(colorSpan, 8, headerSubtitle.length(), SPAN_EXCLUSIVE_EXCLUSIVE);
421573a3c5f7888e80d0d4e0fb75ddfe746d4bd9358Manoj Gupta        SpannableString homeSubtitle = new SpannableString("12 miles | 12 min | $9.00");
422e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        homeSubtitle.setSpan(colorSpan, 20, homeSubtitle.length(), SPAN_EXCLUSIVE_EXCLUSIVE);
423e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        SpannableString workSubtitle = new SpannableString("44 miles | 1 hour 45 min | $31.41");
424e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        workSubtitle.setSpan(colorSpan, 27, workSubtitle.length(), SPAN_EXCLUSIVE_EXCLUSIVE);
425d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross
426e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        SliceAction primaryAction = new SliceAction(getBroadcastIntent(ACTION_TOAST, "get ride"),
427e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                IconCompat.createWithResource(getContext(), R.drawable.ic_car), "Get Ride");
428e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        return new ListBuilder(getContext(), sliceUri, -TimeUnit.MINUTES.toMillis(2))
429e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .setColor(0xff0F9D58)
430e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .setHeader(b -> b
431e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .setTitle("Get ride")
432d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                        .setSubtitle(headerSubtitle)
433e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .setSummarySubtitle("Ride to work in 12 min | Ride home in 1 hour 45 min")
434122c7191dbac60e0a79c24551c142c98597354cdColin Cross                        .setPrimaryAction(primaryAction))
435e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .addRow(b -> b
436e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .setTitle("Work")
43772f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4Colin Cross                        .setSubtitle(workSubtitle)
438bd86b3b10f8c57788177b5132e7078236683f185Colin Cross                        .addEndItem(new SliceAction(getBroadcastIntent(ACTION_TOAST, "work"),
439bd86b3b10f8c57788177b5132e7078236683f185Colin Cross                                IconCompat.createWithResource(getContext(), R.drawable.ic_work),
440479747be63f3c8c33220d3c2690cac6b674746eaColin Cross                                "Get ride to work")))
441e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .addRow(b -> b
442e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .setTitle("Home")
443e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .setSubtitle(homeSubtitle)
444e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addEndItem(new SliceAction(getBroadcastIntent(ACTION_TOAST, "home"),
445e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                IconCompat.createWithResource(getContext(), R.drawable.ic_home),
446b03afb421def033e12ad1de4e0cb146e239fa301daegeun.song                                "Get ride home")))
447e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .build();
448e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
449b03afb421def033e12ad1de4e0cb146e239fa301daegeun.song
450e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    private Slice createCustomToggleSlice(Uri sliceUri) {
451b03afb421def033e12ad1de4e0cb146e239fa301daegeun.song        return new ListBuilder(getContext(), sliceUri, INFINITY)
452b03afb421def033e12ad1de4e0cb146e239fa301daegeun.song                .setColor(0xffff4081)
453b03afb421def033e12ad1de4e0cb146e239fa301daegeun.song                .addRow(b -> b
454b03afb421def033e12ad1de4e0cb146e239fa301daegeun.song                        .setTitle("Custom toggle")
455b03afb421def033e12ad1de4e0cb146e239fa301daegeun.song                        .setSubtitle("It can support two states")
456b03afb421def033e12ad1de4e0cb146e239fa301daegeun.song                        .setPrimaryAction(new SliceAction(getBroadcastIntent(ACTION_TOAST,
457b03afb421def033e12ad1de4e0cb146e239fa301daegeun.song                                "star toggled"),
458b03afb421def033e12ad1de4e0cb146e239fa301daegeun.song                                IconCompat.createWithResource(getContext(), R.drawable.toggle_star),
459b03afb421def033e12ad1de4e0cb146e239fa301daegeun.song                                "Toggle star", true /* isChecked */)))
460e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .build();
461e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
462e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
463e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    private Slice createTwoCustomToggleSlices(Uri sliceUri) {
464e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        return new ListBuilder(getContext(), sliceUri, INFINITY)
465e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .setColor(0xffff4081)
466e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .addRow(b -> b
467e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .setTitle("2 toggles")
468e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .setSubtitle("each supports two states")
469e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addEndItem(new SliceAction(
470e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                getBroadcastIntent(ACTION_TOAST, "first star toggled"),
471e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                IconCompat.createWithResource(getContext(), R.drawable.toggle_star),
472e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                "Toggle star", true /* isChecked */))
473e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        .addEndItem(new SliceAction(
474e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                getBroadcastIntent(ACTION_TOAST, "second star toggled"),
475e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                IconCompat.createWithResource(getContext(), R.drawable.toggle_star),
476e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                                "Toggle star", false /* isChecked */)))
477e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                .build();
478e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
479e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
480e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    private Slice createWifiSlice(Uri sliceUri) {
481e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        // Get wifi state
482e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        WifiManager wifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
483e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        int wifiState = wifiManager.getWifiState();
484e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        boolean wifiEnabled = false;
485e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        String state;
486e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        switch (wifiState) {
487e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            case WifiManager.WIFI_STATE_DISABLED:
488e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            case WifiManager.WIFI_STATE_DISABLING:
489d2b8656ce47ee08aba7cb95499deeb29254eb655Colin Cross                state = "disconnected";
490                break;
491            case WifiManager.WIFI_STATE_ENABLED:
492            case WifiManager.WIFI_STATE_ENABLING:
493                state = wifiManager.getConnectionInfo().getSSID();
494                wifiEnabled = true;
495                break;
496            case WifiManager.WIFI_STATE_UNKNOWN:
497            default:
498                state = ""; // just don't show anything?
499                break;
500        }
501
502        // Set the first row as a toggle
503        boolean finalWifiEnabled = wifiEnabled;
504        SliceAction primaryAction = new SliceAction(getIntent(Settings.ACTION_WIFI_SETTINGS),
505                IconCompat.createWithResource(getContext(), R.drawable.ic_wifi), "Wi-fi Settings");
506        String toggleCDString = wifiEnabled ? "Turn wifi off" : "Turn wifi on";
507        String sliceCDString = wifiEnabled ? "Wifi connected to " + state
508                : "Wifi disconnected, 10 networks available";
509        ListBuilder lb = new ListBuilder(getContext(), sliceUri, INFINITY)
510                .setColor(0xff4285f4)
511                .setHeader(b -> b
512                        .setTitle("Wi-fi")
513                        .setSubtitle(state)
514                        .setContentDescription(sliceCDString)
515                        .setPrimaryAction(primaryAction))
516                .addAction((new SliceAction(getBroadcastIntent(ACTION_WIFI_CHANGED, null),
517                        toggleCDString, finalWifiEnabled)));
518
519        // Add fake wifi networks
520        int[] wifiIcons = new int[]{R.drawable.ic_wifi_full, R.drawable.ic_wifi_low,
521                R.drawable.ic_wifi_fair};
522        for (int i = 0; i < 10; i++) {
523            final int iconId = wifiIcons[i % wifiIcons.length];
524            IconCompat icon = IconCompat.createWithResource(getContext(), iconId);
525            final String networkName = "Network" + i;
526            ListBuilder.RowBuilder rb = new ListBuilder.RowBuilder(lb);
527            rb.setTitleItem(icon, ICON_IMAGE).setTitle(networkName);
528            boolean locked = i % 3 == 0;
529            if (locked) {
530                rb.addEndItem(IconCompat.createWithResource(getContext(), R.drawable.ic_lock),
531                        ICON_IMAGE);
532                rb.setContentDescription("Connect to " + networkName + ", password needed");
533            } else {
534                rb.setContentDescription("Connect to " + networkName);
535            }
536            String message = locked ? "Open wifi password dialog" : "Connect to " + networkName;
537            rb.setPrimaryAction(new SliceAction(getBroadcastIntent(ACTION_TOAST, message), icon,
538                    message));
539            lb.addRow(rb);
540        }
541
542        // Add keywords
543        String[] keywords = new String[]{"internet", "wifi", "data", "network"};
544        lb.setKeywords(Arrays.asList(keywords));
545
546        // Add see more intent
547        if (TEST_CUSTOM_SEE_MORE) {
548            lb.addSeeMoreRow(rb -> rb
549                    .setTitle("See all available networks")
550                    .addEndItem(
551                            IconCompat.createWithResource(getContext(), R.drawable.ic_right_caret),
552                            SMALL_IMAGE)
553                    .setPrimaryAction(primaryAction));
554        } else {
555            lb.addSeeMoreAction(primaryAction.getAction());
556        }
557        return lb.build();
558    }
559
560    private Slice createStarRatingInputRange(Uri sliceUri) {
561        IconCompat icon = IconCompat.createWithResource(getContext(), R.drawable.ic_star_on);
562        SliceAction primaryAction =
563                new SliceAction(getBroadcastIntent(ACTION_TOAST, "open star rating"), icon, "Rate");
564        return new ListBuilder(getContext(), sliceUri, INFINITY)
565                .setColor(0xffff4081)
566                .addInputRange(c -> c
567                        .setTitle("Star rating")
568                        .setSubtitle("Pick a rating from 0 to 5")
569                        .setThumb(icon)
570                        .setInputAction(getBroadcastIntent(ACTION_TOAST_RANGE_VALUE, null))
571                        .setMax(5)
572                        .setValue(3)
573                        .setPrimaryAction(primaryAction)
574                        .setContentDescription("Slider for star ratings"))
575                .build();
576    }
577
578    private Slice createDownloadProgressRange(Uri sliceUri) {
579        IconCompat icon = IconCompat.createWithResource(getContext(), R.drawable.ic_star_on);
580        SliceAction primaryAction =
581                new SliceAction(
582                        getBroadcastIntent(ACTION_TOAST, "open download"), icon, "Download");
583        return new ListBuilder(getContext(), sliceUri, INFINITY)
584                .setColor(0xffff4081)
585                .addRange(c -> c
586                        .setTitle("Download progress")
587                        .setSubtitle("Download is happening")
588                        .setMax(100)
589                        .setValue(75)
590                        .setPrimaryAction(primaryAction))
591                .build();
592    }
593
594    private Handler mHandler = new Handler();
595    private SparseArray<String> mListSummaries = new SparseArray<>();
596    private long mListLastUpdate;
597    private SparseArray<String> mGridSummaries = new SparseArray<>();
598    private long mGridLastUpdate;
599
600    private void update(long delay, SparseArray<String> summaries, int id, String s, Uri uri,
601            Runnable r) {
602        mHandler.postDelayed(() -> {
603            summaries.put(id, s);
604            getContext().getContentResolver().notifyChange(uri, null);
605            r.run();
606        }, delay);
607    }
608
609    private Slice createLoadingListSlice(Uri sliceUri) {
610        boolean updating = mListLastUpdate == 0
611                || mListLastUpdate < (System.currentTimeMillis() - 10 * System.currentTimeMillis());
612        if (updating) {
613            Runnable r = () -> mListLastUpdate = System.currentTimeMillis();
614            update(1000, mListSummaries, 0, "44 miles | 1 hour 45 min | $31.41", sliceUri, r);
615            update(1500, mListSummaries, 1, "12 miles | 12 min | $9.00", sliceUri, r);
616            update(1700, mListSummaries, 2, "5 miles | 10 min | $8.00", sliceUri, r);
617        }
618        CharSequence work = mListSummaries.get(0, "");
619        CharSequence home = mListSummaries.get(1, "");
620        CharSequence school = mListSummaries.get(2, "");
621        Slice s = new ListBuilder(getContext(), sliceUri, -TimeUnit.MINUTES.toMillis(50))
622                .addRow(b -> b
623                        .setTitle("Work")
624                        .setSubtitle(work,
625                                updating || TextUtils.isEmpty(work))
626                        .addEndItem(IconCompat.createWithResource(getContext(), R.drawable.ic_work),
627                                ICON_IMAGE))
628                .addRow(b -> b
629                        .setTitle("Home")
630                        .setSubtitle(mListSummaries.get(1, ""),
631                                updating || TextUtils.isEmpty(home))
632                        .addEndItem(
633                                IconCompat.createWithResource(getContext(), R.drawable.ic_home),
634                                ICON_IMAGE))
635                .addRow(b -> b
636                        .setTitle("School")
637                        .setSubtitle(mListSummaries.get(2, ""),
638                                updating || TextUtils.isEmpty(school))
639                        .addEndItem(
640                                IconCompat.createWithResource(getContext(), R.drawable.ic_school),
641                                ICON_IMAGE))
642                .build();
643        return s;
644    }
645
646    // TODO: Should test large image grids
647    private Slice createLoadingGridSlice(Uri sliceUri) {
648        boolean updating = mGridLastUpdate == 0
649                || mGridLastUpdate < (System.currentTimeMillis() - 10 * System.currentTimeMillis());
650        if (updating) {
651            Runnable r = () -> mGridLastUpdate = System.currentTimeMillis();
652            update(2000, mGridSummaries, 0, "Heavy traffic in your area", sliceUri, r);
653            update(3500, mGridSummaries, 1, "Typical conditions with delays up to 28 min",
654                    sliceUri, r);
655            update(3000, mGridSummaries, 2, "41 min", sliceUri, r);
656            update(1500, mGridSummaries, 3, "33 min", sliceUri, r);
657            update(1000, mGridSummaries, 4, "12 min", sliceUri, r);
658        }
659        CharSequence title = mGridSummaries.get(0, "");
660        CharSequence subtitle = mGridSummaries.get(1, "");
661        CharSequence home = mGridSummaries.get(2, "");
662        CharSequence work = mGridSummaries.get(3, "");
663        CharSequence school = mGridSummaries.get(4, "");
664        Slice s = new ListBuilder(getContext(), sliceUri, INFINITY)
665                .setHeader(hb -> hb
666                        .setTitle(title,
667                                updating || TextUtils.isEmpty(title))
668                        .setSubtitle(subtitle,
669                                updating || TextUtils.isEmpty(subtitle)))
670                .addGrid(gb -> gb
671                        .addCell(cb -> cb
672                                .addImage(IconCompat.createWithResource(getContext(),
673                                        R.drawable.ic_home),
674                                        ICON_IMAGE)
675                                .addTitleText("Home")
676                                .addText(home,
677                                        updating || TextUtils.isEmpty(home)))
678                        .addCell(cb -> cb
679                                .addImage(IconCompat.createWithResource(getContext(),
680                                        R.drawable.ic_work),
681                                        ICON_IMAGE)
682                                .addTitleText("Work")
683                                .addText(work,
684                                        updating || TextUtils.isEmpty(work)))
685                        .addCell(cb -> cb
686                                .addImage(IconCompat.createWithResource(getContext(),
687                                        R.drawable.ic_school),
688                                        ICON_IMAGE)
689                                .addTitleText("School")
690                                .addText(school,
691                                        updating || TextUtils.isEmpty(school))))
692                .build();
693        return s;
694    }
695
696    private PendingIntent getIntent(String action) {
697        Intent intent = new Intent(action);
698        PendingIntent pi = PendingIntent.getActivity(getContext(), 0, intent, 0);
699        return pi;
700    }
701
702    private PendingIntent getBroadcastIntent(String action, String message) {
703        Intent intent = new Intent(action);
704        intent.setClass(getContext(), SliceBroadcastReceiver.class);
705        // Ensure a new PendingIntent is created for each message.
706        int requestCode = 0;
707        if (message != null) {
708            intent.putExtra(EXTRA_TOAST_MESSAGE, message);
709            requestCode = message.hashCode();
710        }
711        return PendingIntent.getBroadcast(getContext(), requestCode, intent,
712                PendingIntent.FLAG_UPDATE_CURRENT);
713    }
714}
715