/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.github.andlyticsproject.admob; import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.util.Log; import java.io.IOException; import com.github.andlyticsproject.AdmobAuthenticatorActivity; import com.github.andlyticsproject.console.NetworkException; /** * Provides utility methods for communicating with the server. */ public class AdmobAuthenticationUtilities { private static final int REQUEST_AUTHENTICATE = 0; private static final String TAG = AdmobAuthenticationUtilities.class.getSimpleName(); /** * Executes the network requests on a separate thread. * * @param runnable * The runnable instance containing network mOperations to be * executed. */ public static Thread performOnBackgroundThread(final Runnable runnable) { final Thread t = new Thread() { @Override public void run() { try { runnable.run(); } finally { } } }; t.start(); return t; } /** * Connects to the Voiper server, authenticates the provided username and * password. * * @param username * The user's username * @param password * The user's password * @param handler * The hander instance from the calling UI thread. * @param context * The context of the calling Activity. * @return boolean The boolean result indicating whether the user was * successfully authenticated. */ public static String authenticate(String username, String password, Handler handler, final Context context) { try { String token = AdmobRequest.login(username, password); sendResult("true", handler, context); return token; } catch (NetworkException e) { Log.e(TAG, "Unsuccessful Admob authentication, network error"); sendResult(AdmobRequest.ERROR_NETWORK_ERROR, handler, context); return AdmobRequest.ERROR_NETWORK_ERROR; } catch (AdmobInvalidRequestException e) { Log.e(TAG, "Unsuccessful Admob authentication, google accounts are not supported"); sendResult(AdmobRequest.ERROR_REQUEST_INVALID, handler, context); return null; } catch (AdmobRateLimitExceededException e) { Log.e(TAG, "Unsuccessful Admob authentication, rate limit excceded"); sendResult(AdmobRequest.ERROR_RATE_LIMIT_EXCEEDED, handler, context); return null; } catch (Exception e) { Log.e(TAG, "Unsuccessful Admob authentication"); sendResult("false", handler, context); return null; } } /** * Sends the authentication response from server back to the caller main UI * thread through its handler. * * @param result * The boolean holding authentication result * @param handler * The main UI thread's handler instance. * @param context * The caller Activity's context. */ private static void sendResult(final String result, final Handler handler, final Context context) { if (handler == null || context == null) { return; } handler.post(new Runnable() { public void run() { ((AdmobAuthenticatorActivity) context).onAuthenticationResult(result); } }); } /** * Attempts to authenticate the user credentials on the server. * * @param username * The user's username * @param password * The user's password to be authenticated * @param handler * The main UI thread's handler instance. * @param context * The caller Activity's context * @return Thread The thread on which the network mOperations are executed. */ public static Thread attemptAuth(final String username, final String password, final Handler handler, final Context context) { final Runnable runnable = new Runnable() { public void run() { authenticate(username, password, handler, context); } }; // run on background thread. return AdmobAuthenticationUtilities.performOnBackgroundThread(runnable); } public static String authenticateAccount(String accountName, Context context) { Account account = null; String token = null; AccountManager manager = AccountManager.get(context); if (accountName != null) { Account[] accounts = manager.getAccountsByType(AdmobAccountAuthenticator.ACCOUNT_TYPE_ADMOB); int size = accounts.length; for (int i = 0; i < size; i++) { Account ac = accounts[i]; if (accountName.equals(ac.name)) { account = ac; } } } if (account != null) { token = authenticateAccount(manager, account, context); } else { token = AdmobRequest.ERROR_ACCOUNT_REMOVED; } return token; } @SuppressWarnings("deprecation") protected static String authenticateAccount(final AccountManager manager, final Account account, Context context) { String token = null; Bundle bundle; try { bundle = manager.getAuthToken(account, AdmobAccountAuthenticator.AUTHTOKEN_TYPE_ADMOB, true, null, null) .getResult(); if (bundle.containsKey(AccountManager.KEY_INTENT)) { if (context instanceof Activity) { // ask user for permission - launch account manager intent Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT); int flags = intent.getFlags(); flags &= ~Intent.FLAG_ACTIVITY_NEW_TASK; intent.setFlags(flags); ((Activity) context).startActivityForResult(intent, REQUEST_AUTHENTICATE); } else { Log.e(TAG, "Got admob KEY_INTENT to ask user for permission but context is not an activity"); } token = AdmobRequest.ERROR_ASK_USER_PASSWORD; } else if (bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) { // got token form manager - set in application an exit final String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN); return authToken; } } catch (OperationCanceledException e1) { e1.printStackTrace(); } catch (AuthenticatorException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } return token; } public static void invalidateToken(final String token, Context context) { Log.d(TAG, "invalidate admob token"); AccountManager manager = AccountManager.get(context); manager.invalidateAuthToken(AdmobAccountAuthenticator.ACCOUNT_TYPE_ADMOB, token); } }