• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 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 
17 package android.test;
18 
19 import com.google.android.collect.Lists;
20 
21 import android.accounts.AccountManager;
22 import android.accounts.AccountManagerCallback;
23 import android.accounts.AccountManagerFuture;
24 import android.accounts.AuthenticatorException;
25 import android.accounts.OnAccountsUpdateListener;
26 import android.accounts.OperationCanceledException;
27 import android.accounts.Account;
28 import android.content.ContextWrapper;
29 import android.content.ContentResolver;
30 import android.content.Intent;
31 import android.content.Context;
32 import android.content.ServiceConnection;
33 import android.content.BroadcastReceiver;
34 import android.content.IntentFilter;
35 import android.content.pm.PackageManager;
36 import android.net.Uri;
37 import android.os.Handler;
38 
39 import java.io.File;
40 import java.io.IOException;
41 import java.util.concurrent.TimeUnit;
42 import java.util.concurrent.ExecutionException;
43 import java.util.concurrent.TimeoutException;
44 import java.util.List;
45 
46 
47 /**
48      * A mock context which prevents its users from talking to the rest of the device while
49  * stubbing enough methods to satify code that tries to talk to other packages.
50  */
51 public class IsolatedContext extends ContextWrapper {
52 
53     private ContentResolver mResolver;
54     private final MockAccountManager mMockAccountManager;
55 
56     private List<Intent> mBroadcastIntents = Lists.newArrayList();
57 
IsolatedContext( ContentResolver resolver, Context targetContext)58     public IsolatedContext(
59             ContentResolver resolver, Context targetContext) {
60         super(targetContext);
61         mResolver = resolver;
62         mMockAccountManager = new MockAccountManager();
63     }
64 
65     /** Returns the list of intents that were broadcast since the last call to this method. */
getAndClearBroadcastIntents()66     public List<Intent> getAndClearBroadcastIntents() {
67         List<Intent> intents = mBroadcastIntents;
68         mBroadcastIntents = Lists.newArrayList();
69         return intents;
70     }
71 
72     @Override
getContentResolver()73     public ContentResolver getContentResolver() {
74         // We need to return the real resolver so that MailEngine.makeRight can get to the
75         // subscribed feeds provider. TODO: mock out subscribed feeds too.
76         return mResolver;
77     }
78 
79     @Override
bindService(Intent service, ServiceConnection conn, int flags)80     public boolean bindService(Intent service, ServiceConnection conn, int flags) {
81         return false;
82     }
83 
84     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)85     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
86         return null;
87     }
88 
89     @Override
unregisterReceiver(BroadcastReceiver receiver)90     public void unregisterReceiver(BroadcastReceiver receiver) {
91         // Ignore
92     }
93 
94     @Override
sendBroadcast(Intent intent)95     public void sendBroadcast(Intent intent) {
96         mBroadcastIntents.add(intent);
97     }
98 
99     @Override
sendOrderedBroadcast(Intent intent, String receiverPermission)100     public void sendOrderedBroadcast(Intent intent, String receiverPermission) {
101         mBroadcastIntents.add(intent);
102     }
103 
104     @Override
checkUriPermission( Uri uri, String readPermission, String writePermission, int pid, int uid, int modeFlags)105     public int checkUriPermission(
106             Uri uri, String readPermission, String writePermission, int pid,
107             int uid, int modeFlags) {
108         return PackageManager.PERMISSION_GRANTED;
109     }
110 
111     @Override
checkUriPermission(Uri uri, int pid, int uid, int modeFlags)112     public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) {
113         return PackageManager.PERMISSION_GRANTED;
114     }
115 
116     @Override
getSystemService(String name)117     public Object getSystemService(String name) {
118         if (Context.ACCOUNT_SERVICE.equals(name)) {
119             return mMockAccountManager;
120         }
121         // No other services exist in this context.
122         return null;
123     }
124 
125     private class MockAccountManager extends AccountManager {
MockAccountManager()126         public MockAccountManager() {
127             super(IsolatedContext.this, null /* IAccountManager */, null /* handler */);
128         }
129 
addOnAccountsUpdatedListener(OnAccountsUpdateListener listener, Handler handler, boolean updateImmediately)130         public void addOnAccountsUpdatedListener(OnAccountsUpdateListener listener,
131                 Handler handler, boolean updateImmediately) {
132             // do nothing
133         }
134 
getAccounts()135         public Account[] getAccounts() {
136             return new Account[]{};
137         }
138 
getAccountsByTypeAndFeatures( final String type, final String[] features, AccountManagerCallback<Account[]> callback, Handler handler)139         public AccountManagerFuture<Account[]> getAccountsByTypeAndFeatures(
140                 final String type, final String[] features,
141                 AccountManagerCallback<Account[]> callback, Handler handler) {
142             return new MockAccountManagerFuture<Account[]>(new Account[0]);
143         }
144 
blockingGetAuthToken(Account account, String authTokenType, boolean notifyAuthFailure)145         public String blockingGetAuthToken(Account account, String authTokenType,
146                 boolean notifyAuthFailure)
147                 throws OperationCanceledException, IOException, AuthenticatorException {
148             return null;
149         }
150 
151 
152         /**
153          * A very simple AccountManagerFuture class
154          * that returns what ever was passed in
155          */
156         private class MockAccountManagerFuture<T>
157                 implements AccountManagerFuture<T> {
158 
159             T mResult;
160 
MockAccountManagerFuture(T result)161             public MockAccountManagerFuture(T result) {
162                 mResult = result;
163             }
164 
cancel(boolean mayInterruptIfRunning)165             public boolean cancel(boolean mayInterruptIfRunning) {
166                 return false;
167             }
168 
isCancelled()169             public boolean isCancelled() {
170                 return false;
171             }
172 
isDone()173             public boolean isDone() {
174                 return true;
175             }
176 
getResult()177             public T getResult()
178                     throws OperationCanceledException, IOException, AuthenticatorException {
179                 return mResult;
180             }
181 
getResult(long timeout, TimeUnit unit)182             public T getResult(long timeout, TimeUnit unit)
183                     throws OperationCanceledException, IOException, AuthenticatorException {
184                 return getResult();
185             }
186         }
187 
188     }
189 
190     @Override
getFilesDir()191     public File getFilesDir() {
192         return new File("/dev/null");
193     }
194 }
195