Cleanup with Kotlin extension functions

This commit is contained in:
Prathamesh More 2022-04-13 14:33:36 +05:30
parent fc4f0396a4
commit e0f345b616
37 changed files with 183 additions and 291 deletions

View file

@ -15,13 +15,13 @@
package code.name.monkey.retromusic package code.name.monkey.retromusic
import android.app.Application import android.app.Application
import android.widget.Toast
import cat.ereza.customactivityoncrash.config.CaocConfig import cat.ereza.customactivityoncrash.config.CaocConfig
import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.Constants.PRO_VERSION_PRODUCT_ID import code.name.monkey.retromusic.Constants.PRO_VERSION_PRODUCT_ID
import code.name.monkey.retromusic.activities.ErrorActivity import code.name.monkey.retromusic.activities.ErrorActivity
import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.helper.WallpaperAccentManager import code.name.monkey.retromusic.helper.WallpaperAccentManager
import com.anjlab.android.iab.v3.BillingProcessor import com.anjlab.android.iab.v3.BillingProcessor
import com.anjlab.android.iab.v3.PurchaseInfo import com.anjlab.android.iab.v3.PurchaseInfo
@ -60,11 +60,7 @@ class App : Application() {
override fun onProductPurchased(productId: String, details: PurchaseInfo?) {} override fun onProductPurchased(productId: String, details: PurchaseInfo?) {}
override fun onPurchaseHistoryRestored() { override fun onPurchaseHistoryRestored() {
Toast.makeText( showToast(R.string.restored_previous_purchase_please_restart)
this@App,
R.string.restored_previous_purchase_please_restart,
Toast.LENGTH_LONG
).show()
} }
override fun onBillingError(errorCode: Int, error: Throwable?) {} override fun onBillingError(errorCode: Int, error: Throwable?) {}

View file

@ -19,8 +19,6 @@ import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.MenuItem import android.view.MenuItem
import android.widget.Toast
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.MaterialUtil import code.name.monkey.appthemehelper.util.MaterialUtil
import code.name.monkey.retromusic.App import code.name.monkey.retromusic.App
import code.name.monkey.retromusic.BuildConfig import code.name.monkey.retromusic.BuildConfig
@ -31,6 +29,7 @@ import code.name.monkey.retromusic.databinding.ActivityProVersionBinding
import code.name.monkey.retromusic.extensions.accentColor import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.setLightStatusBar import code.name.monkey.retromusic.extensions.setLightStatusBar
import code.name.monkey.retromusic.extensions.setStatusBarColor import code.name.monkey.retromusic.extensions.setStatusBarColor
import code.name.monkey.retromusic.extensions.showToast
import com.anjlab.android.iab.v3.BillingProcessor import com.anjlab.android.iab.v3.BillingProcessor
import com.anjlab.android.iab.v3.PurchaseInfo import com.anjlab.android.iab.v3.PurchaseInfo
@ -66,8 +65,7 @@ class PurchaseActivity : AbsBaseActivity(), BillingProcessor.IBillingHandler {
} }
private fun restorePurchase() { private fun restorePurchase() {
Toast.makeText(this, R.string.restoring_purchase, Toast.LENGTH_SHORT) showToast(R.string.restoring_purchase)
.show()
billingProcessor.loadOwnedPurchasesFromGoogleAsync(object : billingProcessor.loadOwnedPurchasesFromGoogleAsync(object :
BillingProcessor.IPurchasesResponseListener { BillingProcessor.IPurchasesResponseListener {
override fun onPurchasesSuccess() { override fun onPurchasesSuccess() {
@ -75,30 +73,22 @@ class PurchaseActivity : AbsBaseActivity(), BillingProcessor.IBillingHandler {
} }
override fun onPurchasesError() { override fun onPurchasesError() {
Toast.makeText( showToast(R.string.could_not_restore_purchase)
this@PurchaseActivity,
R.string.could_not_restore_purchase,
Toast.LENGTH_SHORT
).show()
} }
}) })
} }
override fun onProductPurchased(productId: String, details: PurchaseInfo?) { override fun onProductPurchased(productId: String, details: PurchaseInfo?) {
Toast.makeText(this, R.string.thank_you, Toast.LENGTH_SHORT).show() showToast(R.string.thank_you)
setResult(RESULT_OK) setResult(RESULT_OK)
} }
override fun onPurchaseHistoryRestored() { override fun onPurchaseHistoryRestored() {
if (App.isProVersion()) { if (App.isProVersion()) {
Toast.makeText( showToast(R.string.restored_previous_purchase_please_restart)
this,
R.string.restored_previous_purchase_please_restart,
Toast.LENGTH_LONG
).show()
setResult(RESULT_OK) setResult(RESULT_OK)
} else { } else {
Toast.makeText(this, R.string.no_purchase_found, Toast.LENGTH_SHORT).show() showToast(R.string.no_purchase_found)
} }
} }

View file

@ -21,12 +21,10 @@ import android.view.LayoutInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.TextView import android.widget.TextView
import android.widget.Toast
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
@ -121,7 +119,7 @@ class SupportDevelopmentActivity : AbsBaseActivity(), BillingProcessor.IBillingH
override fun onProductPurchased(productId: String, details: PurchaseInfo?) { override fun onProductPurchased(productId: String, details: PurchaseInfo?) {
// loadSkuDetails(); // loadSkuDetails();
Toast.makeText(this, R.string.thank_you, Toast.LENGTH_SHORT).show() showToast(R.string.thank_you)
} }
override fun onBillingError(errorCode: Int, error: Throwable?) { override fun onBillingError(errorCode: Int, error: Throwable?) {
@ -130,7 +128,7 @@ class SupportDevelopmentActivity : AbsBaseActivity(), BillingProcessor.IBillingH
override fun onPurchaseHistoryRestored() { override fun onPurchaseHistoryRestored() {
// loadSkuDetails(); // loadSkuDetails();
Toast.makeText(this, R.string.restored_previous_purchases, Toast.LENGTH_SHORT).show() showToast(R.string.restored_previous_purchases)
} }
override fun onDestroy() { override fun onDestroy() {

View file

@ -20,7 +20,6 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.MenuItem import android.view.MenuItem
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import android.widget.Toast
import androidx.annotation.StringDef import androidx.annotation.StringDef
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
@ -39,6 +38,7 @@ import code.name.monkey.retromusic.activities.bugreport.model.github.GithubTarge
import code.name.monkey.retromusic.databinding.ActivityBugReportBinding import code.name.monkey.retromusic.databinding.ActivityBugReportBinding
import code.name.monkey.retromusic.extensions.accentColor import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.setTaskDescriptionColorAuto import code.name.monkey.retromusic.extensions.setTaskDescriptionColorAuto
import code.name.monkey.retromusic.extensions.showToast
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.android.material.textfield.TextInputLayout import com.google.android.material.textfield.TextInputLayout
@ -163,11 +163,7 @@ open class BugReportActivity : AbsThemeActivity() {
val clipboard = getSystemService<ClipboardManager>() val clipboard = getSystemService<ClipboardManager>()
val clip = ClipData.newPlainText(getString(R.string.device_info), deviceInfo?.toMarkdown()) val clip = ClipData.newPlainText(getString(R.string.device_info), deviceInfo?.toMarkdown())
clipboard?.setPrimaryClip(clip) clipboard?.setPrimaryClip(clip)
Toast.makeText( showToast(R.string.copied_device_info_to_clipboard)
this@BugReportActivity,
R.string.copied_device_info_to_clipboard,
Toast.LENGTH_LONG
).show()
} }
private fun validateInput(): Boolean { private fun validateInput(): Boolean {

View file

@ -30,10 +30,7 @@ import androidx.core.widget.doAfterTextChanged
import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.ActivityAlbumTagEditorBinding import code.name.monkey.retromusic.databinding.ActivityAlbumTagEditorBinding
import code.name.monkey.retromusic.extensions.appHandleColor import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.extensions.defaultFooterColor
import code.name.monkey.retromusic.extensions.isColorLight
import code.name.monkey.retromusic.extensions.setTint
import code.name.monkey.retromusic.glide.GlideApp import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import code.name.monkey.retromusic.model.ArtworkInfo import code.name.monkey.retromusic.model.ArtworkInfo
@ -117,11 +114,7 @@ class AlbumTagEditorActivity : AbsTagEditorActivity<ActivityAlbumTagEditorBindin
} }
private fun toastLoadingFailed() { private fun toastLoadingFailed() {
Toast.makeText( showToast(R.string.could_not_download_album_cover)
this@AlbumTagEditorActivity,
R.string.could_not_download_album_cover,
Toast.LENGTH_SHORT
).show()
} }
override fun searchImageOnWeb() { override fun searchImageOnWeb() {
@ -161,8 +154,7 @@ class AlbumTagEditorActivity : AbsTagEditorActivity<ActivityAlbumTagEditorBindin
override fun onLoadFailed(errorDrawable: Drawable?) { override fun onLoadFailed(errorDrawable: Drawable?) {
super.onLoadFailed(errorDrawable) super.onLoadFailed(errorDrawable)
Toast.makeText(this@AlbumTagEditorActivity, "Load Failed", Toast.LENGTH_LONG) showToast("Load Failed", Toast.LENGTH_LONG)
.show()
} }
override fun setResource(resource: BitmapPaletteWrapper?) {} override fun setResource(resource: BitmapPaletteWrapper?) {}

View file

@ -30,10 +30,7 @@ import androidx.core.widget.doAfterTextChanged
import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.ActivitySongTagEditorBinding import code.name.monkey.retromusic.databinding.ActivitySongTagEditorBinding
import code.name.monkey.retromusic.extensions.appHandleColor import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.extensions.defaultFooterColor
import code.name.monkey.retromusic.extensions.isColorLight
import code.name.monkey.retromusic.extensions.setTint
import code.name.monkey.retromusic.glide.GlideApp import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import code.name.monkey.retromusic.model.ArtworkInfo import code.name.monkey.retromusic.model.ArtworkInfo
@ -196,8 +193,7 @@ class SongTagEditorActivity : AbsTagEditorActivity<ActivitySongTagEditorBinding>
override fun onLoadFailed(errorDrawable: Drawable?) { override fun onLoadFailed(errorDrawable: Drawable?) {
super.onLoadFailed(errorDrawable) super.onLoadFailed(errorDrawable)
Toast.makeText(this@SongTagEditorActivity, "Load Failed", Toast.LENGTH_LONG) showToast("Load Failed", Toast.LENGTH_LONG)
.show()
} }
override fun setResource(resource: BitmapPaletteWrapper?) {} override fun setResource(resource: BitmapPaletteWrapper?) {}

View file

@ -6,8 +6,8 @@ import android.graphics.Bitmap
import android.media.MediaScannerConnection import android.media.MediaScannerConnection
import android.os.Build import android.os.Build
import android.util.Log import android.util.Log
import android.widget.Toast
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.misc.UpdateToastMediaScannerCompletionListener import code.name.monkey.retromusic.misc.UpdateToastMediaScannerCompletionListener
import code.name.monkey.retromusic.model.AudioTagInfo import code.name.monkey.retromusic.model.AudioTagInfo
import code.name.monkey.retromusic.util.MusicUtil.createAlbumArtFile import code.name.monkey.retromusic.util.MusicUtil.createAlbumArtFile
@ -24,7 +24,6 @@ import org.jaudiotagger.tag.TagException
import org.jaudiotagger.tag.images.AndroidArtwork import org.jaudiotagger.tag.images.AndroidArtwork
import org.jaudiotagger.tag.images.Artwork import org.jaudiotagger.tag.images.Artwork
import java.io.File import java.io.File
import java.io.FileOutputStream
import java.io.IOException import java.io.IOException
class TagWriter { class TagWriter {
@ -34,7 +33,7 @@ class TagWriter {
suspend fun scan(context: Context, toBeScanned: List<String?>?) { suspend fun scan(context: Context, toBeScanned: List<String?>?) {
if (toBeScanned == null || toBeScanned.isEmpty()) { if (toBeScanned == null || toBeScanned.isEmpty()) {
Log.i("scan", "scan: Empty") Log.i("scan", "scan: Empty")
Toast.makeText(context, "Scan file from folder", Toast.LENGTH_SHORT).show() context.showToast( "Scan file from folder")
return return
} }
MediaScannerConnection.scanFile( MediaScannerConnection.scanFile(
@ -60,7 +59,7 @@ class TagWriter {
info.artworkInfo.artwork.compress( info.artworkInfo.artwork.compress(
Bitmap.CompressFormat.JPEG, Bitmap.CompressFormat.JPEG,
100, 100,
FileOutputStream(albumArtFile) albumArtFile.outputStream()
) )
artwork = AndroidArtwork.createArtworkFromFile(albumArtFile) artwork = AndroidArtwork.createArtworkFromFile(albumArtFile)
} catch (e: IOException) { } catch (e: IOException) {
@ -133,7 +132,7 @@ class TagWriter {
info.artworkInfo.artwork.compress( info.artworkInfo.artwork.compress(
Bitmap.CompressFormat.JPEG, Bitmap.CompressFormat.JPEG,
100, 100,
FileOutputStream(albumArtFile) albumArtFile.outputStream()
) )
artwork = AndroidArtwork.createArtworkFromFile(albumArtFile) artwork = AndroidArtwork.createArtworkFromFile(albumArtFile)
} catch (e: IOException) { } catch (e: IOException) {

View file

@ -19,12 +19,12 @@ import android.view.LayoutInflater
import android.view.MotionEvent import android.view.MotionEvent
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.ThemeStore.Companion.accentColor import code.name.monkey.appthemehelper.ThemeStore.Companion.accentColor
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.PreferenceDialogLibraryCategoriesListitemBinding import code.name.monkey.retromusic.databinding.PreferenceDialogLibraryCategoriesListitemBinding
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.model.CategoryInfo import code.name.monkey.retromusic.model.CategoryInfo
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.SwipeAndDragHelper import code.name.monkey.retromusic.util.SwipeAndDragHelper
@ -59,12 +59,7 @@ class CategoryInfoAdapter : RecyclerView.Adapter<CategoryInfoAdapter.ViewHolder>
categoryInfo.visible = !categoryInfo.visible categoryInfo.visible = !categoryInfo.visible
holder.binding.checkbox.isChecked = categoryInfo.visible holder.binding.checkbox.isChecked = categoryInfo.visible
} else { } else {
Toast.makeText( holder.itemView.context.showToast(R.string.you_have_to_select_at_least_one_category)
holder.itemView.context,
R.string.you_have_to_select_at_least_one_category,
Toast.LENGTH_SHORT
)
.show()
} }
} }
holder.binding.dragView.setOnTouchListener { _: View?, event: MotionEvent -> holder.binding.dragView.setOnTouchListener { _: View?, event: MotionEvent ->

View file

@ -114,7 +114,7 @@ class RetroWebServer(val context: Context) : NanoHTTPD(SERVER_PORT) {
} else { } else {
res = newFixedLengthResponse( res = newFixedLengthResponse(
Status.OK, mime, Status.OK, mime,
FileInputStream(file), file.length() file.inputStream(), file.length()
) )
res.addHeader("Accept-Ranges", "bytes") res.addHeader("Accept-Ranges", "bytes")
res.addHeader("Content-Length", "" + fileLen) res.addHeader("Content-Length", "" + fileLen)

View file

@ -22,14 +22,10 @@ import androidx.core.os.bundleOf
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.App
import code.name.monkey.retromusic.EXTRA_PLAYLIST import code.name.monkey.retromusic.EXTRA_PLAYLIST
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.db.PlaylistWithSongs import code.name.monkey.retromusic.db.PlaylistWithSongs
import code.name.monkey.retromusic.extensions.colorButtons import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.extensions.createNewFile
import code.name.monkey.retromusic.extensions.extraNotNull
import code.name.monkey.retromusic.extensions.materialDialog
import code.name.monkey.retromusic.helper.M3UWriter import code.name.monkey.retromusic.helper.M3UWriter
import code.name.monkey.retromusic.util.PlaylistsUtil import code.name.monkey.retromusic.util.PlaylistsUtil
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -64,25 +60,21 @@ class SavePlaylistDialog : DialogFragment() {
playlistWithSongs playlistWithSongs
) )
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
Toast.makeText( showToast(
requireContext(),
String.format( String.format(
requireContext().getString(R.string.saved_playlist_to), requireContext().getString(R.string.saved_playlist_to),
data?.lastPathSegment data?.lastPathSegment
), ),
Toast.LENGTH_LONG Toast.LENGTH_LONG
).show() )
dismiss() dismiss()
} }
} }
} }
} catch (e: Exception) { } catch (e: Exception) {
Toast.makeText( showToast(
context, "Something went wrong : " + e.message
"Something went wrong : " + e.message,
Toast.LENGTH_SHORT
) )
.show()
} }
} }
} else { } else {
@ -95,11 +87,10 @@ class SavePlaylistDialog : DialogFragment() {
) { _, _ -> ) { _, _ ->
} }
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
Toast.makeText( showToast(
requireContext(), String.format(getString(R.string.saved_playlist_to), file),
String.format(App.getContext().getString(R.string.saved_playlist_to), file),
Toast.LENGTH_LONG Toast.LENGTH_LONG
).show() )
dismiss() dismiss()
} }
} }

View file

@ -0,0 +1,13 @@
package code.name.monkey.retromusic.extensions
import android.content.Context
import android.widget.Toast
import androidx.annotation.StringRes
fun Context.showToast(@StringRes stringRes: Int, duration: Int = Toast.LENGTH_SHORT) {
showToast(getString(stringRes), duration)
}
fun Context.showToast(message: String, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, message, duration).show()
}

View file

@ -0,0 +1,6 @@
package code.name.monkey.retromusic.extensions
import java.io.BufferedOutputStream
import java.util.zip.ZipOutputStream
fun BufferedOutputStream.zipOutputStream(): ZipOutputStream = ZipOutputStream(this)

View file

@ -80,12 +80,12 @@ fun <T> Fragment.whichFragment(@IdRes id: Int): T {
return childFragmentManager.findFragmentById(id) as T return childFragmentManager.findFragmentById(id) as T
} }
fun Fragment.showToast(@StringRes stringRes: Int) { fun Fragment.showToast(@StringRes stringRes: Int, duration: Int = Toast.LENGTH_SHORT) {
showToast(getString(stringRes)) showToast(getString(stringRes), duration)
} }
fun Fragment.showToast(message: String) { fun Fragment.showToast(message: String, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show() Toast.makeText(requireContext(), message, duration).show()
} }
fun Context.getDrawableCompat(@DrawableRes drawableRes: Int): Drawable { fun Context.getDrawableCompat(@DrawableRes drawableRes: Int): Drawable {

View file

@ -16,11 +16,11 @@ package code.name.monkey.retromusic.fragments
import android.animation.ValueAnimator import android.animation.ValueAnimator
import android.content.Context import android.content.Context
import android.widget.Toast
import androidx.core.animation.doOnEnd import androidx.core.animation.doOnEnd
import androidx.lifecycle.* import androidx.lifecycle.*
import code.name.monkey.retromusic.* import code.name.monkey.retromusic.*
import code.name.monkey.retromusic.db.* import code.name.monkey.retromusic.db.*
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.fragments.ReloadType.* import code.name.monkey.retromusic.fragments.ReloadType.*
import code.name.monkey.retromusic.fragments.search.Filter import code.name.monkey.retromusic.fragments.search.Filter
import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
@ -348,12 +348,7 @@ class LibraryViewModel(
createPlaylist(PlaylistEntity(playlistName = playlistName)) createPlaylist(PlaylistEntity(playlistName = playlistName))
insertSongs(songs.map { it.toSongEntity(playlistId) }) insertSongs(songs.map { it.toSongEntity(playlistId) })
withContext(Main) { withContext(Main) {
Toast.makeText( context.showToast(R.string.playlist_created_sucessfully)
context ,
context
.getString(R.string.playlist_created_sucessfully, playlistName),
Toast.LENGTH_SHORT
).show()
} }
} else { } else {
val playlist = playlists.firstOrNull() val playlist = playlists.firstOrNull()
@ -365,13 +360,7 @@ class LibraryViewModel(
} }
forceReload(Playlists) forceReload(Playlists)
withContext(Main) { withContext(Main) {
Toast.makeText( context.showToast(R.string.added_song_count_to_playlist)
context, context.getString(
R.string.added_song_count_to_playlist,
songs.size,
playlistName
), Toast.LENGTH_SHORT
).show()
} }
} }
} }

View file

@ -5,7 +5,6 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.core.view.isVisible import androidx.core.view.isVisible
@ -20,6 +19,7 @@ import code.name.monkey.retromusic.databinding.FragmentBackupBinding
import code.name.monkey.retromusic.extensions.accentColor import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.accentOutlineColor import code.name.monkey.retromusic.extensions.accentOutlineColor
import code.name.monkey.retromusic.extensions.materialDialog import code.name.monkey.retromusic.extensions.materialDialog
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.helper.BackupHelper import code.name.monkey.retromusic.helper.BackupHelper
import code.name.monkey.retromusic.helper.sanitize import code.name.monkey.retromusic.helper.sanitize
import code.name.monkey.retromusic.util.BackupUtil import code.name.monkey.retromusic.util.BackupUtil
@ -122,11 +122,7 @@ class BackupFragment : Fragment(R.layout.fragment_backup), BackupAdapter.BackupC
try { try {
file.delete() file.delete()
} catch (exception: SecurityException) { } catch (exception: SecurityException) {
Toast.makeText( showToast("Could not delete backup")
activity,
"Could not delete backup",
Toast.LENGTH_SHORT
).show()
} }
backupViewModel.loadBackups() backupViewModel.loadBackups()
return true return true
@ -151,11 +147,9 @@ class BackupFragment : Fragment(R.layout.fragment_backup), BackupAdapter.BackupC
file.renameTo(renamedFile) file.renameTo(renamedFile)
backupViewModel.loadBackups() backupViewModel.loadBackups()
} else { } else {
Toast.makeText( showToast(
requireContext(), "File already exists"
"File already exists", )
Toast.LENGTH_SHORT
).show()
} }
} }
positiveButton(android.R.string.ok) positiveButton(android.R.string.ok)

View file

@ -29,7 +29,6 @@ import android.view.MenuItem
import android.view.MotionEvent import android.view.MotionEvent
import android.view.View import android.view.View
import android.widget.RelativeLayout import android.widget.RelativeLayout
import android.widget.Toast
import androidx.annotation.LayoutRes import androidx.annotation.LayoutRes
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
@ -48,10 +47,7 @@ import code.name.monkey.retromusic.activities.tageditor.SongTagEditorActivity
import code.name.monkey.retromusic.db.PlaylistEntity import code.name.monkey.retromusic.db.PlaylistEntity
import code.name.monkey.retromusic.db.toSongEntity import code.name.monkey.retromusic.db.toSongEntity
import code.name.monkey.retromusic.dialogs.* import code.name.monkey.retromusic.dialogs.*
import code.name.monkey.retromusic.extensions.currentFragment import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.extensions.hide
import code.name.monkey.retromusic.extensions.keepScreenOn
import code.name.monkey.retromusic.extensions.whichFragment
import code.name.monkey.retromusic.fragments.NowPlayingScreen import code.name.monkey.retromusic.fragments.NowPlayingScreen
import code.name.monkey.retromusic.fragments.ReloadType import code.name.monkey.retromusic.fragments.ReloadType
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
@ -60,7 +56,10 @@ import code.name.monkey.retromusic.interfaces.IPaletteColorHolder
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.repository.RealRepository import code.name.monkey.retromusic.repository.RealRepository
import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.util.* import code.name.monkey.retromusic.util.NavigationUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
import code.name.monkey.retromusic.util.RingtoneManager
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.Dispatchers.Main
@ -196,7 +195,7 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMainActivityFragme
if (genre == null) { if (genre == null) {
genre = "Not Specified" genre = "Not Specified"
} }
Toast.makeText(context, genre, Toast.LENGTH_SHORT).show() showToast(genre)
return true return true
} }
} }

View file

@ -24,7 +24,6 @@ import android.view.MenuInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.webkit.MimeTypeMap import android.webkit.MimeTypeMap
import android.widget.Toast
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.core.view.isVisible import androidx.core.view.isVisible
@ -211,12 +210,9 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
} }
R.id.action_set_as_start_directory -> { R.id.action_set_as_start_directory -> {
startDirectory = file startDirectory = file
Toast.makeText( showToast(
activity, String.format(getString(R.string.new_start_directory), file.path)
String.format(getString(R.string.new_start_directory), file.path),
Toast.LENGTH_SHORT
) )
.show()
return@setOnMenuItemClickListener true return@setOnMenuItemClickListener true
} }
R.id.action_scan -> { R.id.action_scan -> {
@ -491,7 +487,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
return return
} }
if (toBeScanned.isEmpty()) { if (toBeScanned.isEmpty()) {
Toast.makeText(activity, R.string.nothing_to_scan, Toast.LENGTH_SHORT).show() showToast(R.string.nothing_to_scan)
} else { } else {
MediaScannerConnection.scanFile( MediaScannerConnection.scanFile(
requireContext(), requireContext(),

View file

@ -24,7 +24,6 @@ import android.view.LayoutInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast
import androidx.core.view.doOnPreDraw import androidx.core.view.doOnPreDraw
import androidx.core.view.updateLayoutParams import androidx.core.view.updateLayoutParams
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
@ -36,6 +35,7 @@ import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.FragmentUserInfoBinding import code.name.monkey.retromusic.databinding.FragmentUserInfoBinding
import code.name.monkey.retromusic.extensions.accentColor import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.applyToolbar import code.name.monkey.retromusic.extensions.applyToolbar
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.fragments.LibraryViewModel import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.glide.GlideApp import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroGlideExtension
@ -55,9 +55,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.koin.androidx.viewmodel.ext.android.sharedViewModel import org.koin.androidx.viewmodel.ext.android.sharedViewModel
import java.io.BufferedOutputStream
import java.io.File import java.io.File
import java.io.FileOutputStream
class UserInfoFragment : Fragment() { class UserInfoFragment : Fragment() {
@ -98,11 +96,7 @@ class UserInfoFragment : Fragment() {
binding.next.setOnClickListener { binding.next.setOnClickListener {
val nameString = binding.name.text.toString().trim { it <= ' ' } val nameString = binding.name.text.toString().trim { it <= ' ' }
if (nameString.isEmpty()) { if (nameString.isEmpty()) {
Toast.makeText( showToast("Your name can't be empty!")
requireContext(),
"Your name can't be empty!",
Toast.LENGTH_SHORT
).show()
return@setOnClickListener return@setOnClickListener
} }
PreferenceUtil.userName = nameString PreferenceUtil.userName = nameString
@ -204,9 +198,9 @@ class UserInfoFragment : Fragment() {
val fileUri = data?.data val fileUri = data?.data
fileUri?.let { setAndSaveBannerImage(it) } fileUri?.let { setAndSaveBannerImage(it) }
} else if (resultCode == ImagePicker.RESULT_ERROR) { } else if (resultCode == ImagePicker.RESULT_ERROR) {
Toast.makeText(requireContext(), ImagePicker.getError(data), Toast.LENGTH_SHORT).show() showToast(ImagePicker.getError(data))
} else { } else {
Toast.makeText(requireContext(), "Task Cancelled", Toast.LENGTH_SHORT).show() showToast("Task Cancelled")
} }
} }
@ -245,7 +239,7 @@ class UserInfoFragment : Fragment() {
val file = File(appDir, fileName) val file = File(appDir, fileName)
var successful = false var successful = false
runCatching { runCatching {
BufferedOutputStream(FileOutputStream(file)).use { file.outputStream().buffered().use {
successful = ImageUtil.resizeBitmap(bitmap, 2048) successful = ImageUtil.resizeBitmap(bitmap, 2048)
.compress(Bitmap.CompressFormat.WEBP, 100, it) .compress(Bitmap.CompressFormat.WEBP, 100, it)
} }
@ -254,7 +248,7 @@ class UserInfoFragment : Fragment() {
} }
if (successful) { if (successful) {
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
Toast.makeText(requireContext(), "Updated", Toast.LENGTH_SHORT).show() showToast("Updated")
} }
} }
} }

View file

@ -19,12 +19,12 @@ import android.graphics.drawable.ColorDrawable
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.Toast
import androidx.preference.ListPreference import androidx.preference.ListPreference
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEPreferenceFragmentCompat import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEPreferenceFragmentCompat
import code.name.monkey.retromusic.activities.OnThemeChangedListener import code.name.monkey.retromusic.activities.OnThemeChangedListener
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.preferences.* import code.name.monkey.retromusic.preferences.*
import code.name.monkey.retromusic.util.NavigationUtil import code.name.monkey.retromusic.util.NavigationUtil
import dev.chrisbanes.insetter.applyInsetter import dev.chrisbanes.insetter.applyInsetter
@ -36,8 +36,7 @@ import dev.chrisbanes.insetter.applyInsetter
abstract class AbsSettingsFragment : ATEPreferenceFragmentCompat() { abstract class AbsSettingsFragment : ATEPreferenceFragmentCompat() {
internal fun showProToastAndNavigate(message: String) { internal fun showProToastAndNavigate(message: String) {
Toast.makeText(requireContext(), "$message is Pro version feature.", Toast.LENGTH_SHORT) showToast("$message is Pro version feature.")
.show()
NavigationUtil.goToProVersion(requireActivity()) NavigationUtil.goToProVersion(requireActivity())
} }

View file

@ -2,11 +2,11 @@ package code.name.monkey.retromusic.helper
import android.content.Context import android.content.Context
import android.os.Environment import android.os.Environment
import android.widget.Toast
import code.name.monkey.retromusic.App
import code.name.monkey.retromusic.BuildConfig import code.name.monkey.retromusic.BuildConfig
import code.name.monkey.retromusic.db.PlaylistEntity import code.name.monkey.retromusic.db.PlaylistEntity
import code.name.monkey.retromusic.db.toSongEntity import code.name.monkey.retromusic.db.toSongEntity
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.extensions.zipOutputStream
import code.name.monkey.retromusic.helper.BackupContent.* import code.name.monkey.retromusic.helper.BackupContent.*
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.repository.Repository import code.name.monkey.retromusic.repository.Repository
@ -15,12 +15,12 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.koin.core.component.KoinComponent import org.koin.core.component.KoinComponent
import org.koin.core.component.inject import org.koin.core.component.inject
import java.io.* import java.io.File
import java.io.InputStream
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
import java.util.zip.ZipEntry import java.util.zip.ZipEntry
import java.util.zip.ZipInputStream import java.util.zip.ZipInputStream
import java.util.zip.ZipOutputStream
object BackupHelper : KoinComponent { object BackupHelper : KoinComponent {
private val repository by inject<Repository>() private val repository by inject<Repository>()
@ -37,38 +37,30 @@ object BackupHelper : KoinComponent {
zipItems.addAll(getSettingsZipItems(context)) zipItems.addAll(getSettingsZipItems(context))
getUserImageZipItems(context)?.let { zipItems.addAll(it) } getUserImageZipItems(context)?.let { zipItems.addAll(it) }
zipItems.addAll(getCustomArtistZipItems(context)) zipItems.addAll(getCustomArtistZipItems(context))
zipAll(zipItems, backupFile) zipAll(context, zipItems, backupFile)
// Clean Cache Playlist Directory // Clean Cache Playlist Directory
File(context.filesDir, PLAYLISTS_PATH).deleteRecursively() File(context.filesDir, PLAYLISTS_PATH).deleteRecursively()
} }
private suspend fun zipAll(zipItems: List<ZipItem>, backupFile: File) = private suspend fun zipAll(context: Context, zipItems: List<ZipItem>, backupFile: File) =
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
runCatching { runCatching {
ZipOutputStream(BufferedOutputStream(FileOutputStream(backupFile))).use { out -> backupFile.outputStream().buffered().zipOutputStream().use { out ->
for (zipItem in zipItems) { for (zipItem in zipItems) {
FileInputStream(zipItem.filePath).use { fi -> File(zipItem.filePath).inputStream().buffered().use { origin ->
BufferedInputStream(fi).use { origin ->
val entry = ZipEntry(zipItem.zipPath) val entry = ZipEntry(zipItem.zipPath)
out.putNextEntry(entry) out.putNextEntry(entry)
origin.copyTo(out) origin.copyTo(out)
} }
} }
} }
}
}.onFailure { }.onFailure {
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
Toast.makeText(App.getContext(), "Couldn't create backup", Toast.LENGTH_SHORT) context.showToast("Couldn't create backup")
.show()
} }
}.onSuccess { }.onSuccess {
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
Toast.makeText( context.showToast("Backup created successfully")
App.getContext(),
"Backup created successfully",
Toast.LENGTH_SHORT
)
.show()
} }
} }
} }
@ -167,7 +159,7 @@ object BackupHelper : KoinComponent {
} }
} }
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
Toast.makeText(context, "Restore Completed Successfully", Toast.LENGTH_SHORT).show() context.showToast("Restore Completed Successfully")
} }
} }
} }
@ -176,7 +168,7 @@ object BackupHelper : KoinComponent {
val file = File( val file = File(
context.filesDir.path, zipEntry.getFileName() context.filesDir.path, zipEntry.getFileName()
) )
BufferedOutputStream(FileOutputStream(file)).use { bos -> file.outputStream().buffered().use { bos ->
zipIn.copyTo(bos) zipIn.copyTo(bos)
} }
} }
@ -188,7 +180,7 @@ object BackupHelper : KoinComponent {
if (file.exists()) { if (file.exists()) {
file.delete() file.delete()
} }
BufferedOutputStream(FileOutputStream(file)).use { bos -> file.outputStream().buffered().use { bos ->
zipIn.copyTo(bos) zipIn.copyTo(bos)
} }
} }
@ -233,14 +225,12 @@ object BackupHelper : KoinComponent {
if (!parentFolder.exists()) { if (!parentFolder.exists()) {
parentFolder.mkdirs() parentFolder.mkdirs()
} }
BufferedOutputStream( val file = File(
FileOutputStream(
File(
parentFolder, parentFolder,
zipEntry.getFileName() zipEntry.getFileName()
) )
) file.outputStream().buffered()
).use { bos -> .use { bos ->
zipIn.copyTo(bos) zipIn.copyTo(bos)
} }
} }
@ -252,7 +242,7 @@ object BackupHelper : KoinComponent {
) { ) {
val file = val file =
File(context.filesDir.parentFile, "shared_prefs".child(zipEntry.getFileName())) File(context.filesDir.parentFile, "shared_prefs".child(zipEntry.getFileName()))
BufferedOutputStream(FileOutputStream(file)).use { bos -> file.outputStream().buffered().use { bos ->
zipIn.copyTo(bos) zipIn.copyTo(bos)
} }
} }

View file

@ -25,6 +25,7 @@ import android.provider.DocumentsContract
import android.widget.Toast import android.widget.Toast
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.repository.SongRepository import code.name.monkey.retromusic.repository.SongRepository
import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.service.MusicService
@ -317,11 +318,7 @@ object MusicPlayerRemote : KoinComponent {
queue.add(song) queue.add(song)
openQueue(queue, 0, false) openQueue(queue, 0, false)
} }
Toast.makeText( musicService?.showToast(R.string.added_title_to_playing_queue)
musicService,
musicService!!.resources.getString(R.string.added_title_to_playing_queue),
Toast.LENGTH_SHORT
).show()
return true return true
} }
return false return false
@ -340,7 +337,7 @@ object MusicPlayerRemote : KoinComponent {
R.string.added_x_titles_to_playing_queue, R.string.added_x_titles_to_playing_queue,
songs.size songs.size
) )
Toast.makeText(musicService, toast, Toast.LENGTH_SHORT).show() musicService?.showToast(toast, Toast.LENGTH_SHORT)
return true return true
} }
return false return false
@ -355,11 +352,7 @@ object MusicPlayerRemote : KoinComponent {
queue.add(song) queue.add(song)
openQueue(queue, 0, false) openQueue(queue, 0, false)
} }
Toast.makeText( musicService?.showToast(R.string.added_title_to_playing_queue)
musicService,
musicService!!.resources.getString(R.string.added_title_to_playing_queue),
Toast.LENGTH_SHORT
).show()
return true return true
} }
return false return false
@ -377,7 +370,7 @@ object MusicPlayerRemote : KoinComponent {
R.string.added_x_titles_to_playing_queue, R.string.added_x_titles_to_playing_queue,
songs.size songs.size
) )
Toast.makeText(musicService, toast, Toast.LENGTH_SHORT).show() musicService?.showToast(toast)
return true return true
} }
return false return false

View file

@ -21,7 +21,6 @@ import android.util.AttributeSet
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast
import androidx.core.graphics.BlendModeColorFilterCompat import androidx.core.graphics.BlendModeColorFilterCompat
import androidx.core.graphics.BlendModeCompat.SRC_IN import androidx.core.graphics.BlendModeCompat.SRC_IN
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
@ -81,7 +80,7 @@ class AlbumCoverStylePreferenceDialog : DialogFragment(),
val coverStyle = values()[viewPagerPosition] val coverStyle = values()[viewPagerPosition]
if (isAlbumCoverStyle(coverStyle)) { if (isAlbumCoverStyle(coverStyle)) {
val result = getString(coverStyle.titleRes) + " theme is Pro version feature." val result = getString(coverStyle.titleRes) + " theme is Pro version feature."
Toast.makeText(context, result, Toast.LENGTH_SHORT).show() showToast(result)
NavigationUtil.goToProVersion(requireActivity()) NavigationUtil.goToProVersion(requireActivity())
} else { } else {
PreferenceUtil.albumCoverStyle = coverStyle PreferenceUtil.albumCoverStyle = coverStyle

View file

@ -18,7 +18,6 @@ import android.app.Dialog
import android.content.Context import android.content.Context
import android.os.Bundle import android.os.Bundle
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.Toast
import androidx.core.graphics.BlendModeColorFilterCompat import androidx.core.graphics.BlendModeColorFilterCompat
import androidx.core.graphics.BlendModeCompat.SRC_IN import androidx.core.graphics.BlendModeCompat.SRC_IN
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
@ -30,6 +29,7 @@ import code.name.monkey.retromusic.databinding.PreferenceDialogLibraryCategories
import code.name.monkey.retromusic.extensions.colorButtons import code.name.monkey.retromusic.extensions.colorButtons
import code.name.monkey.retromusic.extensions.colorControlNormal import code.name.monkey.retromusic.extensions.colorControlNormal
import code.name.monkey.retromusic.extensions.materialDialog import code.name.monkey.retromusic.extensions.materialDialog
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.model.CategoryInfo import code.name.monkey.retromusic.model.CategoryInfo
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
@ -76,7 +76,7 @@ class LibraryPreferenceDialog : DialogFragment() {
private fun updateCategories(categories: List<CategoryInfo>) { private fun updateCategories(categories: List<CategoryInfo>) {
if (getSelected(categories) == 0) return if (getSelected(categories) == 0) return
if (getSelected(categories) > 5) { if (getSelected(categories) > 5) {
Toast.makeText(context, "Not more than 5 items", Toast.LENGTH_SHORT).show() showToast("Not more than 5 items")
return return
} }
PreferenceUtil.libraryCategory = categories PreferenceUtil.libraryCategory = categories

View file

@ -21,7 +21,6 @@ import android.util.AttributeSet
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast
import androidx.core.graphics.BlendModeColorFilterCompat import androidx.core.graphics.BlendModeColorFilterCompat
import androidx.core.graphics.BlendModeCompat.SRC_IN import androidx.core.graphics.BlendModeCompat.SRC_IN
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
@ -91,7 +90,7 @@ class NowPlayingScreenPreferenceDialog : DialogFragment(), ViewPager.OnPageChang
if (isNowPlayingThemes(nowPlayingScreen)) { if (isNowPlayingThemes(nowPlayingScreen)) {
val result = val result =
"${getString(nowPlayingScreen.titleRes)} theme is Pro version feature." "${getString(nowPlayingScreen.titleRes)} theme is Pro version feature."
Toast.makeText(context, result, Toast.LENGTH_SHORT).show() showToast(result)
NavigationUtil.goToProVersion(requireContext()) NavigationUtil.goToProVersion(requireContext())
} else { } else {
PreferenceUtil.nowPlayingScreen = nowPlayingScreen PreferenceUtil.nowPlayingScreen = nowPlayingScreen

View file

@ -9,9 +9,9 @@ import android.media.MediaPlayer
import android.media.audiofx.AudioEffect import android.media.audiofx.AudioEffect
import android.os.PowerManager import android.os.PowerManager
import android.util.Log import android.util.Log
import android.widget.Toast
import androidx.core.net.toUri import androidx.core.net.toUri
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.service.AudioFader.Companion.createFadeAnimator import code.name.monkey.retromusic.service.AudioFader.Companion.createFadeAnimator
import code.name.monkey.retromusic.service.playback.Playback import code.name.monkey.retromusic.service.playback.Playback
@ -291,12 +291,7 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion
player2 = MediaPlayer() player2 = MediaPlayer()
mIsInitialized = true mIsInitialized = true
mp?.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK) mp?.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK)
Toast.makeText( context.showToast(R.string.unplayable_file)
context,
context.resources.getString(R.string.unplayable_file),
Toast.LENGTH_SHORT
)
.show()
Log.e(TAG, what.toString() + extra) Log.e(TAG, what.toString() + extra)
return false return false
} }

View file

@ -38,7 +38,6 @@ import android.support.v4.media.session.PlaybackStateCompat
import android.telephony.PhoneStateListener import android.telephony.PhoneStateListener
import android.telephony.TelephonyManager import android.telephony.TelephonyManager
import android.util.Log import android.util.Log
import android.widget.Toast
import androidx.core.content.edit import androidx.core.content.edit
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import androidx.media.AudioAttributesCompat import androidx.media.AudioAttributesCompat
@ -54,6 +53,7 @@ import code.name.monkey.retromusic.activities.LockScreenActivity
import code.name.monkey.retromusic.appwidgets.* import code.name.monkey.retromusic.appwidgets.*
import code.name.monkey.retromusic.auto.AutoMediaIDHelper import code.name.monkey.retromusic.auto.AutoMediaIDHelper
import code.name.monkey.retromusic.auto.AutoMusicProvider import code.name.monkey.retromusic.auto.AutoMusicProvider
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.glide.BlurTransformation import code.name.monkey.retromusic.glide.BlurTransformation
import code.name.monkey.retromusic.glide.GlideApp import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension.getSongModel import code.name.monkey.retromusic.glide.RetroGlideExtension.getSongModel
@ -891,10 +891,7 @@ class MusicService : MediaBrowserServiceCompat(),
} }
} }
} else { } else {
Toast.makeText( showToast(R.string.audio_focus_denied)
this, resources.getString(R.string.audio_focus_denied), Toast.LENGTH_SHORT
)
.show()
} }
} }
@ -924,8 +921,7 @@ class MusicService : MediaBrowserServiceCompat(),
if (openTrackAndPrepareNextAt(position)) { if (openTrackAndPrepareNextAt(position)) {
play() play()
} else { } else {
Toast.makeText(this, resources.getString(R.string.unplayable_file), Toast.LENGTH_SHORT) showToast(resources.getString(R.string.unplayable_file))
.show()
} }
} }
@ -940,7 +936,7 @@ class MusicService : MediaBrowserServiceCompat(),
} }
play() play()
} else { } else {
Toast.makeText(applicationContext, R.string.playlist_is_empty, Toast.LENGTH_LONG).show() showToast(R.string.playlist_is_empty)
} }
} }
@ -1315,11 +1311,10 @@ class MusicService : MediaBrowserServiceCompat(),
openQueue(playlistSongs, 0, true) openQueue(playlistSongs, 0, true)
} }
} else { } else {
Toast.makeText(applicationContext, R.string.playlist_is_empty, Toast.LENGTH_LONG) showToast( R.string.playlist_is_empty)
.show()
} }
} else { } else {
Toast.makeText(applicationContext, R.string.playlist_is_empty, Toast.LENGTH_LONG).show() showToast(R.string.playlist_is_empty)
} }
} }

View file

@ -2,8 +2,8 @@ package code.name.monkey.retromusic.util
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.widget.Toast
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import code.name.monkey.retromusic.extensions.showToast
import java.io.File import java.io.File
object BackupUtil { object BackupUtil {
@ -19,11 +19,9 @@ object BackupUtil {
).addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION).setType("*/*") ).addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION).setType("*/*")
} catch (e: IllegalArgumentException) { } catch (e: IllegalArgumentException) {
e.printStackTrace() e.printStackTrace()
Toast.makeText( context.showToast(
context, "Could not share this file."
"Could not share this file.", )
Toast.LENGTH_SHORT
).show()
Intent() Intent()
} }
} }

View file

@ -25,14 +25,13 @@ import android.provider.MediaStore
import android.widget.Toast import android.widget.Toast
import androidx.core.content.edit import androidx.core.content.edit
import code.name.monkey.retromusic.App import code.name.monkey.retromusic.App
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.model.Artist import code.name.monkey.retromusic.model.Artist
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.target.SimpleTarget import com.bumptech.glide.request.target.SimpleTarget
import com.bumptech.glide.request.transition.Transition import com.bumptech.glide.request.transition.Transition
import java.io.BufferedOutputStream
import java.io.File import java.io.File
import java.io.FileOutputStream
import java.io.IOException import java.io.IOException
import java.util.* import java.util.*
@ -53,7 +52,7 @@ class CustomArtistImageUtil private constructor(context: Context) {
.into(object : SimpleTarget<Bitmap>() { .into(object : SimpleTarget<Bitmap>() {
override fun onLoadFailed(errorDrawable: Drawable?) { override fun onLoadFailed(errorDrawable: Drawable?) {
super.onLoadFailed(errorDrawable) super.onLoadFailed(errorDrawable)
Toast.makeText(App.getContext(), "Load Failed", Toast.LENGTH_LONG).show() App.getContext().showToast("Load Failed")
} }
@SuppressLint("StaticFieldLeak") @SuppressLint("StaticFieldLeak")
@ -70,13 +69,12 @@ class CustomArtistImageUtil private constructor(context: Context) {
var succesful = false var succesful = false
try { try {
val os = BufferedOutputStream(FileOutputStream(file)) file.outputStream().buffered().use { bos ->
succesful = ImageUtil.resizeBitmap(resource, 2048) succesful = ImageUtil.resizeBitmap(resource, 2048)
.compress(Bitmap.CompressFormat.JPEG, 100, os) .compress(Bitmap.CompressFormat.JPEG, 100, bos)
os.close() }
} catch (e: IOException) { } catch (e: IOException) {
Toast.makeText(App.getContext(), e.toString(), Toast.LENGTH_LONG) App.getContext().showToast(e.toString(), Toast.LENGTH_LONG)
.show()
} }
if (succesful) { if (succesful) {

View file

@ -9,7 +9,6 @@ import android.os.Environment
import android.provider.BaseColumns import android.provider.BaseColumns
import android.provider.MediaStore import android.provider.MediaStore
import android.util.Log import android.util.Log
import android.widget.Toast
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import androidx.core.content.contentValuesOf import androidx.core.content.contentValuesOf
import androidx.core.net.toUri import androidx.core.net.toUri
@ -20,6 +19,7 @@ import code.name.monkey.retromusic.db.PlaylistEntity
import code.name.monkey.retromusic.db.SongEntity import code.name.monkey.retromusic.db.SongEntity
import code.name.monkey.retromusic.db.toSongEntity import code.name.monkey.retromusic.db.toSongEntity
import code.name.monkey.retromusic.extensions.getLong import code.name.monkey.retromusic.extensions.getLong
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.helper.MusicPlayerRemote.removeFromQueue import code.name.monkey.retromusic.helper.MusicPlayerRemote.removeFromQueue
import code.name.monkey.retromusic.model.Artist import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.model.Playlist import code.name.monkey.retromusic.model.Playlist
@ -58,11 +58,7 @@ object MusicUtil : KoinComponent {
} catch (e: IllegalArgumentException) { } catch (e: IllegalArgumentException) {
// TODO the path is most likely not like /storage/emulated/0/... but something like /storage/28C7-75B0/... // TODO the path is most likely not like /storage/emulated/0/... but something like /storage/28C7-75B0/...
e.printStackTrace() e.printStackTrace()
Toast.makeText( context.showToast("Could not share this file, I'm aware of the issue.")
context,
"Could not share this file, I'm aware of the issue.",
Toast.LENGTH_SHORT
).show()
Intent() Intent()
} }
} }
@ -456,12 +452,7 @@ object MusicUtil : KoinComponent {
} }
activity.contentResolver.notifyChange("content://media".toUri(), null) activity.contentResolver.notifyChange("content://media".toUri(), null)
activity.runOnUiThread { activity.runOnUiThread {
Toast.makeText( activity.showToast(activity.getString(R.string.deleted_x_songs, songCount))
activity,
activity.getString(R.string.deleted_x_songs, songCount),
Toast.LENGTH_SHORT
)
.show()
callback?.run() callback?.run()
} }
@ -519,11 +510,7 @@ object MusicUtil : KoinComponent {
cursor.close() cursor.close()
} }
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
Toast.makeText( context.showToast(context.getString(R.string.deleted_x_songs, deletedCount))
context,
context.getString(R.string.deleted_x_songs, deletedCount),
Toast.LENGTH_SHORT
).show()
} }
} catch (ignored: SecurityException) { } catch (ignored: SecurityException) {

View file

@ -22,6 +22,7 @@ import android.widget.Toast
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.* import code.name.monkey.retromusic.activities.*
import code.name.monkey.retromusic.activities.bugreport.BugReportActivity import code.name.monkey.retromusic.activities.bugreport.BugReportActivity
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.helper.MusicPlayerRemote.audioSessionId import code.name.monkey.retromusic.helper.MusicPlayerRemote.audioSessionId
object NavigationUtil { object NavigationUtil {
@ -68,10 +69,7 @@ object NavigationUtil {
private fun stockEqualizer(activity: Activity) { private fun stockEqualizer(activity: Activity) {
val sessionId = audioSessionId val sessionId = audioSessionId
if (sessionId == AudioEffect.ERROR_BAD_VALUE) { if (sessionId == AudioEffect.ERROR_BAD_VALUE) {
Toast.makeText( activity.showToast(R.string.no_audio_ID, Toast.LENGTH_LONG)
activity, activity.resources.getString(R.string.no_audio_ID), Toast.LENGTH_LONG
)
.show()
} else { } else {
try { try {
val effects = Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL) val effects = Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL)
@ -79,12 +77,7 @@ object NavigationUtil {
effects.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC) effects.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC)
activity.startActivityForResult(effects, 0) activity.startActivityForResult(effects, 0)
} catch (notFound: ActivityNotFoundException) { } catch (notFound: ActivityNotFoundException) {
Toast.makeText( activity.showToast(R.string.no_equalizer)
activity,
activity.resources.getString(R.string.no_equalizer),
Toast.LENGTH_SHORT
)
.show()
} }
} }
} }

View file

@ -424,10 +424,11 @@ object PreferenceUtil {
val position = sharedPreferences.getStringOrDefault( val position = sharedPreferences.getStringOrDefault(
HOME_ARTIST_GRID_STYLE, "0" HOME_ARTIST_GRID_STYLE, "0"
).toInt() ).toInt()
val typedArray = App.getContext() val layoutRes =
.resources.obtainTypedArray(R.array.pref_home_grid_style_layout) App.getContext().resources.obtainTypedArray(R.array.pref_home_grid_style_layout)
val layoutRes = typedArray.getResourceId(position, 0) .use {
typedArray.recycle() it.getResourceId(position, 0)
}
return if (layoutRes == 0) { return if (layoutRes == 0) {
R.layout.item_artist R.layout.item_artist
} else layoutRes } else layoutRes
@ -438,10 +439,10 @@ object PreferenceUtil {
val position = sharedPreferences.getStringOrDefault( val position = sharedPreferences.getStringOrDefault(
HOME_ALBUM_GRID_STYLE, "4" HOME_ALBUM_GRID_STYLE, "4"
).toInt() ).toInt()
val typedArray = App.getContext() val layoutRes = App.getContext()
.resources.obtainTypedArray(R.array.pref_home_grid_style_layout) .resources.obtainTypedArray(R.array.pref_home_grid_style_layout).use {
val layoutRes = typedArray.getResourceId(position, 0) it.getResourceId(position, 0)
typedArray.recycle() }
return if (layoutRes == 0) { return if (layoutRes == 0) {
R.layout.item_image R.layout.item_image
} else layoutRes } else layoutRes

View file

@ -19,10 +19,10 @@ import android.content.Intent
import android.provider.BaseColumns import android.provider.BaseColumns
import android.provider.MediaStore import android.provider.MediaStore
import android.provider.Settings import android.provider.Settings
import android.widget.Toast
import androidx.core.net.toUri import androidx.core.net.toUri
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil.getSongFileUri import code.name.monkey.retromusic.util.MusicUtil.getSongFileUri
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
@ -45,7 +45,7 @@ class RingtoneManager(val context: Context) {
Settings.System.putString(resolver, Settings.System.RINGTONE, uri.toString()) Settings.System.putString(resolver, Settings.System.RINGTONE, uri.toString())
val message = context val message = context
.getString(R.string.x_has_been_set_as_ringtone, cursorSong.getString(0)) .getString(R.string.x_has_been_set_as_ringtone, cursorSong.getString(0))
Toast.makeText(context, message, Toast.LENGTH_SHORT).show() context.showToast(message)
} }
} }
} catch (ignored: SecurityException) { } catch (ignored: SecurityException) {

View file

@ -15,24 +15,24 @@ package code.name.monkey.retromusic.views
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import androidx.core.content.withStyledAttributes
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
/** @author Hemanth S (h4h13). /** @author Hemanth S (h4h13).
*/ */
class NetworkImageView : CircularImageView { class NetworkImageView @JvmOverloads constructor(
constructor(context: Context) : super(context) { context: Context,
init(context, null) attrs: AttributeSet? = null,
} defStyleAttr: Int = 0
) :
CircularImageView(context, attrs, defStyleAttr) {
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { init {
init(context, attrs) context.withStyledAttributes(attrs, R.styleable.NetworkImageView, 0, 0) {
val url = getString(R.styleable.NetworkImageView_url_link)
setImageUrl(context, url!!)
} }
constructor(
context: Context, attrs: AttributeSet?, defStyleAttr: Int
) : super(context, attrs, defStyleAttr) {
init(context, attrs)
} }
fun setImageUrl(imageUrl: String) { fun setImageUrl(imageUrl: String) {
@ -46,12 +46,4 @@ class NetworkImageView : CircularImageView {
.placeholder(R.drawable.ic_account) .placeholder(R.drawable.ic_account)
.into(this) .into(this)
} }
private fun init(context: Context, attributeSet: AttributeSet?) {
val attributes =
context.obtainStyledAttributes(attributeSet, R.styleable.NetworkImageView, 0, 0)
val url = attributes.getString(R.styleable.NetworkImageView_url_link)
setImageUrl(context, url!!)
attributes.recycle()
}
} }

View file

@ -15,6 +15,7 @@ package code.name.monkey.retromusic.views
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import androidx.core.content.withStyledAttributes
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import com.google.android.material.imageview.ShapeableImageView import com.google.android.material.imageview.ShapeableImageView
import com.google.android.material.shape.CornerFamily import com.google.android.material.shape.CornerFamily
@ -29,13 +30,12 @@ class RetroShapeableImageView @JvmOverloads constructor(
init { init {
val typedArray = context.withStyledAttributes(attrs, R.styleable.RetroShapeableImageView, defStyle, -1) {
context.obtainStyledAttributes(attrs, R.styleable.RetroShapeableImageView, defStyle, -1)
addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
val radius = width / 2f val radius = width / 2f
shapeAppearanceModel = ShapeAppearanceModel().withCornerSize(radius) shapeAppearanceModel = ShapeAppearanceModel().withCornerSize(radius)
} }
typedArray.recycle() }
} }
private fun updateCornerSize(cornerSize: Float) { private fun updateCornerSize(cornerSize: Float) {

View file

@ -61,6 +61,14 @@
android:visibility="gone" android:visibility="gone"
tools:text="100" tools:text="100"
tools:visibility="visible" /> tools:visibility="visible" />
<code.name.monkey.retromusic.views.PlayingIndicatorView
android:id="@+id/playing_indicator"
android:layout_width="45dp"
android:layout_height="45dp"
android:padding="5dp"
android:visibility="gone"
tools:visibility="visible"/>
</com.google.android.material.card.MaterialCardView> </com.google.android.material.card.MaterialCardView>
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView

View file

@ -53,8 +53,8 @@
</array> </array>
<array name="pref_appbar_mode_titles"> <array name="pref_appbar_mode_titles">
<item>@string/collapsing</item> <item>@string/expanded</item>
<item>@string/simple</item> <item>@string/compact</item>
</array> </array>
<string-array name="pref_appbar_mode_values"> <string-array name="pref_appbar_mode_values">
@ -229,5 +229,4 @@
<item>@string/choose_image</item> <item>@string/choose_image</item>
<item>@string/remove_image</item> <item>@string/remove_image</item>
</string-array> </string-array>
<string name="collapsing">Collapsing</string>
</resources> </resources>

View file

@ -103,6 +103,7 @@
<string name="bug_report_no_password">Please enter your valid GitHub password</string> <string name="bug_report_no_password">Please enter your valid GitHub password</string>
<string name="bug_report_no_title">Please enter an issue title</string> <string name="bug_report_no_title">Please enter an issue title</string>
<string name="bug_report_no_username">Please enter your valid GitHub username</string> <string name="bug_report_no_username">Please enter your valid GitHub username</string>
<string name="bug_report_success">Bug report successful</string>
<string name="bug_report_summary">An unexpected error occurred. Sorry you found this bug, if it keeps crashing \"Clear app data\" or send an Email </string> <string name="bug_report_summary">An unexpected error occurred. Sorry you found this bug, if it keeps crashing \"Clear app data\" or send an Email </string>
<string name="bug_report_use_account">Send using GitHub account</string> <string name="bug_report_use_account">Send using GitHub account</string>
<string name="buy_now">Buy now</string> <string name="buy_now">Buy now</string>
@ -126,6 +127,7 @@
<string name="clear_playing_queue">Clear queue</string> <string name="clear_playing_queue">Clear queue</string>
<string name="color">Color</string> <string name="color">Color</string>
<string name="colors">Colors</string> <string name="colors">Colors</string>
<string name="compact">Compact</string>
<string name="composer">Composer</string> <string name="composer">Composer</string>
<string name="copied_device_info_to_clipboard">Copied device info to clipboard.</string> <string name="copied_device_info_to_clipboard">Copied device info to clipboard.</string>
<string name="could_not_create_playlist">Couldn\u2019t create playlist.</string> <string name="could_not_create_playlist">Couldn\u2019t create playlist.</string>
@ -168,6 +170,7 @@
<string name="edit_synced_lyrics">Edit Synced Lyrics</string> <string name="edit_synced_lyrics">Edit Synced Lyrics</string>
<string name="empty">Empty</string> <string name="empty">Empty</string>
<string name="equalizer">Equalizer</string> <string name="equalizer">Equalizer</string>
<string name="expanded">Expanded</string>
<string name="faq">FAQ</string> <string name="faq">FAQ</string>
<string name="favorites">Favorites</string> <string name="favorites">Favorites</string>
<string name="finish_last_song">Finish last song</string> <string name="finish_last_song">Finish last song</string>
@ -533,5 +536,4 @@
<string name="you_have_to_select_at_least_one_category">You have to select at least one category.</string> <string name="you_have_to_select_at_least_one_category">You have to select at least one category.</string>
<string name="you_will_be_forwarded_to_the_issue_tracker_website">You will be forwarded to the issue tracker website.</string> <string name="you_will_be_forwarded_to_the_issue_tracker_website">You will be forwarded to the issue tracker website.</string>
<string name="your_account_data_is_only_used_for_authentication">Your account data is only used for authentication.</string> <string name="your_account_data_is_only_used_for_authentication">Your account data is only used for authentication.</string>
<string name="bug_report_success">Bug report successful</string>
</resources> </resources>