Skip to content
Snippets Groups Projects
Commit 08014ccd authored by John Carlson's avatar John Carlson
Browse files

Use File provider to open file for editing instead

parent d20d6cfa
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -155,6 +155,7 @@ dependencies {
compile 'com.github.Commit451:MorphTransitions:2.0.0'
compile 'com.github.Commit451.Alakazam:alakazam:1.0.1'
compile 'com.github.Commit451:Lift:1.2.0'
compile 'com.github.Commit451:okyo:1.2.0'
compile 'com.github.Commit451:OkioProGuardRules:1.11.0.0'
compile 'com.github.Commit451:RetrofitProguardRules:2.2.0.0'
compile 'com.github.Commit451:LoganSquareProGuardRules:1.3.7.0'
Loading
Loading
Loading
Loading
@@ -2,15 +2,11 @@ package com.commit451.gitlab.activity
 
import android.Manifest
import android.annotation.SuppressLint
import android.annotation.TargetApi
import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Bundle
import android.os.Environment
import android.support.annotation.IntDef
import android.support.design.widget.Snackbar
import android.support.v4.content.ContextCompat
import android.support.v7.widget.Toolbar
Loading
Loading
@@ -19,25 +15,21 @@ import android.view.View
import android.view.ViewGroup
import android.webkit.MimeTypeMap
import android.webkit.WebView
import butterknife.BindView
import butterknife.ButterKnife
import com.commit451.gitlab.App
import com.commit451.gitlab.R
import com.commit451.gitlab.extension.base64Decode
import com.commit451.gitlab.extension.setup
import com.commit451.gitlab.model.api.RepositoryFile
import com.commit451.gitlab.rx.CustomSingleObserver
import com.commit451.gitlab.util.FileUtil
import timber.log.Timber
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.nio.charset.Charset
 
import butterknife.BindView
import butterknife.ButterKnife
import com.commit451.gitlab.extension.base64Decode
import com.commit451.gitlab.extension.setup
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import timber.log.Timber
class FileActivity : BaseActivity() {
 
companion object {
Loading
Loading
@@ -49,13 +41,6 @@ class FileActivity : BaseActivity() {
private val EXTRA_PATH = "extra_path"
private val EXTRA_REF = "extra_ref"
 
const val OPTION_SAVE = 0
const val OPTION_OPEN = 1
@Retention(AnnotationRetention.SOURCE)
@IntDef(OPTION_SAVE.toLong(), OPTION_OPEN.toLong())
annotation class Option
fun newIntent(context: Context, projectId: Long, path: String, ref: String): Intent {
val intent = Intent(context, FileActivity::class.java)
intent.putExtra(EXTRA_PROJECT_ID, projectId)
Loading
Loading
@@ -64,10 +49,10 @@ class FileActivity : BaseActivity() {
return intent
}
 
fun fileExtension(filename: String): String? {
fun fileExtension(filename: String): String {
val extStart = filename.lastIndexOf(".") + 1
if (extStart < 1) {
return null
return ""
}
 
return filename.substring(extStart)
Loading
Loading
@@ -85,8 +70,6 @@ class FileActivity : BaseActivity() {
var repositoryFile: RepositoryFile? = null
var fileName: String? = null
var blob: ByteArray? = null
@Option
private var option: Int = 0
 
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Loading
Loading
@@ -102,12 +85,10 @@ class FileActivity : BaseActivity() {
toolbar.setOnMenuItemClickListener(Toolbar.OnMenuItemClickListener { item ->
when (item.itemId) {
R.id.action_open -> {
option = OPTION_OPEN
checkAccountPermission()
openFile()
return@OnMenuItemClickListener true
}
R.id.action_save -> {
option = OPTION_SAVE
checkAccountPermission()
return@OnMenuItemClickListener true
}
Loading
Loading
@@ -212,11 +193,7 @@ class FileActivity : BaseActivity() {
@SuppressLint("NewApi")
private fun checkAccountPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
if (option == OPTION_SAVE) {
saveBlob()
} else {
openFile()
}
saveBlob()
} else {
requestPermissions(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), REQUEST_PERMISSION_WRITE_STORAGE)
}
Loading
Loading
@@ -226,11 +203,7 @@ class FileActivity : BaseActivity() {
when (requestCode) {
REQUEST_PERMISSION_WRITE_STORAGE -> {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (option == OPTION_SAVE) {
saveBlob()
} else {
openFile()
}
saveBlob()
}
}
}
Loading
Loading
@@ -273,34 +246,30 @@ class FileActivity : BaseActivity() {
return null
}
 
private fun openFile() {
val file = saveBlob()
if (file == null) {
Snackbar.make(root, getString(R.string.open_error), Snackbar.LENGTH_SHORT)
.show()
return
}
fun openFile() {
 
val intent = Intent(Intent.ACTION_VIEW)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
if (blob != null && fileName != null) {
val intent = Intent(Intent.ACTION_VIEW)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
 
val extension = fileExtension(file.name)
if (extension != null) {
intent.setDataAndType(Uri.fromFile(file), MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension))
} else {
intent.data = Uri.fromFile(file)
}
val file = FileUtil.saveBlobToProviderDirectory(this, blob!!, fileName!!)
val extension = fileExtension(fileName!!)
if (extension.isNotEmpty()) {
intent.type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)
}
intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
intent.data = FileUtil.uriForFile(this, file)
 
try {
startActivity(intent)
} catch (e: ActivityNotFoundException) {
Timber.e(e)
try {
startActivity(intent)
} catch (e: Exception) {
Timber.e(e)
Snackbar.make(root, getString(R.string.open_error), Snackbar.LENGTH_SHORT)
.show()
}
} else {
Snackbar.make(root, getString(R.string.open_error), Snackbar.LENGTH_SHORT)
.show()
} catch (e: SecurityException) {
Timber.e(e)
Snackbar.make(root, getString(R.string.open_error), Snackbar.LENGTH_SHORT).show()
}
}
}
Loading
Loading
@@ -11,4 +11,4 @@ fun File.toPart(): Single<MultipartBody.Part> {
return Single.fromCallable {
FileUtil.toPart(this)
}
}
\ No newline at end of file
}
Loading
Loading
@@ -4,8 +4,11 @@ package com.commit451.gitlab.util
import android.content.Context
import android.graphics.Bitmap
import android.net.Uri
import android.os.Environment
import android.provider.MediaStore
import android.provider.OpenableColumns
import android.support.v4.content.FileProvider
import com.commit451.okyo.Okyo
import okhttp3.MediaType
import okhttp3.MultipartBody
import okhttp3.RequestBody
Loading
Loading
@@ -45,18 +48,51 @@ object FileUtil {
}
 
fun getFileName(context: Context, imageUri: Uri): String {
val returnCursor = context.contentResolver.query(imageUri, null, null, null, null) ?: //This should probably just return null, but oh well
return "file"
val returnCursor = context.contentResolver.query(imageUri, null, null, null, null)
var name = "file"
 
var nameIndex = returnCursor.getColumnIndex(MediaStore.Audio.Media.TITLE)
if (nameIndex == -1) {
nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
}
returnCursor.moveToFirst()
val name = returnCursor.getString(nameIndex)
if (!returnCursor.isClosed) {
returnCursor.close()
if (returnCursor != null) {
var nameIndex = returnCursor.getColumnIndex(MediaStore.Audio.Media.TITLE)
if (nameIndex == -1) {
nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
}
returnCursor.moveToFirst()
name = returnCursor.getString(nameIndex)
if (!returnCursor.isClosed) {
returnCursor.close()
}
}
return name
}
fun uriForFile(context: Context, file: File): Uri {
return FileProvider.getUriForFile(context, context.packageName + ".easyphotopicker.fileprovider", file)
}
@Throws(IOException::class)
fun saveBlobToProviderDirectory(context: Context, bytes: ByteArray, fileName: String): File {
val targetFile = File(getProviderDirectory(context), fileName)
targetFile.createNewFile()
Okyo.writeByteArrayToFile(targetFile, bytes)
return targetFile
}
/**
* Piggy back off of EasyImage directory
*/
fun getProviderDirectory(context: Context): File {
var cacheDir = context.cacheDir
if (isExternalStorageWritable()) {
cacheDir = context.externalCacheDir
}
val dir = File(cacheDir, "EasyImage")
if (!dir.exists()) dir.mkdirs()
return dir
}
fun isExternalStorageWritable(): Boolean {
val state = Environment.getExternalStorageState()
return Environment.MEDIA_MOUNTED == state
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment