Utility method for launching a new Activity without using onActivityResult

This commit is contained in:
casey langen 2022-07-23 13:48:28 -07:00
parent dea9b6fe55
commit bba94d1998
5 changed files with 63 additions and 41 deletions

View File

@ -10,7 +10,6 @@ import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.*
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment
import com.uacf.taskrunner.Task
@ -28,6 +27,7 @@ import io.casey.musikcube.remote.ui.shared.mixin.MetadataProxyMixin
import io.casey.musikcube.remote.ui.shared.mixin.PlaybackMixin
import io.casey.musikcube.remote.util.getParcelableCompat
import io.casey.musikcube.remote.util.getParcelableExtraCompat
import io.casey.musikcube.remote.util.launcher
import java.util.*
import javax.inject.Inject
import io.casey.musikcube.remote.ui.settings.constants.Prefs.Default as Defaults
@ -215,7 +215,7 @@ class SettingsActivity : BaseActivity() {
}
}
private val connectionsActivityLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { activityResult ->
private val connectionsActivityLauncher = launcher { activityResult ->
if (activityResult.resultCode == RESULT_OK && activityResult.data != null) {
activityResult.data?.let { data ->
val connection = data.getParcelableExtraCompat<Connection>(ConnectionsActivity.EXTRA_SELECTED_CONNECTION)
@ -227,7 +227,6 @@ class SettingsActivity : BaseActivity() {
sslCheckbox.setCheckWithoutEvent(connection.ssl, sslCheckChanged)
certCheckbox.setCheckWithoutEvent(connection.noValidate, certValidationChanged)
}
}
}
}

View File

@ -0,0 +1,45 @@
package io.casey.musikcube.remote.util
import androidx.activity.ComponentActivity
import android.content.Intent
import android.os.Bundle
import android.os.Parcelable
import androidx.activity.result.ActivityResult
import androidx.activity.result.ActivityResultCallback
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresApi
import java.io.Serializable
@RequiresApi(33)
@Suppress("deprecation")
inline fun <reified T: Parcelable> Intent.getParcelableExtraCompat(name: String): T? =
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
this.getParcelableExtra(name)
}
else {
this.getParcelableExtra(name, T::class.java)
}
@RequiresApi(33)
@Suppress("deprecation")
inline fun <reified T: Parcelable> Bundle.getParcelableCompat(name: String): T? =
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
this.getParcelable(name)
}
else {
this.getParcelable(name, T::class.java)
}
@RequiresApi(33)
@Suppress("deprecation")
inline fun <reified T: Serializable> Bundle.getSerializableCompat(name: String): T? =
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
this.getSerializable(name) as T?
}
else {
this.getSerializable(name, T::class.java)
}
fun ComponentActivity.launcher(callback: ActivityResultCallback<ActivityResult>): ActivityResultLauncher<Intent> =
this.registerForActivityResult(ActivityResultContracts.StartActivityForResult(), callback)

View File

@ -1,5 +1,6 @@
package io.casey.musikcube.remote.ui.shared.mixin
import android.annotation.SuppressLint
import android.app.Activity
import android.app.Dialog
import android.content.DialogInterface
@ -29,8 +30,10 @@ import io.casey.musikcube.remote.ui.shared.extension.showSnackbar
import io.casey.musikcube.remote.ui.shared.fragment.BaseDialogFragment
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
import io.casey.musikcube.remote.ui.tracks.activity.EditPlaylistActivity
import io.casey.musikcube.remote.util.getSerializableCompat
import io.reactivex.Observable
import io.reactivex.rxkotlin.subscribeBy
import java.io.Serializable
import javax.inject.Inject
class ItemContextMenuMixin(private val activity: AppCompatActivity,
@ -106,6 +109,7 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity,
fun createPlaylist() =
EnterPlaylistNameDialog.showForCreate(activity, this)
@SuppressLint("CheckResult")
fun createPlaylist(playlistName: String) {
@Suppress("unused")
provider.createPlaylist(playlistName).subscribeBy(
@ -123,8 +127,8 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity,
})
}
@SuppressLint("CheckResult")
fun renamePlaylist(newName: String, id: Long) {
@Suppress("unused")
provider.renamePlaylist(id, newName).subscribeBy(
onNext = { success ->
if (success) {
@ -159,10 +163,10 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity,
Navigate.toTracks(Metadata.Category.PLAYLISTS, playlistId, playlistName, activity, fragment)
}
@SuppressLint("CheckResult")
private fun addWithErrorHandler(playlistId: Long, playlistName: String, observable: Observable<Boolean>) {
val error = R.string.playlist_edit_add_error
@Suppress("unused")
observable.subscribeBy(
onNext = { success ->
if (success) {
@ -340,8 +344,8 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity,
}
}
@SuppressLint("CheckResult")
private fun deletePlaylistConfirmed(playlistId: Long, playlistName: String) {
@Suppress("unused")
if (playlistId != -1L) {
provider.deletePlaylist(playlistId).subscribeBy(
onNext = { success ->
@ -359,8 +363,8 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity,
}
}
@SuppressLint("CheckResult")
private fun removeFromPlaylistConfirmed(playlistId: Long, playlistName: String, externalId: String, position: Int) {
@Suppress("unused")
provider
.removeTracksFromPlaylist(playlistId, listOf(externalId), listOf(position))
.subscribeBy(
@ -392,7 +396,7 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity,
val trackExternalId = args.getString(EXTRA_TRACK_EXTERNAL_ID, "")
val trackPosition = args.getInt(EXTRA_TRACK_POSITION, -1)
return AlertDialog.Builder(activity!!)
return AlertDialog.Builder(requireActivity())
.setTitle(R.string.playlist_confirm_delete_title)
.setMessage(getString(R.string.playlist_confirm_delete_message, trackTitle))
.setNegativeButton(R.string.button_no, null)
@ -440,7 +444,7 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity,
val args = this.arguments ?: Bundle()
val playlistName = args.getString(EXTRA_PLAYLIST_NAME, "") ?: ""
val dlg = AlertDialog.Builder(activity!!)
val dlg = AlertDialog.Builder(requireActivity())
.setTitle(R.string.playlist_confirm_delete_title)
.setMessage(getString(R.string.playlist_confirm_delete_message, playlistName))
.setNegativeButton(R.string.button_no, null)
@ -485,7 +489,7 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity,
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val args = arguments ?: Bundle()
val editText = EditText(activity)
val action = args.getSerializable(EXTRA_ACTION)
val action = args.getSerializableCompat<Serializable>(EXTRA_ACTION)
val name = args.getString(EXTRA_NAME, "")
val id = args.getLong(EXTRA_ID, -1)
@ -499,7 +503,7 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity,
editText.requestFocus()
val activity = this.activity!!
val activity = requireActivity()
val dlg = AlertDialog.Builder(activity)
.setTitle(R.string.playlist_name_title)

View File

@ -116,16 +116,16 @@ class EditPlaylistActivity: BaseActivity() {
ItemTouchHelper.LEFT)
{
override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
val from = viewHolder.adapterPosition
val to = target.adapterPosition
val from = viewHolder.bindingAdapterPosition
val to = target.bindingAdapterPosition
viewModel.move(from, to)
adapter.notifyItemMoved(from, to)
return true
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
viewModel.remove(viewHolder.adapterPosition)
adapter.notifyItemRemoved(viewHolder.adapterPosition)
viewModel.remove(viewHolder.bindingAdapterPosition)
adapter.notifyItemRemoved(viewHolder.bindingAdapterPosition)
}
}

View File

@ -1,26 +0,0 @@
package io.casey.musikcube.remote.util
import android.content.Intent
import android.os.Bundle
import android.os.Parcelable
import androidx.annotation.RequiresApi
@RequiresApi(33)
@Suppress("deprecation")
inline fun <reified T: Parcelable> Intent.getParcelableExtraCompat(name: String): T? =
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
this.getParcelableExtra(name)
}
else {
this.getParcelableExtra(name, T::class.java)
}
@RequiresApi(33)
@Suppress("deprecation")
inline fun <reified T: Parcelable> Bundle.getParcelableCompat(name: String): T? =
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
this.getParcelable(name)
}
else {
this.getParcelable(name, T::class.java)
}