1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5 * except in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the 10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 11 * KIND, either express or implied. See the License for the specific language governing 12 * permissions and limitations under the License. 13 */ 14 15 package android.slice.cts; 16 17 import static org.junit.Assert.assertEquals; 18 import static org.junit.Assert.assertFalse; 19 import static org.junit.Assert.assertNotEquals; 20 import static org.junit.Assert.assertTrue; 21 22 import android.app.PendingIntent.CanceledException; 23 import android.app.slice.Slice; 24 import android.app.slice.SliceItem; 25 import android.app.slice.SliceManager; 26 import android.app.slice.SliceSpec; 27 import android.content.BroadcastReceiver; 28 import android.content.Context; 29 import android.content.Intent; 30 import android.content.IntentFilter; 31 import android.graphics.drawable.Icon; 32 import android.net.Uri; 33 import android.os.Bundle; 34 import android.slice.cts.SliceProvider.TestParcel; 35 import android.support.test.InstrumentationRegistry; 36 import android.support.test.runner.AndroidJUnit4; 37 38 import org.junit.Test; 39 import org.junit.runner.RunWith; 40 41 import java.util.Arrays; 42 import java.util.Collection; 43 import java.util.Collections; 44 import java.util.Iterator; 45 import java.util.concurrent.CountDownLatch; 46 import java.util.concurrent.TimeUnit; 47 48 @RunWith(AndroidJUnit4.class) 49 public class SliceBindingTest { 50 51 public static boolean sFlag = false; 52 53 private static final Uri BASE_URI = Uri.parse("content://android.slice.cts/"); 54 private final Context mContext = InstrumentationRegistry.getContext(); 55 private final SliceManager mSliceManager = mContext.getSystemService(SliceManager.class); 56 57 @Test 58 public void testProcess() { 59 sFlag = false; 60 mSliceManager.bindSlice(BASE_URI.buildUpon().appendPath("set_flag").build(), 61 Collections.emptySet()); 62 assertFalse(sFlag); 63 } 64 65 @Test 66 public void testType() { 67 assertEquals(SliceProvider.SLICE_TYPE, 68 mContext.getContentResolver().getType(BASE_URI)); 69 } 70 71 @Test 72 public void testSliceUri() { 73 Slice s = mSliceManager.bindSlice(BASE_URI, 74 Collections.emptySet()); 75 assertEquals(BASE_URI, s.getUri()); 76 } 77 78 @Test 79 public void testSubSlice() { 80 Uri uri = BASE_URI.buildUpon().appendPath("subslice").build(); 81 Slice s = mSliceManager.bindSlice(uri, Collections.emptySet()); 82 assertEquals(uri, s.getUri()); 83 assertEquals(1, s.getItems().size()); 84 85 SliceItem item = s.getItems().get(0); 86 assertEquals(SliceItem.FORMAT_SLICE, item.getFormat()); 87 assertEquals("subslice", item.getSubType()); 88 // The item should start with the same Uri as the parent, but be different. 89 assertTrue(item.getSlice().getUri().toString().startsWith(uri.toString())); 90 assertNotEquals(uri, item.getSlice().getUri()); 91 } 92 93 @Test 94 public void testText() { 95 Uri uri = BASE_URI.buildUpon().appendPath("text").build(); 96 Slice s = mSliceManager.bindSlice(uri, 97 Collections.emptySet()); 98 assertEquals(uri, s.getUri()); 99 assertEquals(1, s.getItems().size()); 100 101 SliceItem item = s.getItems().get(0); 102 assertEquals(SliceItem.FORMAT_TEXT, item.getFormat()); 103 // TODO: Test spannables here. 104 assertEquals("Expected text", item.getText()); 105 } 106 107 @Test 108 public void testIcon() { 109 Uri uri = BASE_URI.buildUpon().appendPath("icon").build(); 110 Slice s = mSliceManager.bindSlice(uri, 111 Collections.emptySet()); 112 assertEquals(uri, s.getUri()); 113 assertEquals(1, s.getItems().size()); 114 115 SliceItem item = s.getItems().get(0); 116 assertEquals(SliceItem.FORMAT_IMAGE, item.getFormat()); 117 assertEquals(Icon.createWithResource(mContext, R.drawable.size_48x48).toString(), 118 item.getIcon().toString()); 119 } 120 121 @Test 122 public void testAction() { 123 sFlag = false; 124 CountDownLatch latch = new CountDownLatch(1); 125 BroadcastReceiver receiver = new BroadcastReceiver() { 126 @Override 127 public void onReceive(Context context, Intent intent) { 128 sFlag = true; 129 latch.countDown(); 130 } 131 }; 132 mContext.registerReceiver(receiver, 133 new IntentFilter(mContext.getPackageName() + ".action")); 134 Uri uri = BASE_URI.buildUpon().appendPath("action").build(); 135 Slice s = mSliceManager.bindSlice(uri, Collections.emptySet()); 136 assertEquals(uri, s.getUri()); 137 assertEquals(1, s.getItems().size()); 138 139 SliceItem item = s.getItems().get(0); 140 assertEquals(SliceItem.FORMAT_ACTION, item.getFormat()); 141 try { 142 item.getAction().send(); 143 } catch (CanceledException e) { 144 } 145 146 try { 147 latch.await(100, TimeUnit.MILLISECONDS); 148 } catch (InterruptedException e) { 149 e.printStackTrace(); 150 } 151 assertTrue(sFlag); 152 mContext.unregisterReceiver(receiver); 153 } 154 155 @Test 156 public void testInt() { 157 Uri uri = BASE_URI.buildUpon().appendPath("int").build(); 158 Slice s = mSliceManager.bindSlice(uri, Collections.emptySet()); 159 assertEquals(uri, s.getUri()); 160 assertEquals(1, s.getItems().size()); 161 162 SliceItem item = s.getItems().get(0); 163 assertEquals(SliceItem.FORMAT_INT, item.getFormat()); 164 assertEquals(0xff121212, item.getInt()); 165 } 166 167 @Test 168 public void testTimestamp() { 169 Uri uri = BASE_URI.buildUpon().appendPath("timestamp").build(); 170 Slice s = mSliceManager.bindSlice(uri, 171 Collections.emptySet()); 172 assertEquals(uri, s.getUri()); 173 assertEquals(1, s.getItems().size()); 174 175 SliceItem item = s.getItems().get(0); 176 assertEquals(SliceItem.FORMAT_LONG, item.getFormat()); 177 assertEquals(43, item.getLong()); 178 } 179 180 @Test 181 public void testHints() { 182 // Note this tests that hints are propagated through to the client but not that any specific 183 // hints have any effects. 184 Uri uri = BASE_URI.buildUpon().appendPath("hints").build(); 185 Slice s = mSliceManager.bindSlice(uri, Collections.emptySet()); 186 assertEquals(uri, s.getUri()); 187 188 assertEquals(Arrays.asList(Slice.HINT_LIST), s.getHints()); 189 assertEquals(Arrays.asList(Slice.HINT_TITLE), s.getItems().get(0).getHints()); 190 assertEquals(Arrays.asList(Slice.HINT_NO_TINT, Slice.HINT_LARGE), 191 s.getItems().get(1).getHints()); 192 } 193 194 @Test 195 public void testHasHints() { 196 Uri uri = BASE_URI.buildUpon().appendPath("hints").build(); 197 Slice s = mSliceManager.bindSlice(uri, Collections.emptySet()); 198 199 assertTrue(s.getItems().get(0).hasHint(Slice.HINT_TITLE)); 200 assertFalse(s.getItems().get(0).hasHint(Slice.HINT_LIST)); 201 } 202 203 @Test 204 public void testBundle() { 205 Uri uri = BASE_URI.buildUpon().appendPath("bundle").build(); 206 Slice s = mSliceManager.bindSlice(uri, Collections.emptySet()); 207 assertEquals(uri, s.getUri()); 208 assertEquals(1, s.getItems().size()); 209 210 SliceItem item = s.getItems().get(0); 211 assertEquals(SliceItem.FORMAT_BUNDLE, item.getFormat()); 212 Bundle b = item.getBundle(); 213 b.setClassLoader(getClass().getClassLoader()); 214 assertEquals(new TestParcel(), b.getParcelable("a")); 215 } 216 217 @Test 218 public void testGetDescendants() { 219 Collection<Uri> allUris = mSliceManager.getSliceDescendants(BASE_URI); 220 assertEquals(SliceProvider.PATHS.length, allUris.size()); 221 Iterator<Uri> it = allUris.iterator(); 222 for (int i = 0; i < SliceProvider.PATHS.length; i++) { 223 assertEquals(SliceProvider.PATHS[i], it.next().getPath()); 224 } 225 226 assertEquals(0, mSliceManager.getSliceDescendants( 227 BASE_URI.buildUpon().appendPath("/nothing").build()).size()); 228 } 229 230 @Test 231 public void testGetSliceSpec() { 232 Uri uri = BASE_URI.buildUpon().appendPath("spec").build(); 233 Slice s = mSliceManager.bindSlice(uri, Collections.emptySet()); 234 assertEquals(new SliceSpec(SliceProvider.SPEC_TYPE, SliceProvider.SPEC_REV), s.getSpec()); 235 } 236 } 237