diff --git a/app/src/main/java/org/kiwix/kiwixmobile/di/components/ApplicationComponent.java b/app/src/main/java/org/kiwix/kiwixmobile/di/components/ApplicationComponent.java index 65a039749..1c99609f9 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/di/components/ApplicationComponent.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/di/components/ApplicationComponent.java @@ -29,6 +29,7 @@ import org.kiwix.kiwixmobile.di.modules.NetworkModule; import org.kiwix.kiwixmobile.downloader.DownloadService; import org.kiwix.kiwixmobile.library.LibraryAdapter; import org.kiwix.kiwixmobile.main.AddNoteDialog; +import org.kiwix.kiwixmobile.main.ConfirmationAlertDialogFragment; import org.kiwix.kiwixmobile.main.KiwixWebView; import org.kiwix.kiwixmobile.search.AutoCompleteAdapter; import org.kiwix.kiwixmobile.settings.KiwixSettingsActivity; @@ -64,4 +65,6 @@ public interface ApplicationComponent { void inject(AutoCompleteAdapter autoCompleteAdapter); void inject(AddNoteDialog addNoteDialog); + + void inject(ConfirmationAlertDialogFragment confirmationAlertDialogFragment); } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/main/AddNoteDialog.java b/app/src/main/java/org/kiwix/kiwixmobile/main/AddNoteDialog.java index 240e24a35..cb67cee5b 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/main/AddNoteDialog.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/main/AddNoteDialog.java @@ -3,7 +3,6 @@ package org.kiwix.kiwixmobile.main; import android.Manifest; import android.app.Dialog; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; @@ -24,7 +23,6 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; import androidx.core.content.FileProvider; @@ -58,7 +56,9 @@ import static org.kiwix.kiwixmobile.utils.Constants.NOTES_DIRECTORY; * Notes are saved as text files at location: "{External Storage}/Kiwix/Notes/ZimFileTitle/ArticleTitle.txt" * */ -public class AddNoteDialog extends DialogFragment { +public class AddNoteDialog extends DialogFragment implements ConfirmationAlertDialogFragment.UserClickListener { + + public static String TAG = "AddNoteDialog"; @Inject SharedPreferenceUtil sharedPreferenceUtil; @@ -77,8 +77,6 @@ public class AddNoteDialog extends DialogFragment { private boolean noteFileExists = false; private boolean noteEdited = false; // Keeps track of state of the note (whether edited since last save) - private final String TAG = "AddNoteDialog"; - public AddNoteDialog() { super(); KiwixApplication.getApplicationComponent().inject(this); @@ -169,13 +167,12 @@ public class AddNoteDialog extends DialogFragment { private void exitAddNoteDialog() { if(noteEdited) { // Custom AlertDialog for taking user confirmation before closing note dialog in case of unsaved changes - DialogFragment newFragment = new ConfirmationAlertDialogFragment(getDialog()); - newFragment.show(getActivity().getSupportFragmentManager(), "ConfirmationAlertDialog"); + DialogFragment newFragment = new ConfirmationAlertDialogFragment(TAG, R.string.confirmation_alert_dialog_message); + newFragment.show(getActivity().getSupportFragmentManager(), ConfirmationAlertDialogFragment.TAG); } else { // Closing unedited note dialog straightaway - Dialog dialog = getDialog(); - dialog.dismiss(); + dismissAddNoteDialog(); } } @@ -378,6 +375,22 @@ public class AddNoteDialog extends DialogFragment { Toast.makeText(getActivity(), stringResource, duration).show(); } + // Methods from ConfirmationAlertDialogFragment.UserClickListener interface + @Override + public void onPositiveClick() { + dismissAddNoteDialog(); + } + + @Override + public void onNegativeClick() { + // Do nothing + } + + private void dismissAddNoteDialog() { + Dialog dialog = getDialog(); + dialog.dismiss(); + } + @Override public void onStart() { super.onStart(); @@ -399,45 +412,3 @@ public class AddNoteDialog extends DialogFragment { } } - -class ConfirmationAlertDialogFragment extends DialogFragment { - /** - * Helper class to show the alert dialog in case the user tries to exit the - * AddNoteDialog with unsaved file changes - **/ - - private SharedPreferenceUtil sharedPreferenceUtil = new SharedPreferenceUtil(KiwixApplication.getInstance()); - private Dialog addNoteDialog; - - public ConfirmationAlertDialogFragment(Dialog dialog) { - super(); - addNoteDialog = dialog; - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - - AlertDialog.Builder builder; - - if (sharedPreferenceUtil != null && sharedPreferenceUtil.nightMode()) { - // Night Mode support - builder = new AlertDialog.Builder(getActivity(), R.style.AppTheme_Dialog_Night); - - } else { - builder = new AlertDialog.Builder(getActivity()); - - } - builder.setMessage(getString(R.string.confirmation_alert_dialog_message)) - .setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - // User sure of discarding unsaved changes and closing note dialog - addNoteDialog.dismiss(); - } - }) - .setNegativeButton(getString(R.string.cancel), null); // Do nothing for 'Cancel' button - - return builder.create(); - } - -} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/main/ConfirmationAlertDialogFragment.java b/app/src/main/java/org/kiwix/kiwixmobile/main/ConfirmationAlertDialogFragment.java new file mode 100644 index 000000000..38220f7e2 --- /dev/null +++ b/app/src/main/java/org/kiwix/kiwixmobile/main/ConfirmationAlertDialogFragment.java @@ -0,0 +1,85 @@ +package org.kiwix.kiwixmobile.main; + +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.Bundle; + +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.Fragment; + +import org.kiwix.kiwixmobile.KiwixApplication; +import org.kiwix.kiwixmobile.R; +import org.kiwix.kiwixmobile.utils.SharedPreferenceUtil; + +import javax.inject.Inject; + +/** + * Created by @Aditya-Sood as a part of GSoC 2019 + * + * This is a generic helper class for displaying a 2-button (positive & negative) confirmation dialog fragment on top of an existing dialog fragment + * - Only for confirmation dialogs with a Positive & Negative button + * - If you also need a Neutral button, add it selectively (if-else) for the required use case (Take care of the callback interface as well) + * + * Currently used as: + * - Helper class to show the alert dialog in case the user tries to exit the {@link AddNoteDialog} with unsaved file changes + * + **/ + +public class ConfirmationAlertDialogFragment extends DialogFragment { + + public static String TAG = "ConfirmationAlertDialog"; + @Inject SharedPreferenceUtil sharedPreferenceUtil; + private int stringResource; + private String parentDialogFragmentTAG; + + public ConfirmationAlertDialogFragment(String dialogFragmentTAG, int resourceId) { + super(); + parentDialogFragmentTAG = dialogFragmentTAG; + stringResource = resourceId; + KiwixApplication.getApplicationComponent().inject(this); + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + Fragment parentDialogFragment = getFragmentManager().findFragmentByTag(parentDialogFragmentTAG); + + AlertDialog.Builder builder; + + if (sharedPreferenceUtil != null && sharedPreferenceUtil.nightMode()) { // Night Mode support + builder = new AlertDialog.Builder(getActivity(), R.style.AppTheme_Dialog_Night); + } else { + builder = new AlertDialog.Builder(getActivity()); + } + + builder.setMessage(stringResource) + .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + + if(parentDialogFragment != null) { + ((UserClickListener) parentDialogFragment).onPositiveClick(); + } + } + }) + .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + + if(parentDialogFragment != null) { + ((UserClickListener) parentDialogFragment).onNegativeClick(); + } + } + }); + + return builder.create(); + } + + /** Callback interface for responding to user clicks to a {@link ConfirmationAlertDialogFragment} dialog */ + public interface UserClickListener { + void onPositiveClick(); + + void onNegativeClick(); + } + +} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/main/MainActivity.java b/app/src/main/java/org/kiwix/kiwixmobile/main/MainActivity.java index 1ad4fc2e9..5cfc5f627 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/main/MainActivity.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/main/MainActivity.java @@ -989,7 +989,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, /** Creates the full screen AddNoteDialog, which is a DialogFragment */ private void showAddNoteDialog() { FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); - Fragment prev = getSupportFragmentManager().findFragmentByTag("AddNoteDialog"); + Fragment prev = getSupportFragmentManager().findFragmentByTag(AddNoteDialog.TAG); // To prevent multiple instances of the DialogFragment if(prev != null) { @@ -997,7 +997,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, } else { fragmentTransaction.addToBackStack(null); AddNoteDialog dialogFragment = new AddNoteDialog(); - dialogFragment.show(fragmentTransaction, "AddNoteDialog"); + dialogFragment.show(fragmentTransaction, AddNoteDialog.TAG); } }