Add header and remove button to account detail page.
- Add account header which contains the account icon and name to the top of the account detail page. - Also add the remove account button to the bottom of the page. Change-Id: I24f1a17a7f9c4dd8c840a2b0329c0965e4e612e9 Fix: 33543525 Test: make RunSettingsRoboTests
This commit is contained in:
@@ -23,11 +23,13 @@ import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
import android.support.annotation.VisibleForTesting;
|
||||
|
||||
import android.support.v7.preference.Preference;
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.core.PreferenceController;
|
||||
import com.android.settings.dashboard.DashboardFragment;
|
||||
import com.android.settingslib.accounts.AuthenticatorHelper;
|
||||
import com.android.settingslib.drawer.CategoryKey;
|
||||
import com.android.settingslib.drawer.Tile;
|
||||
|
||||
@@ -43,11 +45,16 @@ public class AccountDetailDashboardFragment extends DashboardFragment {
|
||||
public static final String KEY_ACCOUNT_TYPE = "account_type";
|
||||
public static final String KEY_ACCOUNT_LABEL = "account_label";
|
||||
public static final String KEY_ACCOUNT_TITLE_RES = "account_title_res";
|
||||
public static final String KEY_ACCOUNT_HEADER = "account_header";
|
||||
public static final String KEY_USER_HANDLE = "user_handle";
|
||||
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
|
||||
Account mAccount;
|
||||
private String mAccountLabel;
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
|
||||
String mAccountType;
|
||||
private AccountSyncPreferenceController mAccountSynController;
|
||||
private RemoveAccountPreferenceController mRemoveAccountController;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle icicle) {
|
||||
@@ -57,10 +64,9 @@ public class AccountDetailDashboardFragment extends DashboardFragment {
|
||||
UserHandle userHandle = Utils.getSecureTargetUser(activity.getActivityToken(),
|
||||
(UserManager) getSystemService(Context.USER_SERVICE), args,
|
||||
activity.getIntent().getExtras());
|
||||
Account account = null;
|
||||
if (args != null) {
|
||||
if (args.containsKey(KEY_ACCOUNT)) {
|
||||
account = args.getParcelable(KEY_ACCOUNT);
|
||||
mAccount = args.getParcelable(KEY_ACCOUNT);
|
||||
}
|
||||
if (args.containsKey(KEY_ACCOUNT_LABEL)) {
|
||||
mAccountLabel = args.getString(KEY_ACCOUNT_LABEL);
|
||||
@@ -69,7 +75,8 @@ public class AccountDetailDashboardFragment extends DashboardFragment {
|
||||
mAccountType = args.getString(KEY_ACCOUNT_TYPE);
|
||||
}
|
||||
}
|
||||
mAccountSynController.init(account, userHandle);
|
||||
mAccountSynController.init(mAccount, userHandle);
|
||||
mRemoveAccountController.setAccount(mAccount);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -78,6 +85,7 @@ public class AccountDetailDashboardFragment extends DashboardFragment {
|
||||
if (mAccountLabel != null) {
|
||||
getActivity().setTitle(mAccountLabel);
|
||||
}
|
||||
updateAccountHeader();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -105,6 +113,8 @@ public class AccountDetailDashboardFragment extends DashboardFragment {
|
||||
final List<PreferenceController> controllers = new ArrayList<>();
|
||||
mAccountSynController = new AccountSyncPreferenceController(context);
|
||||
controllers.add(mAccountSynController);
|
||||
mRemoveAccountController = new RemoveAccountPreferenceController(context, this);
|
||||
controllers.add(mRemoveAccountController);
|
||||
return controllers;
|
||||
}
|
||||
|
||||
@@ -120,4 +130,18 @@ public class AccountDetailDashboardFragment extends DashboardFragment {
|
||||
return mAccountType.equals(metadata.getString(METADATA_IA_ACCOUNT));
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
void updateAccountHeader() {
|
||||
final Preference headerPreference = findPreference(KEY_ACCOUNT_HEADER);
|
||||
headerPreference.setTitle(mAccount.name);
|
||||
final Context context = getContext();
|
||||
UserHandle userHandle = null;
|
||||
Bundle args = getArguments();
|
||||
if (args != null && args.containsKey(KEY_USER_HANDLE)) {
|
||||
userHandle = args.getParcelable(KEY_USER_HANDLE);
|
||||
}
|
||||
final AuthenticatorHelper helper = new AuthenticatorHelper(context, userHandle, null);
|
||||
headerPreference.setIcon(helper.getDrawableForType(context, mAccountType));
|
||||
}
|
||||
|
||||
}
|
@@ -465,6 +465,8 @@ public class AccountPreferenceController extends PreferenceController
|
||||
final Bundle fragmentArguments = new Bundle();
|
||||
fragmentArguments.putParcelable(AccountDetailDashboardFragment.KEY_ACCOUNT,
|
||||
account);
|
||||
fragmentArguments.putParcelable(AccountDetailDashboardFragment.KEY_USER_HANDLE,
|
||||
userHandle);
|
||||
fragmentArguments.putString(AccountDetailDashboardFragment.KEY_ACCOUNT_TYPE,
|
||||
accountType);
|
||||
fragmentArguments.putString(AccountDetailDashboardFragment.KEY_ACCOUNT_LABEL,
|
||||
|
@@ -0,0 +1,199 @@
|
||||
/*
|
||||
* Copyright (C) 2017 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.android.settings.accounts;
|
||||
|
||||
import android.accounts.Account;
|
||||
import android.accounts.AccountManager;
|
||||
import android.accounts.AccountManagerCallback;
|
||||
import android.accounts.AccountManagerFuture;
|
||||
import android.accounts.AuthenticatorException;
|
||||
import android.accounts.OperationCanceledException;
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.app.Dialog;
|
||||
import android.app.Fragment;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Bundle;
|
||||
import android.os.Process;
|
||||
import android.support.v7.preference.PreferenceScreen;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.widget.Button;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.applications.LayoutPreference;
|
||||
import com.android.settings.core.PreferenceController;
|
||||
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class RemoveAccountPreferenceController extends PreferenceController
|
||||
implements OnClickListener {
|
||||
|
||||
private static final String KEY_REMOVE_ACCOUNT = "remove_account";
|
||||
|
||||
private Account mAccount;
|
||||
private Fragment mParentFragment;
|
||||
|
||||
public RemoveAccountPreferenceController(Context context, Fragment parent) {
|
||||
super(context);
|
||||
mParentFragment = parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayPreference(PreferenceScreen screen) {
|
||||
super.displayPreference(screen);
|
||||
final LayoutPreference removeAccountPreference =
|
||||
(LayoutPreference) screen.findPreference(KEY_REMOVE_ACCOUNT);
|
||||
Button removeAccountButton = (Button) removeAccountPreference.findViewById(R.id.button);
|
||||
removeAccountButton.setOnClickListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAvailable() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPreferenceKey() {
|
||||
return KEY_REMOVE_ACCOUNT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
ConfirmRemoveAccountDialog.show(mParentFragment, mAccount);
|
||||
}
|
||||
|
||||
public void setAccount(Account account) {
|
||||
mAccount = account;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dialog to confirm with user about account removal
|
||||
*/
|
||||
public static class ConfirmRemoveAccountDialog extends InstrumentedDialogFragment implements
|
||||
DialogInterface.OnClickListener {
|
||||
private static final String SAVE_ACCOUNT = "account";
|
||||
private static final String REMOVE_ACCOUNT_DIALOG = "confirmRemoveAccount";
|
||||
private Account mAccount;
|
||||
|
||||
public static ConfirmRemoveAccountDialog show(Fragment parent, Account account) {
|
||||
if (!parent.isAdded()) {
|
||||
return null;
|
||||
}
|
||||
final ConfirmRemoveAccountDialog dialog = new ConfirmRemoveAccountDialog();
|
||||
dialog.mAccount = account;
|
||||
dialog.setTargetFragment(parent, 0);
|
||||
dialog.show(parent.getFragmentManager(), REMOVE_ACCOUNT_DIALOG);
|
||||
return dialog;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
final Context context = getActivity();
|
||||
if (savedInstanceState != null) {
|
||||
mAccount = (Account) savedInstanceState.getParcelable(SAVE_ACCOUNT);
|
||||
}
|
||||
return new AlertDialog.Builder(context)
|
||||
.setTitle(R.string.really_remove_account_title)
|
||||
.setMessage(R.string.really_remove_account_message)
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.setPositiveButton(R.string.remove_account_label, this)
|
||||
.create();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
outState.putParcelable(SAVE_ACCOUNT, mAccount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMetricsCategory() {
|
||||
return MetricsProto.MetricsEvent.DIALOG_ACCOUNT_SYNC_REMOVE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
Activity activity = getTargetFragment().getActivity();
|
||||
AccountManager.get(activity).removeAccountAsUser(mAccount, activity,
|
||||
new AccountManagerCallback<Bundle>() {
|
||||
@Override
|
||||
public void run(AccountManagerFuture<Bundle> future) {
|
||||
// If already out of this screen, don't proceed.
|
||||
if (!getTargetFragment().isResumed()) {
|
||||
return;
|
||||
}
|
||||
boolean failed = true;
|
||||
try {
|
||||
if (future.getResult()
|
||||
.getBoolean(AccountManager.KEY_BOOLEAN_RESULT)) {
|
||||
failed = false;
|
||||
}
|
||||
} catch (OperationCanceledException e) {
|
||||
// handled below
|
||||
} catch (IOException e) {
|
||||
// handled below
|
||||
} catch (AuthenticatorException e) {
|
||||
// handled below
|
||||
}
|
||||
final Activity activity = getTargetFragment().getActivity();
|
||||
if (failed && activity != null && !activity.isFinishing()) {
|
||||
RemoveAccountFailureDialog.show(getTargetFragment());
|
||||
} else {
|
||||
activity.finish();
|
||||
}
|
||||
}
|
||||
}, null, Process.myUserHandle());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Dialog to tell user about account removal failure
|
||||
*/
|
||||
public static class RemoveAccountFailureDialog extends InstrumentedDialogFragment {
|
||||
|
||||
private static final String FAILED_REMOVAL_DIALOG = "removeAccountFailed";
|
||||
|
||||
public static void show(Fragment parent) {
|
||||
if (!parent.isAdded()) {
|
||||
return;
|
||||
}
|
||||
final RemoveAccountFailureDialog dialog = new RemoveAccountFailureDialog();
|
||||
dialog.setTargetFragment(parent, 0);
|
||||
dialog.show(parent.getFragmentManager(), FAILED_REMOVAL_DIALOG);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
final Context context = getActivity();
|
||||
|
||||
return new AlertDialog.Builder(context)
|
||||
.setTitle(R.string.really_remove_account_title)
|
||||
.setMessage(R.string.remove_account_failed)
|
||||
.setPositiveButton(android.R.string.ok, null)
|
||||
.create();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMetricsCategory() {
|
||||
return MetricsProto.MetricsEvent.DIALOG_ACCOUNT_SYNC_FAILED_REMOVAL;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user