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