Parcourir la source

Merge pull request #6022 from nextcloud/feature/ui-revamp/manage-accounts-activity

New design (UI) - Accounts manage
Andy Scherzinger il y a 5 ans
Parent
commit
7e34e3b965

+ 42 - 3
src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java

@@ -37,6 +37,8 @@ import android.os.Bundle;
 import android.os.Handler;
 import android.os.IBinder;
 import android.view.MenuItem;
+import android.view.View;
+import android.widget.ImageView;
 
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.account.UserAccountManager;
@@ -54,6 +56,7 @@ import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.services.OperationsService;
 import com.owncloud.android.ui.adapter.UserListAdapter;
 import com.owncloud.android.ui.adapter.UserListItem;
+import com.owncloud.android.ui.dialog.AccountRemovalConfirmationDialog;
 import com.owncloud.android.ui.events.AccountRemovedEvent;
 import com.owncloud.android.ui.helpers.FileOperationsHelper;
 import com.owncloud.android.utils.ThemeUtils;
@@ -71,8 +74,10 @@ import java.util.Set;
 import javax.inject.Inject;
 
 import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.widget.PopupMenu;
 import androidx.core.content.ContextCompat;
 import androidx.core.graphics.drawable.DrawableCompat;
+import androidx.fragment.app.FragmentManager;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
@@ -163,6 +168,7 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap
         initializeComponentGetters();
     }
 
+
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
@@ -379,7 +385,9 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap
         super.onDestroy();
     }
 
-    public Handler getHandler() { return handler; }
+    public Handler getHandler() {
+        return handler;
+    }
 
     @Override
     public FileUploader.FileUploaderBinder getFileUploaderBinder() {
@@ -462,8 +470,13 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap
         }
     }
 
-    @Override
-    public void onClick(User user) {
+    public static void openAccountRemovalConfirmationDialog(User user, FragmentManager fragmentManager) {
+        AccountRemovalConfirmationDialog dialog =
+            AccountRemovalConfirmationDialog.newInstance(user);
+        dialog.show(fragmentManager, "dialog");
+    }
+
+    private void openAccount(User user) {
         final Intent intent = new Intent(this, UserInfoActivity.class);
         intent.putExtra(UserInfoActivity.KEY_ACCOUNT, user);
         OwnCloudAccount oca = user.toOwnCloudAccount();
@@ -471,6 +484,32 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap
         startActivityForResult(intent, KEY_USER_INFO_REQUEST_CODE);
     }
 
+    @Override
+    public void onOptionItemClicked(User user, View view) {
+        if (view.getId() == R.id.account_menu) {
+            ImageView menuButton = findViewById(R.id.account_menu);
+
+            PopupMenu popup = new PopupMenu(view.getContext(), menuButton);
+            popup.getMenuInflater().inflate(R.menu.item_account, popup.getMenu());
+            popup.show();
+            popup.setOnMenuItemClickListener(item -> {
+                if (item.getItemId() == R.id.action_delete_account) {
+                    openAccountRemovalConfirmationDialog(user, getSupportFragmentManager());
+                } else {
+                    openAccount(user);
+                }
+                return true;
+            });
+        } else {
+            openAccount(user);
+        }
+    }
+
+    @Override
+    public void onAccountClicked(User user) {
+        openAccount(user);
+    }
+
     /**
      * Defines callbacks for service binding, passed to bindService()
      */

+ 18 - 4
src/main/java/com/owncloud/android/ui/adapter/UserListAdapter.java

@@ -40,6 +40,7 @@ import com.owncloud.android.R;
 import com.owncloud.android.lib.common.OwnCloudAccount;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.ui.activity.BaseActivity;
+import com.owncloud.android.ui.activity.ReceiveExternalFilesActivity;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.ThemeUtils;
 
@@ -295,13 +296,20 @@ public class UserListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
 
         private User user;
 
+
         AccountViewHolderItem(@NonNull View view) {
             super(view);
             this.imageViewItem = view.findViewById(R.id.user_icon);
             this.checkViewItem = view.findViewById(R.id.ticker);
             this.usernameViewItem = view.findViewById(R.id.user_name);
             this.accountViewItem = view.findViewById(R.id.account);
+            ImageView accountMenu = view.findViewById(R.id.account_menu);
+
             view.setOnClickListener(this);
+            if(context instanceof ReceiveExternalFilesActivity) {
+                accountMenu.setVisibility(View.GONE);
+            }
+            accountMenu.setOnClickListener(this);
         }
 
         public void setData(User user) {
@@ -309,9 +317,13 @@ public class UserListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
         }
 
         @Override
-        public void onClick(View v) {
-            if (clickListener != null && v.isEnabled()) {
-                clickListener.onClick(user);
+        public void onClick(View view) {
+            if (clickListener != null && view.isEnabled()) {
+                if (view.getId() == R.id.account_menu) {
+                    clickListener.onOptionItemClicked(user, view);
+                } else {
+                    clickListener.onAccountClicked(user);
+                }
             }
         }
     }
@@ -328,6 +340,8 @@ public class UserListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
     }
 
     public interface ClickListener {
-        void onClick(User user);
+        void onOptionItemClicked(User user, View view);
+
+        void onAccountClicked(User user);
     }
 }

+ 7 - 1
src/main/java/com/owncloud/android/ui/dialog/MultipleAccountsDialog.java

@@ -131,7 +131,13 @@ public class MultipleAccountsDialog extends DialogFragment implements Injectable
     }
 
     @Override
-    public void onClick(User user) {
+    public void onOptionItemClicked(User user, View view) {
+        // By default, access account if option is clicked
+        onAccountClicked(user);
+    }
+
+    @Override
+    public void onAccountClicked(User user) {
         final ReceiveExternalFilesActivity parentActivity = (ReceiveExternalFilesActivity) getActivity();
         if (parentActivity != null) {
             parentActivity.changeAccount(user.toPlatformAccount());

+ 47 - 31
src/main/res/layout/account_item.xml

@@ -55,40 +55,56 @@
             android:contentDescription="@string/active_user"/>
     </FrameLayout>
 
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_centerInParent="true"
-        android:layout_toEndOf="@id/avatar_container"
-        android:orientation="vertical"
-        android:paddingEnd="@dimen/zero"
-        android:paddingStart="3dp">
 
-        <TextView
-            android:id="@+id/user_name"
+        <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_marginEnd="@dimen/standard_half_margin"
-            android:layout_marginStart="@dimen/standard_margin"
-            android:layout_marginTop="@dimen/standard_quarter_margin"
-            android:ellipsize="end"
-            android:gravity="bottom"
-            android:maxLines="1"
-            android:text="@string/placeholder_filename"
-            android:textAppearance="?android:attr/textAppearanceListItem"/>
+            android:layout_centerInParent="true"
+            android:layout_toEndOf="@id/avatar_container"
+            android:orientation="vertical"
+            android:paddingEnd="@dimen/zero"
+            android:layout_marginEnd="25dp"
+            android:paddingStart="3dp">
 
-        <TextView
-            android:id="@+id/account"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginBottom="@dimen/standard_quarter_margin"
-            android:layout_marginEnd="@dimen/standard_half_margin"
-            android:layout_marginStart="@dimen/standard_margin"
-            android:ellipsize="end"
-            android:gravity="top"
-            android:maxLines="2"
-            android:text="@string/placeholder_sentence"
-            android:textColor="?android:attr/textColorSecondary"/>
-    </LinearLayout>
+            <TextView
+                android:id="@+id/user_name"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginEnd="@dimen/standard_half_margin"
+                android:layout_marginStart="@dimen/standard_margin"
+                android:layout_marginTop="@dimen/standard_quarter_margin"
+                android:ellipsize="end"
+                android:gravity="bottom"
+                android:maxLines="1"
+                android:text="@string/placeholder_filename"
+                android:textAppearance="?android:attr/textAppearanceListItem"/>
+
+            <TextView
+                android:id="@+id/account"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="@dimen/standard_quarter_margin"
+                android:layout_marginEnd="@dimen/standard_half_margin"
+                android:layout_marginStart="@dimen/standard_margin"
+                android:ellipsize="end"
+                android:gravity="top"
+                android:maxLines="2"
+                android:text="@string/placeholder_sentence"
+                android:textColor="?android:attr/textColorSecondary"/>
+
+        </LinearLayout>
+
+        <ImageView
+            android:id="@+id/account_menu"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_centerVertical="true"
+            android:layout_alignParentEnd="true"
+            android:clickable="true"
+            android:contentDescription="@string/overflow_menu"
+            android:focusable="true"
+            android:paddingEnd="@dimen/alternate_padding"
+            android:paddingStart="@dimen/standard_half_padding"
+            android:src="@drawable/ic_dots_vertical"/>
 
 </RelativeLayout>

+ 38 - 0
src/main/res/menu/item_account.xml

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Nextcloud Android client application
+
+ @author  Infomaniak Network SA (Kilian P.)
+ Copyright (C) 2020 Infomaniak
+ Copyright (C) 2020 Nextcloud GmbH
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+-->
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:app="http://schemas.android.com/apk/res-auto"
+      xmlns:tools="http://schemas.android.com/tools"
+      tools:ignore="AppCompatResource">
+
+    <item
+        android:id="@+id/action_open_account"
+        android:title="@string/view_profile"
+        app:showAsAction="never"
+        android:showAsAction="never" />
+
+    <item
+        android:id="@+id/action_delete_account"
+        android:title="@string/delete_account"
+        app:showAsAction="never"
+        android:showAsAction="never" />
+</menu>

+ 1 - 0
src/main/res/values/strings.xml

@@ -947,4 +947,5 @@
     <string name="thumbnail_for_existing_file_description">Thumbnail for existing file</string>
     <string name="invalid_url">Invalid URL</string>
     <string name="conflict_dialog_error">Error creating conflict dialog!</string>
+    <string name="view_profile">View profile</string>
 </resources>