Fix for long click menue for account management in preferences screen
authorAndy Scherzinger <info@andy-scherzinger.de>
Tue, 18 Aug 2015 21:13:10 +0000 (23:13 +0200)
committerAndy Scherzinger <info@andy-scherzinger.de>
Tue, 18 Aug 2015 21:13:10 +0000 (23:13 +0200)
res/layout/alert_dialog_list_view.xml [new file with mode: 0644]
src/com/owncloud/android/ui/activity/Preferences.java
src/com/owncloud/android/ui/dialog/AccountActionsDialogFragment.java [new file with mode: 0644]
src/com/owncloud/android/ui/fragment/OCFileListFragment.java

diff --git a/res/layout/alert_dialog_list_view.xml b/res/layout/alert_dialog_list_view.xml
new file mode 100644 (file)
index 0000000..ce5a569
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content">
+
+    <ListView
+        android:id="@+id/list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+</LinearLayout>
index f0e7d85..e1c5c10 100644 (file)
@@ -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<String> adapter = new ArrayAdapter<String>(
+                            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<Boolean> 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 (file)
index 0000000..968aac2
--- /dev/null
@@ -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<MenuItemParcelable> 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<String> stringList = new ArrayList<String>();
+        for (int i = 0; i < menuItems.size(); i++) {
+            stringList.add(menuItems.get(i).getMenuText());
+        }
+
+        ArrayAdapter<String> adapter = new ArrayAdapter<String>(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<MenuItemParcelable> calculateMenuParcel(Menu menu) {
+        int index = 0;
+        boolean hasNext = true;
+        List<MenuItemParcelable> itemList = new ArrayList<MenuItemParcelable>();
+        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;
+    }
+}
index 65f8e11..fbb209e 100644 (file)
@@ -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);