package com.permissionnanny.demo.account; import android.accounts.Account; import android.accounts.AccountManagerCallback; import android.accounts.AccountManagerFuture; import android.accounts.AuthenticatorException; import android.accounts.OnAccountsUpdateListener; import android.accounts.OperationCanceledException; import android.app.Dialog; import android.content.Context; import com.permissionnanny.common.StringUtil; import com.permissionnanny.demo.DataAdapter; import com.permissionnanny.demo.DemoRequest; import com.permissionnanny.demo.ResponseDisplayListener; import com.permissionnanny.demo.ResponseListener; import com.permissionnanny.demo.SimpleRequestFactory; import com.permissionnanny.demo.extra.AccountExtra; import com.permissionnanny.demo.extra.BooleanExtra; import com.permissionnanny.demo.extra.Extra; import com.permissionnanny.demo.extra.ExtrasDialogBuilder; import com.permissionnanny.demo.extra.StringExtra; import com.permissionnanny.lib.request.PermissionRequest; import com.permissionnanny.lib.request.simple.AccountRequest; import java.io.IOException; import java.util.Arrays; /** * */ public class AccountRequestFactory implements SimpleRequestFactory { private AccountExtra mAccount = new AccountExtra("permissionnanny@gmail.com", "com.google"); private StringExtra mPassword = new StringExtra("pw"); private StringExtra mAuthTokenType = new StringExtra("oauth://"); private StringExtra mType = new StringExtra("com.google"); private StringExtra mKey = new StringExtra("myKey"); private StringExtra mAuthToken = new StringExtra("myAuthToken"); private StringExtra mNewName = new StringExtra("Brown Smith Account"); private StringExtra mValue = new StringExtra("myValue"); private BooleanExtra mUpdateImmediately = new BooleanExtra(); private BooleanExtra mNotifyAuthFailure = new BooleanExtra(true); public interface Factory { PermissionRequest newRequest(int position, DataAdapter adapter); } private DemoRequest[] mRequests = new DemoRequest[]{ new DemoRequest(AccountRequest.ADD_ACCOUNT_EXPLICITLY, new Extra[]{mAccount, mPassword}, new String[]{"account", "password"}, new Factory() { @Override public PermissionRequest newRequest(int position, DataAdapter adapter) { return AccountRequest.addAccountExplicitly(mAccount.getValue(), mPassword.getValue(), null) .listener(new ResponseDisplayListener(position, adapter)); } }), new DemoRequest(AccountRequest.ADD_ON_ACCOUNTS_UPDATED_LISTENER, new Extra[]{mUpdateImmediately}, new String[]{"updateImmediately"}, new Factory() { @Override public PermissionRequest newRequest(final int position, final DataAdapter adapter) { return AccountRequest.addOnAccountsUpdatedListener(new OnAccountsUpdateListener() { @Override public void onAccountsUpdated(Account[] accounts) { adapter.onData(position, Arrays.toString(accounts)); } }, null, true) .listener(new ResponseListener(position, adapter)); } }), new DemoRequest(AccountRequest.BLOCKING_GET_AUTH_TOKEN, new Extra[]{mAccount, mAuthTokenType, mNotifyAuthFailure}, new String[]{"account", "authTokenType", "notifyAuthFailure"}, new Factory() { @Override public PermissionRequest newRequest(int position, DataAdapter adapter) { return AccountRequest.blockingGetAuthToken(mAccount.getValue(), mAuthTokenType.getValue(), mNotifyAuthFailure.getValue()) .listener(new ResponseDisplayListener(position, adapter)); } }), new DemoRequest(AccountRequest.CLEAR_PASSWORD, new Extra[]{mAccount}, new String[]{"account"}, new Factory() { @Override public PermissionRequest newRequest(int position, DataAdapter adapter) { return AccountRequest.clearPassword(mAccount.getValue()) .listener(new ResponseDisplayListener(position, adapter)); } }), new DemoRequest(AccountRequest.GET_ACCOUNTS, new Extra[]{}, new String[]{}, new Factory() { @Override public PermissionRequest newRequest(int position, DataAdapter adapter) { return AccountRequest.getAccounts() .listener(new ResponseDisplayListener(position, adapter)); } }), new DemoRequest(AccountRequest.GET_ACCOUNTS_BY_TYPE, new Extra[]{mType}, new String[]{"type"}, new Factory() { @Override public PermissionRequest newRequest(int position, DataAdapter adapter) { return AccountRequest.getAccountsByType(mType.getValue()) .listener(new ResponseDisplayListener(position, adapter)); } }), new DemoRequest(AccountRequest.GET_ACCOUNTS_BY_TYPE_AND_FEATURES, new Extra[]{mType}, new String[]{"type"}, new Factory() { @Override public PermissionRequest newRequest(final int position, final DataAdapter adapter) { return AccountRequest.getAccountsByTypeAndFeatures(mType.getValue(), null, new StringifyAccountManagerCallback(position, adapter), null) .listener(new ResponseListener(position, adapter)); } }), new DemoRequest(AccountRequest.GET_AUTH_TOKEN1, new Extra[]{mAccount, mAuthTokenType, mNotifyAuthFailure}, new String[]{"account", "authTokenType", "notifyAuthFailure"}, new Factory() { @Override public PermissionRequest newRequest(int position, DataAdapter adapter) { return AccountRequest.getAuthToken(mAccount.getValue(), mAuthTokenType.getValue(), mNotifyAuthFailure.getValue(), new StringifyAccountManagerCallback(position, adapter), null) .listener(new ResponseListener(position, adapter)); } }), new DemoRequest(AccountRequest.GET_AUTH_TOKEN2, new Extra[]{mAccount, mAuthTokenType, mNotifyAuthFailure}, new String[]{"account", "authTokenType", "notifyAuthFailure"}, new Factory() { @Override public PermissionRequest newRequest(int position, DataAdapter adapter) { return AccountRequest.getAuthToken(mAccount.getValue(), mAuthTokenType.getValue(), mNotifyAuthFailure.getValue(), new StringifyAccountManagerCallback(position, adapter), null) .listener(new ResponseListener(position, adapter)); } }), new DemoRequest(AccountRequest.GET_PASSWORD, new Extra[]{mAccount}, new String[]{"account"}, new Factory() { @Override public PermissionRequest newRequest(int position, DataAdapter adapter) { return AccountRequest.getPassword(mAccount.getValue()) .listener(new ResponseDisplayListener(position, adapter)); } }), new DemoRequest(AccountRequest.GET_USER_DATA, new Extra[]{mAccount, mKey}, new String[]{"account", "key"}, new Factory() { @Override public PermissionRequest newRequest(int position, DataAdapter adapter) { return AccountRequest.getUserData(mAccount.getValue(), mKey.getValue()) .listener(new ResponseDisplayListener(position, adapter)); } }), new DemoRequest(AccountRequest.HAS_FEATURES, new Extra[]{mAccount}, new String[]{"account"}, new Factory() { @Override public PermissionRequest newRequest(int position, DataAdapter adapter) { return AccountRequest.hasFeatures(mAccount.getValue(), null, new StringifyAccountManagerCallback(position, adapter), null) .listener(new ResponseListener(position, adapter)); } }), new DemoRequest(AccountRequest.INVALIDATE_AUTH_TOKEN, new Extra[]{mType, mAuthToken}, new String[]{"accountType", "authToken"}, new Factory() { @Override public PermissionRequest newRequest(int position, DataAdapter adapter) { return AccountRequest.invalidateAuthToken(mType.getValue(), mAuthToken.getValue()) .listener(new ResponseDisplayListener(position, adapter)); } }), new DemoRequest(AccountRequest.PEEK_AUTH_TOKEN, new Extra[]{mAccount, mAuthTokenType}, new String[]{"account", "authTokenType"}, new Factory() { @Override public PermissionRequest newRequest(int position, DataAdapter adapter) { return AccountRequest.peekAuthToken(mAccount.getValue(), mAuthTokenType.getValue()) .listener(new ResponseDisplayListener(position, adapter)); } }), new DemoRequest(AccountRequest.REMOVE_ACCOUNT, new Extra[]{mAccount}, new String[]{"account"}, new Factory() { @Override public PermissionRequest newRequest(int position, DataAdapter adapter) { return AccountRequest.removeAccount(mAccount.getValue(), new StringifyAccountManagerCallback(position, adapter), null) .listener(new ResponseListener(position, adapter)); } }), new DemoRequest(AccountRequest.REMOVE_ACCOUNT_EXPLICITLY, new Extra[]{mAccount}, new String[]{"account"}, new Factory() { @Override public PermissionRequest newRequest(int position, DataAdapter adapter) { return AccountRequest.removeAccountExplicitly(mAccount.getValue()) .listener(new ResponseDisplayListener(position, adapter)); } }), new DemoRequest(AccountRequest.RENAME_ACCOUNT, new Extra[]{mAccount, mNewName}, new String[]{"account", "newName"}, new Factory() { @Override public PermissionRequest newRequest(int position, DataAdapter adapter) { return AccountRequest.renameAccount(mAccount.getValue(), mNewName.getValue(), new StringifyAccountManagerCallback(position, adapter), null) .listener(new ResponseListener(position, adapter)); } }), new DemoRequest(AccountRequest.SET_AUTH_TOKEN, new Extra[]{mAccount, mAuthTokenType, mAuthToken}, new String[]{"account", "authTokenType", "authToken"}, new Factory() { @Override public PermissionRequest newRequest(int position, DataAdapter adapter) { return AccountRequest.setAuthToken(mAccount.getValue(), mAuthTokenType.getValue(), mAuthToken.getValue()) .listener(new ResponseDisplayListener(position, adapter)); } }), new DemoRequest(AccountRequest.SET_PASSWORD, new Extra[]{mAccount, mPassword}, new String[]{"account", "password"}, new Factory() { @Override public PermissionRequest newRequest(int position, DataAdapter adapter) { return AccountRequest.setPassword(mAccount.getValue(), mPassword.getValue()) .listener(new ResponseDisplayListener(position, adapter)); } }), new DemoRequest(AccountRequest.SET_USER_DATA, new Extra[]{mAccount, mKey, mValue}, new String[]{"account", "key", "value"}, new Factory() { @Override public PermissionRequest newRequest(int position, DataAdapter adapter) { return AccountRequest.setUserData(mAccount.getValue(), mKey.getValue(), mValue.getValue()) .listener(new ResponseDisplayListener(position, adapter)); } }), }; private ExtrasDialogBuilder mBuilder = new ExtrasDialogBuilder(); @Override public PermissionRequest getRequest(final int position, final DataAdapter adapter) { return mRequests[position].mFactory.newRequest(position, adapter); } @Override public int getCount() { return mRequests.length; } @Override public String getLabel(int position) { return mRequests[position].mOp; } @Override public boolean hasExtras(int position) { Extra[] extras = mRequests[position].mExtras; return extras != null && extras.length > 0; } @Override public Dialog buildDialog(Context context, int position) { return mBuilder.build(context, mRequests[position].mExtras, mRequests[position].mExtrasLabels); } public static class StringifyAccountManagerCallback implements AccountManagerCallback { public DataAdapter mAdapter; public int mPosition; public StringifyAccountManagerCallback(int position, DataAdapter adapter) { mAdapter = adapter; mPosition = position; } @Override public void run(AccountManagerFuture future) { try { Object val = future.getResult(); mAdapter.onData(mPosition, StringUtil.toString(val)); } catch (OperationCanceledException | IOException | AuthenticatorException e) { e.printStackTrace(); } } } }