瀏覽代碼

Implemented ChooseAccountFragment dialog + Fixed some things around accounts management

Signed-off-by: Kilian Périsset <kilian.perisset@infomaniak.com>
Kilian Périsset 4 年之前
父節點
當前提交
127f4886cd

+ 132 - 0
src/main/java/com/nextcloud/ui/ChooseAccountFragment.kt

@@ -0,0 +1,132 @@
+package com.nextcloud.ui
+
+import android.graphics.drawable.Drawable
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.RelativeLayout
+import androidx.core.content.ContextCompat
+import androidx.core.graphics.drawable.DrawableCompat
+import androidx.fragment.app.DialogFragment
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.nextcloud.client.account.User
+import com.nextcloud.client.account.UserAccountManager
+import com.owncloud.android.R
+import com.owncloud.android.lib.common.utils.Log_OC
+import com.owncloud.android.ui.activity.BaseActivity
+import com.owncloud.android.ui.activity.DrawerActivity
+import com.owncloud.android.ui.adapter.UserListAdapter
+import com.owncloud.android.ui.adapter.UserListItem
+import com.owncloud.android.utils.DisplayUtils
+import com.owncloud.android.utils.DisplayUtils.AvatarGenerationListener
+import kotlinx.android.synthetic.main.account_item.*
+import kotlinx.android.synthetic.main.fragment_choose_account.*
+import java.util.ArrayList
+
+private const val ARG_CURRENT_USER_PARAM = "currentUser"
+
+class ChooseAccountFragment : DialogFragment(), AvatarGenerationListener, UserListAdapter.ClickListener {
+    private var currentUser: User? = null
+    private lateinit var accountManager: UserAccountManager
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        arguments?.let {
+            currentUser = it.getParcelable(ARG_CURRENT_USER_PARAM)
+        }
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+        accountManager = (activity as BaseActivity).userAccountManager
+        currentUser?.let { user ->
+
+            // Defining user picture
+            user_icon.tag = user.accountName
+            DisplayUtils.setAvatar(user, this, resources.getDimension(R.dimen.list_item_avatar_icon_radius), resources, user_icon, context)
+
+            // Defining user texts, accounts, etc.
+            user_name.text = user.toOwnCloudAccount().displayName
+            ticker.visibility = View.GONE
+            account.text = user.accountName
+
+            // Defining user right indicator
+            account_menu.setImageDrawable(ContextCompat.getDrawable(requireContext(), R.drawable
+                .ic_check_circle)?.let { icon -> DrawableCompat.wrap(icon) })
+            val tintedCheck = ContextCompat.getDrawable(requireContext(), R.drawable.account_circle_white)?.let { DrawableCompat.wrap(it) }
+
+            // Creating adapter for accounts list
+            val adapter = UserListAdapter(activity as BaseActivity,
+                accountManager,
+                getAccountListItems(),
+                tintedCheck,
+                this,
+                false, false)
+            accounts_list.setHasFixedSize(true)
+            accounts_list.layoutManager = LinearLayoutManager(activity)
+            accounts_list.adapter = adapter
+
+            /*
+            // Creating listeners for quick-actions
+            user_layout.setOnClickListener {
+                dismiss()
+            }
+            */
+            add_account.setOnClickListener {
+                (activity as DrawerActivity).openAddAccount()
+            }
+            manage_accounts.setOnClickListener {
+                (activity as DrawerActivity).openManageAccounts()
+            }
+        }
+    }
+
+    private fun getAccountListItems(): List<UserListItem>? {
+        val users = accountManager.allUsers
+        val adapterUserList: MutableList<UserListItem> = ArrayList(users.size)
+        for (user in users) {
+            if (user != currentUser) {
+                adapterUserList.add(UserListItem(user))
+            }
+        }
+        return adapterUserList
+    }
+
+    /**
+     * Fragment creator
+     */
+    companion object {
+        @JvmStatic
+        fun newInstance(user: User) =
+            ChooseAccountFragment().apply {
+                arguments = Bundle().apply {
+                    putParcelable(ARG_CURRENT_USER_PARAM, user)
+                }
+            }
+    }
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+                              savedInstanceState: Bundle?): View? {
+        return inflater.inflate(R.layout.fragment_choose_account, container, false)
+    }
+
+    override fun shouldCallGeneratedCallback(tag: String?, callContext: Any?): Boolean {
+        return (callContext as ImageView).tag.toString() == tag
+    }
+
+    override fun avatarGenerated(avatarDrawable: Drawable?, callContext: Any?) {
+        user_icon.setImageDrawable(avatarDrawable)
+    }
+
+    override fun onAccountClicked(user: User?) {
+        (activity as DrawerActivity).accountClicked(user.hashCode())
+    }
+
+    override fun onOptionItemClicked(user: User?, view: View?) {
+        // Todo : Implement the onOptionItemClicked
+    }
+}

+ 21 - 11
src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java

@@ -62,6 +62,7 @@ import com.nextcloud.client.onboarding.FirstRunActivity;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.nextcloud.client.preferences.DarkMode;
 import com.nextcloud.java.util.Optional;
+import com.nextcloud.ui.ChooseAccountFragment;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.PassCodeManager;
@@ -495,16 +496,7 @@ public abstract class DrawerActivity extends ToolbarActivity
     private void handleAccountItemClick(MenuItem menuItem) {
         switch (menuItem.getItemId()) {
             case R.id.drawer_menu_account_add:
-                boolean isProviderOrOwnInstallationVisible = getResources()
-                    .getBoolean(R.bool.show_provider_or_own_installation);
-
-                if (isProviderOrOwnInstallationVisible) {
-                    Intent firstRunIntent = new Intent(getApplicationContext(), FirstRunActivity.class);
-                    firstRunIntent.putExtra(FirstRunActivity.EXTRA_ALLOW_CLOSE, true);
-                    startActivity(firstRunIntent);
-                } else {
-                    startAccountCreation();
-                }
+                openAddAccount();
                 break;
 
             case R.id.drawer_menu_account_manage:
@@ -517,11 +509,29 @@ public abstract class DrawerActivity extends ToolbarActivity
         }
     }
 
+    public void showManageAccountsDialog() {
+        ChooseAccountFragment choseAccountDialog = ChooseAccountFragment.newInstance(accountManager.getUser());
+        choseAccountDialog.show(getSupportFragmentManager(), "fragment_chose_account");
+    }
+
     public void openManageAccounts() {
         Intent manageAccountsIntent = new Intent(getApplicationContext(), ManageAccountsActivity.class);
         startActivityForResult(manageAccountsIntent, ACTION_MANAGE_ACCOUNTS);
     }
 
+    public void openAddAccount() {
+        boolean isProviderOrOwnInstallationVisible = getResources()
+            .getBoolean(R.bool.show_provider_or_own_installation);
+
+        if (isProviderOrOwnInstallationVisible) {
+            Intent firstRunIntent = new Intent(getApplicationContext(), FirstRunActivity.class);
+            firstRunIntent.putExtra(FirstRunActivity.EXTRA_ALLOW_CLOSE, true);
+            startActivity(firstRunIntent);
+        } else {
+            startAccountCreation();
+        }
+    }
+
     private void startPhotoSearch(MenuItem menuItem) {
         SearchEvent searchEvent = new SearchEvent("image/%", SearchRemoteOperation.SearchType.PHOTO_SEARCH);
 
@@ -569,7 +579,7 @@ public abstract class DrawerActivity extends ToolbarActivity
      *
      * @param hashCode HashCode of account to be set
      */
-    private void accountClicked(int hashCode) {
+    public void accountClicked(int hashCode) {
         final User currentUser = accountManager.getUser();
         if (currentUser.hashCode() != hashCode && accountManager.setCurrentOwnCloudAccount(hashCode)) {
             fetchExternalLinks(true);

+ 1 - 1
src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -265,7 +265,7 @@ public class FileDisplayActivity extends FileActivity
         });
 
         mSwitchAccountButton.setOnClickListener(v -> {
-            openManageAccounts();
+            showManageAccountsDialog();
         });
 
         mDualPane = getResources().getBoolean(R.bool.large_land_layout);

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

@@ -161,7 +161,7 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap
                                               getUserListItems(),
                                               tintedCheck,
                                               this,
-                                              multipleAccountsSupported);
+                                              multipleAccountsSupported, true);
 
         recyclerView.setAdapter(userListAdapter);
         recyclerView.setLayoutManager(new LinearLayoutManager(this));
@@ -309,7 +309,7 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap
                                       getUserListItems(),
                                       tintedCheck,
                                       this,
-                                      multipleAccountsSupported
+                                      multipleAccountsSupported, false
                                   );
                                   recyclerView.setAdapter(userListAdapter);
                                   runOnUiThread(() -> userListAdapter.notifyDataSetChanged());
@@ -362,7 +362,7 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap
                                                       userListItemArray,
                                                       tintedCheck,
                                                       this,
-                                                      multipleAccountsSupported
+                                                      multipleAccountsSupported, false
                 );
                 recyclerView.setAdapter(userListAdapter);
             } else {

+ 9 - 5
src/main/java/com/owncloud/android/ui/adapter/UserListAdapter.java

@@ -40,7 +40,6 @@ 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;
 
@@ -68,13 +67,14 @@ public class UserListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
     public static final int KEY_USER_INFO_REQUEST_CODE = 13;
     private ClickListener clickListener;
     private boolean showAddAccount;
+    private boolean showDotsMenu;
 
     public UserListAdapter(BaseActivity context,
                            UserAccountManager accountManager,
                            List<UserListItem> values,
                            Drawable tintedCheck,
                            ClickListener clickListener,
-                           boolean showAddAccount) {
+                           boolean showAddAccount, boolean showDotsMenu) {
         this.context = context;
         this.accountManager = accountManager;
         this.values = values;
@@ -85,6 +85,7 @@ public class UserListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
         this.tintedCheck = tintedCheck;
         this.clickListener = clickListener;
         this.showAddAccount = showAddAccount;
+        this.showDotsMenu = showDotsMenu;
     }
 
     @Override
@@ -290,6 +291,7 @@ public class UserListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
     class AccountViewHolderItem extends RecyclerView.ViewHolder implements View.OnClickListener {
         private ImageView imageViewItem;
         private ImageView checkViewItem;
+        private ImageView accountMenu;
 
         private TextView usernameViewItem;
         private TextView accountViewItem;
@@ -303,13 +305,15 @@ public class UserListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
             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);
+            this.accountMenu = view.findViewById(R.id.account_menu);
 
             view.setOnClickListener(this);
-            if(context instanceof ReceiveExternalFilesActivity) {
+            if (showDotsMenu) {
+                accountMenu.setVisibility(View.VISIBLE);
+                accountMenu.setOnClickListener(this);
+            } else {
                 accountMenu.setVisibility(View.GONE);
             }
-            accountMenu.setOnClickListener(this);
         }
 
         public void setData(User user) {

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

@@ -95,7 +95,7 @@ public class MultipleAccountsDialog extends DialogFragment implements Injectable
                                                       getAccountListItems(),
                                                       tintedCheck,
                                                       this,
-                                                      false);
+                                                      false, false);
 
         listView.setHasFixedSize(true);
         listView.setLayoutManager(new LinearLayoutManager(activity));

+ 4 - 8
src/main/res/drawable/ic_check_circle.xml

@@ -1,9 +1,5 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z" />
+<vector android:height="24dp" android:tint="#4995FB"
+    android:viewportHeight="24.0" android:viewportWidth="24.0"
+    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="#FF000000" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z"/>
 </vector>

+ 9 - 6
src/main/res/layout/account_item.xml

@@ -21,10 +21,13 @@
 -->
 <RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/user_layout"
     android:layout_width="match_parent"
     android:layout_height="@dimen/account_item_layout_height"
     android:orientation="horizontal"
-    android:weightSum="1">
+    android:foreground="?attr/selectableItemBackground"
+    tools:ignore="UnusedAttribute">
 
     <FrameLayout
         android:id="@+id/avatar_container"
@@ -70,8 +73,8 @@
                 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_marginEnd="@dimen/standard_double_margin"
+                android:layout_marginStart="@dimen/standard_half_margin"
                 android:layout_marginTop="@dimen/standard_quarter_margin"
                 android:ellipsize="end"
                 android:gravity="bottom"
@@ -84,11 +87,11 @@
                 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:layout_marginEnd="@dimen/standard_double_margin"
+                android:layout_marginStart="@dimen/standard_half_margin"
                 android:ellipsize="end"
                 android:gravity="top"
-                android:maxLines="2"
+                android:maxLines="1"
                 android:text="@string/placeholder_sentence"
                 android:textColor="?android:attr/textColorSecondary"/>
 

+ 68 - 0
src/main/res/layout/fragment_choose_account.xml

@@ -0,0 +1,68 @@
+<androidx.constraintlayout.widget.ConstraintLayout 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"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:padding="5dp"
+    tools:context="com.nextcloud.ui.ChooseAccountFragment">
+
+    <include
+        android:id="@+id/current_account"
+        layout="@layout/account_item"
+        app:layout_constraintBottom_toTopOf="@id/separator_line"
+        app:layout_constraintStart_toStartOf="parent" />
+
+    <View
+        android:id="@+id/separator_line"
+        android:layout_width="0dp"
+        android:layout_height="1dp"
+        android:background="@color/account_separator"
+        app:layout_constraintBottom_toBottomOf="@+id/current_account"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/accounts_list"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        app:layout_constrainedHeight="true"
+        app:layout_constraintBottom_toTopOf="@+id/add_account"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/separator_line" />
+
+    <TextView
+        android:id="@+id/add_account"
+        android:layout_width="0dp"
+        android:layout_height="40dp"
+        android:drawableStart="@drawable/ic_account_plus"
+        android:drawablePadding="25dp"
+        android:foreground="?attr/selectableItemBackground"
+        android:gravity="center_vertical"
+        android:paddingStart="24dp"
+        android:text="Add account"
+        android:textAppearance="?android:attr/textAppearanceListItem"
+        android:textColor="@color/black"
+        app:layout_constraintBottom_toTopOf="@+id/manage_accounts"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        tools:ignore="RtlSymmetry" />
+
+    <TextView
+        android:id="@+id/manage_accounts"
+        android:layout_width="0dp"
+        android:layout_height="40dp"
+        android:drawableStart="@drawable/ic_settings"
+        android:drawablePadding="25dp"
+        android:foreground="?attr/selectableItemBackground"
+        android:gravity="center_vertical"
+        android:paddingStart="24dp"
+        android:text="Manage account"
+        android:textAppearance="?android:attr/textAppearanceListItem"
+        android:textColor="@color/black"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        tools:ignore="RtlSymmetry" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 3 - 0
src/main/res/values/colors.xml

@@ -87,4 +87,7 @@
     <color name="appbar">@android:color/white</color>
     <color name="fontAppbar">#666666</color>
     <color name="fontSecondaryAppbar">#A5A5A5</color>
+
+    <!-- Account selection -->
+    <color name="account_separator">#E0E0E0</color>
 </resources>