blob: 0ede29dc37ff1e22bef1d6fc6aede9f3f2177509 [file] [log] [blame]
Jason Monk6fa0c9b2017-12-12 20:55:35 -05001/*
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.app.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;
Jason Monk98ae4f82017-12-18 11:29:07 -050025import static android.app.slice.SliceItem.FORMAT_INT;
Jason Monk6fa0c9b2017-12-12 20:55:35 -050026import static android.app.slice.SliceItem.FORMAT_SLICE;
27import static android.app.slice.SliceItem.FORMAT_TEXT;
28import static android.app.slice.SliceItem.FORMAT_TIMESTAMP;
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.graphics.drawable.Icon;
42import android.net.Uri;
43import android.support.test.InstrumentationRegistry;
44import android.support.test.filters.SmallTest;
45import android.support.test.runner.AndroidJUnit4;
46
47import org.junit.Test;
48import org.junit.runner.RunWith;
49
50import java.util.Arrays;
Jason Monka09cb672018-01-08 13:17:36 -050051import java.util.Collections;
Jason Monk6fa0c9b2017-12-12 20:55:35 -050052import java.util.concurrent.CountDownLatch;
53import java.util.concurrent.TimeUnit;
54
55import androidx.app.slice.core.test.R;
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.app.slice.core.test/");
64 private final Context mContext = InstrumentationRegistry.getContext();
65
66 @Test
67 public void testProcess() {
68 sFlag = false;
69 Slice.bindSlice(mContext,
Jason Monka09cb672018-01-08 13:17:36 -050070 BASE_URI.buildUpon().appendPath("set_flag").build(),
71 Collections.<SliceSpec>emptyList());
Jason Monk6fa0c9b2017-12-12 20:55:35 -050072 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() {
Jason Monka09cb672018-01-08 13:17:36 -050082 Slice s = Slice.bindSlice(mContext, BASE_URI, Collections.<SliceSpec>emptyList());
Jason Monk6fa0c9b2017-12-12 20:55:35 -050083 assertEquals(BASE_URI, s.getUri());
84 }
85
86 @Test
87 public void testSubSlice() {
88 Uri uri = BASE_URI.buildUpon().appendPath("subslice").build();
Jason Monka09cb672018-01-08 13:17:36 -050089 Slice s = Slice.bindSlice(mContext, uri, Collections.<SliceSpec>emptyList());
Jason Monk6fa0c9b2017-12-12 20:55:35 -050090 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();
Jason Monka09cb672018-01-08 13:17:36 -0500104 Slice s = Slice.bindSlice(mContext, uri, Collections.<SliceSpec>emptyList());
Jason Monk6fa0c9b2017-12-12 20:55:35 -0500105 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();
Jason Monka09cb672018-01-08 13:17:36 -0500117 Slice s = Slice.bindSlice(mContext, uri, Collections.<SliceSpec>emptyList());
Jason Monk6fa0c9b2017-12-12 20:55:35 -0500118 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 assertEquals(Icon.createWithResource(mContext, R.drawable.size_48x48).toString(),
124 item.getIcon().toString());
125 }
126
127 @Test
128 public void testAction() {
129 sFlag = false;
130 final CountDownLatch latch = new CountDownLatch(1);
131 BroadcastReceiver receiver = new BroadcastReceiver() {
132 @Override
133 public void onReceive(Context context, Intent intent) {
134 sFlag = true;
135 latch.countDown();
136 }
137 };
138 mContext.registerReceiver(receiver,
139 new IntentFilter(mContext.getPackageName() + ".action"));
140 Uri uri = BASE_URI.buildUpon().appendPath("action").build();
Jason Monka09cb672018-01-08 13:17:36 -0500141 Slice s = Slice.bindSlice(mContext, uri, Collections.<SliceSpec>emptyList());
Jason Monk6fa0c9b2017-12-12 20:55:35 -0500142 assertEquals(uri, s.getUri());
143 assertEquals(1, s.getItems().size());
144
145 SliceItem item = s.getItems().get(0);
146 assertEquals(FORMAT_ACTION, item.getFormat());
147 try {
148 item.getAction().send();
149 } catch (CanceledException e) {
150 }
151
152 try {
153 latch.await(100, TimeUnit.MILLISECONDS);
154 } catch (InterruptedException e) {
155 e.printStackTrace();
156 }
157 assertTrue(sFlag);
158 mContext.unregisterReceiver(receiver);
159 }
160
Jason Monk6fa0c9b2017-12-12 20:55:35 -0500161 @Test
162 public void testInt() {
163 Uri uri = BASE_URI.buildUpon().appendPath("int").build();
Jason Monka09cb672018-01-08 13:17:36 -0500164 Slice s = Slice.bindSlice(mContext, uri, Collections.<SliceSpec>emptyList());
Jason Monk6fa0c9b2017-12-12 20:55:35 -0500165 assertEquals(uri, s.getUri());
166 assertEquals(1, s.getItems().size());
167
168 SliceItem item = s.getItems().get(0);
169 assertEquals(FORMAT_INT, item.getFormat());
170 assertEquals(0xff121212, item.getInt());
171 }
Jason Monk6fa0c9b2017-12-12 20:55:35 -0500172
173 @Test
174 public void testTimestamp() {
175 Uri uri = BASE_URI.buildUpon().appendPath("timestamp").build();
Jason Monka09cb672018-01-08 13:17:36 -0500176 Slice s = Slice.bindSlice(mContext, uri, Collections.<SliceSpec>emptyList());
Jason Monk6fa0c9b2017-12-12 20:55:35 -0500177 assertEquals(uri, s.getUri());
178 assertEquals(1, s.getItems().size());
179
180 SliceItem item = s.getItems().get(0);
181 assertEquals(FORMAT_TIMESTAMP, item.getFormat());
182 assertEquals(43, item.getTimestamp());
183 }
184
185 @Test
186 public void testHints() {
187 // Note this tests that hints are propagated through to the client but not that any specific
188 // hints have any effects.
189 Uri uri = BASE_URI.buildUpon().appendPath("hints").build();
Jason Monka09cb672018-01-08 13:17:36 -0500190 Slice s = Slice.bindSlice(mContext, uri, Collections.<SliceSpec>emptyList());
Jason Monk6fa0c9b2017-12-12 20:55:35 -0500191 assertEquals(uri, s.getUri());
192
193 assertEquals(Arrays.asList(HINT_LIST), s.getHints());
194 assertEquals(Arrays.asList(HINT_TITLE), s.getItems().get(0).getHints());
195 assertEquals(Arrays.asList(HINT_NO_TINT, HINT_LARGE),
196 s.getItems().get(1).getHints());
197 }
198}