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