From: Andy Scherzinger Date: Tue, 18 Aug 2015 21:13:10 +0000 (+0200) Subject: Fix for long click menue for account management in preferences screen X-Git-Tag: oc-android-1.8~42^2~6 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/cbb0f8743ffc081f01886dad9cb02470351a2dab?hp=-c Fix for long click menue for account management in preferences screen --- cbb0f8743ffc081f01886dad9cb02470351a2dab diff --git a/res/layout/alert_dialog_list_view.xml b/res/layout/alert_dialog_list_view.xml new file mode 100644 index 00000000..ce5a569e --- /dev/null +++ b/res/layout/alert_dialog_list_view.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/src/com/owncloud/android/ui/activity/Preferences.java b/src/com/owncloud/android/ui/activity/Preferences.java index f0e7d854..e1c5c10d 100644 --- a/src/com/owncloud/android/ui/activity/Preferences.java +++ b/src/com/owncloud/android/ui/activity/Preferences.java @@ -47,6 +47,7 @@ import android.preference.PreferenceManager; import android.support.annotation.LayoutRes; import android.support.annotation.Nullable; import android.support.v7.app.ActionBar; +import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatDelegate; import android.support.v7.widget.Toolbar; import android.view.ContextMenu; @@ -58,6 +59,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; +import android.widget.ArrayAdapter; import android.widget.ListAdapter; import android.widget.ListView; @@ -151,7 +153,49 @@ public class Preferences extends PreferenceActivity mShowContextMenu = true; mAccountName = ((RadioButtonPreference) obj).getKey(); - Preferences.this.openContextMenu(listView); + String[] items = { + getResources().getString(R.string.change_password), + getResources().getString(R.string.delete_account) + }; + final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(Preferences.this); + View convertView = getLayoutInflater().inflate(R.layout.alert_dialog_list_view, null); + alertDialogBuilder.setView(convertView); + ListView lv = (ListView) convertView.findViewById(R.id.list); + ArrayAdapter adapter = new ArrayAdapter( + Preferences.this,R.layout.simple_dialog_list_item,items); + lv.setAdapter(adapter); + + //Setup proper inline listener + final AlertDialog alertDialog = alertDialogBuilder.create(); + lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE); + Account accounts[] = am.getAccountsByType(MainApp.getAccountType()); + for (Account a : accounts) { + if (a.name.equals(mAccountName)) { + if (position==0) { + + // Change account password + Intent updateAccountCredentials = new Intent(Preferences.this, AuthenticatorActivity.class); + updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, a); + updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, + AuthenticatorActivity.ACTION_UPDATE_TOKEN); + startActivity(updateAccountCredentials); + alertDialog.cancel(); + + } else if (position==1) { + + // Remove account + am.removeAccount(a, Preferences.this, mHandler); + Log_OC.d(TAG, "Remove an account " + a.name); + alertDialog.cancel(); + } + } + } + } + }); + alertDialog.show(); View.OnLongClickListener longListener = (View.OnLongClickListener) obj; return longListener.onLongClick(view); @@ -440,40 +484,6 @@ public class Preferences extends PreferenceActivity super.onCreateContextMenu(menu, v, menuInfo); } - /** - * Called when the user clicked on an item into the context menu created at - * {@link #onCreateContextMenu(ContextMenu, View, ContextMenuInfo)} for - * every ownCloud {@link Account} , containing 'secondary actions' for them. - * - * {@inheritDoc} - */ - @Override - public boolean onContextItemSelected(android.view.MenuItem item) { - AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE); - Account accounts[] = am.getAccountsByType(MainApp.getAccountType()); - for (Account a : accounts) { - if (a.name.equals(mAccountName)) { - if (item.getItemId() == R.id.change_password) { - - // Change account password - Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); - updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, a); - updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, - AuthenticatorActivity.ACTION_UPDATE_TOKEN); - startActivity(updateAccountCredentials); - - } else if (item.getItemId() == R.id.delete_account) { - - // Remove account - am.removeAccount(a, this, mHandler); - Log_OC.d(TAG, "Remove an account " + a.name); - } - } - } - - return true; - } - @Override public void run(AccountManagerFuture future) { if (future.isDone()) { diff --git a/src/com/owncloud/android/ui/dialog/AccountActionsDialogFragment.java b/src/com/owncloud/android/ui/dialog/AccountActionsDialogFragment.java new file mode 100644 index 00000000..968aac26 --- /dev/null +++ b/src/com/owncloud/android/ui/dialog/AccountActionsDialogFragment.java @@ -0,0 +1,146 @@ +package com.owncloud.android.ui.dialog; + +import android.os.Bundle; +import android.support.v4.app.DialogFragment; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.ArrayAdapter; +import android.widget.ListView; + +import com.owncloud.android.R; +import com.owncloud.android.ui.dialog.parcel.MenuItemParcelable; +import com.owncloud.android.ui.dialog.parcel.MenuParcelable; + +import java.util.ArrayList; +import java.util.List; + +/** + * Dialog for choosing a file action. + */ +public class AccountActionsDialogFragment extends DialogFragment implements + OnItemClickListener { + private static final String ARG_ITEM_LIST = "ITEM_LIST"; + private static final String ARG_FILE_POSITION = "FILE_POSITION"; + public static final String FTAG_FILE_ACTIONS = "FILE_ACTIONS_FRAGMENT"; + + private List menuItems; + + private int filePosition; + + private ListView mListView; + + /** + * Listener interface for the file action fragment. + */ + public interface FileActionsDialogFragmentListener { + public boolean onFileActionChosen(int menuId, int filePosition); + } + + /** + * Public factory method to create new FileActionsDialogFragment instances. + * + * @param menu menu to be display. + * @return Dialog ready to show. + */ + public static AccountActionsDialogFragment newInstance(Menu menu, int filePosition) { + AccountActionsDialogFragment fragment = new AccountActionsDialogFragment(); + Bundle args = new Bundle(); + + MenuParcelable menuParcelable = new MenuParcelable(); + menuParcelable.setMenuItems(calculateMenuParcel(menu)); + + args.putParcelable(ARG_ITEM_LIST, menuParcelable); + args.putInt(ARG_FILE_POSITION, filePosition); + + fragment.setArguments(args); + return fragment; + } + + /** + * {@inheritDoc} + */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setStyle(DialogFragment.STYLE_NORMAL, R.style.ownCloud_Dialog); + } + + /** + * {@inheritDoc} + */ + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.file_actions, null, false); + mListView = (ListView) view.findViewById(R.id.file_actions_list); + + getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); + return view; + } + + + /** + * {@inheritDoc} + */ + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + filePosition = getArguments().getInt(ARG_FILE_POSITION); + + MenuParcelable menu = getArguments().getParcelable(ARG_ITEM_LIST); + menuItems = menu.getMenuItems(); + List stringList = new ArrayList(); + for (int i = 0; i < menuItems.size(); i++) { + stringList.add(menuItems.get(i).getMenuText()); + } + + ArrayAdapter adapter = new ArrayAdapter(getActivity(), + R.layout.simple_dialog_list_item, stringList); + + mListView.setAdapter(adapter); + + mListView.setOnItemClickListener(this); + } + + /** + * {@inheritDoc} + */ + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + dismiss(); + ((FileActionsDialogFragmentListener) getTargetFragment()).onFileActionChosen(menuItems.get(position).getMenuItemId(), filePosition); + } + + /** + * calculates a parcelable list of MenuItemParcelable based on the given menu and the visibility of the menu items. + * + * @param menu the menu to be displayed + * @return a filtered List of parcelables based on the menu + */ + private static List calculateMenuParcel(Menu menu) { + int index = 0; + boolean hasNext = true; + List itemList = new ArrayList(); + MenuParcelable menuParcelable = new MenuParcelable(); + try { + while (hasNext) { + MenuItem item = menu.getItem(index); + if (item.isVisible()) { + itemList.add(new MenuItemParcelable(item)); + } + index++; + } + } catch (IndexOutOfBoundsException iobe) { + // reach the end of the item list + } + + return itemList; + } +} diff --git a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java index 65f8e11e..fbb209e5 100644 --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -193,7 +193,6 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi } } - MenuItem menuItem = new DialogMenuItem(item.getItemId()); FileActionsDialogFragment dialog = FileActionsDialogFragment.newInstance(menu, fileIndex); dialog.setTargetFragment(this, 0); dialog.show(getFragmentManager(), FileActionsDialogFragment.FTAG_FILE_ACTIONS);