Skip to content

Commit

Permalink
Added confirmation dialog before downloading
Browse files Browse the repository at this point in the history
  • Loading branch information
xizzhu committed May 22, 2020
1 parent 891219a commit bef6140
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -134,11 +134,12 @@ class TranslationListPresenter(
if (translationInfo.downloaded) {
updateCurrentTranslationAndFinishActivity(translationInfo.shortName)
} else {
downloadTranslation(translationInfo)
confirmAndDownloadTranslation(translationInfo)
}
}

private fun updateCurrentTranslationAndFinishActivity(translationShortName: String) {
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
fun updateCurrentTranslationAndFinishActivity(translationShortName: String) {
coroutineScope.launch {
try {
viewModel.saveCurrentTranslation(translationShortName)
Expand All @@ -151,6 +152,12 @@ class TranslationListPresenter(
}
}

@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
fun confirmAndDownloadTranslation(translationToDownload: TranslationInfo) {
activity.dialog(true, activity.getString(R.string.dialog_download_translation_confirmation, translationToDownload.name),
DialogInterface.OnClickListener { _, _ -> downloadTranslation(translationToDownload) })
}

private fun downloadTranslation(translationToDownload: TranslationInfo) {
if (downloadingJob != null || downloadTranslationDialog != null) {
// just in case the user clicks too fast
Expand Down Expand Up @@ -192,14 +199,19 @@ class TranslationListPresenter(
fun onTranslationLongClicked(translationInfo: TranslationInfo, isCurrentTranslation: Boolean) {
if (translationInfo.downloaded) {
if (!isCurrentTranslation) {
activity.dialog(true, R.string.dialog_delete_translation_confirmation,
DialogInterface.OnClickListener { _, _ -> removeTranslation(translationInfo) })
confirmAndRemoveTranslation(translationInfo)
}
} else {
downloadTranslation(translationInfo)
confirmAndDownloadTranslation(translationInfo)
}
}

@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
fun confirmAndRemoveTranslation(translationToRemove: TranslationInfo) {
activity.dialog(true, R.string.dialog_delete_translation_confirmation,
DialogInterface.OnClickListener { _, _ -> removeTranslation(translationToRemove) })
}

private fun removeTranslation(translationToRemove: TranslationInfo) {
if (removeTranslationDialog != null) {
// just in case the user clicks too fast
Expand Down
12 changes: 12 additions & 0 deletions app/src/main/kotlin/me/xizzhu/android/joshua/ui/Dialog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,18 @@ fun Activity.dialog(cancelable: Boolean, @StringRes message: Int,
.show()
}

fun Activity.dialog(cancelable: Boolean, message: CharSequence,
onPositive: DialogInterface.OnClickListener, onNegative: DialogInterface.OnClickListener? = null) {
if (isDestroyed) return

AlertDialog.Builder(this)
.setCancelable(cancelable)
.setMessage(message)
.setPositiveButton(android.R.string.yes, onPositive)
.setNegativeButton(android.R.string.no, onNegative)
.show()
}

fun Activity.progressDialog(@StringRes title: Int, maxProgress: Int, onCancel: () -> Unit): ProgressDialog? {
val progressBar = (View.inflate(this, R.layout.widget_progress_bar, null) as ProgressBar)
.apply { max = maxProgress }
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
<string name="action_clear_search_history">Delete Search History</string>
<string name="action_settings">Settings</string>

<string name="dialog_download_translation_confirmation">Download %1$s now?</string>
<string name="dialog_delete_translation_confirmation">Delete now?</string>
<string name="dialog_no_translation_downloaded">No translation, download now?</string>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,16 @@ import kotlin.test.assertEquals
class TranslationListPresenterTest : BaseUnitTest() {
@Mock
private lateinit var lifecycle: Lifecycle

@Mock
private lateinit var translationsViewModel: TranslationsViewModel

@Mock
private lateinit var translationsActivity: TranslationsActivity

@Mock
private lateinit var swipeRefreshLayout: SwipeRefreshLayout

@Mock
private lateinit var translationListView: CommonRecyclerView

Expand Down Expand Up @@ -125,4 +129,49 @@ class TranslationListPresenterTest : BaseUnitTest() {

assertEquals(expected, actual)
}

@Test
fun testOnTranslationClicked() {
translationListPresenter = spy(translationListPresenter)
doNothing().`when`(translationListPresenter).confirmAndDownloadTranslation(MockContents.kjvTranslationInfo)

translationListPresenter.onTranslationClicked(MockContents.kjvTranslationInfo)
verify(translationListPresenter, times(1)).confirmAndDownloadTranslation(MockContents.kjvTranslationInfo)
}

@Test
fun testOnDownloadedTranslationClicked() {
translationListPresenter = spy(translationListPresenter)
doNothing().`when`(translationListPresenter)
.updateCurrentTranslationAndFinishActivity(MockContents.kjvShortName)

translationListPresenter.onTranslationClicked(MockContents.kjvDownloadedTranslationInfo)
verify(translationListPresenter, times(1))
.updateCurrentTranslationAndFinishActivity(MockContents.kjvShortName)
}

@Test
fun testOnTranslationLongClicked() {
translationListPresenter = spy(translationListPresenter)
doNothing().`when`(translationListPresenter).confirmAndDownloadTranslation(MockContents.kjvTranslationInfo)

translationListPresenter.onTranslationLongClicked(MockContents.kjvTranslationInfo, true)
verify(translationListPresenter, times(1)).confirmAndDownloadTranslation(MockContents.kjvTranslationInfo)

translationListPresenter.onTranslationLongClicked(MockContents.kjvTranslationInfo, false)
verify(translationListPresenter, times(2)).confirmAndDownloadTranslation(MockContents.kjvTranslationInfo)
}

@Test
fun testOnDownloadedTranslationLongClicked() {
translationListPresenter = spy(translationListPresenter)
doNothing().`when`(translationListPresenter).confirmAndRemoveTranslation(MockContents.kjvDownloadedTranslationInfo)

translationListPresenter.onTranslationLongClicked(MockContents.kjvDownloadedTranslationInfo, true)
verify(translationListPresenter, never()).confirmAndRemoveTranslation(any())

translationListPresenter.onTranslationLongClicked(MockContents.kjvDownloadedTranslationInfo, false)
verify(translationListPresenter, times(1))
.confirmAndRemoveTranslation(MockContents.kjvDownloadedTranslationInfo)
}
}
2 changes: 2 additions & 0 deletions app/src/test/kotlin/me/xizzhu/android/joshua/ui/Dialog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ fun Activity.dialog(@StringRes title: Int, items: Array<String>, selected: Int,

fun Activity.dialog(cancelable: Boolean, @StringRes message: Int, onPositive: DialogInterface.OnClickListener, onNegative: DialogInterface.OnClickListener? = null) {}

fun Activity.dialog(cancelable: Boolean, message: CharSequence, onPositive: DialogInterface.OnClickListener, onNegative: DialogInterface.OnClickListener? = null) {}

fun Activity.progressDialog(@StringRes title: Int, maxProgress: Int, onCancel: () -> Unit): ProgressDialog? = null

fun Activity.indeterminateProgressDialog(@StringRes title: Int): AlertDialog? = null
1 change: 1 addition & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ CHANGELOG
- Fixed issue with Direct Share on Android 10 and above
- Changes:
- No longer show book name when simple reading mode is off
- Added confirmation dialog before downloading
- Refactoring:
- Migrated to Firebase Crashlytics
- Used ViewPager2 instead of ViewPager
Expand Down

0 comments on commit bef6140

Please sign in to comment.