瀏覽代碼

update rich document chooser for new prefill logic

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
Andy Scherzinger 4 年之前
父節點
當前提交
06ced09c7a

+ 21 - 4
src/main/java/com/owncloud/android/ui/adapter/RichDocumentsTemplateAdapter.java

@@ -26,8 +26,6 @@ import android.content.Context;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
 
 import com.bumptech.glide.Glide;
 import com.nextcloud.client.account.CurrentAccountProvider;
@@ -37,6 +35,7 @@ import com.owncloud.android.databinding.TemplateButtonBinding;
 import com.owncloud.android.datamodel.Template;
 import com.owncloud.android.ui.dialog.ChooseRichDocumentsTemplateDialogFragment;
 import com.owncloud.android.utils.NextcloudServer;
+import com.owncloud.android.utils.ThemeUtils;
 import com.owncloud.android.utils.glide.CustomGlideStreamLoader;
 
 import java.util.ArrayList;
@@ -44,8 +43,6 @@ import java.util.List;
 
 import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.RecyclerView;
-import butterknife.BindView;
-import butterknife.ButterKnife;
 
 /**
  * Adapter for handling Templates, used to create files out of it via RichDocuments app
@@ -58,6 +55,9 @@ public class RichDocumentsTemplateAdapter extends RecyclerView.Adapter<RichDocum
     private ChooseRichDocumentsTemplateDialogFragment.Type type;
     private CurrentAccountProvider currentAccountProvider;
     private ClientFactory clientFactory;
+    private Template selectedTemplate;
+    private final int colorSelected;
+    private final int colorUnselected;
 
     public RichDocumentsTemplateAdapter(
         ChooseRichDocumentsTemplateDialogFragment.Type type,
@@ -71,6 +71,8 @@ public class RichDocumentsTemplateAdapter extends RecyclerView.Adapter<RichDocum
         this.context = context;
         this.currentAccountProvider = currentAccountProvider;
         this.clientFactory = clientFactory;
+        colorSelected = ThemeUtils.primaryColor(context, true);
+        colorUnselected = context.getResources().getColor(R.color.grey_200);
     }
 
     @NonNull
@@ -91,6 +93,15 @@ public class RichDocumentsTemplateAdapter extends RecyclerView.Adapter<RichDocum
         this.templateList = templateList;
     }
 
+    public void setTemplateAsActive(Template template) {
+        selectedTemplate = template;
+        notifyDataSetChanged();
+    }
+
+    public Template getSelectedTemplate() {
+        return selectedTemplate;
+    }
+
     @Override
     public int getItemCount() {
         return templateList.size();
@@ -144,6 +155,12 @@ public class RichDocumentsTemplateAdapter extends RecyclerView.Adapter<RichDocum
                 .into(binding.template);
 
             binding.templateName.setText(template.getName());
+
+            if (template == selectedTemplate) {
+                binding.templateContainer.setStrokeColor(colorSelected);
+            } else {
+                binding.templateContainer.setStrokeColor(colorUnselected);
+            }
         }
     }
 

+ 39 - 11
src/main/java/com/owncloud/android/ui/dialog/ChooseRichDocumentsTemplateDialogFragment.java

@@ -24,7 +24,6 @@ package com.owncloud.android.ui.dialog;
 
 import android.app.Activity;
 import android.app.Dialog;
-import android.content.DialogInterface;
 import android.content.Intent;
 import android.os.AsyncTask;
 import android.os.Bundle;
@@ -32,6 +31,7 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.Window;
 import android.view.WindowManager.LayoutParams;
+import android.widget.Button;
 
 import com.nextcloud.client.account.CurrentAccountProvider;
 import com.nextcloud.client.account.User;
@@ -74,7 +74,7 @@ import androidx.recyclerview.widget.GridLayoutManager;
 /**
  * Dialog to show templates for new documents/spreadsheets/presentations.
  */
-public class ChooseRichDocumentsTemplateDialogFragment extends DialogFragment implements DialogInterface.OnClickListener,
+public class ChooseRichDocumentsTemplateDialogFragment extends DialogFragment implements View.OnClickListener,
     RichDocumentsTemplateAdapter.ClickListener, Injectable {
 
     private static final String ARG_PARENT_FOLDER = "PARENT_FOLDER";
@@ -87,6 +87,7 @@ public class ChooseRichDocumentsTemplateDialogFragment extends DialogFragment im
     private OwnCloudClient client;
     @Inject CurrentAccountProvider currentAccount;
     @Inject ClientFactory clientFactory;
+    private Button positiveButton;
 
     public enum Type {
         DOCUMENT,
@@ -114,7 +115,11 @@ public class ChooseRichDocumentsTemplateDialogFragment extends DialogFragment im
 
         AlertDialog alertDialog = (AlertDialog) getDialog();
 
-        ThemeUtils.themeBorderlessButton(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE), color);
+        positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
+        ThemeUtils.themeBorderlessButton(positiveButton, color);
+        positiveButton.setOnClickListener(this);
+        positiveButton.setEnabled(false);
+
         ThemeUtils.themeBorderlessButton(alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL), color);
     }
 
@@ -158,7 +163,8 @@ public class ChooseRichDocumentsTemplateDialogFragment extends DialogFragment im
         // Build the dialog
         AlertDialog.Builder builder = new AlertDialog.Builder(activity);
         builder.setView(view)
-            .setNeutralButton(R.string.common_cancel, this)
+            .setPositiveButton(R.string.create, null)
+            .setNeutralButton(R.string.common_cancel, null)
             .setTitle(R.string.select_template);
         Dialog dialog = builder.create();
 
@@ -187,22 +193,44 @@ public class ChooseRichDocumentsTemplateDialogFragment extends DialogFragment im
     }
 
     @Override
-    public void onClick(Template template) {
+    public void onClick(View v) {
         String name = binding.filename.getText().toString();
         String path = parentFolder.getRemotePath() + name;
 
-        if (name.isEmpty() || name.equalsIgnoreCase(DOT + template.getExtension())) {
+        Template selectedTemplate = adapter.getSelectedTemplate();
+
+        if (selectedTemplate == null) {
+            DisplayUtils.showSnackMessage(binding.list, R.string.select_one_template);
+        } else if (name.isEmpty() || name.equalsIgnoreCase(DOT + selectedTemplate.getExtension())) {
             DisplayUtils.showSnackMessage(binding.list, R.string.enter_filename);
-        } else if (!name.endsWith(template.getExtension())) {
-            createFromTemplate(template, path + DOT + template.getExtension());
+        } else if (!name.endsWith(selectedTemplate.getExtension())) {
+            createFromTemplate(selectedTemplate, path + DOT + selectedTemplate.getExtension());
         } else {
-            createFromTemplate(template, path);
+            createFromTemplate(selectedTemplate, path);
         }
     }
 
     @Override
-    public void onClick(DialogInterface dialog, int which) {
-        // cancel is handled by dialog itself, no other button available
+    public void onClick(Template template) {
+        adapter.setTemplateAsActive(template);
+        prefillFilenameIfEmpty(template);
+        checkEnablingCreateButton();
+    }
+
+    private void prefillFilenameIfEmpty(Template template) {
+        String name = binding.filename.getText().toString();
+        if (name.isEmpty() || name.equalsIgnoreCase(DOT + template.getExtension())) {
+            binding.filename.setText(String.format("%s.%s", template.name, template.extension));
+        }
+        binding.filename.setSelection(binding.filename.getText().toString().lastIndexOf('.'));
+    }
+
+    private void checkEnablingCreateButton() {
+        Template selectedTemplate = adapter.getSelectedTemplate();
+        String name = binding.filename.getText().toString();
+
+        positiveButton.setEnabled(selectedTemplate != null && !name.isEmpty() &&
+                                      !name.equalsIgnoreCase(DOT + selectedTemplate.getExtension()));
     }
 
     private static class CreateFileFromTemplateTask extends AsyncTask<Void, Void, String> {