Skip to content

Instantly share code, notes, and snippets.

@illuzor
Last active October 2, 2018 21:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save illuzor/46f91cddf873e96645b54917caa2ecab to your computer and use it in GitHub Desktop.
Save illuzor/46f91cddf873e96645b54917caa2ecab to your computer and use it in GitHub Desktop.
package com.illuzor.lesson.wallpapers.screens
import android.Manifest
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.MediaStore
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import androidx.core.app.ShareCompat
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProviders
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.illuzor.lesson.wallpapers.GlideApp
import com.illuzor.lesson.wallpapers.R
import com.illuzor.lesson.wallpapers.extensions.runInBackground
import com.illuzor.lesson.wallpapers.extensions.runInMainThread
import com.illuzor.lesson.wallpapers.extensions.toast
import com.illuzor.lesson.wallpapers.model.ViewModelBase.State.*
import com.illuzor.lesson.wallpapers.model.ViewModelWallpaper
import com.illuzor.lesson.wallpapers.ui.ProgressDialog
import kotlinx.android.synthetic.main.fragment_wallpaper.*
import java.io.File
@Suppress("PrivatePropertyName")
class WallpaperFragment : AbstractFragment() {
override val layoutId = R.layout.fragment_wallpaper
private val CACHE_SIZE = 20
private val REQUEST_STORAGE_PERMISSION_CODE = 0
private val SHARING_REQUEST_CODE = 1
private val SETTING_REQUEST_CODE = 2
private val PROVIDER_AUTHORITY = "com.illuzor.lesson.wallpapers.SHARE_WALLPAPER"
private val imageFileUri by lazy { FileProvider.getUriForFile(activity!!, PROVIDER_AUTHORITY, imageFile) }
private var loaded = false
private lateinit var relativeUrl: String
private lateinit var model: ViewModelWallpaper
private lateinit var imageFile: File
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
model = ViewModelProviders.of(this).get(ViewModelWallpaper::class.java)
val filename = arguments!!.getString("filename", "")
val category = arguments!!.getString("category", "")
relativeUrl = "images/$category/$filename"
createFile("$category-$filename")
}
private fun createFile(filename: String) {
val subfolder = File(context!!.cacheDir.path + "/wallpapers/")
imageFile = subfolder.resolve(filename)
if (imageFile.exists()) return
if (subfolder.exists() && subfolder.listFiles().size >= CACHE_SIZE) {
subfolder.listFiles().forEach { it.delete() }
} else {
subfolder.mkdir()
}
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
contentView = pv_wallpaper
if (model.state != PROGRESS && imageFile.exists()) {
loadFileToImageView()
} else {
checkData()
}
}
private fun checkData() {
if (view == null) return
when (model.state) {
CREATED -> {
showProgress()
model.setListener { checkData() }
model.load(relativeUrl, imageFile)
}
PROGRESS -> {
showProgress()
model.setListener { checkData() }
}
LOADED -> loadFileToImageView()
ERROR -> {
showError(R.string.unable_to_load) {
showProgress()
model.setListener { checkData() }
model.load(relativeUrl, imageFile)
}
}
}
}
private fun loadFileToImageView() {
showContent()
GlideApp.with(context!!)
.load(Uri.fromFile(imageFile))
.transition(DrawableTransitionOptions.withCrossFade())
.into(pv_wallpaper)
loaded = true
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.menu_wallpaper, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (!loaded && item.itemId != android.R.id.home) {
toast(R.string.not_loaded_yet)
} else {
when (item.itemId) {
R.id.menu_item_set_wallpaper -> setWallpaper()
R.id.menu_item_share_image -> shareWallpaper()
R.id.menu_item_save_image -> checkPermissionForImageSave()
}
}
return super.onOptionsItemSelected(item)
}
private fun setWallpaper() {
}
private fun shareWallpaper() {
val sharingIntent = ShareCompat.IntentBuilder
.from(activity)
.setType("image/*")
.intent
if (activity!!.packageManager.resolveActivity(sharingIntent, PackageManager.MATCH_DEFAULT_ONLY) == null) {
toast(R.string.no_apps_for_share)
} else {
sharingIntent.putExtra(Intent.EXTRA_STREAM, imageFileUri)
val activities = activity!!.packageManager.queryIntentActivities(sharingIntent, PackageManager.MATCH_DEFAULT_ONLY)
for (activity in activities) {
getActivity()!!.grantUriPermission(activity.activityInfo.packageName, imageFileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
startActivityForResult(Intent.createChooser(sharingIntent, getString(R.string.share_image)), SHARING_REQUEST_CODE)
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == SHARING_REQUEST_CODE || requestCode == SETTING_REQUEST_CODE) {
activity!!.revokeUriPermission(imageFileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
}
private fun checkPermissionForImageSave() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M ||
activity!!.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
saveImageToGallery()
} else {
requestPermissions(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), REQUEST_STORAGE_PERMISSION_CODE)
}
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
if (requestCode == REQUEST_STORAGE_PERMISSION_CODE && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
saveImageToGallery()
} else {
toast(R.string.unable_to_save_permission)
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
private fun saveImageToGallery() {
val dialog = ProgressDialog()
dialog.isCancelable = false
dialog.title = getString(R.string.save_image)
dialog.show(fragmentManager, "")
runInBackground {
MediaStore.Images.Media.insertImage(context!!.contentResolver, imageFile.path, "wallpaper", "")
runInMainThread {
dialog.dismiss()
toast(R.string.saved)
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment