1 /*
2  * Copyright (C) 2016 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 package com.android.contacts.util;
17 
18 import android.graphics.Canvas;
19 import android.graphics.ColorFilter;
20 import android.graphics.PixelFormat;
21 import android.graphics.drawable.Drawable;
22 import android.test.AndroidTestCase;
23 import android.test.suitebuilder.annotation.SmallTest;
24 
25 import com.android.contacts.model.AccountTypeManager;
26 import com.android.contacts.model.account.AccountDisplayInfo;
27 import com.android.contacts.model.account.AccountDisplayInfoFactory;
28 import com.android.contacts.model.account.AccountType;
29 import com.android.contacts.model.account.AccountWithDataSet;
30 import com.android.contacts.test.mocks.MockAccountTypeManager;
31 import com.android.contacts.tests.FakeAccountType;
32 import com.android.contacts.tests.FakeDeviceAccountTypeFactory;
33 
34 import java.util.ArrayList;
35 import java.util.HashMap;
36 import java.util.Map;
37 
38 @SmallTest
39 public class AccountDisplayInfoFactoryTests extends AndroidTestCase {
40 
41     private Map<AccountWithDataSet, AccountType> mKnownTypes;
42 
43     @Override
setUp()44     protected void setUp() throws Exception {
45         super.setUp();
46         mKnownTypes = new HashMap<>();
47     }
48 
test_displayableAccount_hasIconFromAccountType()49     public void test_displayableAccount_hasIconFromAccountType() {
50         final Drawable comExampleIcon = someDrawable();
51 
52         addTypeMapping(account("user", "com.example"), "title", comExampleIcon);
53         addTypeMapping(account(null, null), "device", someDrawable());
54         addTypeMapping(account("foo", "bar.type"), "bar", someDrawable());
55         addTypeMapping(account("user2", "com.example"), "title", comExampleIcon);
56 
57         final AccountDisplayInfoFactory sut = createFactoryForKnownTypes();
58 
59         final AccountDisplayInfo displayable = sut.getAccountDisplayInfo(
60                 account("user", "com.example"));
61         assertEquals(comExampleIcon, displayable.getIcon());
62     }
63 
test_displayableAccount_hasNameFromAccount()64     public void test_displayableAccount_hasNameFromAccount() {
65         final Drawable comExampleIcon = someDrawable();
66 
67         addTypeMapping(account("user@example.com", "com.example"), "title", comExampleIcon);
68         addTypeMapping(account(null, null), "device", someDrawable());
69         addTypeMapping(account("foo", "bar.type"), "bar", someDrawable());
70         addTypeMapping(account("user2@example.com", "com.example"), "title", comExampleIcon);
71 
72         final AccountDisplayInfoFactory sut = createFactoryForKnownTypes();
73 
74         final AccountDisplayInfo displayable = sut.getAccountDisplayInfo(
75                 account("user@example.com", "com.example"));
76         assertEquals("user@example.com", displayable.getNameLabel());
77     }
78 
test_displayableAccountForNullAccount_hasNameFromAccountType()79     public void test_displayableAccountForNullAccount_hasNameFromAccountType() {
80         addSomeKnownAccounts();
81         addTypeMapping(account(null, null), "Device Display Label", someDrawable());
82 
83         final AccountDisplayInfoFactory sut = createFactoryForKnownTypes();
84 
85         final AccountDisplayInfo displayable = sut.getAccountDisplayInfo(
86                 account(null, null));
87         assertEquals("Device Display Label", displayable.getNameLabel());
88     }
89 
test_displayableAccountForDeviceAccount_hasNameFromAccountType()90     public void test_displayableAccountForDeviceAccount_hasNameFromAccountType() {
91         addSomeKnownAccounts();
92         addTypeMapping(account("some.device.account.name", "device.account.type"), "Device Label",
93                 someDrawable());
94 
95         final AccountDisplayInfoFactory sut = createFactoryForKnownTypes(
96                 new FakeDeviceAccountTypeFactory().withDeviceTypes("device.account.type"));
97 
98         final AccountDisplayInfo displayable = sut.getAccountDisplayInfo(
99                 account("some.device.account.name", "device.account.type"));
100         assertEquals("Device Label", displayable.getNameLabel());
101     }
102 
test_displayableAccountForDeviceAccountWhenMultiple_hasNameFromAccount()103     public void test_displayableAccountForDeviceAccountWhenMultiple_hasNameFromAccount() {
104         addSomeKnownAccounts();
105         addTypeMapping(account("first.device.account.name", "a.device.account.type"),
106                 "Device Display Label", someDrawable());
107         addTypeMapping(account("second.device.account.name", "b.device.account.type"),
108                 "Device Display Label", someDrawable());
109         addTypeMapping(account("another.device.account.name", "a.device.account.type"),
110                 "Device Display Label", someDrawable());
111 
112         final AccountDisplayInfoFactory sut = createFactoryForKnownTypes(
113                 new FakeDeviceAccountTypeFactory().withDeviceTypes("a.device.account.type",
114                         "b.device.account.type"));
115 
116         final AccountDisplayInfo displayable = sut.getAccountDisplayInfo(
117                 account("first.device.account.name", "a.device.account.type"));
118         assertEquals("first.device.account.name", displayable.getNameLabel());
119 
120         final AccountDisplayInfo displayable2 = sut.getAccountDisplayInfo(
121                 account("second.device.account.name", "b.device.account.type"));
122         assertEquals("second.device.account.name", displayable2.getNameLabel());
123     }
124 
test_displayableAccountForSimAccount_hasNameFromAccountType()125     public void test_displayableAccountForSimAccount_hasNameFromAccountType() {
126         addSomeKnownAccounts();
127         addTypeMapping(account("sim.account.name", "sim.account.type"), "SIM", someDrawable());
128 
129         final AccountDisplayInfoFactory sut = createFactoryForKnownTypes(
130                 new FakeDeviceAccountTypeFactory().withSimTypes("sim.account.type"));
131 
132         final AccountDisplayInfo displayable = sut.getAccountDisplayInfo(
133                 account("sim.account.name", "sim.account.type"));
134         assertEquals("SIM", displayable.getNameLabel());
135     }
136 
test_displayableAccountForSimAccountWhenMultiple_hasNameFromAccount()137     public void test_displayableAccountForSimAccountWhenMultiple_hasNameFromAccount() {
138         addSomeKnownAccounts();
139         addTypeMapping(account("sim.account.name", "sim.account.type"), "SIM", someDrawable());
140         addTypeMapping(account("sim2.account.name", "sim.account.type"), "SIM", someDrawable());
141 
142         final AccountDisplayInfoFactory sut = createFactoryForKnownTypes(
143                 new FakeDeviceAccountTypeFactory().withSimTypes("sim.account.type"));
144 
145         final AccountDisplayInfo displayable = sut.getAccountDisplayInfo(
146                 account("sim.account.name", "sim.account.type"));
147         assertEquals("sim.account.name", displayable.getNameLabel());
148     }
149 
addSomeKnownAccounts()150     private void addSomeKnownAccounts() {
151         final Drawable comExampleIcon = someDrawable();
152         addTypeMapping(account("user@example.com", "com.example"), "Example Title", comExampleIcon);
153         addTypeMapping(account("foo", "bar.type"), "Bar", someDrawable());
154         addTypeMapping(account("user2@example.com", "com.example"), "Example Title", comExampleIcon);
155         addTypeMapping(account("user", "com.example.two"), "Some Account", someDrawable());
156     }
157 
createFactoryForKnownTypes()158     private AccountDisplayInfoFactory createFactoryForKnownTypes() {
159         return createFactoryForKnownTypes(new DeviceLocalAccountTypeFactory.Default(getContext()));
160     }
161 
createFactoryForKnownTypes(DeviceLocalAccountTypeFactory typeFactory)162     private AccountDisplayInfoFactory createFactoryForKnownTypes(DeviceLocalAccountTypeFactory
163             typeFactory) {
164         return new AccountDisplayInfoFactory(getContext(),
165                 createFakeAccountTypeManager(mKnownTypes), typeFactory,
166                 new ArrayList<>(mKnownTypes.keySet()));
167     }
168 
account(String name, String type)169     private AccountWithDataSet account(String name, String type) {
170         return new AccountWithDataSet(name, type, /* dataSet */ null);
171     }
172 
addTypeMapping(AccountWithDataSet account, String label, Drawable icon)173     private void addTypeMapping(AccountWithDataSet account, String label, Drawable icon) {
174         mKnownTypes.put(account, FakeAccountType.create(account, label, icon));
175     }
176 
createFakeAccountTypeManager( final Map<AccountWithDataSet, AccountType> mapping)177     private AccountTypeManager createFakeAccountTypeManager(
178             final Map<AccountWithDataSet, AccountType> mapping) {
179         return new MockAccountTypeManager(mapping.values().toArray(new AccountType[mapping.size()]),
180                 mapping.keySet().toArray(new AccountWithDataSet[mapping.size()]));
181     }
182 
someDrawable()183     private Drawable someDrawable() {
184         return new Drawable() {
185             @Override
186             public void draw(Canvas canvas) {
187             }
188 
189             @Override
190             public void setAlpha(int i) {
191             }
192 
193             @Override
194             public void setColorFilter(ColorFilter colorFilter) {
195             }
196 
197             @Override
198             public int getOpacity() {
199                 return PixelFormat.OPAQUE;
200             }
201         };
202     }
203 
204 }
205