blob: 89f3ac1e0fd4d5f7c6cc03f8661edc9a4e09e227 [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package android.slice.cts;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.app.PendingIntent;
import android.app.RemoteInput;
import android.app.slice.Slice;
import android.app.slice.SliceItem;
import android.app.slice.SliceSpec;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Icon;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcel;
import androidx.test.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@RunWith(AndroidJUnit4.class)
public class SliceBuilderTest {
private static final Uri BASE_URI = Uri.parse("content://android.slice.cts/");
private static final SliceSpec SPEC = new SliceSpec("", 1);
private final Context mContext = InstrumentationRegistry.getContext();
@Test
public void testInt() {
Slice s = new Slice.Builder(BASE_URI, SPEC)
.addInt(0xff121212, "subtype", Arrays.asList(Slice.HINT_TITLE))
.build();
assertEquals(BASE_URI, s.getUri());
assertEquals(1, s.getItems().size());
SliceItem item = s.getItems().get(0);
assertEquals(SliceItem.FORMAT_INT, item.getFormat());
assertEquals(0xff121212, item.getInt());
assertEquals("subtype", item.getSubType());
assertTrue(item.hasHint(Slice.HINT_TITLE));
verifySlice(s);
}
@Test
public void testIcon() {
Icon i = Icon.createWithResource(mContext, R.drawable.size_48x48);
Slice s = new Slice.Builder(BASE_URI, SPEC)
.addIcon(i, "subtype", Arrays.asList(Slice.HINT_TITLE))
.build();
assertEquals(BASE_URI, s.getUri());
assertEquals(1, s.getItems().size());
SliceItem item = s.getItems().get(0);
assertEquals(SliceItem.FORMAT_IMAGE, item.getFormat());
assertEquals(i, item.getIcon());
assertEquals("subtype", item.getSubType());
assertTrue(item.hasHint(Slice.HINT_TITLE));
verifySlice(s);
}
@Test
public void testText() {
CharSequence i = "Some text";
Slice s = new Slice.Builder(BASE_URI, SPEC)
.addText(i, "subtype", Arrays.asList(Slice.HINT_TITLE))
.build();
assertEquals(BASE_URI, s.getUri());
assertEquals(1, s.getItems().size());
SliceItem item = s.getItems().get(0);
assertEquals(SliceItem.FORMAT_TEXT, item.getFormat());
assertEquals(i, item.getText());
assertEquals("subtype", item.getSubType());
assertTrue(item.hasHint(Slice.HINT_TITLE));
verifySlice(s);
}
@Test
public void testLong() {
long i = 43L;
Slice s = new Slice.Builder(BASE_URI, SPEC)
.addLong(i, "subtype", Arrays.asList(Slice.HINT_TITLE))
.build();
assertEquals(BASE_URI, s.getUri());
assertEquals(1, s.getItems().size());
SliceItem item = s.getItems().get(0);
assertEquals(SliceItem.FORMAT_LONG, item.getFormat());
assertEquals(i, item.getLong());
assertEquals("subtype", item.getSubType());
assertTrue(item.hasHint(Slice.HINT_TITLE));
verifySlice(s);
}
@Test
public void testRemoteInput() {
RemoteInput i = new RemoteInput.Builder("key").build();
Slice s = new Slice.Builder(BASE_URI, SPEC)
.addRemoteInput(i, "subtype", Arrays.asList(Slice.HINT_TITLE))
.build();
assertEquals(BASE_URI, s.getUri());
assertEquals(1, s.getItems().size());
SliceItem item = s.getItems().get(0);
assertEquals(SliceItem.FORMAT_REMOTE_INPUT, item.getFormat());
assertEquals(i, item.getRemoteInput());
assertEquals("subtype", item.getSubType());
assertTrue(item.hasHint(Slice.HINT_TITLE));
verifySlice(s);
}
@Test
public void testBundle() {
Bundle i = new Bundle();
Slice s = new Slice.Builder(BASE_URI, SPEC)
.addBundle(i, "subtype", Arrays.asList(Slice.HINT_TITLE))
.build();
assertEquals(BASE_URI, s.getUri());
assertEquals(1, s.getItems().size());
SliceItem item = s.getItems().get(0);
assertEquals(SliceItem.FORMAT_BUNDLE, item.getFormat());
assertEquals(i, item.getBundle());
assertEquals("subtype", item.getSubType());
assertTrue(item.hasHint(Slice.HINT_TITLE));
verifySlice(s);
}
@Test
public void testActionSubtype() {
PendingIntent i = PendingIntent.getActivity(mContext, 0, new Intent(), 0);
Slice subSlice = new Slice.Builder(BASE_URI.buildUpon().appendPath("s").build(), SPEC)
.build();
Slice s = new Slice.Builder(BASE_URI, SPEC)
.addAction(i, subSlice, "subtype")
.build();
assertEquals(BASE_URI, s.getUri());
assertEquals(1, s.getItems().size());
SliceItem item = s.getItems().get(0);
assertEquals(SliceItem.FORMAT_ACTION, item.getFormat());
assertEquals(i, item.getAction());
assertEquals("subtype", item.getSubType());
assertEquals(subSlice, item.getSlice());
verifySlice(s);
}
@Test
public void testSubsliceSubtype() {
Slice subSlice = new Slice.Builder(BASE_URI.buildUpon().appendPath("s").build(), SPEC)
.build();
Slice s = new Slice.Builder(BASE_URI, SPEC)
.addSubSlice(subSlice, "subtype")
.build();
assertEquals(BASE_URI, s.getUri());
assertEquals(1, s.getItems().size());
SliceItem item = s.getItems().get(0);
assertEquals(SliceItem.FORMAT_SLICE, item.getFormat());
assertEquals("subtype", item.getSubType());
assertEquals(subSlice, item.getSlice());
verifySlice(s);
}
@Test
public void testSpec() {
Slice s = new Slice.Builder(BASE_URI, new SliceSpec("spec", 3))
.build();
assertEquals(BASE_URI, s.getUri());
assertEquals(0, s.getItems().size());
assertEquals(new SliceSpec("spec", 3), s.getSpec());
verifySlice(s);
}
@Test
public void testCallerNeeded() {
Slice s = new Slice.Builder(BASE_URI, SPEC)
.setCallerNeeded(true)
.build();
assertEquals(BASE_URI, s.getUri());
assertEquals(0, s.getItems().size());
assertTrue(s.isCallerNeeded());
s = new Slice.Builder(BASE_URI, SPEC)
.build();
assertEquals(BASE_URI, s.getUri());
assertEquals(0, s.getItems().size());
assertFalse(s.isCallerNeeded());
verifySlice(s);
}
private void verifySlice(Slice s) {
Parcel p = Parcel.obtain();
s.writeToParcel(p, 0);
p.setDataPosition(0);
Slice other = Slice.CREATOR.createFromParcel(p);
assertEquivalent(s, other);
p.recycle();
}
private void assertEquivalent(Slice s, Slice other) {
assertEquals(s.getUri(), other.getUri());
assertEquivalentHints(s.getHints(), other.getHints());
assertEquivalent(s.getItems(), other.getItems());
assertEquals(s.getSpec(), other.getSpec());
}
private void assertEquivalent(List<SliceItem> i1, List<SliceItem> i2) {
assertEquals(i1.size(), i2.size());
for (int i = 0; i < i1.size(); i++) {
assertEquivalent(i1.get(i), i2.get(i));
}
}
private void assertEquivalent(SliceItem s1, SliceItem s2) {
assertEquals(s1.getFormat(), s2.getFormat());
assertEquals(s1.getSubType(), s2.getSubType());
assertEquivalentHints(s1.getHints(), s2.getHints());
// TODO: Consider comparing content.
}
private void assertEquivalentHints(List<String> h1, List<String> h2) {
assertEquals(h1.size(), h2.size());
Collections.sort(h1);
Collections.sort(h2);
assertEquals(h1, h2);
}
}