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.navigation:navigation-fragment: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:converter-gson: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 '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:runner:1.2.0'
androidTestImplementation 'androidx.test:rules:1.2.0'
@ -111,6 +111,7 @@ dependencies {
def fragment_version = '1.2.4'
debugImplementation "androidx.fragment:fragment-testing:$fragment_version"
implementation 'com.karumi:dexter:6.1.0'
}
tasks.withType(Test) {

View File

@ -1,5 +1,6 @@
package com.h.pixeldroid
import android.Manifest
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
@ -11,10 +12,15 @@ import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.PopupMenu
import android.widget.Toast
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestBuilder
import com.h.pixeldroid.utils.ImageConverter
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 java.io.Serializable
@ -48,11 +54,31 @@ class ImageFragment : Fragment() {
setOnMenuItemClickListener { item ->
when (item.itemId) {
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
}
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
}
else -> false

View File

@ -24,14 +24,14 @@ class PostFragment : Fragment() {
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): 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 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)
.asDrawable().fitCenter()
.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
val holder = PostViewHolder(root, requireContext())
@ -42,14 +42,15 @@ class PostFragment : Fragment() {
val accessToken = preferences.getString("accessToken", "")
val api = PixelfedAPI.create("${preferences.getString("domain", "")}")
status?.setDescription(root, api, "Bearer $accessToken")
current_status?.setDescription(root, api, "Bearer $accessToken")
//Activate onclickListeners
status?.activateLiker(holder, api, "Bearer $accessToken", status.favourited)
status?.activateReblogger(holder, api, "Bearer $accessToken", status.reblogged)
status?.activateCommenter(holder, api, "Bearer $accessToken")
status?.showComments(holder, api, "Bearer $accessToken")
current_status?.activateLiker(holder, api, "Bearer $accessToken", current_status!!.favourited)
current_status?.activateReblogger(holder, api, "Bearer $accessToken", current_status!!.reblogged)
current_status?.activateCommenter(holder, api, "Bearer $accessToken")
current_status?.showComments(holder, api, "Bearer $accessToken")
return root
}
}

View File

@ -1,6 +1,8 @@
package com.h.pixeldroid.objects
import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.graphics.Typeface
import android.graphics.drawable.Drawable
import android.text.Spanned
@ -16,6 +18,7 @@ import android.widget.Toast
import android.widget.PopupMenu
import android.widget.ImageView
import android.widget.FrameLayout
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
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.unLikePostCall
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.postDomain
import java.io.Serializable
@ -91,6 +101,7 @@ data class Status(
{
companion object {
const val SAVE_TO_GALLERY_WRITE_PERMISSION = 1
const val POST_TAG = "postTag"
const val POST_FRAG_TAG = "postFragTag"
const val DOMAIN_TAG = "domainTag"
@ -356,11 +367,31 @@ data class Status(
setOnMenuItemClickListener { item ->
when (item.itemId) {
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
}
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
}
else -> false

View File

@ -18,7 +18,8 @@ import java.io.File
class ImageUtils {
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 lastMsg = ""
val directory = File(Environment.DIRECTORY_PICTURES)
@ -88,7 +89,7 @@ class ImageUtils {
e.printStackTrace()
}
intentShare.putExtra(Intent.EXTRA_STREAM, uri)
context.startActivity(Intent.createChooser(intentShare, "Share Image"))
activity.startActivity(Intent.createChooser(intentShare, "Share Image"))
}
cursor.close()
}