PlayerAndroid/app/src/main/java/code/name/monkey/retromusic/fragments/other/UserInfoFragment.kt

276 lines
9.8 KiB
Kotlin
Raw Normal View History

2020-10-06 08:46:04 +00:00
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.fragments.other
2019-06-03 16:23:37 +00:00
import android.app.Activity
2019-12-01 15:27:01 +00:00
import android.content.Intent
2019-06-03 16:23:37 +00:00
import android.content.res.ColorStateList
import android.graphics.Bitmap
import android.graphics.Color
2019-06-03 16:23:37 +00:00
import android.net.Uri
import android.os.Bundle
2019-06-04 04:00:11 +00:00
import android.text.TextUtils
import android.view.LayoutInflater
2019-06-03 16:23:37 +00:00
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
2019-06-03 16:23:37 +00:00
import android.widget.Toast
import androidx.core.view.doOnPreDraw
import androidx.core.view.updateLayoutParams
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
2019-12-01 15:27:01 +00:00
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
2019-06-03 16:23:37 +00:00
import code.name.monkey.retromusic.Constants.USER_BANNER
import code.name.monkey.retromusic.Constants.USER_PROFILE
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.FragmentUserInfoBinding
2020-05-20 22:53:09 +00:00
import code.name.monkey.retromusic.extensions.accentColor
2020-05-20 20:28:38 +00:00
import code.name.monkey.retromusic.extensions.applyToolbar
import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
2020-05-20 22:53:09 +00:00
import code.name.monkey.retromusic.util.ImageUtil
2020-06-06 18:57:28 +00:00
import code.name.monkey.retromusic.util.PreferenceUtil
2020-05-20 22:53:09 +00:00
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
2020-05-20 22:53:09 +00:00
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.engine.GlideException
2020-05-20 22:53:09 +00:00
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import com.github.dhaval2404.imagepicker.ImagePicker
2020-05-20 23:07:44 +00:00
import com.github.dhaval2404.imagepicker.constant.ImageProvider
import com.google.android.material.transition.MaterialContainerTransform
2019-12-26 19:53:11 +00:00
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
import java.io.BufferedOutputStream
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
2019-06-03 16:23:37 +00:00
class UserInfoFragment : Fragment() {
2019-06-03 16:23:37 +00:00
private var _binding: FragmentUserInfoBinding? = null
private val binding get() = _binding!!
private val libraryViewModel: LibraryViewModel by sharedViewModel()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
sharedElementEnterTransition = MaterialContainerTransform().apply {
drawingViewId = R.id.fragment_container
duration = 300L
scrimColor = Color.TRANSPARENT
}
_binding = FragmentUserInfoBinding.inflate(layoutInflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
applyToolbar(binding.toolbar)
2020-05-20 22:53:09 +00:00
binding.nameContainer.accentColor()
binding.name.setText(PreferenceUtil.userName)
2019-06-03 16:23:37 +00:00
binding.userImage.setOnClickListener {
2020-05-20 22:53:09 +00:00
pickNewPhoto()
2019-12-01 15:27:01 +00:00
}
2020-05-20 22:53:09 +00:00
binding.bannerImage.setOnClickListener {
2020-05-20 22:53:09 +00:00
selectBannerImage()
2019-12-01 15:27:01 +00:00
}
2020-05-20 22:53:09 +00:00
binding.next.setOnClickListener {
val nameString = binding.name.text.toString().trim { it <= ' ' }
2019-12-01 15:27:01 +00:00
if (TextUtils.isEmpty(nameString)) {
Toast.makeText(
requireContext(),
"Umm you're name can't be empty!",
Toast.LENGTH_SHORT
).show()
2019-12-01 15:27:01 +00:00
return@setOnClickListener
}
2020-06-06 18:57:28 +00:00
PreferenceUtil.userName = nameString
findNavController().navigateUp()
2019-12-01 15:27:01 +00:00
}
2020-05-20 22:53:09 +00:00
val textColor =
MaterialValueHelper.getPrimaryTextColor(
requireContext(),
ColorUtil.isColorLight(accentColor())
)
binding.next.backgroundTintList = ColorStateList.valueOf(accentColor())
binding.next.iconTint = ColorStateList.valueOf(textColor)
binding.next.setTextColor(textColor)
2020-05-20 22:53:09 +00:00
loadProfile()
postponeEnterTransition()
view.doOnPreDraw {
startPostponedEnterTransition()
}
libraryViewModel.getFabMargin().observe(viewLifecycleOwner, {
binding.next.updateLayoutParams<ViewGroup.MarginLayoutParams> {
bottomMargin = it
}
})
2020-05-20 22:53:09 +00:00
}
private fun loadProfile() {
binding.bannerImage.let {
GlideApp.with(this)
.asBitmap()
.load(RetroGlideExtension.getBannerModel())
.profileBannerOptions(RetroGlideExtension.getBannerModel())
.into(it)
2020-05-20 22:53:09 +00:00
}
GlideApp.with(this).asBitmap()
.load(RetroGlideExtension.getUserModel())
.userProfileOptions(RetroGlideExtension.getUserModel())
.into(binding.userImage)
2019-12-01 15:27:01 +00:00
}
2019-06-03 16:23:37 +00:00
2019-12-01 15:27:01 +00:00
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
findNavController().navigateUp()
2019-12-01 15:27:01 +00:00
}
return super.onOptionsItemSelected(item)
}
2019-06-03 16:23:37 +00:00
2019-12-01 15:27:01 +00:00
private fun selectBannerImage() {
2020-05-20 22:53:09 +00:00
ImagePicker.with(this)
2020-05-20 23:07:44 +00:00
.compress(1440)
.provider(ImageProvider.GALLERY)
2020-05-20 22:53:09 +00:00
.crop(16f, 9f)
.start(PICK_BANNER_REQUEST)
2019-12-01 15:27:01 +00:00
}
2019-06-03 16:23:37 +00:00
2019-12-01 15:27:01 +00:00
private fun pickNewPhoto() {
2020-05-20 22:53:09 +00:00
ImagePicker.with(this)
2020-05-20 23:07:44 +00:00
.provider(ImageProvider.GALLERY)
2020-05-20 22:53:09 +00:00
.cropSquare()
2020-05-20 23:07:44 +00:00
.compress(1440)
2020-05-20 22:53:09 +00:00
.start(PICK_IMAGE_REQUEST)
2019-12-01 15:27:01 +00:00
}
2019-06-03 16:23:37 +00:00
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
2019-12-01 15:27:01 +00:00
super.onActivityResult(requestCode, resultCode, data)
2020-05-20 22:53:09 +00:00
if (resultCode == Activity.RESULT_OK && requestCode == PICK_IMAGE_REQUEST) {
val fileUri = data?.data
fileUri?.let { setAndSaveUserImage(it) }
} else if (resultCode == Activity.RESULT_OK && requestCode == PICK_BANNER_REQUEST) {
val fileUri = data?.data
fileUri?.let { setAndSaveBannerImage(it) }
} else if (resultCode == ImagePicker.RESULT_ERROR) {
Toast.makeText(requireContext(), ImagePicker.getError(data), Toast.LENGTH_SHORT).show()
2020-05-20 22:53:09 +00:00
} else {
Toast.makeText(requireContext(), "Task Cancelled", Toast.LENGTH_SHORT).show()
2019-12-01 15:27:01 +00:00
}
}
2019-06-03 16:23:37 +00:00
2020-05-20 22:53:09 +00:00
private fun setAndSaveBannerImage(fileUri: Uri) {
Glide.with(this)
.asBitmap()
.load(fileUri)
2020-05-20 22:53:09 +00:00
.diskCacheStrategy(DiskCacheStrategy.NONE)
.listener(object : RequestListener<Bitmap> {
override fun onResourceReady(
resource: Bitmap?,
2020-05-20 22:53:09 +00:00
model: Any?,
target: Target<Bitmap>?,
dataSource: DataSource?,
2020-05-20 22:53:09 +00:00
isFirstResource: Boolean
): Boolean {
resource?.let { saveImage(it, USER_BANNER) }
2020-05-20 22:53:09 +00:00
return false
}
override fun onLoadFailed(
e: GlideException?,
2020-05-20 22:53:09 +00:00
model: Any?,
target: Target<Bitmap>?,
isFirstResource: Boolean
): Boolean {
return false
}
})
.into(binding.bannerImage)
2019-12-01 15:27:01 +00:00
}
2019-06-03 16:23:37 +00:00
2020-05-20 23:23:40 +00:00
private fun saveImage(bitmap: Bitmap, fileName: String) {
2020-08-21 14:19:15 +00:00
CoroutineScope(Dispatchers.IO).launch {
val appDir = requireContext().filesDir
2020-05-20 23:23:40 +00:00
val file = File(appDir, fileName)
2020-05-20 22:53:09 +00:00
var successful = false
try {
val os = BufferedOutputStream(FileOutputStream(file))
successful = ImageUtil.resizeBitmap(bitmap, 2048)
.compress(Bitmap.CompressFormat.WEBP, 100, os)
2020-05-20 23:23:40 +00:00
withContext(Dispatchers.IO) { os.close() }
2020-05-20 22:53:09 +00:00
} catch (e: IOException) {
e.printStackTrace()
}
if (successful) {
withContext(Dispatchers.Main) {
Toast.makeText(requireContext(), "Updated", Toast.LENGTH_SHORT).show()
2020-05-20 22:53:09 +00:00
}
2019-12-26 19:53:11 +00:00
}
}
2019-12-01 15:27:01 +00:00
}
2019-06-03 16:23:37 +00:00
2020-05-20 22:53:09 +00:00
private fun setAndSaveUserImage(fileUri: Uri) {
Glide.with(this)
.asBitmap()
.load(fileUri)
2020-05-20 22:53:09 +00:00
.diskCacheStrategy(DiskCacheStrategy.NONE)
.listener(object : RequestListener<Bitmap> {
override fun onResourceReady(
resource: Bitmap?,
2020-05-20 22:53:09 +00:00
model: Any?,
target: Target<Bitmap>?,
dataSource: DataSource?,
2020-05-20 22:53:09 +00:00
isFirstResource: Boolean
): Boolean {
resource?.let { saveImage(it, USER_PROFILE) }
2020-05-20 22:53:09 +00:00
return false
}
override fun onLoadFailed(
e: GlideException?,
2020-05-20 22:53:09 +00:00
model: Any?,
target: Target<Bitmap>?,
isFirstResource: Boolean
): Boolean {
return false
}
})
.into(binding.userImage)
2019-12-01 15:27:01 +00:00
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
2019-12-01 15:27:01 +00:00
companion object {
private const val PICK_IMAGE_REQUEST = 9002
private const val PICK_BANNER_REQUEST = 9004
}
2020-10-06 08:46:04 +00:00
}