fixed issue 152: ask write permissions (#154)

This commit is contained in:
Ulysse Widmer 2020-05-08 11:42:41 +02:00 committed by GitHub
parent c4946dd61c
commit b2842b8abe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 76 additions and 16 deletions

View File

@ -58,7 +58,7 @@ dependencies {
implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.navigation:navigation-fragment:2.2.2' implementation 'androidx.navigation:navigation-fragment:2.2.2'
implementation 'androidx.navigation:navigation-ui:2.2.2' implementation 'androidx.navigation:navigation-ui:2.2.2'
implementation "com.squareup.okhttp3:okhttp:4.4.1" implementation 'com.squareup.okhttp3:okhttp:4.6.0'
implementation 'com.squareup.retrofit2:retrofit:2.8.1' implementation 'com.squareup.retrofit2:retrofit:2.8.1'
implementation 'com.squareup.retrofit2:converter-gson:2.8.1' implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.8.1' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.8.1'
@ -95,7 +95,7 @@ dependencies {
testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0" testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0"
testImplementation 'junit:junit:4.13' testImplementation 'junit:junit:4.13'
androidTestImplementation("com.squareup.okhttp3:mockwebserver:4.4.1") androidTestImplementation('com.squareup.okhttp3:mockwebserver:4.6.0')
androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test:rules:1.2.0' androidTestImplementation 'androidx.test:rules:1.2.0'
@ -111,6 +111,7 @@ dependencies {
def fragment_version = '1.2.4' def fragment_version = '1.2.4'
debugImplementation "androidx.fragment:fragment-testing:$fragment_version" debugImplementation "androidx.fragment:fragment-testing:$fragment_version"
implementation 'com.karumi:dexter:6.1.0'
} }
tasks.withType(Test) { tasks.withType(Test) {

View File

@ -1,5 +1,6 @@
package com.h.pixeldroid package com.h.pixeldroid
import android.Manifest
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
@ -11,10 +12,15 @@ import android.view.ViewGroup
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.ImageView import android.widget.ImageView
import android.widget.PopupMenu import android.widget.PopupMenu
import android.widget.Toast
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.RequestBuilder import com.bumptech.glide.RequestBuilder
import com.h.pixeldroid.utils.ImageConverter import com.h.pixeldroid.utils.ImageConverter
import com.h.pixeldroid.utils.ImageUtils import com.h.pixeldroid.utils.ImageUtils
import com.karumi.dexter.Dexter
import com.karumi.dexter.listener.PermissionDeniedResponse
import com.karumi.dexter.listener.PermissionGrantedResponse
import com.karumi.dexter.listener.single.BasePermissionListener
import kotlinx.android.synthetic.main.post_fragment.view.* import kotlinx.android.synthetic.main.post_fragment.view.*
import java.io.Serializable import java.io.Serializable
@ -48,11 +54,31 @@ class ImageFragment : Fragment() {
setOnMenuItemClickListener { item -> setOnMenuItemClickListener { item ->
when (item.itemId) { when (item.itemId) {
R.id.image_popup_menu_save_to_gallery -> { R.id.image_popup_menu_save_to_gallery -> {
ImageUtils.downloadImage(requireActivity(), view.context, imgUrl) Dexter.withContext(view.context)
.withPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.withListener(object: BasePermissionListener() {
override fun onPermissionDenied(p0: PermissionDeniedResponse?) {
Toast.makeText(view.context, "You need to grant write permission to download pictures!", Toast.LENGTH_SHORT).show()
}
override fun onPermissionGranted(p0: PermissionGrantedResponse?) {
ImageUtils.downloadImage(requireActivity(), imgUrl)
}
}).check()
true true
} }
R.id.image_popup_menu_share_picture -> { R.id.image_popup_menu_share_picture -> {
ImageUtils.downloadImage(requireActivity(), view.context, imgUrl, share = true) Dexter.withContext(view.context)
.withPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.withListener(object: BasePermissionListener() {
override fun onPermissionDenied(p0: PermissionDeniedResponse?) {
Toast.makeText(view.context, "You need to grant write permission to share pictures!", Toast.LENGTH_SHORT).show()
}
override fun onPermissionGranted(p0: PermissionGrantedResponse?) {
ImageUtils.downloadImage(requireActivity(), imgUrl, share = true)
}
}).check()
true true
} }
else -> false else -> false

View File

@ -24,14 +24,14 @@ class PostFragment : Fragment() {
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
val status = arguments?.getSerializable(POST_TAG) as Status? val current_status = arguments?.getSerializable(POST_TAG) as Status?
val domain = arguments?.getString(DOMAIN_TAG)!! val domain = arguments?.getString(DOMAIN_TAG)!!
val root = inflater.inflate(R.layout.post_fragment, container, false) val root: View = inflater.inflate(R.layout.post_fragment, container, false)
val picRequest = Glide.with(this) val picRequest = Glide.with(this)
.asDrawable().fitCenter() .asDrawable().fitCenter()
.placeholder(ColorDrawable(Color.GRAY)) .placeholder(ColorDrawable(Color.GRAY))
status?.setupPost(root, picRequest, this, domain, true) current_status?.setupPost(root, picRequest, this, domain, true)
//Setup arguments needed for the onclicklisteners //Setup arguments needed for the onclicklisteners
val holder = PostViewHolder(root, requireContext()) val holder = PostViewHolder(root, requireContext())
@ -42,14 +42,15 @@ class PostFragment : Fragment() {
val accessToken = preferences.getString("accessToken", "") val accessToken = preferences.getString("accessToken", "")
val api = PixelfedAPI.create("${preferences.getString("domain", "")}") val api = PixelfedAPI.create("${preferences.getString("domain", "")}")
status?.setDescription(root, api, "Bearer $accessToken") current_status?.setDescription(root, api, "Bearer $accessToken")
//Activate onclickListeners //Activate onclickListeners
status?.activateLiker(holder, api, "Bearer $accessToken", status.favourited) current_status?.activateLiker(holder, api, "Bearer $accessToken", current_status!!.favourited)
status?.activateReblogger(holder, api, "Bearer $accessToken", status.reblogged) current_status?.activateReblogger(holder, api, "Bearer $accessToken", current_status!!.reblogged)
status?.activateCommenter(holder, api, "Bearer $accessToken") current_status?.activateCommenter(holder, api, "Bearer $accessToken")
status?.showComments(holder, api, "Bearer $accessToken") current_status?.showComments(holder, api, "Bearer $accessToken")
return root return root
} }
} }

View File

@ -1,6 +1,8 @@
package com.h.pixeldroid.objects package com.h.pixeldroid.objects
import android.Manifest
import android.content.Context import android.content.Context
import android.content.pm.PackageManager
import android.graphics.Typeface import android.graphics.Typeface
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.text.Spanned import android.text.Spanned
@ -16,6 +18,7 @@ import android.widget.Toast
import android.widget.PopupMenu import android.widget.PopupMenu
import android.widget.ImageView import android.widget.ImageView
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.adapter.FragmentStateAdapter
@ -36,6 +39,13 @@ import com.h.pixeldroid.utils.PostUtils.Companion.retrieveComments
import com.h.pixeldroid.utils.PostUtils.Companion.toggleCommentInput import com.h.pixeldroid.utils.PostUtils.Companion.toggleCommentInput
import com.h.pixeldroid.utils.PostUtils.Companion.unLikePostCall import com.h.pixeldroid.utils.PostUtils.Companion.unLikePostCall
import com.h.pixeldroid.utils.PostUtils.Companion.undoReblogPost import com.h.pixeldroid.utils.PostUtils.Companion.undoReblogPost
import com.karumi.dexter.Dexter
import com.karumi.dexter.PermissionToken
import com.karumi.dexter.listener.PermissionDeniedResponse
import com.karumi.dexter.listener.PermissionGrantedResponse
import com.karumi.dexter.listener.PermissionRequest
import com.karumi.dexter.listener.single.BasePermissionListener
import com.karumi.dexter.listener.single.PermissionListener
import kotlinx.android.synthetic.main.post_fragment.view.postDate import kotlinx.android.synthetic.main.post_fragment.view.postDate
import kotlinx.android.synthetic.main.post_fragment.view.postDomain import kotlinx.android.synthetic.main.post_fragment.view.postDomain
import java.io.Serializable import java.io.Serializable
@ -91,6 +101,7 @@ data class Status(
{ {
companion object { companion object {
const val SAVE_TO_GALLERY_WRITE_PERMISSION = 1
const val POST_TAG = "postTag" const val POST_TAG = "postTag"
const val POST_FRAG_TAG = "postFragTag" const val POST_FRAG_TAG = "postFragTag"
const val DOMAIN_TAG = "domainTag" const val DOMAIN_TAG = "domainTag"
@ -356,11 +367,31 @@ data class Status(
setOnMenuItemClickListener { item -> setOnMenuItemClickListener { item ->
when (item.itemId) { when (item.itemId) {
R.id.image_popup_menu_save_to_gallery -> { R.id.image_popup_menu_save_to_gallery -> {
downloadImage(activity, view.context, getPostUrl()!!) Dexter.withContext(view.context)
.withPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.withListener(object: BasePermissionListener() {
override fun onPermissionDenied(p0: PermissionDeniedResponse?) {
Toast.makeText(view.context, "You need to grant write permission to download pictures!", Toast.LENGTH_SHORT).show()
}
override fun onPermissionGranted(p0: PermissionGrantedResponse?) {
downloadImage(activity, getPostUrl()!!)
}
}).check()
true true
} }
R.id.image_popup_menu_share_picture -> { R.id.image_popup_menu_share_picture -> {
downloadImage(activity, view.context, getPostUrl()!!, share = true) Dexter.withContext(view.context)
.withPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.withListener(object: BasePermissionListener() {
override fun onPermissionDenied(p0: PermissionDeniedResponse?) {
Toast.makeText(view.context, "You need to grant write permission to share pictures!", Toast.LENGTH_SHORT).show()
}
override fun onPermissionGranted(p0: PermissionGrantedResponse?) {
downloadImage(activity, getPostUrl()!!, share = true)
}
}).check()
true true
} }
else -> false else -> false

View File

@ -18,7 +18,8 @@ import java.io.File
class ImageUtils { class ImageUtils {
companion object { companion object {
fun downloadImage(activity: FragmentActivity, context: Context, url: String, share: Boolean = false) { fun downloadImage(activity: FragmentActivity, url: String, share: Boolean = false) {
val context = activity.applicationContext
var msg = "" var msg = ""
var lastMsg = "" var lastMsg = ""
val directory = File(Environment.DIRECTORY_PICTURES) val directory = File(Environment.DIRECTORY_PICTURES)
@ -88,7 +89,7 @@ class ImageUtils {
e.printStackTrace() e.printStackTrace()
} }
intentShare.putExtra(Intent.EXTRA_STREAM, uri) intentShare.putExtra(Intent.EXTRA_STREAM, uri)
context.startActivity(Intent.createChooser(intentShare, "Share Image")) activity.startActivity(Intent.createChooser(intentShare, "Share Image"))
} }
cursor.close() cursor.close()
} }