1 /* 2 * Copyright (C) 2014 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 com.android.tv.settings.accounts; 18 19 import android.accounts.Account; 20 import android.accounts.AccountManager; 21 import android.accounts.AccountManagerCallback; 22 import android.accounts.AccountManagerFuture; 23 import android.accounts.AuthenticatorException; 24 import android.accounts.OperationCanceledException; 25 import android.app.Activity; 26 import android.app.ActivityManager; 27 import android.os.Bundle; 28 import android.os.Handler; 29 import android.support.annotation.NonNull; 30 import android.support.v17.leanback.app.GuidedStepFragment; 31 import android.support.v17.leanback.widget.GuidanceStylist; 32 import android.support.v17.leanback.widget.GuidedAction; 33 import android.util.Log; 34 import android.widget.Toast; 35 36 import com.android.tv.settings.R; 37 38 import java.io.IOException; 39 import java.util.List; 40 41 /** 42 * OK / Cancel dialog. 43 */ 44 public class RemoveAccountDialog extends Activity implements AccountManagerCallback<Bundle> { 45 46 private static final String TAG = "RemoveAccountDialog"; 47 48 @Override onCreate(Bundle savedInstanceState)49 protected void onCreate(Bundle savedInstanceState) { 50 super.onCreate(savedInstanceState); 51 if (savedInstanceState == null) { 52 GuidedStepFragment.addAsRoot(this, RemoveAccountFragment.newInstance( 53 getIntent().getStringExtra(AccountSyncActivity.EXTRA_ACCOUNT)), 54 android.R.id.content); 55 } 56 } 57 58 @Override run(AccountManagerFuture<Bundle> future)59 public void run(AccountManagerFuture<Bundle> future) { 60 if (!isResumed()) { 61 if (!isFinishing()) { 62 finish(); 63 } 64 return; 65 } 66 try { 67 if (!future.getResult().getBoolean(AccountManager.KEY_BOOLEAN_RESULT)) { 68 // Wasn't removed, toast this. 69 Toast.makeText(this, R.string.account_remove_failed, 70 Toast.LENGTH_LONG) 71 .show(); 72 } 73 } catch (OperationCanceledException | AuthenticatorException | IOException e) { 74 Log.e(TAG, "Could not remove", e); 75 } 76 finish(); 77 } 78 79 public static class RemoveAccountFragment extends GuidedStepFragment { 80 private static final String ARG_ACCOUNT_NAME = "accountName"; 81 private static final int ID_OK = 1; 82 private static final int ID_CANCEL = 0; 83 private String mAccountName; 84 private boolean mIsRemoving; 85 newInstance(String accountName)86 public static RemoveAccountFragment newInstance(String accountName) { 87 final RemoveAccountFragment f = new RemoveAccountFragment(); 88 final Bundle b = new Bundle(1); 89 b.putString(ARG_ACCOUNT_NAME, accountName); 90 f.setArguments(b); 91 return f; 92 } 93 94 @Override onCreate(Bundle savedInstanceState)95 public void onCreate(Bundle savedInstanceState) { 96 mAccountName = getArguments().getString(ARG_ACCOUNT_NAME); 97 98 super.onCreate(savedInstanceState); 99 } 100 101 @NonNull 102 @Override onCreateGuidance(Bundle savedInstanceState)103 public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) { 104 return new GuidanceStylist.Guidance( 105 getString(R.string.account_remove), 106 null, 107 mAccountName, 108 getActivity().getDrawable(R.drawable.ic_delete_132dp)); 109 } 110 111 @Override onGuidedActionClicked(GuidedAction action)112 public void onGuidedActionClicked(GuidedAction action) { 113 final RemoveAccountDialog activity = (RemoveAccountDialog) getActivity(); 114 if (action.getId() == ID_OK) { 115 if (ActivityManager.isUserAMonkey()) { 116 // Don't let the monkey remove accounts. 117 activity.finish(); 118 return; 119 } 120 // Block this from happening more than once. 121 if (mIsRemoving) { 122 return; 123 } 124 mIsRemoving = true; 125 AccountManager manager = AccountManager.get(activity.getApplicationContext()); 126 Account account = null; 127 for (Account accountLoop : manager.getAccounts()) { 128 if (accountLoop.name.equals(mAccountName)) { 129 account = accountLoop; 130 break; 131 } 132 } 133 manager.removeAccount(account, activity, activity, new Handler()); 134 } else { 135 activity.finish(); 136 } 137 } 138 139 @Override onCreateActions(@onNull List<GuidedAction> actions, Bundle savedInstanceState)140 public void onCreateActions(@NonNull List<GuidedAction> actions, 141 Bundle savedInstanceState) { 142 actions.add(new GuidedAction.Builder() 143 .id(ID_CANCEL) 144 .title(getString(android.R.string.cancel)) 145 .build()); 146 actions.add(new GuidedAction.Builder() 147 .id(ID_OK) 148 .title(getString(android.R.string.ok)) 149 .build()); 150 } 151 } 152 } 153