OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.components.signin; | 5 package org.chromium.components.signin; |
6 | 6 |
7 import android.Manifest; | 7 import android.Manifest; |
8 import android.accounts.Account; | 8 import android.accounts.Account; |
9 import android.accounts.AccountManager; | 9 import android.accounts.AccountManager; |
10 import android.accounts.AccountManagerCallback; | 10 import android.accounts.AccountManagerCallback; |
11 import android.accounts.AccountManagerFuture; | 11 import android.accounts.AccountManagerFuture; |
12 import android.accounts.AuthenticatorDescription; | 12 import android.accounts.AuthenticatorDescription; |
13 import android.accounts.AuthenticatorException; | 13 import android.accounts.AuthenticatorException; |
14 import android.accounts.OperationCanceledException; | 14 import android.accounts.OperationCanceledException; |
15 import android.app.Activity; | 15 import android.app.Activity; |
16 import android.content.Context; | |
17 import android.content.pm.PackageManager; | 16 import android.content.pm.PackageManager; |
18 import android.os.Build; | 17 import android.os.Build; |
19 import android.os.Bundle; | 18 import android.os.Bundle; |
20 import android.os.Process; | 19 import android.os.Process; |
21 import android.os.SystemClock; | 20 import android.os.SystemClock; |
22 | 21 |
23 import com.google.android.gms.auth.GoogleAuthException; | 22 import com.google.android.gms.auth.GoogleAuthException; |
24 import com.google.android.gms.auth.GoogleAuthUtil; | 23 import com.google.android.gms.auth.GoogleAuthUtil; |
25 import com.google.android.gms.auth.GooglePlayServicesAvailabilityException; | 24 import com.google.android.gms.auth.GooglePlayServicesAvailabilityException; |
26 | 25 |
27 import org.chromium.base.ApiCompatibilityUtils; | 26 import org.chromium.base.ApiCompatibilityUtils; |
28 import org.chromium.base.Callback; | 27 import org.chromium.base.Callback; |
| 28 import org.chromium.base.ContextUtils; |
29 import org.chromium.base.Log; | 29 import org.chromium.base.Log; |
30 import org.chromium.base.ThreadUtils; | 30 import org.chromium.base.ThreadUtils; |
31 import org.chromium.base.annotations.MainDex; | 31 import org.chromium.base.annotations.MainDex; |
32 import org.chromium.base.library_loader.LibraryLoader; | 32 import org.chromium.base.library_loader.LibraryLoader; |
33 import org.chromium.base.metrics.RecordHistogram; | 33 import org.chromium.base.metrics.RecordHistogram; |
34 | 34 |
35 import java.io.IOException; | 35 import java.io.IOException; |
36 import java.util.concurrent.TimeUnit; | 36 import java.util.concurrent.TimeUnit; |
37 | 37 |
38 /** | 38 /** |
39 * Default implementation of {@link AccountManagerDelegate} which delegates all
calls to the | 39 * Default implementation of {@link AccountManagerDelegate} which delegates all
calls to the |
40 * Android account manager. | 40 * Android account manager. |
41 */ | 41 */ |
42 @MainDex | 42 @MainDex |
43 public class SystemAccountManagerDelegate implements AccountManagerDelegate { | 43 public class SystemAccountManagerDelegate implements AccountManagerDelegate { |
44 private final AccountManager mAccountManager; | 44 private final AccountManager mAccountManager; |
45 private final Context mApplicationContext; | |
46 private static final String TAG = "Auth"; | 45 private static final String TAG = "Auth"; |
47 | 46 |
48 public SystemAccountManagerDelegate(Context context) { | 47 public SystemAccountManagerDelegate() { |
49 mApplicationContext = context.getApplicationContext(); | 48 mAccountManager = AccountManager.get(ContextUtils.getApplicationContext(
)); |
50 mAccountManager = AccountManager.get(context.getApplicationContext()); | |
51 } | 49 } |
52 | 50 |
53 @Override | 51 @Override |
54 public Account[] getAccountsByType(String type) { | 52 public Account[] getAccountsByType(String type) { |
55 if (!hasGetAccountsPermission()) { | 53 if (!hasGetAccountsPermission()) { |
56 return new Account[] {}; | 54 return new Account[] {}; |
57 } | 55 } |
58 long now = SystemClock.elapsedRealtime(); | 56 long now = SystemClock.elapsedRealtime(); |
59 Account[] accounts = mAccountManager.getAccountsByType(type); | 57 Account[] accounts = mAccountManager.getAccountsByType(type); |
60 long elapsed = SystemClock.elapsedRealtime() - now; | 58 long elapsed = SystemClock.elapsedRealtime() - now; |
61 recordElapsedTimeHistogram("Signin.AndroidGetAccountsTime_AccountManager
", elapsed); | 59 recordElapsedTimeHistogram("Signin.AndroidGetAccountsTime_AccountManager
", elapsed); |
62 return accounts; | 60 return accounts; |
63 } | 61 } |
64 | 62 |
65 @Override | 63 @Override |
66 public String getAuthToken(Account account, String authTokenScope) throws Au
thException { | 64 public String getAuthToken(Account account, String authTokenScope) throws Au
thException { |
67 assert !ThreadUtils.runningOnUiThread(); | 65 assert !ThreadUtils.runningOnUiThread(); |
68 assert AccountManagerHelper.GOOGLE_ACCOUNT_TYPE.equals(account.type); | 66 assert AccountManagerHelper.GOOGLE_ACCOUNT_TYPE.equals(account.type); |
69 try { | 67 try { |
70 return GoogleAuthUtil.getTokenWithNotification( | 68 return GoogleAuthUtil.getTokenWithNotification( |
71 mApplicationContext, account, authTokenScope, null); | 69 ContextUtils.getApplicationContext(), account, authTokenScop
e, null); |
72 } catch (GoogleAuthException ex) { | 70 } catch (GoogleAuthException ex) { |
73 // This case includes a UserRecoverableNotifiedException, but most c
lients will have | 71 // This case includes a UserRecoverableNotifiedException, but most c
lients will have |
74 // their own retry mechanism anyway. | 72 // their own retry mechanism anyway. |
75 // TODO(bauerb): Investigate integrating the callback with Connectio
nRetry. | 73 // TODO(bauerb): Investigate integrating the callback with Connectio
nRetry. |
76 throw new AuthException(false /* isTransientError */, ex); | 74 throw new AuthException(false /* isTransientError */, ex); |
77 } catch (IOException ex) { | 75 } catch (IOException ex) { |
78 throw new AuthException(true /* isTransientError */, ex); | 76 throw new AuthException(true /* isTransientError */, ex); |
79 } | 77 } |
80 } | 78 } |
81 | 79 |
82 @Override | 80 @Override |
83 public void invalidateAuthToken(String authToken) throws AuthException { | 81 public void invalidateAuthToken(String authToken) throws AuthException { |
84 try { | 82 try { |
85 GoogleAuthUtil.clearToken(mApplicationContext, authToken); | 83 GoogleAuthUtil.clearToken(ContextUtils.getApplicationContext(), auth
Token); |
86 } catch (GooglePlayServicesAvailabilityException ex) { | 84 } catch (GooglePlayServicesAvailabilityException ex) { |
87 throw new AuthException(false /* isTransientError */, ex); | 85 throw new AuthException(false /* isTransientError */, ex); |
88 } catch (GoogleAuthException ex) { | 86 } catch (GoogleAuthException ex) { |
89 throw new AuthException(false /* isTransientError */, ex); | 87 throw new AuthException(false /* isTransientError */, ex); |
90 } catch (IOException ex) { | 88 } catch (IOException ex) { |
91 throw new AuthException(true /* isTransientError */, ex); | 89 throw new AuthException(true /* isTransientError */, ex); |
92 } | 90 } |
93 } | 91 } |
94 | 92 |
95 @Override | 93 @Override |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 } | 157 } |
160 } | 158 } |
161 }; | 159 }; |
162 // Android 4.4 throws NullPointerException if null is passed | 160 // Android 4.4 throws NullPointerException if null is passed |
163 Bundle emptyOptions = new Bundle(); | 161 Bundle emptyOptions = new Bundle(); |
164 mAccountManager.updateCredentials( | 162 mAccountManager.updateCredentials( |
165 account, "android", emptyOptions, activity, realCallback, null); | 163 account, "android", emptyOptions, activity, realCallback, null); |
166 } | 164 } |
167 | 165 |
168 protected boolean hasGetAccountsPermission() { | 166 protected boolean hasGetAccountsPermission() { |
169 return ApiCompatibilityUtils.checkPermission(mApplicationContext, | 167 return ApiCompatibilityUtils.checkPermission(ContextUtils.getApplication
Context(), |
170 Manifest.permission.GET_ACCOUNTS, Process.myPid(), Proces
s.myUid()) | 168 Manifest.permission.GET_ACCOUNTS, Process.myPid(), Proces
s.myUid()) |
171 == PackageManager.PERMISSION_GRANTED; | 169 == PackageManager.PERMISSION_GRANTED; |
172 } | 170 } |
173 | 171 |
174 protected boolean hasManageAccountsPermission() { | 172 protected boolean hasManageAccountsPermission() { |
175 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | 173 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { |
176 return true; | 174 return true; |
177 } | 175 } |
178 return ApiCompatibilityUtils.checkPermission(mApplicationContext, | 176 return ApiCompatibilityUtils.checkPermission(ContextUtils.getApplication
Context(), |
179 "android.permission.MANAGE_ACCOUNTS", Process.myPid(), Pr
ocess.myUid()) | 177 "android.permission.MANAGE_ACCOUNTS", Process.myPid(), Pr
ocess.myUid()) |
180 == PackageManager.PERMISSION_GRANTED; | 178 == PackageManager.PERMISSION_GRANTED; |
181 } | 179 } |
182 } | 180 } |
OLD | NEW |