fixed issue 152: ask write permissions (#154)
This commit is contained in:
parent
c4946dd61c
commit
b2842b8abe
@ -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) {
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user