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.browser.browseractions;
18
19import static org.junit.Assert.assertEquals;
20import static org.junit.Assert.assertFalse;
21import static org.junit.Assert.assertNotNull;
22import static org.junit.Assert.assertTrue;
23
24import android.app.PendingIntent;
25import android.content.Context;
26import android.content.Intent;
27import android.net.Uri;
28import android.os.Bundle;
29import android.support.test.InstrumentationRegistry;
30import android.support.test.filters.SmallTest;
31import android.support.test.runner.AndroidJUnit4;
32
33import org.junit.Test;
34import org.junit.runner.RunWith;
35
36import java.util.ArrayList;
37import java.util.List;
38
39/** Unit tests for {@link BrowserActionsIntent}. */
40@RunWith(AndroidJUnit4.class)
41@SmallTest
42public final class BrowserActionsIntentTest {
43    private static final String TEST_URL = "http://www.example.com";
44    private static final String CUSTOM_ITEM_TITLE = "Share url";
45    private Uri mUri = Uri.parse(TEST_URL);
46    private Context mContext = InstrumentationRegistry.getTargetContext();
47
48    /**
49     * Test whether default {@link BrowserActionsIntent} is populated correctly.
50     */
51    @Test
52    public void testDefaultBrowserActionsIntent() {
53        BrowserActionsIntent browserActionsIntent =
54                new BrowserActionsIntent.Builder(mContext, mUri).build();
55        Intent intent = browserActionsIntent.getIntent();
56        assertNotNull(intent);
57
58        assertEquals(BrowserActionsIntent.ACTION_BROWSER_ACTIONS_OPEN, intent.getAction());
59        assertEquals(mUri, intent.getData());
60        assertTrue(intent.hasExtra(BrowserActionsIntent.EXTRA_TYPE));
61        assertEquals(BrowserActionsIntent.URL_TYPE_NONE,
62                intent.getIntExtra(BrowserActionsIntent.EXTRA_TYPE, 0));
63        assertTrue(intent.hasExtra(BrowserActionsIntent.EXTRA_APP_ID));
64        assertEquals(mContext.getPackageName(), BrowserActionsIntent.getCreatorPackageName(intent));
65        assertFalse(intent.hasExtra(BrowserActionsIntent.EXTRA_SELECTED_ACTION_PENDING_INTENT));
66    }
67
68    @Test
69    /**
70     * Test whether custom items are set correctly.
71     */
72    public void testCustomItem() {
73        PendingIntent action1 = createCustomItemAction(TEST_URL);
74        BrowserActionItem customItemWithoutIcon = new BrowserActionItem(CUSTOM_ITEM_TITLE, action1);
75        PendingIntent action2 = createCustomItemAction(TEST_URL);
76        BrowserActionItem customItemWithIcon =
77                new BrowserActionItem(CUSTOM_ITEM_TITLE, action2, android.R.drawable.ic_menu_share);
78        ArrayList<BrowserActionItem> customItems = new ArrayList<>();
79        customItems.add(customItemWithIcon);
80        customItems.add(customItemWithoutIcon);
81
82        BrowserActionsIntent browserActionsIntent = new BrowserActionsIntent.Builder(mContext, mUri)
83                .setCustomItems(customItems)
84                .build();
85        Intent intent = browserActionsIntent.getIntent();
86        assertTrue(intent.hasExtra(BrowserActionsIntent.EXTRA_MENU_ITEMS));
87        ArrayList<Bundle> bundles =
88                intent.getParcelableArrayListExtra(BrowserActionsIntent.EXTRA_MENU_ITEMS);
89        assertNotNull(bundles);
90        List<BrowserActionItem> items = BrowserActionsIntent.parseBrowserActionItems(bundles);
91        assertEquals(2, items.size());
92        BrowserActionItem items1 = items.get(0);
93        assertEquals(CUSTOM_ITEM_TITLE, items1.getTitle());
94        assertEquals(android.R.drawable.ic_menu_share, items1.getIconId());
95        assertEquals(action1, items1.getAction());
96        BrowserActionItem items2 = items.get(1);
97        assertEquals(CUSTOM_ITEM_TITLE, items2.getTitle());
98        assertEquals(0, items2.getIconId());
99        assertEquals(action2, items2.getAction());
100    }
101
102    static PendingIntent createCustomItemAction(String url) {
103        Context context = InstrumentationRegistry.getTargetContext();
104        Intent customIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
105        return PendingIntent.getActivity(context, 0, customIntent, 0);
106    }
107}
108