109404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay/*
209404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay * Copyright (C) 2016 The Android Open Source Project
309404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay *
409404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay * Licensed under the Apache License, Version 2.0 (the "License");
509404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay * you may not use this file except in compliance with the License.
609404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay * You may obtain a copy of the License at
709404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay *
809404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay *      http://www.apache.org/licenses/LICENSE-2.0
909404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay *
1009404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay * Unless required by applicable law or agreed to in writing, software
1109404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay * distributed under the License is distributed on an "AS IS" BASIS,
1209404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1309404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay * See the License for the specific language governing permissions and
1409404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay * limitations under the License.
1509404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay */
1609404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay
17bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKaypackage com.android.documentsui.testing;
1809404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay
19eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKayimport android.annotation.UserIdInt;
2009404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKayimport android.content.Intent;
21eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKayimport android.content.pm.ActivityInfo;
22eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKayimport android.content.pm.ApplicationInfo;
2309404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKayimport android.content.pm.PackageManager;
2409404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKayimport android.content.pm.ProviderInfo;
2509404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay
26012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolanderimport android.content.pm.ResolveInfo;
2709404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKayimport com.android.documentsui.base.RootInfo;
2809404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay
2909404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKayimport org.mockito.Mockito;
3009404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay
3109404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKayimport java.util.ArrayList;
3209404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKayimport java.util.HashMap;
3309404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKayimport java.util.List;
3409404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKayimport java.util.Map;
3509404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay
3609404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay/**
3709404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay * Abstract to avoid having to implement unnecessary Activity stuff.
3809404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay * Instances are created using {@link #create()}.
3909404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay */
4009404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKaypublic abstract class TestPackageManager extends PackageManager {
4109404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay
4209404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay    public Map<String, ResolveInfo> contentProviders;
43012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander    public List<ResolveInfo> queryIntentProvidersResults = new ArrayList<>();
4409404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay
4509404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay    public void addStubContentProviderForRoot(RootInfo... roots) {
4609404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay        for (RootInfo root : roots) {
4709404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay            // only one entry per authority is required.
4809404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay            if (!contentProviders.containsKey(root.authority)) {
4909404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay                ResolveInfo info = new ResolveInfo();
5009404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay                contentProviders.put(root.authority, info);
5109404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay                info.providerInfo = new ProviderInfo();
5209404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay                info.providerInfo.authority = root.authority;
5309404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay            }
5409404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay        }
5509404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay    }
5609404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay
5709404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay    public static TestPackageManager create() {
5809404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay        TestPackageManager pm = Mockito.mock(
5909404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay                TestPackageManager.class, Mockito.CALLS_REAL_METHODS);
6009404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay        pm.contentProviders = new HashMap<>();
6109404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay        return pm;
6209404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay    }
6309404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay
6409404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay    @Override
65012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander    public List<ResolveInfo> queryIntentContentProviders(Intent intent, int flags) {
6609404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay        List<ResolveInfo> result = new ArrayList<>();
6709404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay        result.addAll(contentProviders.values());
6809404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay        return result;
6909404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay    }
70eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay
71012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander    /**
72012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander     * Query's a list of fake apps that can open an application.
73012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander     */
74012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander    @Override
75012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander    public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) {
76012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander        if (queryIntentProvidersResults == null) {
77012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander            return new ArrayList<>();
78012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander        } else {
79012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander            return queryIntentProvidersResults;
80012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander        }
81012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander    }
82012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander
83012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander    @Override
84012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander    public ResolveInfo resolveActivity(Intent intent, int flags) {
85012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander        ResolveInfo info = new TestResolveInfo();
86eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay        info.activityInfo = new ActivityInfo();
87012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander        info.activityInfo.packageName =
88012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander                intent.getPackage() != null ? intent.getPackage() : "TestPackage";
89eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay        info.activityInfo.applicationInfo = new ApplicationInfo();
90eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay        info.activityInfo.applicationInfo.packageName = intent.getPackage();
91eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay        info.activityInfo.name = "Fake Quick Viewer";
92eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay        return info;
93eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay    }
94eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay
95eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay    public final ResolveInfo resolveActivityAsUser(
96eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay            Intent intent, int flags, @UserIdInt int userId) {
97eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay        return resolveActivity(intent, flags);
98eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay    }
99012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander
100012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander    /**
101012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander     * Hacky way to use resolve info in test. resolve info return null when new'ing up a instance
102012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander     * because of an exception thrown in toString.
103012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander     */
104012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander    public static class TestResolveInfo extends ResolveInfo {
105012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander
106012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander        @Override
107012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander        public String toString() {
108012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander            return "";
109012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander        }
110012e8bac5af5bb79838a90c6be2d37af3b8a6093Austin Kolander    }
11109404b3e765ec99e4db30dbddf4aed5524b8523eSteve McKay}
112