diff --git a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt
index 12e79591d..ad08dfdb7 100644
--- a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt
+++ b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt
@@ -18,8 +18,8 @@ import org.oxycblt.auxio.playback.state.PlaybackMode
import org.oxycblt.auxio.recycler.CenterSmoothScroller
import org.oxycblt.auxio.ui.ActionMenu
import org.oxycblt.auxio.ui.canScroll
-import org.oxycblt.auxio.ui.createToast
import org.oxycblt.auxio.ui.newMenu
+import org.oxycblt.auxio.ui.showToast
/**
* The [DetailFragment] for an album.
@@ -58,7 +58,7 @@ class AlbumDetailFragment : DetailFragment() {
setupToolbar(R.menu.menu_album_detail) { itemId ->
if (itemId == R.id.action_queue_add) {
playbackModel.addToUserQueue(detailModel.currentAlbum.value!!)
- getString(R.string.label_queue_added).createToast(requireContext())
+ requireContext().showToast(R.string.label_queue_added)
true
} else {
false
diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicLoader.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicLoader.kt
index d50647869..475abd0f0 100644
--- a/app/src/main/java/org/oxycblt/auxio/music/MusicLoader.kt
+++ b/app/src/main/java/org/oxycblt/auxio/music/MusicLoader.kt
@@ -13,6 +13,7 @@ import org.oxycblt.auxio.logD
/**
* Class that loads/constructs [Genre]s, [Artist]s, [Album]s, and [Song] objects from the filesystem
+ * TODO: Use album artist instead of artist tag.
* @author OxygenCobalt
*/
class MusicLoader(private val context: Context) {
diff --git a/app/src/main/java/org/oxycblt/auxio/settings/AboutDialog.kt b/app/src/main/java/org/oxycblt/auxio/settings/AboutDialog.kt
index 2d8238a33..d982ae85b 100644
--- a/app/src/main/java/org/oxycblt/auxio/settings/AboutDialog.kt
+++ b/app/src/main/java/org/oxycblt/auxio/settings/AboutDialog.kt
@@ -1,6 +1,8 @@
package org.oxycblt.auxio.settings
+import android.content.ActivityNotFoundException
import android.content.Intent
+import android.content.pm.PackageManager
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@@ -11,9 +13,8 @@ import org.oxycblt.auxio.BuildConfig
import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.DialogAboutBinding
import org.oxycblt.auxio.logD
-import org.oxycblt.auxio.logE
import org.oxycblt.auxio.music.MusicStore
-import org.oxycblt.auxio.ui.createToast
+import org.oxycblt.auxio.ui.showToast
/**
* A [BottomSheetDialogFragment] that shows Auxio's about screen.
@@ -48,34 +49,42 @@ class AboutDialog : BottomSheetDialogFragment() {
* Go through the process of opening a [link] in a browser.
*/
private fun openLinkInBrowser(link: String) {
- try {
- val uri = link.toUri()
+ val browserIntent = Intent(Intent.ACTION_VIEW, link.toUri()).setFlags(
+ Intent.FLAG_ACTIVITY_NEW_TASK
+ )
- val browserIntent = Intent(Intent.ACTION_VIEW, uri)
- browserIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
+ val pkgName = requireContext().packageManager.resolveActivity(
+ browserIntent, PackageManager.MATCH_DEFAULT_ONLY
+ )?.activityInfo?.packageName
- val fallbackCandidates = requireContext().packageManager.queryIntentActivities(
- browserIntent, 0
- )
-
- // If there are candidates here, then launch those.
- if (fallbackCandidates.size > 0) {
- requireActivity().startActivity(browserIntent)
+ if (pkgName != null) {
+ if (pkgName == "android") {
+ // No default browser [Must open app chooser, may not be supported
+ openAppChooser(browserIntent)
} else {
- // Otherwise they don't have a browser on their phone, meaning they should
- // just see an error.
- getString(R.string.error_no_browser).createToast(requireContext())
+ try {
+ browserIntent.setPackage(pkgName)
+ startActivity(browserIntent)
+ } catch (exception: ActivityNotFoundException) {
+ // Not browser but an app chooser due to OEM garbage
+ browserIntent.setPackage(null)
+ openAppChooser(browserIntent)
+ }
}
- } catch (e: Exception) {
- logE("Browser intent launching failed [Probably android's fault]")
- logE(e.stackTraceToString())
-
- // Sometimes people have """Browsers""" on their phone according to android,
- // but they actually don't so here's a fallback for that.
- getString(R.string.error_no_browser).createToast(requireContext())
+ } else {
+ // No app installed to open the link
+ requireContext().showToast(R.string.error_no_browser)
}
}
+ private fun openAppChooser(intent: Intent) {
+ val chooserIntent = Intent(Intent.ACTION_CHOOSER)
+ .putExtra(Intent.EXTRA_INTENT, intent)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+
+ startActivity(chooserIntent)
+ }
+
companion object {
private const val LINK_CODEBASE = "https://github.com/oxygencobalt/Auxio"
private const val LINK_FAQ = "$LINK_CODEBASE/blob/master/info/FAQ.md"
diff --git a/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt
index c504f6f60..cbb072f22 100644
--- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt
+++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt
@@ -18,7 +18,6 @@ import org.oxycblt.auxio.settings.blacklist.BlacklistDialog
import org.oxycblt.auxio.settings.ui.IntListPrefDialog
import org.oxycblt.auxio.settings.ui.IntListPreference
import org.oxycblt.auxio.ui.Accent
-import org.oxycblt.auxio.ui.createToast
/**
* The actual fragment containing the settings menu. Inherits [PreferenceFragmentCompat].
@@ -130,8 +129,9 @@ class SettingsListFragment : PreferenceFragmentCompat() {
SettingsManager.KEY_SAVE_STATE -> {
onPreferenceClickListener = Preference.OnPreferenceClickListener {
playbackModel.savePlaybackState(requireContext()) {
- getString(R.string.label_state_saved).createToast(requireContext())
+ requireContext().getString(R.string.label_state_saved)
}
+
true
}
}
diff --git a/app/src/main/java/org/oxycblt/auxio/settings/blacklist/BlacklistDialog.kt b/app/src/main/java/org/oxycblt/auxio/settings/blacklist/BlacklistDialog.kt
index 6fed9dd82..516411892 100644
--- a/app/src/main/java/org/oxycblt/auxio/settings/blacklist/BlacklistDialog.kt
+++ b/app/src/main/java/org/oxycblt/auxio/settings/blacklist/BlacklistDialog.kt
@@ -19,7 +19,7 @@ import org.oxycblt.auxio.databinding.DialogBlacklistBinding
import org.oxycblt.auxio.logD
import org.oxycblt.auxio.playback.PlaybackViewModel
import org.oxycblt.auxio.settings.ui.LifecycleDialog
-import org.oxycblt.auxio.ui.createToast
+import org.oxycblt.auxio.ui.showToast
import kotlin.system.exitProcess
/**
@@ -105,7 +105,7 @@ class BlacklistDialog : LifecycleDialog() {
if (path != null) {
blacklistModel.addPath(path)
} else {
- getString(R.string.error_bad_dir).createToast(requireContext())
+ requireContext().showToast(R.string.error_bad_dir)
}
}
diff --git a/app/src/main/java/org/oxycblt/auxio/ui/ActionMenu.kt b/app/src/main/java/org/oxycblt/auxio/ui/ActionMenu.kt
index 1caa1c89b..31613b5dc 100644
--- a/app/src/main/java/org/oxycblt/auxio/ui/ActionMenu.kt
+++ b/app/src/main/java/org/oxycblt/auxio/ui/ActionMenu.kt
@@ -135,11 +135,12 @@ class ActionMenu(
when (data) {
is Song -> {
playbackModel.addToUserQueue(data)
- context.getString(R.string.label_queue_added).createToast(context)
+ context.showToast(R.string.label_queue_added)
}
+
is Album -> {
playbackModel.addToUserQueue(data)
- context.getString(R.string.label_queue_added).createToast(context)
+ context.showToast(R.string.label_queue_added)
}
else -> {}
diff --git a/app/src/main/java/org/oxycblt/auxio/ui/InterfaceUtils.kt b/app/src/main/java/org/oxycblt/auxio/ui/InterfaceUtils.kt
index 0d6aca79f..6c1912e88 100644
--- a/app/src/main/java/org/oxycblt/auxio/ui/InterfaceUtils.kt
+++ b/app/src/main/java/org/oxycblt/auxio/ui/InterfaceUtils.kt
@@ -20,6 +20,7 @@ import android.widget.Toast
import androidx.annotation.ColorInt
import androidx.annotation.ColorRes
import androidx.annotation.PluralsRes
+import androidx.annotation.StringRes
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.RecyclerView
@@ -131,11 +132,10 @@ fun Int.resolveAttr(context: Context): Int {
}
/**
- * Create a [Toast] from a [String]
- * @param context [Context] required to create the toast
+ * Create a toast using the provided string resource.
*/
-fun String.createToast(context: Context) {
- Toast.makeText(context.applicationContext, this, Toast.LENGTH_SHORT).show()
+fun Context.showToast(@StringRes str: Int) {
+ Toast.makeText(applicationContext, getString(str), Toast.LENGTH_SHORT).show()
}
// --- CONFIGURATION ---
@@ -220,7 +220,7 @@ private fun isSystemBarOnBottom(activity: Activity): Boolean {
}
} else {
@Suppress("DEPRECATION")
- (activity.getSystemServiceSafe(WindowManager::class)).apply {
+ activity.getSystemServiceSafe(WindowManager::class).apply {
defaultDisplay.getRealSize(realPoint)
defaultDisplay.getMetrics(metrics)
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 67e40df58..d014810bf 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -99,7 +99,7 @@
No music found
Music loading failed
Auxio needs permission to read your music library
- Could not open link
+ No app can open this link
This directory is not supported