1816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/*
2816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Copyright (C) 2015 The Android Open Source Project
3816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
4816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
5816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * you may not use this file except in compliance with the License.
6816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * You may obtain a copy of the License at
7816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
8816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
9816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
10816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Unless required by applicable law or agreed to in writing, software
11816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
12816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * See the License for the specific language governing permissions and
14816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * limitations under the License.
15816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */
16816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
17816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopackage com.android.tv.util;
18816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
19816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.pm.ResolveInfo;
20816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.pm.ServiceInfo;
21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.media.tv.TvInputInfo;
2207b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalkoimport android.os.Build;
2348dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport android.support.v4.os.BuildCompat;
24816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.lang.reflect.Constructor;
26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/**
28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * A class that includes convenience methods for testing.
29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */
30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic class TestUtils {
31816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public static TvInputInfo createTvInputInfo(ResolveInfo service, String id, String parentId,
32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            int type, boolean isHardwareInput) throws Exception {
33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Create a mock TvInputInfo by using private constructor
34816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // TODO: Find better way to mock TvInputInfo.
35816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Note that mockito doesn't support mock/spy on final object.
36ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            return createTvInputInfoForLmp(service, id, parentId, type);
3848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        } else if (BuildCompat.isAtLeastN()) {
3948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            new RuntimeException("TOOD(dvr): implement");  // http://b/26903987
40816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return createTvInputInfoForMnc(service, id, parentId, type, isHardwareInput);
42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static TvInputInfo createTvInputInfoForLmp(ResolveInfo service, String id,
45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            String parentId, int type) throws Exception {
46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        Constructor<TvInputInfo> constructor = TvInputInfo.class.getDeclaredConstructor(new Class[]{
47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                ResolveInfo.class, String.class, String.class, int.class});
48816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        constructor.setAccessible(true);
49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return constructor.newInstance(service, id, parentId, type);
50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static TvInputInfo createTvInputInfoForMnc(ResolveInfo service, String id,
53816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            String parentId, int type, boolean isHardwareInput) throws Exception {
54816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        Constructor<TvInputInfo> constructor = TvInputInfo.class.getDeclaredConstructor(new Class[]{
55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                ResolveInfo.class, String.class, String.class, int.class, boolean.class});
56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        constructor.setAccessible(true);
57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return constructor.newInstance(service, id, parentId, type, isHardwareInput);
58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
6048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    private static TvInputInfo createTvInputInfoForNpreview(ResolveInfo service, String id,
6148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            String parentId, int type) throws Exception {
6248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        Constructor<TvInputInfo> constructor = TvInputInfo.class.getDeclaredConstructor(
6348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                new Class[]{ResolveInfo.class, String.class, String.class, int.class});
6448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        constructor.setAccessible(true);
6548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        return constructor.newInstance(service, id, parentId, type);
6648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    }
6748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho
68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public static ResolveInfo createResolveInfo(String packageName, String name) {
69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ResolveInfo resolveInfo = new ResolveInfo();
70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        resolveInfo.serviceInfo = new ServiceInfo();
71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        resolveInfo.serviceInfo.packageName = packageName;
72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        resolveInfo.serviceInfo.name = name;
73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return resolveInfo;
74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko}
76