From d86421f743a83b9756f10eea789f44d176ae07d2 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 16 Oct 2023 08:54:42 +0200 Subject: [PATCH 01/20] Use M3 for buttons Signed-off-by: alperozturk --- .../ui/dialog/ConfirmationDialogFragment.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java index 7c0c19001daf..0b7f5b805131 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java @@ -20,6 +20,7 @@ import android.app.Dialog; import android.os.Bundle; +import com.google.android.material.button.MaterialButton; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.nextcloud.client.di.Injectable; import com.owncloud.android.R; @@ -84,10 +85,21 @@ public void onStart() { AlertDialog alertDialog = (AlertDialog) getDialog(); - if(alertDialog != null) { - viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE), - alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE), - alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL)); + if (alertDialog != null) { + MaterialButton positiveButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); + if (positiveButton != null) { + viewThemeUtils.material.colorMaterialButtonPrimaryTonal(positiveButton); + } + + MaterialButton negativeButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE); + if (negativeButton != null) { + viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(negativeButton); + } + + MaterialButton neutralButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL); + if (neutralButton != null) { + viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(neutralButton); + } } } From 35079e710616d8c272c37d6456250c26c4938100 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 16 Oct 2023 09:04:35 +0200 Subject: [PATCH 02/20] Rename button arguments Signed-off-by: alperozturk --- .../ui/dialog/ConfirmationDialogFragment.java | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java index 0b7f5b805131..16dadb859eb4 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java @@ -53,16 +53,17 @@ public class ConfirmationDialogFragment extends DialogFragment implements Inject /** * Public factory method to create new ConfirmationDialogFragment instances. * - * @param messageResId Resource id for a message to show in the dialog. - * @param messageArguments Arguments to complete the message, if it's a format string. May be null. - * @param titleResId Resource id for a text to show in the title. 0 for default alert title, -1 for no title. - * @param posBtn Resource id for the text of the positive button. -1 for no positive button. - * @param neuBtn Resource id for the text of the neutral button. -1 for no neutral button. - * @param negBtn Resource id for the text of the negative button. -1 for no negative button. + * @param messageResId Resource id for a message to show in the dialog. + * @param messageArguments Arguments to complete the message, if it's a format string. May be null. + * @param titleResId Resource id for a text to show in the title. 0 for default alert title, -1 for no + * title. + * @param positiveButtonTextId Resource id for the text of the positive button. -1 for no positive button. + * @param neutralButtonTextId Resource id for the text of the neutral button. -1 for no neutral button. + * @param negativeButtonTextId Resource id for the text of the negative button. -1 for no negative button. * @return Dialog ready to show. */ public static ConfirmationDialogFragment newInstance(int messageResId, String[] messageArguments, int titleResId, - int posBtn, int neuBtn, int negBtn) { + int positiveButtonTextId, int neutralButtonTextId, int negativeButtonTextId) { if (messageResId == -1) { throw new IllegalStateException("Calling confirmation dialog without message resource"); } @@ -72,9 +73,11 @@ public static ConfirmationDialogFragment newInstance(int messageResId, String[] args.putInt(ARG_MESSAGE_RESOURCE_ID, messageResId); args.putStringArray(ARG_MESSAGE_ARGUMENTS, messageArguments); args.putInt(ARG_TITLE_ID, titleResId); - args.putInt(ARG_POSITIVE_BTN_RES, posBtn); - args.putInt(ARG_NEUTRAL_BTN_RES, neuBtn); - args.putInt(ARG_NEGATIVE_BTN_RES, negBtn); + + args.putInt(ARG_POSITIVE_BTN_RES, positiveButtonTextId); + args.putInt(ARG_NEGATIVE_BTN_RES, negativeButtonTextId); + args.putInt(ARG_NEUTRAL_BTN_RES, neutralButtonTextId); + frag.setArguments(args); return frag; } @@ -125,9 +128,10 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { Object[] messageArguments = arguments.getStringArray(ARG_MESSAGE_ARGUMENTS); int messageId = arguments.getInt(ARG_MESSAGE_RESOURCE_ID, -1); int titleId = arguments.getInt(ARG_TITLE_ID, -1); - int posBtn = arguments.getInt(ARG_POSITIVE_BTN_RES, -1); - int neuBtn = arguments.getInt(ARG_NEUTRAL_BTN_RES, -1); - int negBtn = arguments.getInt(ARG_NEGATIVE_BTN_RES, -1); + + int positiveButtonTextId = arguments.getInt(ARG_POSITIVE_BTN_RES, -1); + int negativeButtonTextId = arguments.getInt(ARG_NEGATIVE_BTN_RES, -1); + int neutralButtonTextId = arguments.getInt(ARG_NEUTRAL_BTN_RES, -1); if (messageArguments == null) { messageArguments = new String[]{}; @@ -144,24 +148,25 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { builder.setTitle(titleId); } - if (posBtn != -1) { - builder.setPositiveButton(posBtn, (dialog, whichButton) -> { + if (positiveButtonTextId != -1) { + builder.setPositiveButton(positiveButtonTextId, (dialog, whichButton) -> { if (mListener != null) { mListener.onConfirmation(getTag()); } dialog.dismiss(); }); } - if (neuBtn != -1) { - builder.setNeutralButton(neuBtn, (dialog, whichButton) -> { + + if (neutralButtonTextId != -1) { + builder.setNeutralButton(neutralButtonTextId, (dialog, whichButton) -> { if (mListener != null) { mListener.onNeutral(getTag()); } dialog.dismiss(); }); } - if (negBtn != -1) { - builder.setNegativeButton(negBtn, (dialog, which) -> { + if (negativeButtonTextId != -1) { + builder.setNegativeButton(negativeButtonTextId, (dialog, which) -> { if (mListener != null) { mListener.onCancel(getTag()); } From 3fc0a1bf8683dfbcea1af611d269132141e55dea Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 16 Oct 2023 09:19:23 +0200 Subject: [PATCH 03/20] Change order or buttons according to M3 Signed-off-by: alperozturk --- .../ui/dialog/ConfirmationDialogFragment.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java index 16dadb859eb4..b30303cf030e 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java @@ -157,21 +157,33 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { }); } - if (neutralButtonTextId != -1) { - builder.setNeutralButton(neutralButtonTextId, (dialog, whichButton) -> { + if (negativeButtonTextId != -1 && neutralButtonTextId == -1) { + builder.setNegativeButton(negativeButtonTextId, (dialog, which) -> { if (mListener != null) { - mListener.onNeutral(getTag()); + mListener.onCancel(getTag()); } dialog.dismiss(); }); - } - if (negativeButtonTextId != -1) { + } else if (neutralButtonTextId != -1 && negativeButtonTextId == -1) { + builder.setNegativeButton(neutralButtonTextId, (dialog, which) -> { + if (mListener != null) { + mListener.onCancel(getTag()); + } + dialog.dismiss(); + }); + } else { builder.setNegativeButton(negativeButtonTextId, (dialog, which) -> { if (mListener != null) { mListener.onCancel(getTag()); } dialog.dismiss(); }); + builder.setNeutralButton(neutralButtonTextId, (dialog, whichButton) -> { + if (mListener != null) { + mListener.onNeutral(getTag()); + } + dialog.dismiss(); + }); } viewThemeUtils.dialog.colorMaterialAlertDialogBackground(activity, builder); From df395de821b42f90c07a1e94cfa72c16aacbcd82 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 16 Oct 2023 09:23:09 +0200 Subject: [PATCH 04/20] Fix action for neutral button Signed-off-by: alperozturk --- .../owncloud/android/ui/dialog/ConfirmationDialogFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java index b30303cf030e..f17831a89fce 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java @@ -167,7 +167,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { } else if (neutralButtonTextId != -1 && negativeButtonTextId == -1) { builder.setNegativeButton(neutralButtonTextId, (dialog, which) -> { if (mListener != null) { - mListener.onCancel(getTag()); + mListener.onNeutral(getTag()); } dialog.dismiss(); }); From 748f0e2e76b57fd180cd20c70831c43976c99b74 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 16 Oct 2023 10:00:37 +0200 Subject: [PATCH 05/20] Update screenshots Signed-off-by: alperozturk --- ....DialogFragmentIT_testRemoveFileDialog.png | Bin 5272 -> 6223 bytes ...DialogFragmentIT_testRemoveFilesDialog.png | Bin 5634 -> 6581 bytes ...ialogFragmentIT_testRemoveFolderDialog.png | Bin 4878 -> 5842 bytes ...alogFragmentIT_testRemoveFoldersDialog.png | Bin 5634 -> 6581 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog.png index c4bd33b4abd24f7b88ce203ea7dea631319a56a1..bb93a174e2db5ebd047fc1dc635402030a8ddb16 100644 GIT binary patch delta 5478 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 C+AQz@ delta 4801 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 literal 4878 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 C+AQz@ delta 4801 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 b*O~tU`Hg5mL}^;l00000NkvXXu0mjf3t Date: Mon, 16 Oct 2023 10:44:55 +0200 Subject: [PATCH 06/20] Remove button order logic from dialog Signed-off-by: alperozturk --- .../ui/activity/UploadFilesActivity.java | 4 +--- .../ui/dialog/ConfirmationDialogFragment.java | 23 ++++--------------- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java index 8a8572e3002f..bff39ae57e0e 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java @@ -528,9 +528,7 @@ public void onCheckAvailableSpaceFinish(boolean hasEnoughSpaceAvailable, String. // to the ownCloud folder instead of copying String[] args = {getString(R.string.app_name)}; ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance( - R.string.upload_query_move_foreign_files, args, 0, R.string.common_yes, -1, - R.string.common_no - ); + R.string.upload_query_move_foreign_files, args, 0, R.string.common_yes, R.string.common_no, -1); dialog.setOnConfirmationListener(this); dialog.show(getSupportFragmentManager(), QUERY_TO_MOVE_DIALOG_TAG); } diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java index f17831a89fce..ee8ac1ba598e 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java @@ -63,7 +63,7 @@ public class ConfirmationDialogFragment extends DialogFragment implements Inject * @return Dialog ready to show. */ public static ConfirmationDialogFragment newInstance(int messageResId, String[] messageArguments, int titleResId, - int positiveButtonTextId, int neutralButtonTextId, int negativeButtonTextId) { + int positiveButtonTextId, int negativeButtonTextId, int neutralButtonTextId) { if (messageResId == -1) { throw new IllegalStateException("Calling confirmation dialog without message resource"); } @@ -156,29 +156,16 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { dialog.dismiss(); }); } - - if (negativeButtonTextId != -1 && neutralButtonTextId == -1) { + if (negativeButtonTextId != -1) { builder.setNegativeButton(negativeButtonTextId, (dialog, which) -> { if (mListener != null) { mListener.onCancel(getTag()); } dialog.dismiss(); }); - } else if (neutralButtonTextId != -1 && negativeButtonTextId == -1) { - builder.setNegativeButton(neutralButtonTextId, (dialog, which) -> { - if (mListener != null) { - mListener.onNeutral(getTag()); - } - dialog.dismiss(); - }); - } else { - builder.setNegativeButton(negativeButtonTextId, (dialog, which) -> { - if (mListener != null) { - mListener.onCancel(getTag()); - } - dialog.dismiss(); - }); - builder.setNeutralButton(neutralButtonTextId, (dialog, whichButton) -> { + } + if (neutralButtonTextId != -1) { + builder.setNeutralButton(neutralButtonTextId, (dialog, which) -> { if (mListener != null) { mListener.onNeutral(getTag()); } From a387e689cdcc312ef5c3884ed5ccce55dc8666a8 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 16 Oct 2023 10:56:27 +0200 Subject: [PATCH 07/20] Add tests for ConfirmationDialog Signed-off-by: alperozturk --- .../android/ui/dialog/DialogFragmentIT.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java b/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java index 1a2bd2367fdf..c7efe77efa97 100644 --- a/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java +++ b/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java @@ -134,6 +134,27 @@ public void testLoadingDialog() { showDialog(dialog); } + @Test + @ScreenshotTest + public void testConfirmationDialogWithOneAction() { + ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(R.string.upload_list_empty_text_auto_upload, new String[]{}, R.string.filedetails_sync_file, R.string.common_ok, -1, -1); + showDialog(dialog); + } + + @Test + @ScreenshotTest + public void testConfirmationDialogWithTwoAction() { + ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(R.string.upload_list_empty_text_auto_upload, new String[]{}, R.string.filedetails_sync_file, R.string.common_ok, R.string.common_cancel, -1); + showDialog(dialog); + } + + @Test + @ScreenshotTest + public void testConfirmationDialogWithThreeAction() { + ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(R.string.upload_list_empty_text_auto_upload, new String[]{}, R.string.filedetails_sync_file, R.string.common_ok, R.string.common_cancel, R.string.common_confirm); + showDialog(dialog); + } + @Test @ScreenshotTest public void testRemoveFileDialog() { From 228c2159c7b63cd308035369905e26c8e36ebf26 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 16 Oct 2023 11:03:40 +0200 Subject: [PATCH 08/20] Add tests for ConfirmationDialog RTL Signed-off-by: alperozturk --- .../java/com/owncloud/android/AbstractIT.java | 18 ++++++++++++++++++ .../android/ui/dialog/DialogFragmentIT.java | 15 +++++++++++++++ .../ui/dialog/ConfirmationDialogFragment.java | 4 +++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/app/src/androidTest/java/com/owncloud/android/AbstractIT.java b/app/src/androidTest/java/com/owncloud/android/AbstractIT.java index 9549951b3471..7374c463190a 100644 --- a/app/src/androidTest/java/com/owncloud/android/AbstractIT.java +++ b/app/src/androidTest/java/com/owncloud/android/AbstractIT.java @@ -7,6 +7,8 @@ import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; @@ -58,6 +60,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.Collection; +import java.util.Locale; import java.util.Objects; import androidx.annotation.NonNull; @@ -403,6 +406,21 @@ public boolean isPowerSavingExclusionAvailable() { assertTrue(result.getLogMessage(), result.isSuccess()); } + protected void enableRTL() { + Locale locale = new Locale("ar"); + Resources resources = InstrumentationRegistry.getInstrumentation().getTargetContext().getResources(); + Configuration config = resources.getConfiguration(); + config.setLocale(locale); + resources.updateConfiguration(config, null); + } + + protected void resetLocale() { + Resources resources = InstrumentationRegistry.getInstrumentation().getTargetContext().getResources(); + Configuration defaultConfig = resources.getConfiguration(); + defaultConfig.setLocale(Locale.getDefault()); + resources.updateConfiguration(defaultConfig, null); + } + protected void screenshot(View view) { screenshot(view, ""); } diff --git a/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java b/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java index c7efe77efa97..024b40c7a3e3 100644 --- a/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java +++ b/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java @@ -25,6 +25,8 @@ import android.accounts.Account; import android.accounts.AccountManager; import android.content.Intent; +import android.content.res.Configuration; +import android.content.res.Resources; import android.net.http.SslCertificate; import android.net.http.SslError; import android.os.Looper; @@ -86,12 +88,14 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.Objects; import androidx.activity.result.contract.ActivityResultContract; import androidx.annotation.NonNull; import androidx.fragment.app.DialogFragment; import androidx.test.espresso.intent.rule.IntentsTestRule; +import androidx.test.platform.app.InstrumentationRegistry; import kotlin.Unit; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; @@ -155,6 +159,17 @@ public void testConfirmationDialogWithThreeAction() { showDialog(dialog); } + @Test + @ScreenshotTest + public void testConfirmationDialogWithThreeActionRTL() { + enableRTL(); + + ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(R.string.upload_list_empty_text_auto_upload, new String[] { }, -1, R.string.common_ok, R.string.common_cancel, R.string.common_confirm); + showDialog(dialog); + + resetLocale(); + } + @Test @ScreenshotTest public void testRemoveFileDialog() { diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java index ee8ac1ba598e..bd36a670ab3b 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java @@ -70,6 +70,7 @@ public static ConfirmationDialogFragment newInstance(int messageResId, String[] ConfirmationDialogFragment frag = new ConfirmationDialogFragment(); Bundle args = new Bundle(); + args.putInt(ARG_MESSAGE_RESOURCE_ID, messageResId); args.putStringArray(ARG_MESSAGE_ARGUMENTS, messageArguments); args.putInt(ARG_TITLE_ID, titleResId); @@ -126,8 +127,9 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { } Object[] messageArguments = arguments.getStringArray(ARG_MESSAGE_ARGUMENTS); - int messageId = arguments.getInt(ARG_MESSAGE_RESOURCE_ID, -1); + int titleId = arguments.getInt(ARG_TITLE_ID, -1); + int messageId = arguments.getInt(ARG_MESSAGE_RESOURCE_ID, -1); int positiveButtonTextId = arguments.getInt(ARG_POSITIVE_BTN_RES, -1); int negativeButtonTextId = arguments.getInt(ARG_NEGATIVE_BTN_RES, -1); From a5773aaab1a779234dba597b9576a0b03681d69f Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 16 Oct 2023 08:54:42 +0200 Subject: [PATCH 09/20] Use M3 for buttons Signed-off-by: alperozturk --- .../ui/dialog/ConfirmationDialogFragment.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java index 7c0c19001daf..0b7f5b805131 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java @@ -20,6 +20,7 @@ import android.app.Dialog; import android.os.Bundle; +import com.google.android.material.button.MaterialButton; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.nextcloud.client.di.Injectable; import com.owncloud.android.R; @@ -84,10 +85,21 @@ public void onStart() { AlertDialog alertDialog = (AlertDialog) getDialog(); - if(alertDialog != null) { - viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE), - alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE), - alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL)); + if (alertDialog != null) { + MaterialButton positiveButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); + if (positiveButton != null) { + viewThemeUtils.material.colorMaterialButtonPrimaryTonal(positiveButton); + } + + MaterialButton negativeButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE); + if (negativeButton != null) { + viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(negativeButton); + } + + MaterialButton neutralButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL); + if (neutralButton != null) { + viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(neutralButton); + } } } From f0f765d0e1d83e68c9a5660e471225751fb69d7f Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 16 Oct 2023 09:04:35 +0200 Subject: [PATCH 10/20] Rename button arguments Signed-off-by: alperozturk --- .../ui/dialog/ConfirmationDialogFragment.java | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java index 0b7f5b805131..16dadb859eb4 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java @@ -53,16 +53,17 @@ public class ConfirmationDialogFragment extends DialogFragment implements Inject /** * Public factory method to create new ConfirmationDialogFragment instances. * - * @param messageResId Resource id for a message to show in the dialog. - * @param messageArguments Arguments to complete the message, if it's a format string. May be null. - * @param titleResId Resource id for a text to show in the title. 0 for default alert title, -1 for no title. - * @param posBtn Resource id for the text of the positive button. -1 for no positive button. - * @param neuBtn Resource id for the text of the neutral button. -1 for no neutral button. - * @param negBtn Resource id for the text of the negative button. -1 for no negative button. + * @param messageResId Resource id for a message to show in the dialog. + * @param messageArguments Arguments to complete the message, if it's a format string. May be null. + * @param titleResId Resource id for a text to show in the title. 0 for default alert title, -1 for no + * title. + * @param positiveButtonTextId Resource id for the text of the positive button. -1 for no positive button. + * @param neutralButtonTextId Resource id for the text of the neutral button. -1 for no neutral button. + * @param negativeButtonTextId Resource id for the text of the negative button. -1 for no negative button. * @return Dialog ready to show. */ public static ConfirmationDialogFragment newInstance(int messageResId, String[] messageArguments, int titleResId, - int posBtn, int neuBtn, int negBtn) { + int positiveButtonTextId, int neutralButtonTextId, int negativeButtonTextId) { if (messageResId == -1) { throw new IllegalStateException("Calling confirmation dialog without message resource"); } @@ -72,9 +73,11 @@ public static ConfirmationDialogFragment newInstance(int messageResId, String[] args.putInt(ARG_MESSAGE_RESOURCE_ID, messageResId); args.putStringArray(ARG_MESSAGE_ARGUMENTS, messageArguments); args.putInt(ARG_TITLE_ID, titleResId); - args.putInt(ARG_POSITIVE_BTN_RES, posBtn); - args.putInt(ARG_NEUTRAL_BTN_RES, neuBtn); - args.putInt(ARG_NEGATIVE_BTN_RES, negBtn); + + args.putInt(ARG_POSITIVE_BTN_RES, positiveButtonTextId); + args.putInt(ARG_NEGATIVE_BTN_RES, negativeButtonTextId); + args.putInt(ARG_NEUTRAL_BTN_RES, neutralButtonTextId); + frag.setArguments(args); return frag; } @@ -125,9 +128,10 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { Object[] messageArguments = arguments.getStringArray(ARG_MESSAGE_ARGUMENTS); int messageId = arguments.getInt(ARG_MESSAGE_RESOURCE_ID, -1); int titleId = arguments.getInt(ARG_TITLE_ID, -1); - int posBtn = arguments.getInt(ARG_POSITIVE_BTN_RES, -1); - int neuBtn = arguments.getInt(ARG_NEUTRAL_BTN_RES, -1); - int negBtn = arguments.getInt(ARG_NEGATIVE_BTN_RES, -1); + + int positiveButtonTextId = arguments.getInt(ARG_POSITIVE_BTN_RES, -1); + int negativeButtonTextId = arguments.getInt(ARG_NEGATIVE_BTN_RES, -1); + int neutralButtonTextId = arguments.getInt(ARG_NEUTRAL_BTN_RES, -1); if (messageArguments == null) { messageArguments = new String[]{}; @@ -144,24 +148,25 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { builder.setTitle(titleId); } - if (posBtn != -1) { - builder.setPositiveButton(posBtn, (dialog, whichButton) -> { + if (positiveButtonTextId != -1) { + builder.setPositiveButton(positiveButtonTextId, (dialog, whichButton) -> { if (mListener != null) { mListener.onConfirmation(getTag()); } dialog.dismiss(); }); } - if (neuBtn != -1) { - builder.setNeutralButton(neuBtn, (dialog, whichButton) -> { + + if (neutralButtonTextId != -1) { + builder.setNeutralButton(neutralButtonTextId, (dialog, whichButton) -> { if (mListener != null) { mListener.onNeutral(getTag()); } dialog.dismiss(); }); } - if (negBtn != -1) { - builder.setNegativeButton(negBtn, (dialog, which) -> { + if (negativeButtonTextId != -1) { + builder.setNegativeButton(negativeButtonTextId, (dialog, which) -> { if (mListener != null) { mListener.onCancel(getTag()); } From 84b216868456d9ecd7217e24a41af3799c1e4384 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 16 Oct 2023 09:19:23 +0200 Subject: [PATCH 11/20] Change order or buttons according to M3 Signed-off-by: alperozturk --- .../ui/dialog/ConfirmationDialogFragment.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java index 16dadb859eb4..b30303cf030e 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java @@ -157,21 +157,33 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { }); } - if (neutralButtonTextId != -1) { - builder.setNeutralButton(neutralButtonTextId, (dialog, whichButton) -> { + if (negativeButtonTextId != -1 && neutralButtonTextId == -1) { + builder.setNegativeButton(negativeButtonTextId, (dialog, which) -> { if (mListener != null) { - mListener.onNeutral(getTag()); + mListener.onCancel(getTag()); } dialog.dismiss(); }); - } - if (negativeButtonTextId != -1) { + } else if (neutralButtonTextId != -1 && negativeButtonTextId == -1) { + builder.setNegativeButton(neutralButtonTextId, (dialog, which) -> { + if (mListener != null) { + mListener.onCancel(getTag()); + } + dialog.dismiss(); + }); + } else { builder.setNegativeButton(negativeButtonTextId, (dialog, which) -> { if (mListener != null) { mListener.onCancel(getTag()); } dialog.dismiss(); }); + builder.setNeutralButton(neutralButtonTextId, (dialog, whichButton) -> { + if (mListener != null) { + mListener.onNeutral(getTag()); + } + dialog.dismiss(); + }); } viewThemeUtils.dialog.colorMaterialAlertDialogBackground(activity, builder); From ba20bd3ef791dcb3000af31b11efe1bb94c918cd Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 16 Oct 2023 09:23:09 +0200 Subject: [PATCH 12/20] Fix action for neutral button Signed-off-by: alperozturk --- .../owncloud/android/ui/dialog/ConfirmationDialogFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java index b30303cf030e..f17831a89fce 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java @@ -167,7 +167,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { } else if (neutralButtonTextId != -1 && negativeButtonTextId == -1) { builder.setNegativeButton(neutralButtonTextId, (dialog, which) -> { if (mListener != null) { - mListener.onCancel(getTag()); + mListener.onNeutral(getTag()); } dialog.dismiss(); }); From 917959cc5a351e59f5bddd286d21235613f4d4b1 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 16 Oct 2023 10:00:37 +0200 Subject: [PATCH 13/20] Update screenshots Signed-off-by: alperozturk --- ....DialogFragmentIT_testRemoveFileDialog.png | Bin 5272 -> 6223 bytes ...DialogFragmentIT_testRemoveFilesDialog.png | Bin 5634 -> 6581 bytes ...ialogFragmentIT_testRemoveFolderDialog.png | Bin 4878 -> 5842 bytes ...alogFragmentIT_testRemoveFoldersDialog.png | Bin 5634 -> 6581 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog.png index c4bd33b4abd24f7b88ce203ea7dea631319a56a1..bb93a174e2db5ebd047fc1dc635402030a8ddb16 100644 GIT binary patch delta 5478 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 C+AQz@ delta 4801 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 literal 4878 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 C+AQz@ delta 4801 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 b*O~tU`Hg5mL}^;l00000NkvXXu0mjf3t Date: Mon, 16 Oct 2023 10:44:55 +0200 Subject: [PATCH 14/20] Remove button order logic from dialog Signed-off-by: alperozturk --- .../ui/activity/UploadFilesActivity.java | 4 +--- .../ui/dialog/ConfirmationDialogFragment.java | 23 ++++--------------- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java index 8a8572e3002f..bff39ae57e0e 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java @@ -528,9 +528,7 @@ public void onCheckAvailableSpaceFinish(boolean hasEnoughSpaceAvailable, String. // to the ownCloud folder instead of copying String[] args = {getString(R.string.app_name)}; ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance( - R.string.upload_query_move_foreign_files, args, 0, R.string.common_yes, -1, - R.string.common_no - ); + R.string.upload_query_move_foreign_files, args, 0, R.string.common_yes, R.string.common_no, -1); dialog.setOnConfirmationListener(this); dialog.show(getSupportFragmentManager(), QUERY_TO_MOVE_DIALOG_TAG); } diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java index f17831a89fce..ee8ac1ba598e 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java @@ -63,7 +63,7 @@ public class ConfirmationDialogFragment extends DialogFragment implements Inject * @return Dialog ready to show. */ public static ConfirmationDialogFragment newInstance(int messageResId, String[] messageArguments, int titleResId, - int positiveButtonTextId, int neutralButtonTextId, int negativeButtonTextId) { + int positiveButtonTextId, int negativeButtonTextId, int neutralButtonTextId) { if (messageResId == -1) { throw new IllegalStateException("Calling confirmation dialog without message resource"); } @@ -156,29 +156,16 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { dialog.dismiss(); }); } - - if (negativeButtonTextId != -1 && neutralButtonTextId == -1) { + if (negativeButtonTextId != -1) { builder.setNegativeButton(negativeButtonTextId, (dialog, which) -> { if (mListener != null) { mListener.onCancel(getTag()); } dialog.dismiss(); }); - } else if (neutralButtonTextId != -1 && negativeButtonTextId == -1) { - builder.setNegativeButton(neutralButtonTextId, (dialog, which) -> { - if (mListener != null) { - mListener.onNeutral(getTag()); - } - dialog.dismiss(); - }); - } else { - builder.setNegativeButton(negativeButtonTextId, (dialog, which) -> { - if (mListener != null) { - mListener.onCancel(getTag()); - } - dialog.dismiss(); - }); - builder.setNeutralButton(neutralButtonTextId, (dialog, whichButton) -> { + } + if (neutralButtonTextId != -1) { + builder.setNeutralButton(neutralButtonTextId, (dialog, which) -> { if (mListener != null) { mListener.onNeutral(getTag()); } From b0638d9522726e6a5d563df84467e38316d1ab66 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 16 Oct 2023 10:56:27 +0200 Subject: [PATCH 15/20] Add tests for ConfirmationDialog Signed-off-by: alperozturk --- .../android/ui/dialog/DialogFragmentIT.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java b/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java index 1a2bd2367fdf..c7efe77efa97 100644 --- a/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java +++ b/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java @@ -134,6 +134,27 @@ public void testLoadingDialog() { showDialog(dialog); } + @Test + @ScreenshotTest + public void testConfirmationDialogWithOneAction() { + ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(R.string.upload_list_empty_text_auto_upload, new String[]{}, R.string.filedetails_sync_file, R.string.common_ok, -1, -1); + showDialog(dialog); + } + + @Test + @ScreenshotTest + public void testConfirmationDialogWithTwoAction() { + ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(R.string.upload_list_empty_text_auto_upload, new String[]{}, R.string.filedetails_sync_file, R.string.common_ok, R.string.common_cancel, -1); + showDialog(dialog); + } + + @Test + @ScreenshotTest + public void testConfirmationDialogWithThreeAction() { + ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(R.string.upload_list_empty_text_auto_upload, new String[]{}, R.string.filedetails_sync_file, R.string.common_ok, R.string.common_cancel, R.string.common_confirm); + showDialog(dialog); + } + @Test @ScreenshotTest public void testRemoveFileDialog() { From e80568b11db460457b423cd5610e139e3eab4f60 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 16 Oct 2023 11:03:40 +0200 Subject: [PATCH 16/20] Add tests for ConfirmationDialog RTL Signed-off-by: alperozturk --- .../java/com/owncloud/android/AbstractIT.java | 18 ++++++++++++++++++ .../android/ui/dialog/DialogFragmentIT.java | 15 +++++++++++++++ .../ui/dialog/ConfirmationDialogFragment.java | 4 +++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/app/src/androidTest/java/com/owncloud/android/AbstractIT.java b/app/src/androidTest/java/com/owncloud/android/AbstractIT.java index 68bd9cc9d452..98fe9c75e576 100644 --- a/app/src/androidTest/java/com/owncloud/android/AbstractIT.java +++ b/app/src/androidTest/java/com/owncloud/android/AbstractIT.java @@ -7,6 +7,8 @@ import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; @@ -58,6 +60,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.Collection; +import java.util.Locale; import java.util.Objects; import androidx.annotation.NonNull; @@ -403,6 +406,21 @@ public boolean isPowerSavingExclusionAvailable() { assertTrue(result.getLogMessage(), result.isSuccess()); } + protected void enableRTL() { + Locale locale = new Locale("ar"); + Resources resources = InstrumentationRegistry.getInstrumentation().getTargetContext().getResources(); + Configuration config = resources.getConfiguration(); + config.setLocale(locale); + resources.updateConfiguration(config, null); + } + + protected void resetLocale() { + Resources resources = InstrumentationRegistry.getInstrumentation().getTargetContext().getResources(); + Configuration defaultConfig = resources.getConfiguration(); + defaultConfig.setLocale(Locale.getDefault()); + resources.updateConfiguration(defaultConfig, null); + } + protected void screenshot(View view) { screenshot(view, ""); } diff --git a/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java b/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java index c7efe77efa97..024b40c7a3e3 100644 --- a/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java +++ b/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java @@ -25,6 +25,8 @@ import android.accounts.Account; import android.accounts.AccountManager; import android.content.Intent; +import android.content.res.Configuration; +import android.content.res.Resources; import android.net.http.SslCertificate; import android.net.http.SslError; import android.os.Looper; @@ -86,12 +88,14 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.Objects; import androidx.activity.result.contract.ActivityResultContract; import androidx.annotation.NonNull; import androidx.fragment.app.DialogFragment; import androidx.test.espresso.intent.rule.IntentsTestRule; +import androidx.test.platform.app.InstrumentationRegistry; import kotlin.Unit; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; @@ -155,6 +159,17 @@ public void testConfirmationDialogWithThreeAction() { showDialog(dialog); } + @Test + @ScreenshotTest + public void testConfirmationDialogWithThreeActionRTL() { + enableRTL(); + + ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(R.string.upload_list_empty_text_auto_upload, new String[] { }, -1, R.string.common_ok, R.string.common_cancel, R.string.common_confirm); + showDialog(dialog); + + resetLocale(); + } + @Test @ScreenshotTest public void testRemoveFileDialog() { diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java index ee8ac1ba598e..bd36a670ab3b 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java @@ -70,6 +70,7 @@ public static ConfirmationDialogFragment newInstance(int messageResId, String[] ConfirmationDialogFragment frag = new ConfirmationDialogFragment(); Bundle args = new Bundle(); + args.putInt(ARG_MESSAGE_RESOURCE_ID, messageResId); args.putStringArray(ARG_MESSAGE_ARGUMENTS, messageArguments); args.putInt(ARG_TITLE_ID, titleResId); @@ -126,8 +127,9 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { } Object[] messageArguments = arguments.getStringArray(ARG_MESSAGE_ARGUMENTS); - int messageId = arguments.getInt(ARG_MESSAGE_RESOURCE_ID, -1); + int titleId = arguments.getInt(ARG_TITLE_ID, -1); + int messageId = arguments.getInt(ARG_MESSAGE_RESOURCE_ID, -1); int positiveButtonTextId = arguments.getInt(ARG_POSITIVE_BTN_RES, -1); int negativeButtonTextId = arguments.getInt(ARG_NEGATIVE_BTN_RES, -1); From f125b2942a98310d6d55861d0754071a7f2d6914 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Thu, 19 Oct 2023 11:17:44 +0200 Subject: [PATCH 17/20] Clean import Signed-off-by: alperozturk --- .../java/com/owncloud/android/ui/dialog/DialogFragmentIT.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java b/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java index 024b40c7a3e3..2c2dbb785fdd 100644 --- a/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java +++ b/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java @@ -25,8 +25,6 @@ import android.accounts.Account; import android.accounts.AccountManager; import android.content.Intent; -import android.content.res.Configuration; -import android.content.res.Resources; import android.net.http.SslCertificate; import android.net.http.SslError; import android.os.Looper; @@ -88,14 +86,12 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Locale; import java.util.Objects; import androidx.activity.result.contract.ActivityResultContract; import androidx.annotation.NonNull; import androidx.fragment.app.DialogFragment; import androidx.test.espresso.intent.rule.IntentsTestRule; -import androidx.test.platform.app.InstrumentationRegistry; import kotlin.Unit; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; From 7ad5fc78b4868bdd7ac2b62254953783aa84e926 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 24 Oct 2023 14:35:13 +0200 Subject: [PATCH 18/20] Rename .java to .kt Signed-off-by: alperozturk --- ...firmationDialogFragment.java => ConfirmationDialogFragment.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/src/main/java/com/owncloud/android/ui/dialog/{ConfirmationDialogFragment.java => ConfirmationDialogFragment.kt} (100%) diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.kt similarity index 100% rename from app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java rename to app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.kt From ea4981079bcaf18052d85610b265410bc4c00c61 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 24 Oct 2023 14:35:13 +0200 Subject: [PATCH 19/20] Convert to kt Signed-off-by: alperozturk --- .../ui/dialog/ConfirmationDialogFragment.kt | 241 ++++++++---------- 1 file changed, 104 insertions(+), 137 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.kt b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.kt index bd36a670ab3b..8bb41b01eafc 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.kt @@ -13,179 +13,146 @@ * You should have received a copy of the GNU General Public License along with this program. If not, see * . */ +package com.owncloud.android.ui.dialog -package com.owncloud.android.ui.dialog; +//noinspection SuspiciousImport +import android.R +import android.app.Dialog +import android.content.DialogInterface +import android.os.Bundle +import androidx.appcompat.app.AlertDialog +import androidx.fragment.app.DialogFragment +import com.google.android.material.button.MaterialButton +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.nextcloud.client.di.Injectable +import com.owncloud.android.utils.theme.ViewThemeUtils +import javax.inject.Inject -import android.app.Activity; -import android.app.Dialog; -import android.os.Bundle; +open class ConfirmationDialogFragment : DialogFragment(), Injectable { -import com.google.android.material.button.MaterialButton; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.nextcloud.client.di.Injectable; -import com.owncloud.android.R; -import com.owncloud.android.utils.theme.ViewThemeUtils; + @JvmField + @Inject + var viewThemeUtils: ViewThemeUtils? = null -import javax.inject.Inject; + private var mListener: ConfirmationDialogFragmentListener? = null -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; -import androidx.fragment.app.DialogFragment; + override fun onStart() { + super.onStart() - -public class ConfirmationDialogFragment extends DialogFragment implements Injectable { - - final static String ARG_MESSAGE_RESOURCE_ID = "resource_id"; - final static String ARG_MESSAGE_ARGUMENTS = "string_array"; - final static String ARG_TITLE_ID = "title_id"; - - final static String ARG_POSITIVE_BTN_RES = "positive_btn_res"; - final static String ARG_NEUTRAL_BTN_RES = "neutral_btn_res"; - final static String ARG_NEGATIVE_BTN_RES = "negative_btn_res"; - - public static final String FTAG_CONFIRMATION = "CONFIRMATION_FRAGMENT"; - - @Inject ViewThemeUtils viewThemeUtils; - - - private ConfirmationDialogFragmentListener mListener; - - /** - * Public factory method to create new ConfirmationDialogFragment instances. - * - * @param messageResId Resource id for a message to show in the dialog. - * @param messageArguments Arguments to complete the message, if it's a format string. May be null. - * @param titleResId Resource id for a text to show in the title. 0 for default alert title, -1 for no - * title. - * @param positiveButtonTextId Resource id for the text of the positive button. -1 for no positive button. - * @param neutralButtonTextId Resource id for the text of the neutral button. -1 for no neutral button. - * @param negativeButtonTextId Resource id for the text of the negative button. -1 for no negative button. - * @return Dialog ready to show. - */ - public static ConfirmationDialogFragment newInstance(int messageResId, String[] messageArguments, int titleResId, - int positiveButtonTextId, int negativeButtonTextId, int neutralButtonTextId) { - if (messageResId == -1) { - throw new IllegalStateException("Calling confirmation dialog without message resource"); - } - - ConfirmationDialogFragment frag = new ConfirmationDialogFragment(); - Bundle args = new Bundle(); - - args.putInt(ARG_MESSAGE_RESOURCE_ID, messageResId); - args.putStringArray(ARG_MESSAGE_ARGUMENTS, messageArguments); - args.putInt(ARG_TITLE_ID, titleResId); - - args.putInt(ARG_POSITIVE_BTN_RES, positiveButtonTextId); - args.putInt(ARG_NEGATIVE_BTN_RES, negativeButtonTextId); - args.putInt(ARG_NEUTRAL_BTN_RES, neutralButtonTextId); - - frag.setArguments(args); - return frag; - } - - @Override - public void onStart() { - super.onStart(); - - AlertDialog alertDialog = (AlertDialog) getDialog(); + val alertDialog = dialog as AlertDialog? if (alertDialog != null) { - MaterialButton positiveButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); + val positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE) as MaterialButton? if (positiveButton != null) { - viewThemeUtils.material.colorMaterialButtonPrimaryTonal(positiveButton); + viewThemeUtils?.material?.colorMaterialButtonPrimaryTonal(positiveButton) } - MaterialButton negativeButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE); + val negativeButton = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE) as MaterialButton? if (negativeButton != null) { - viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(negativeButton); + viewThemeUtils?.material?.colorMaterialButtonPrimaryBorderless(negativeButton) } - MaterialButton neutralButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL); + val neutralButton = alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL) as MaterialButton? if (neutralButton != null) { - viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(neutralButton); + viewThemeUtils?.material?.colorMaterialButtonPrimaryBorderless(neutralButton) } } } - public void setOnConfirmationListener(ConfirmationDialogFragmentListener listener) { - mListener = listener; + fun setOnConfirmationListener(listener: ConfirmationDialogFragmentListener?) { + mListener = listener } - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - Bundle arguments = getArguments(); - - if (arguments == null) { - throw new IllegalArgumentException("Arguments may not be null"); - } - - Activity activity = getActivity(); - - if (activity == null) { - throw new IllegalArgumentException("Activity may not be null"); - } - - Object[] messageArguments = arguments.getStringArray(ARG_MESSAGE_ARGUMENTS); - - int titleId = arguments.getInt(ARG_TITLE_ID, -1); - int messageId = arguments.getInt(ARG_MESSAGE_RESOURCE_ID, -1); - - int positiveButtonTextId = arguments.getInt(ARG_POSITIVE_BTN_RES, -1); - int negativeButtonTextId = arguments.getInt(ARG_NEGATIVE_BTN_RES, -1); - int neutralButtonTextId = arguments.getInt(ARG_NEUTRAL_BTN_RES, -1); - + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + var messageArguments = requireArguments().getStringArray(ARG_MESSAGE_ARGUMENTS) + val titleId = requireArguments().getInt(ARG_TITLE_ID, -1) + val messageId = requireArguments().getInt(ARG_MESSAGE_RESOURCE_ID, -1) + val positiveButtonTextId = requireArguments().getInt(ARG_POSITIVE_BTN_RES, -1) + val negativeButtonTextId = requireArguments().getInt(ARG_NEGATIVE_BTN_RES, -1) + val neutralButtonTextId = requireArguments().getInt(ARG_NEUTRAL_BTN_RES, -1) if (messageArguments == null) { - messageArguments = new String[]{}; + messageArguments = arrayOf() } - - MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(activity) - .setIcon(R.drawable.ic_warning) - .setIconAttribute(android.R.attr.alertDialogIcon) - .setMessage(String.format(getString(messageId), messageArguments)); - + val builder = MaterialAlertDialogBuilder(requireActivity()) + .setIcon(com.owncloud.android.R.drawable.ic_warning) + .setIconAttribute(R.attr.alertDialogIcon) + .setMessage(String.format(getString(messageId), *messageArguments)) if (titleId == 0) { - builder.setTitle(android.R.string.dialog_alert_title); + builder.setTitle(R.string.dialog_alert_title) } else if (titleId != -1) { - builder.setTitle(titleId); + builder.setTitle(titleId) } - if (positiveButtonTextId != -1) { - builder.setPositiveButton(positiveButtonTextId, (dialog, whichButton) -> { - if (mListener != null) { - mListener.onConfirmation(getTag()); - } - dialog.dismiss(); - }); + builder.setPositiveButton(positiveButtonTextId) { dialog: DialogInterface, _: Int -> + mListener?.onConfirmation(tag) + dialog.dismiss() + } } if (negativeButtonTextId != -1) { - builder.setNegativeButton(negativeButtonTextId, (dialog, which) -> { - if (mListener != null) { - mListener.onCancel(getTag()); - } - dialog.dismiss(); - }); + builder.setNegativeButton(negativeButtonTextId) { dialog: DialogInterface, _: Int -> + mListener?.onCancel(tag) + dialog.dismiss() + } } if (neutralButtonTextId != -1) { - builder.setNeutralButton(neutralButtonTextId, (dialog, which) -> { - if (mListener != null) { - mListener.onNeutral(getTag()); - } - dialog.dismiss(); - }); + builder.setNeutralButton(neutralButtonTextId) { dialog: DialogInterface, _: Int -> + mListener?.onNeutral(tag) + dialog.dismiss() + } } - viewThemeUtils.dialog.colorMaterialAlertDialogBackground(activity, builder); + viewThemeUtils?.dialog?.colorMaterialAlertDialogBackground(requireActivity(), builder) - return builder.create(); + return builder.create() } - public interface ConfirmationDialogFragmentListener { - void onConfirmation(String callerTag); - - void onNeutral(String callerTag); + interface ConfirmationDialogFragmentListener { + fun onConfirmation(callerTag: String?) + fun onNeutral(callerTag: String?) + fun onCancel(callerTag: String?) + } - void onCancel(String callerTag); + companion object { + const val ARG_MESSAGE_RESOURCE_ID = "resource_id" + const val ARG_MESSAGE_ARGUMENTS = "string_array" + const val ARG_TITLE_ID = "title_id" + const val ARG_POSITIVE_BTN_RES = "positive_btn_res" + const val ARG_NEUTRAL_BTN_RES = "neutral_btn_res" + const val ARG_NEGATIVE_BTN_RES = "negative_btn_res" + const val FTAG_CONFIRMATION = "CONFIRMATION_FRAGMENT" + + /** + * Public factory method to create new ConfirmationDialogFragment instances. + * + * @param messageResId Resource id for a message to show in the dialog. + * @param messageArguments Arguments to complete the message, if it's a format string. May be null. + * @param titleResId Resource id for a text to show in the title. 0 for default alert title, -1 for no + * title. + * @param positiveButtonTextId Resource id for the text of the positive button. -1 for no positive button. + * @param neutralButtonTextId Resource id for the text of the neutral button. -1 for no neutral button. + * @param negativeButtonTextId Resource id for the text of the negative button. -1 for no negative button. + * @return Dialog ready to show. + */ + @JvmStatic + fun newInstance( + messageResId: Int, + messageArguments: Array?, + titleResId: Int, + positiveButtonTextId: Int, + negativeButtonTextId: Int, + neutralButtonTextId: Int + ): ConfirmationDialogFragment { + check(messageResId != -1) { "Calling confirmation dialog without message resource" } + val frag = ConfirmationDialogFragment() + val args = Bundle() + args.putInt(ARG_MESSAGE_RESOURCE_ID, messageResId) + args.putStringArray(ARG_MESSAGE_ARGUMENTS, messageArguments) + args.putInt(ARG_TITLE_ID, titleResId) + args.putInt(ARG_POSITIVE_BTN_RES, positiveButtonTextId) + args.putInt(ARG_NEGATIVE_BTN_RES, negativeButtonTextId) + args.putInt(ARG_NEUTRAL_BTN_RES, neutralButtonTextId) + frag.arguments = args + return frag + } } } - From fc531321372beb8d44bebbbaced10118ce61bb9d Mon Sep 17 00:00:00 2001 From: alperozturk Date: Thu, 26 Oct 2023 14:24:51 +0200 Subject: [PATCH 20/20] Remove spread operator Signed-off-by: alperozturk --- .../owncloud/android/ui/dialog/ConfirmationDialogFragment.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.kt b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.kt index 8bb41b01eafc..48b37961e613 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.kt @@ -70,13 +70,16 @@ open class ConfirmationDialogFragment : DialogFragment(), Injectable { val positiveButtonTextId = requireArguments().getInt(ARG_POSITIVE_BTN_RES, -1) val negativeButtonTextId = requireArguments().getInt(ARG_NEGATIVE_BTN_RES, -1) val neutralButtonTextId = requireArguments().getInt(ARG_NEUTRAL_BTN_RES, -1) + if (messageArguments == null) { messageArguments = arrayOf() } + val builder = MaterialAlertDialogBuilder(requireActivity()) .setIcon(com.owncloud.android.R.drawable.ic_warning) .setIconAttribute(R.attr.alertDialogIcon) - .setMessage(String.format(getString(messageId), *messageArguments)) + .setMessage(String.format(getString(messageId), messageArguments)) + if (titleId == 0) { builder.setTitle(R.string.dialog_alert_title) } else if (titleId != -1) {