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