Home | History | Annotate | Download | only in cts
      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