diff --git a/res/layout/account_item.xml b/res/layout/account_item.xml index 9094173a6888..9ce8c581a4e9 100644 --- a/res/layout/account_item.xml +++ b/res/layout/account_item.xml @@ -43,7 +43,7 @@ android:textColor="@color/textColor" android:textSize="@dimen/two_line_primary_text_size"/> - - + android:background="?android:selectableItemBackground" + android:src="@drawable/ic_action_delete"/> \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index b49a268f1a32..749e1f2f6fa3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -105,6 +105,7 @@ About Change password Remove account + Delete account %s?\n\nDeleting cannot be undone. Create account Upload from … Folder name diff --git a/src/com/owncloud/android/ui/activity/ManageAccountsActivity.java b/src/com/owncloud/android/ui/activity/ManageAccountsActivity.java index 98bfdd47ca8a..16637847ff0f 100644 --- a/src/com/owncloud/android/ui/activity/ManageAccountsActivity.java +++ b/src/com/owncloud/android/ui/activity/ManageAccountsActivity.java @@ -24,13 +24,19 @@ import android.accounts.AccountManagerCallback; import android.accounts.AccountManagerFuture; import android.accounts.OperationCanceledException; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; import android.content.ComponentName; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.view.MenuItem; import android.widget.ListView; @@ -115,8 +121,7 @@ public void onBackPressed() { resultIntent.putExtra(KEY_ACCOUNT_LIST_CHANGED, hasAccountListChanged()); resultIntent.putExtra(KEY_CURRENT_ACCOUNT_CHANGED, hasCurrentAccountChanged()); setResult(RESULT_OK, resultIntent); - - finish(); + super.onBackPressed(); } @@ -164,7 +169,7 @@ private void initializeComponentGetters() { */ private ArrayList getAccountListItems() { Account[] accountList = AccountManager.get(this).getAccountsByType(MainApp.getAccountType()); - ArrayList adapterAccountList = new ArrayList(accountList.length); + ArrayList adapterAccountList = new ArrayList<>(accountList.length); for (Account account : accountList) { adapterAccountList.add(new AccountListItem(account)); } @@ -191,11 +196,10 @@ public boolean onOptionsItemSelected(MenuItem item) { } @Override - public void removeAccount(Account account) { - AccountManager am = (AccountManager) this.getSystemService(ACCOUNT_SERVICE); + public void performAccountRemoval(Account account) { + AccountRemovalConfirmationDialog dialog = AccountRemovalConfirmationDialog.newInstance(account); mAccountName = account.name; - am.removeAccount(account, ManageAccountsActivity.this, mHandler); - Log_OC.d(TAG, "Remove an account " + account.name); + dialog.show(getFragmentManager(), "dialog"); } @Override @@ -267,7 +271,7 @@ public void run(AccountManagerFuture future) { } mAccountListAdapter = new AccountListAdapter(this, getAccountListItems()); - mAccountListAdapter.notifyDataSetChanged(); + mListView.setAdapter(mAccountListAdapter); } } @@ -285,6 +289,8 @@ protected void onDestroy() { super.onDestroy(); } + public Handler getHandler() { return mHandler; } + // Methods for ComponentsGetter @Override public FileDownloader.FileDownloaderBinder getFileDownloaderBinder() { @@ -343,4 +349,49 @@ public void onServiceDisconnected(ComponentName component) { } } } + + public static class AccountRemovalConfirmationDialog extends DialogFragment { + + private static final String ARG__ACCOUNT = "account"; + + private Account mAccount; + + public static AccountRemovalConfirmationDialog newInstance(Account account) { + Bundle bundle = new Bundle(); + bundle.putParcelable(ARG__ACCOUNT, account); + + AccountRemovalConfirmationDialog dialog = new AccountRemovalConfirmationDialog(); + dialog.setArguments(bundle); + + return dialog; + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mAccount = getArguments().getParcelable(ARG__ACCOUNT); + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + return new AlertDialog.Builder(getActivity(), R.style.Theme_ownCloud_Dialog) + .setTitle(R.string.delete_account) + .setMessage(getResources().getString(R.string.delete_account_warning, mAccount.name)) + .setIcon(R.drawable.ic_warning) + .setPositiveButton(R.string.common_ok, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + AccountManager am = (AccountManager) getActivity().getSystemService(ACCOUNT_SERVICE); + am.removeAccount( + mAccount, + (ManageAccountsActivity)getActivity(), + ((ManageAccountsActivity)getActivity()).getHandler()); + } + }) + .setNegativeButton(R.string.common_cancel, null) + .create(); + } + } } diff --git a/src/com/owncloud/android/ui/adapter/AccountListAdapter.java b/src/com/owncloud/android/ui/adapter/AccountListAdapter.java index de3ee1f9d2b9..c74dca4a81d5 100644 --- a/src/com/owncloud/android/ui/adapter/AccountListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/AccountListAdapter.java @@ -20,19 +20,17 @@ package com.owncloud.android.ui.adapter; import android.accounts.Account; -import android.content.Context; import android.graphics.drawable.Drawable; -import android.view.Display; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.ui.TextDrawable; import com.owncloud.android.ui.activity.BaseActivity; import com.owncloud.android.ui.activity.ManageAccountsActivity; import com.owncloud.android.utils.DisplayUtils; @@ -57,10 +55,6 @@ public AccountListAdapter(BaseActivity context, List values) { this.mAccountAvatarRadiusDimension = context.getResources().getDimension(R.dimen.list_item_avatar_icon_radius); } - public void setAccountList(List values) { - this.mValues = values; - } - @Override public View getView(final int position, View convertView, ViewGroup parent) { AccountViewHolderItem viewHolder; @@ -72,8 +66,8 @@ public View getView(final int position, View convertView, ViewGroup parent) { viewHolder = new AccountViewHolderItem(); viewHolder.textViewItem = (TextView) convertView.findViewById(R.id.user_name); viewHolder.imageViewItem = (ImageView) convertView.findViewById(R.id.user_icon); - viewHolder.passwordButtonItem = (ImageView) convertView.findViewById(R.id.passwordButton); - viewHolder.removeButtonItem = (ImageView) convertView.findViewById(R.id.removeButton); + viewHolder.passwordButtonItem = (ImageButton) convertView.findViewById(R.id.passwordButton); + viewHolder.removeButtonItem = (ImageButton) convertView.findViewById(R.id.removeButton); convertView.setTag(viewHolder); } else { @@ -111,9 +105,7 @@ public void onClick(View v) { viewHolder.removeButtonItem.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - mListener.removeAccount(mValues.get(position).getAccount()); - mValues.remove(position); - AccountListAdapter.this.notifyDataSetChanged(); + mListener.performAccountRemoval(mValues.get(position).getAccount()); } }); } // create add account action item @@ -152,7 +144,7 @@ public boolean shouldCallGeneratedCallback(String tag, Object callContext) { * Listener interface for Activities using the {@link AccountListAdapter} */ public interface AccountListAdapterListener { - void removeAccount(Account account); + void performAccountRemoval(Account account); void changePasswordOfAccount(Account account); @@ -166,7 +158,7 @@ static class AccountViewHolderItem { TextView textViewItem; ImageView imageViewItem; - ImageView passwordButtonItem; - ImageView removeButtonItem; + ImageButton passwordButtonItem; + ImageButton removeButtonItem; } }