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