diff --git a/app/src/debug/java/org/tasks/preferences/fragments/Debug.kt b/app/src/debug/java/org/tasks/preferences/fragments/Debug.kt index 6dcc3171f..51bb9e316 100644 --- a/app/src/debug/java/org/tasks/preferences/fragments/Debug.kt +++ b/app/src/debug/java/org/tasks/preferences/fragments/Debug.kt @@ -8,8 +8,8 @@ import dagger.hilt.android.AndroidEntryPoint import org.tasks.R import org.tasks.billing.BillingClient import org.tasks.billing.Inventory +import org.tasks.extensions.Context.toast import org.tasks.injection.InjectingPreferenceFragment -import org.tasks.ui.Toaster import javax.inject.Inject @AndroidEntryPoint @@ -17,7 +17,6 @@ class Debug : InjectingPreferenceFragment() { @Inject lateinit var inventory: Inventory @Inject lateinit var billingClient: BillingClient - @Inject lateinit var toaster: Toaster override fun getPreferenceXml() = R.xml.preferences_debug @@ -38,7 +37,7 @@ class Debug : InjectingPreferenceFragment() { findPreference(R.string.debug_reset_ssl).setOnPreferenceClickListener { resetCertificates(requireContext()) - toaster.longToast("SSL certificates reset") + context?.toast("SSL certificates reset") false } diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt index b3c1a9116..809ea2e11 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt @@ -65,6 +65,7 @@ import org.tasks.db.SuspendDbUtils.chunkedMap import org.tasks.dialogs.DateTimePicker.Companion.newDateTimePicker import org.tasks.dialogs.DialogBuilder import org.tasks.dialogs.SortDialog +import org.tasks.extensions.Context.toast import org.tasks.extensions.Fragment.safeStartActivityForResult import org.tasks.filters.PlaceFilter import org.tasks.intents.TaskIntents @@ -79,7 +80,6 @@ import org.tasks.tasklist.* import org.tasks.themes.ColorProvider import org.tasks.themes.ThemeColor import org.tasks.ui.TaskListViewModel -import org.tasks.ui.Toaster import timber.log.Timber import java.text.ParseException import java.time.format.FormatStyle @@ -105,7 +105,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL @Inject lateinit var localBroadcastManager: LocalBroadcastManager @Inject lateinit var device: Device @Inject lateinit var taskMover: TaskMover - @Inject lateinit var toaster: Toaster @Inject lateinit var taskAdapterProvider: TaskAdapterProvider @Inject lateinit var taskDao: TaskDao @Inject lateinit var taskDuplicator: TaskDuplicator @@ -421,7 +420,7 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL private fun clearCompleted() = lifecycleScope.launch { val count = taskDeleter.clearCompleted(filter) - toaster.longToast(R.string.delete_multiple_tasks_confirmation, count) + context?.toast(R.string.delete_multiple_tasks_confirmation, locale.formatNumber(count)) } @OnClick(R.id.fab) diff --git a/app/src/main/java/org/tasks/dialogs/GeofenceDialog.java b/app/src/main/java/org/tasks/dialogs/GeofenceDialog.java index 15078449c..a64fbd614 100644 --- a/app/src/main/java/org/tasks/dialogs/GeofenceDialog.java +++ b/app/src/main/java/org/tasks/dialogs/GeofenceDialog.java @@ -24,7 +24,6 @@ import org.tasks.data.Geofence; import org.tasks.data.Location; import org.tasks.locale.Locale; import org.tasks.preferences.PermissionChecker; -import org.tasks.ui.Toaster; @AndroidEntryPoint public class GeofenceDialog extends DialogFragment { @@ -39,7 +38,6 @@ public class GeofenceDialog extends DialogFragment { @Inject Activity context; @Inject Locale locale; @Inject PermissionChecker permissionChecker; - @Inject Toaster toaster; @BindView(R.id.location_arrival) SwitchMaterial arrivalView; diff --git a/app/src/main/java/org/tasks/dialogs/ImportTasksDialog.kt b/app/src/main/java/org/tasks/dialogs/ImportTasksDialog.kt index 29ef6f4ad..1fb4b2add 100644 --- a/app/src/main/java/org/tasks/dialogs/ImportTasksDialog.kt +++ b/app/src/main/java/org/tasks/dialogs/ImportTasksDialog.kt @@ -14,7 +14,6 @@ import kotlinx.coroutines.withContext import org.tasks.R import org.tasks.backup.TasksJsonImporter import org.tasks.backup.TasksJsonImporter.ImportResult -import org.tasks.ui.Toaster import javax.inject.Inject @AndroidEntryPoint @@ -22,7 +21,6 @@ class ImportTasksDialog : DialogFragment() { @Inject lateinit var jsonImporter: TasksJsonImporter @Inject lateinit var dialogBuilder: DialogBuilder @Inject lateinit var context: Activity - @Inject lateinit var toaster: Toaster override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val arguments = requireArguments() diff --git a/app/src/main/java/org/tasks/extensions/Context.kt b/app/src/main/java/org/tasks/extensions/Context.kt index 26707ba0a..a87aa0eeb 100644 --- a/app/src/main/java/org/tasks/extensions/Context.kt +++ b/app/src/main/java/org/tasks/extensions/Context.kt @@ -15,7 +15,9 @@ object Context { } } - fun Context.toast(resId: Int, duration: Int = Toast.LENGTH_LONG) { - Toast.makeText(this, resId, duration).show() - } + fun Context.toast(resId: Int, vararg formatArgs: Any, duration: Int = Toast.LENGTH_LONG) = + toast(getString(resId, formatArgs), duration) + + fun Context.toast(text: String?, duration: Int = Toast.LENGTH_LONG) = + text?.let { Toast.makeText(this, it, duration).show() } } diff --git a/app/src/main/java/org/tasks/location/LocationPickerActivity.kt b/app/src/main/java/org/tasks/location/LocationPickerActivity.kt index 8a66217a2..ac6a9ab4b 100644 --- a/app/src/main/java/org/tasks/location/LocationPickerActivity.kt +++ b/app/src/main/java/org/tasks/location/LocationPickerActivity.kt @@ -42,6 +42,7 @@ import org.tasks.data.Place import org.tasks.data.Place.Companion.newPlace import org.tasks.data.PlaceUsage import org.tasks.dialogs.DialogBuilder +import org.tasks.extensions.Context.toast import org.tasks.injection.InjectingAppCompatActivity import org.tasks.location.LocationPickerAdapter.OnLocationPicked import org.tasks.location.LocationSearchAdapter.OnPredictionPicked @@ -52,7 +53,6 @@ import org.tasks.preferences.PermissionRequestor import org.tasks.preferences.Preferences import org.tasks.themes.ColorProvider import org.tasks.themes.Theme -import org.tasks.ui.Toaster import timber.log.Timber import java.util.concurrent.TimeUnit import javax.inject.Inject @@ -85,7 +85,6 @@ class LocationPickerActivity : InjectingAppCompatActivity(), Toolbar.OnMenuItemC lateinit var recyclerView: RecyclerView @Inject lateinit var theme: Theme - @Inject lateinit var toaster: Toaster @Inject lateinit var locationDao: LocationDao @Inject lateinit var permissionChecker: PermissionChecker @Inject lateinit var permissionRequestor: ActivityPermissionRequestor @@ -247,7 +246,7 @@ class LocationPickerActivity : InjectingAppCompatActivity(), Toolbar.OnMenuItemC } catch (e: Exception) { loadingIndicator.visibility = View.GONE firebase.reportException(e) - toaster.longToast(e.message) + toast(e.message) } } } @@ -267,7 +266,7 @@ class LocationPickerActivity : InjectingAppCompatActivity(), Toolbar.OnMenuItemC try { locationService.currentLocation()?.let { map.movePosition(it, animate) } } catch (e: Exception) { - toaster.longToast(e.message) + toast(e.message) } } } @@ -314,7 +313,7 @@ class LocationPickerActivity : InjectingAppCompatActivity(), Toolbar.OnMenuItemC private fun handleError(error: Event) { val message = error.ifUnhandled if (!isNullOrEmpty(message)) { - toaster.longToast(message) + toast(message) } } diff --git a/app/src/main/java/org/tasks/preferences/MainPreferences.kt b/app/src/main/java/org/tasks/preferences/MainPreferences.kt index 862cb986c..1a9d2aa98 100644 --- a/app/src/main/java/org/tasks/preferences/MainPreferences.kt +++ b/app/src/main/java/org/tasks/preferences/MainPreferences.kt @@ -13,6 +13,7 @@ import kotlinx.coroutines.launch import org.tasks.LocalBroadcastManager import org.tasks.R import org.tasks.auth.SignInActivity +import org.tasks.extensions.Context.toast import org.tasks.jobs.WorkManager import org.tasks.preferences.fragments.MainSettingsFragment import org.tasks.preferences.fragments.MainSettingsFragment.Companion.REQUEST_CALDAV_SETTINGS @@ -20,7 +21,6 @@ import org.tasks.preferences.fragments.MainSettingsFragment.Companion.REQUEST_GO import org.tasks.preferences.fragments.MainSettingsFragment.Companion.REQUEST_TASKS_ORG import org.tasks.preferences.fragments.TasksAccount import org.tasks.sync.SyncAdapters -import org.tasks.ui.Toaster import javax.inject.Inject @AndroidEntryPoint @@ -28,7 +28,6 @@ class MainPreferences : BasePreferences() { @Inject lateinit var syncAdapters: SyncAdapters @Inject lateinit var workManager: WorkManager - @Inject lateinit var toaster: Toaster @Inject lateinit var localBroadcastManager: LocalBroadcastManager private val viewModel: PreferencesViewModel by viewModels() @@ -61,7 +60,7 @@ class MainPreferences : BasePreferences() { syncAdapters.sync(true) workManager.updateBackgroundSync() } else { - data?.getStringExtra(GtasksLoginActivity.EXTRA_ERROR)?.let { toaster.longToast(it) } + data?.getStringExtra(GtasksLoginActivity.EXTRA_ERROR)?.let { toast(it) } } REQUEST_TASKS_ORG -> if (resultCode == Activity.RESULT_OK) { syncAdapters.sync(true) @@ -78,7 +77,7 @@ class MainPreferences : BasePreferences() { } } } else { - data?.getStringExtra(SignInActivity.EXTRA_ERROR)?.let { toaster.longToast(it) } + data?.getStringExtra(SignInActivity.EXTRA_ERROR)?.let { toast(it) } } else -> super.onActivityResult(requestCode, resultCode, data) } diff --git a/app/src/main/java/org/tasks/preferences/fragments/Advanced.kt b/app/src/main/java/org/tasks/preferences/fragments/Advanced.kt index 35eaa5f00..67df7f682 100644 --- a/app/src/main/java/org/tasks/preferences/fragments/Advanced.kt +++ b/app/src/main/java/org/tasks/preferences/fragments/Advanced.kt @@ -16,6 +16,7 @@ import org.tasks.R import org.tasks.calendars.CalendarEventProvider import org.tasks.data.TaskDao import org.tasks.etebase.EtebaseLocalCache +import org.tasks.extensions.Context.toast import org.tasks.files.FileHelper import org.tasks.injection.InjectingPreferenceFragment import org.tasks.preferences.FragmentPermissionRequestor @@ -23,7 +24,6 @@ import org.tasks.preferences.PermissionChecker import org.tasks.preferences.PermissionRequestor import org.tasks.preferences.Preferences import org.tasks.scheduling.CalendarNotificationIntentService -import org.tasks.ui.Toaster import javax.inject.Inject private const val REQUEST_CODE_FILES_DIR = 10000 @@ -35,7 +35,6 @@ class Advanced : InjectingPreferenceFragment() { @Inject lateinit var database: Database @Inject lateinit var taskDao: TaskDao @Inject lateinit var calendarEventProvider: CalendarEventProvider - @Inject lateinit var toaster: Toaster @Inject lateinit var permissionRequester: FragmentPermissionRequestor @Inject lateinit var permissionChecker: PermissionChecker @Inject lateinit var localBroadcastManager: LocalBroadcastManager @@ -186,7 +185,7 @@ class Advanced : InjectingPreferenceFragment() { } private fun performAction(message: Int, callable: suspend () -> Int) = lifecycleScope.launch { - toaster.longToastUnformatted(message, callable()) + context?.toast(message, callable()) } private fun resetPreferences() { diff --git a/app/src/main/java/org/tasks/preferences/fragments/Backups.kt b/app/src/main/java/org/tasks/preferences/fragments/Backups.kt index b95f382cd..4f6c515df 100644 --- a/app/src/main/java/org/tasks/preferences/fragments/Backups.kt +++ b/app/src/main/java/org/tasks/preferences/fragments/Backups.kt @@ -13,13 +13,13 @@ import org.tasks.R import org.tasks.dialogs.ExportTasksDialog import org.tasks.dialogs.ImportTasksDialog import org.tasks.drive.DriveLoginActivity +import org.tasks.extensions.Context.toast import org.tasks.files.FileHelper import org.tasks.injection.InjectingPreferenceFragment import org.tasks.preferences.FragmentPermissionRequestor import org.tasks.preferences.PermissionRequestor import org.tasks.preferences.Preferences import org.tasks.preferences.PreferencesViewModel -import org.tasks.ui.Toaster import java.util.* import javax.inject.Inject @@ -35,7 +35,6 @@ class Backups : InjectingPreferenceFragment() { @Inject lateinit var preferences: Preferences @Inject lateinit var permissionRequestor: FragmentPermissionRequestor - @Inject lateinit var toaster: Toaster @Inject lateinit var locale: Locale private val viewModel: PreferencesViewModel by activityViewModels() @@ -195,7 +194,7 @@ class Backups : InjectingPreferenceFragment() { ignoreCase = true )) ) { - toaster.longToast(R.string.invalid_backup_file) + context?.toast(R.string.invalid_backup_file) } else { ImportTasksDialog.newImportTasksDialog(uri, extension) .show(parentFragmentManager, FRAG_TAG_IMPORT_TASKS) @@ -205,7 +204,7 @@ class Backups : InjectingPreferenceFragment() { if (resultCode == RESULT_OK) { viewModel.updateDriveBackup() } else { - data?.getStringExtra(DriveLoginActivity.EXTRA_ERROR)?.let { toaster.longToast(it) } + data?.getStringExtra(DriveLoginActivity.EXTRA_ERROR)?.let { context?.toast(it) } } } else if (requestCode == REQUEST_BACKUP_NOW) { if (resultCode == RESULT_OK) { diff --git a/app/src/main/java/org/tasks/preferences/fragments/TasksAccount.kt b/app/src/main/java/org/tasks/preferences/fragments/TasksAccount.kt index 57176c5f2..8ce0be522 100644 --- a/app/src/main/java/org/tasks/preferences/fragments/TasksAccount.kt +++ b/app/src/main/java/org/tasks/preferences/fragments/TasksAccount.kt @@ -5,6 +5,7 @@ import android.net.Uri import android.os.Bundle import android.view.LayoutInflater import android.view.View +import android.widget.Toast.LENGTH_SHORT import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat.getSystemService import androidx.fragment.app.Fragment @@ -26,11 +27,11 @@ import org.tasks.billing.Purchase import org.tasks.data.CaldavAccount import org.tasks.data.CaldavAccount.Companion.isPaymentRequired import org.tasks.data.CaldavDao +import org.tasks.extensions.Context.toast import org.tasks.jobs.WorkManager import org.tasks.locale.Locale import org.tasks.preferences.IconPreference import org.tasks.preferences.fragments.MainSettingsFragment.Companion.REQUEST_TASKS_ORG -import org.tasks.ui.Toaster import java.time.format.FormatStyle import javax.inject.Inject @@ -42,7 +43,6 @@ class TasksAccount : BaseAccountPreference() { @Inject lateinit var localBroadcastManager: LocalBroadcastManager @Inject lateinit var caldavDao: CaldavDao @Inject lateinit var workManager: WorkManager - @Inject lateinit var toaster: Toaster @Inject lateinit var locale: Locale private val viewModel: TasksAccountViewModel by viewModels() @@ -83,7 +83,7 @@ class TasksAccount : BaseAccountPreference() { findPreference(R.string.local_lists).setOnPreferenceClickListener { workManager.migrateLocalTasks(caldavAccount) - toaster.longToast(R.string.migrating_tasks) + context?.toast(R.string.migrating_tasks) false } @@ -139,7 +139,7 @@ class TasksAccount : BaseAccountPreference() { val label = getString(labelRes) getSystemService(requireContext(), ClipboardManager::class.java) ?.setPrimaryClip(ClipData.newPlainText(label, value)) - toaster.toast(R.string.copied_to_clipboard, label) + context?.toast(R.string.copied_to_clipboard, label, duration = LENGTH_SHORT) } } } diff --git a/app/src/main/java/org/tasks/ui/SubtaskControlSet.kt b/app/src/main/java/org/tasks/ui/SubtaskControlSet.kt index c4420073a..221ef9797 100644 --- a/app/src/main/java/org/tasks/ui/SubtaskControlSet.kt +++ b/app/src/main/java/org/tasks/ui/SubtaskControlSet.kt @@ -40,6 +40,7 @@ import org.tasks.LocalBroadcastManager import org.tasks.R import org.tasks.data.* import org.tasks.data.TaskDao.TaskCriteria.activeAndVisible +import org.tasks.extensions.Context.toast import org.tasks.locale.Locale import org.tasks.tasklist.SubtaskViewHolder import org.tasks.tasklist.SubtasksRecyclerAdapter @@ -57,7 +58,6 @@ class SubtaskControlSet : TaskEditControlFragment(), SubtaskViewHolder.Callbacks @Inject lateinit var taskCompleter: TaskCompleter @Inject lateinit var localBroadcastManager: LocalBroadcastManager @Inject lateinit var googleTaskDao: GoogleTaskDao - @Inject lateinit var toaster: Toaster @Inject lateinit var taskCreator: TaskCreator @Inject lateinit var caldavDao: CaldavDao @Inject lateinit var taskDao: TaskDao @@ -114,7 +114,7 @@ class SubtaskControlSet : TaskEditControlFragment(), SubtaskViewHolder.Callbacks @OnClick(R.id.add_subtask) fun addSubtask() { if (isGoogleTaskChild) { - toaster.longToast(R.string.subtasks_multilevel_google_task) + context?.toast(R.string.subtasks_multilevel_google_task) } else { lifecycleScope.launch { val task = taskCreator.createWithValues("") diff --git a/app/src/main/java/org/tasks/ui/Toaster.java b/app/src/main/java/org/tasks/ui/Toaster.java deleted file mode 100644 index 8a30cb952..000000000 --- a/app/src/main/java/org/tasks/ui/Toaster.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.tasks.ui; - -import static android.widget.Toast.LENGTH_LONG; -import static android.widget.Toast.LENGTH_SHORT; -import static org.tasks.Strings.isNullOrEmpty; - -import android.content.Context; -import android.widget.Toast; -import androidx.annotation.StringRes; -import dagger.hilt.android.qualifiers.ActivityContext; -import javax.inject.Inject; -import org.tasks.locale.Locale; - -public class Toaster { - - private final Context context; - private final Locale locale; - - @Inject - public Toaster(@ActivityContext Context context, Locale locale) { - this.context = context; - this.locale = locale; - } - - public void longToast(@StringRes int resId, int number) { - longToast(context.getString(resId, locale.formatNumber(number))); - } - - public void longToast(@StringRes int resId) { - longToast(context.getString(resId)); - } - - public void longToast(String text) { - toast(text, LENGTH_LONG); - } - - public void toast(@StringRes int resId, Object... args) { - toast(context.getString(resId, args), LENGTH_SHORT); - } - - @SuppressWarnings("DeprecatedIsStillUsed") - @Deprecated - public void longToastUnformatted(@StringRes int resId, int number) { - Toast.makeText(context, context.getString(resId, number), LENGTH_LONG).show(); - } - - private void toast(String text, int duration) { - if (!isNullOrEmpty(text)) { - Toast.makeText(context, text, duration).show(); - } - } -} diff --git a/app/src/main/java/org/tasks/voice/VoiceCommandActivity.kt b/app/src/main/java/org/tasks/voice/VoiceCommandActivity.kt index c0737430e..5d326270f 100644 --- a/app/src/main/java/org/tasks/voice/VoiceCommandActivity.kt +++ b/app/src/main/java/org/tasks/voice/VoiceCommandActivity.kt @@ -9,15 +9,14 @@ import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.launch import org.tasks.R +import org.tasks.extensions.Context.toast import org.tasks.injection.InjectingAppCompatActivity -import org.tasks.ui.Toaster import javax.inject.Inject @AndroidEntryPoint class VoiceCommandActivity : InjectingAppCompatActivity() { @Inject lateinit var taskCreator: TaskCreator @Inject @ApplicationContext lateinit var context: Context - @Inject lateinit var toaster: Toaster override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -28,7 +27,7 @@ class VoiceCommandActivity : InjectingAppCompatActivity() { ?.takeUnless { it.isBlank() } ?.let { taskCreator.basicQuickAddTask(it) - toaster.longToast(R.string.voice_command_added_task) + toast(R.string.voice_command_added_task) } finish() }