Add share feature
This commit is contained in:
parent
1a925bd070
commit
257136e7f5
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectType">
|
<component name="ProjectType">
|
||||||
|
|
|
@ -18,6 +18,16 @@
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<provider
|
||||||
|
android:name="androidx.core.content.FileProvider"
|
||||||
|
android:authorities="dev.lowrespalmtree.fileprovider"
|
||||||
|
android:grantUriPermissions="true"
|
||||||
|
android:exported="false">
|
||||||
|
<meta-data
|
||||||
|
android:name="android.support.FILE_PROVIDER_PATHS"
|
||||||
|
android:resource="@xml/file_paths" />
|
||||||
|
</provider>
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
|
@ -4,6 +4,7 @@ import android.Manifest
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
|
import android.net.Uri
|
||||||
import android.os.AsyncTask
|
import android.os.AsyncTask
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Environment
|
import android.os.Environment
|
||||||
|
@ -13,6 +14,7 @@ import android.view.View
|
||||||
import android.widget.PopupMenu
|
import android.widget.PopupMenu
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.core.content.FileProvider
|
||||||
import com.arthenica.mobileffmpeg.Config.RETURN_CODE_CANCEL
|
import com.arthenica.mobileffmpeg.Config.RETURN_CODE_CANCEL
|
||||||
import com.arthenica.mobileffmpeg.Config.RETURN_CODE_SUCCESS
|
import com.arthenica.mobileffmpeg.Config.RETURN_CODE_SUCCESS
|
||||||
import com.arthenica.mobileffmpeg.FFmpeg
|
import com.arthenica.mobileffmpeg.FFmpeg
|
||||||
|
@ -80,31 +82,33 @@ class MainActivity: AppCompatActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun openViewMenu(v: View) {
|
fun openViewMenu(v: View) {
|
||||||
val menu = PopupMenu(this, v)
|
|
||||||
val saveItem = menu.menu.add(R.string.save)
|
|
||||||
val shareItem = menu.menu.add(R.string.share)
|
|
||||||
menu.setOnMenuItemClickListener { item ->
|
|
||||||
val path = when (v.id) {
|
val path = when (v.id) {
|
||||||
imageView1.id, videoView1.id -> path1
|
imageView1.id, videoView1.id -> path1
|
||||||
imageView2.id, videoView2.id -> path2
|
imageView2.id, videoView2.id -> path2
|
||||||
else -> return@setOnMenuItemClickListener false
|
else -> return
|
||||||
}
|
|
||||||
when (item.itemId) {
|
|
||||||
saveItem.itemId -> {
|
|
||||||
val type = when (v.id) {
|
|
||||||
imageView1.id, imageView2.id -> MediaType.IMAGE
|
|
||||||
videoView1.id, videoView2.id -> MediaType.VIDEO
|
|
||||||
else -> return@setOnMenuItemClickListener false
|
|
||||||
}
|
}
|
||||||
|
val type = mediaTypeFromViewId(v.id)
|
||||||
|
?: return
|
||||||
|
|
||||||
|
val menu = PopupMenu(this, v)
|
||||||
|
menu.menu.add(R.string.save).setOnMenuItemClickListener {
|
||||||
save(path, type)
|
save(path, type)
|
||||||
|
true
|
||||||
}
|
}
|
||||||
else -> {}
|
menu.menu.add(R.string.share).setOnMenuItemClickListener {
|
||||||
}
|
share(path, type)
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
menu.show()
|
menu.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun mediaTypeFromViewId(id: Int): MediaType? =
|
||||||
|
when (id) {
|
||||||
|
imageView1.id, imageView2.id -> MediaType.IMAGE
|
||||||
|
videoView1.id, videoView2.id -> MediaType.VIDEO
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
|
||||||
@Suppress("UNUSED_PARAMETER")
|
@Suppress("UNUSED_PARAMETER")
|
||||||
private fun handlePickResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
private fun handlePickResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||||
val uri = data?.data
|
val uri = data?.data
|
||||||
|
@ -123,14 +127,21 @@ class MainActivity: AppCompatActivity() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val mediaCacheDir = File(cacheDir, "media")
|
||||||
|
if (!mediaCacheDir.exists() && !mediaCacheDir.mkdir()) {
|
||||||
|
Log.e(TAG, "Could not create cache media dir")
|
||||||
|
Toast.makeText(this, R.string.write_error, Toast.LENGTH_SHORT).show()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
imageLayout.visibility = View.GONE
|
imageLayout.visibility = View.GONE
|
||||||
videoLayout.visibility = View.GONE
|
videoLayout.visibility = View.GONE
|
||||||
Toast.makeText(this, R.string.please_wait, Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, R.string.please_wait, Toast.LENGTH_SHORT).show()
|
||||||
|
|
||||||
val outputFile1 = File.createTempFile("output1", ".$extension", cacheDir)
|
val outputFile1 = File.createTempFile("output1", ".$extension", mediaCacheDir)
|
||||||
MirrorTask(WeakReference(this), requestCode, 1)
|
MirrorTask(WeakReference(this), requestCode, 1)
|
||||||
.execute(inputFile.canonicalPath, outputFile1.canonicalPath, VF1)
|
.execute(inputFile.canonicalPath, outputFile1.canonicalPath, VF1)
|
||||||
val outputFile2 = File.createTempFile("output2", ".$extension", cacheDir)
|
val outputFile2 = File.createTempFile("output2", ".$extension", mediaCacheDir)
|
||||||
MirrorTask(WeakReference(this), requestCode, 2)
|
MirrorTask(WeakReference(this), requestCode, 2)
|
||||||
.execute(inputFile.canonicalPath, outputFile2.canonicalPath, VF2)
|
.execute(inputFile.canonicalPath, outputFile2.canonicalPath, VF2)
|
||||||
}
|
}
|
||||||
|
@ -230,6 +241,24 @@ class MainActivity: AppCompatActivity() {
|
||||||
Log.i(TAG, "File saved at $outputFile")
|
Log.i(TAG, "File saved at $outputFile")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun share(path: String, type: MediaType) {
|
||||||
|
val uri = FileProvider.getUriForFile(
|
||||||
|
this,
|
||||||
|
"dev.lowrespalmtree.fileprovider",
|
||||||
|
File(path)
|
||||||
|
)
|
||||||
|
Log.i(TAG, "share with uri $uri")
|
||||||
|
val shareIntent = Intent().also {
|
||||||
|
it.action = Intent.ACTION_SEND
|
||||||
|
it.putExtra(Intent.EXTRA_STREAM, uri)
|
||||||
|
it.type = when (type) {
|
||||||
|
MediaType.IMAGE -> "image/*"
|
||||||
|
MediaType.VIDEO -> "video/*"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
startActivity(Intent.createChooser(shareIntent, getString(R.string.send)))
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val TAG = "ZMINGZ"
|
private const val TAG = "ZMINGZ"
|
||||||
private const val REQ_PICK_IMG = 1
|
private const val REQ_PICK_IMG = 1
|
||||||
|
|
|
@ -6,5 +6,6 @@
|
||||||
<string name="please_wait">Please wait...</string>
|
<string name="please_wait">Please wait...</string>
|
||||||
<string name="save">Save</string>
|
<string name="save">Save</string>
|
||||||
<string name="share">Share</string>
|
<string name="share">Share</string>
|
||||||
<string name="write_error">Failed to create file.</string>
|
<string name="write_error">Write error.</string>
|
||||||
|
<string name="send">Send</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
4
app/src/main/res/xml/file_paths.xml
Normal file
4
app/src/main/res/xml/file_paths.xml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<paths>
|
||||||
|
<cache-path name="medias" path="media/" />
|
||||||
|
</paths>
|
Reference in a new issue