Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 57 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,63 @@
.DS_Store
# https://www.dartlang.org/guides/libraries/private-files

# Files and directories created by pub
.dart_tool/
.packages
.pub/
build/
pubspec.lock

# Directory created by dartdoc
/doc/api/

# IDE
*.iml // IntelliJ
*.ipr // IntelliJ
*.iws // IntelliJ
.idea/ // IntelliJ
.DS_Store // Mac

# copied from https://github.com/flutter/plugins/blob/master/.gitignore
.DS_Store
.atom/
.idea/
.vscode/

.packages
.pub/
.dart_tool/
pubspec.lock
flutter_export_environment.sh

examples/all_plugins/pubspec.yaml

Podfile
Podfile.lock
Pods/
.symlinks/
**/Flutter/App.framework/
**/Flutter/Flutter.framework/
**/Flutter/Generated.xcconfig
**/Flutter/flutter_assets/
ServiceDefinitions.json
xcuserdata/
**/DerivedData/

local.properties
keystore.properties
.gradle/
gradlew
gradlew.bat
gradle-wrapper.jar
.flutter-plugins-dependencies
*.iml

GeneratedPluginRegistrant.h
GeneratedPluginRegistrant.m
GeneratedPluginRegistrant.java
build/
.flutter-plugins

.project
.classpath
.settings
2 changes: 1 addition & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'

android {
compileSdkVersion 28
compileSdkVersion 29

sourceSets {
main.java.srcDirs += 'src/main/kotlin'
Expand Down
2 changes: 2 additions & 0 deletions android/gradle.properties
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
Empty file modified android/gradlew
100644 → 100755
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import android.provider.DocumentsContract
import android.provider.MediaStore
import java.io.*
import java.util.*
import java.io.File


object FileDirectory {
Expand Down Expand Up @@ -67,6 +68,12 @@ object FileDirectory {
}// MediaProvider
// DownloadsProvider
} else if ("content".equals(uri.scheme, ignoreCase = true)) {

// Return the remote address
// source: https://gist.github.com/chauhan-tarun/15eb908a778ac77835d7433e04f71c16
if (isGooglePhotosUri(uri))
return uri.getLastPathSegment();

return getDataColumn(context, uri, null, null)
}

Expand All @@ -86,16 +93,6 @@ object FileDirectory {
private fun getDataColumn(context: Context, uri: Uri, selection: String?,
selectionArgs: Array<String>?): String? {

if (uri.authority != null) {
val targetFile = File(context.cacheDir, "IMG_${Date().time}.png")
context.contentResolver.openInputStream(uri)?.use { input ->
FileOutputStream(targetFile).use { fileOut ->
input.copyTo(fileOut)
}
}
return targetFile.path
}

var cursor: Cursor? = null
val column = "_data"
val projection = arrayOf(column)
Expand Down Expand Up @@ -136,4 +133,12 @@ object FileDirectory {
fun isMediaDocument(uri: Uri): Boolean {
return "com.android.providers.media.documents" == uri.authority
}
}

/**
* @param uri The Uri to check.
* @return Whether the Uri authority is Google Photos.
*/
fun isGooglePhotosUri(uri: Uri): Boolean {
return "com.google.android.apps.photos.content" == uri.authority
}
}
Original file line number Diff line number Diff line change
@@ -1,55 +1,93 @@
package com.kasem.flutter_absolute_path

import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Environment
import androidx.annotation.NonNull;
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.embedding.engine.plugins.activity.ActivityAware
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result
import io.flutter.plugin.common.PluginRegistry.Registrar
import android.util.Log
import android.content.pm.ProviderInfo
import android.content.pm.PackageManager
import android.content.pm.PackageInfo
import java.security.Provider

import android.content.Context
import android.app.Activity
import android.net.Uri

class FlutterAbsolutePathPlugin(private val context: Context) : MethodCallHandler {
import io.flutter.plugin.common.BinaryMessenger

companion object {
@JvmStatic
fun registerWith(registrar: Registrar) {
val channel = MethodChannel(registrar.messenger(), "flutter_absolute_path")
channel.setMethodCallHandler(FlutterAbsolutePathPlugin(registrar.context()))
}
class FlutterAbsolutePathPlugin : FlutterPlugin, ActivityAware, MethodCallHandler{
private lateinit var channel : MethodChannel

private lateinit var context: Context
private lateinit var activity: Activity

private var pluginBinding: FlutterPlugin.FlutterPluginBinding? = null
private var activityBinding: ActivityPluginBinding? = null
private var methodChannel: MethodChannel? = null

override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
channel = MethodChannel(flutterPluginBinding.getFlutterEngine().getDartExecutor(), "flutter_absolute_path")
channel.setMethodCallHandler(this);
context = flutterPluginBinding.applicationContext

// From flutter file picker
pluginBinding = flutterPluginBinding
val messenger = pluginBinding?.binaryMessenger
doOnAttachedToEngine(messenger!!)
}

override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
// TODO: your plugin is no longer attached to a Flutter experience.
}

override fun onAttachedToActivity(binding: ActivityPluginBinding) {
activity = binding.activity;

// From flutter file picker
doOnAttachedToActivity(binding)
}

override fun onDetachedFromActivity() {
}

override fun onDetachedFromActivityForConfigChanges() {
}

override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
}

override fun onMethodCall(call: MethodCall, result: Result) {
when {
call.method == "getAbsolutePath" -> {
val uriString = call.argument<Any>("uri") as String
val uri = Uri.parse(uriString)

// val provider = applicationProviders?.firstOrNull { uri.authority == it.authority }
// if (provider != null) {
// val folderPath = Environment.getExternalStorageDirectory().path + "/Pictures"
// result.success("$folderPath/${uri.lastPathSegment}")
// return
// }

result.success(FileDirectory.getAbsolutePath(this.context, uri))
}
else -> result.notImplemented()
}
}

// val applicationProviders: List<ProviderInfo>? by lazy {
// val applicationId = context.packageName
// context.packageManager
// .getInstalledPackages(PackageManager.GET_PROVIDERS)
// .firstOrNull { it.packageName == applicationId }
// ?.providers?.toList()
// }
// V1 only
private var registrar: Registrar? = null
companion object {
@JvmStatic
fun registerWith(registrar: Registrar) {
if (registrar.activity() != null) {
val plugin = FlutterAbsolutePathPlugin()
plugin.doOnAttachedToEngine(registrar.messenger())
plugin.doOnAttachedToActivity(null, registrar)
}
}
}
private fun doOnAttachedToActivity(activityBinding: ActivityPluginBinding?,
registrar: Registrar? = null) {
this.activityBinding = activityBinding
this.registrar = registrar
}
private fun doOnAttachedToEngine(messenger: BinaryMessenger) {
methodChannel = MethodChannel(messenger, "flutter_absolute_path")
methodChannel?.setMethodCallHandler(this)
context = pluginBinding!!.applicationContext
}
}
113 changes: 53 additions & 60 deletions example/.gitignore
Original file line number Diff line number Diff line change
@@ -1,70 +1,63 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
# https://www.dartlang.org/guides/libraries/private-files

# Files and directories created by pub
.dart_tool/
.packages
.pub/
build/
pubspec.lock

# Directory created by dartdoc
/doc/api/

# IDE
*.iml // IntelliJ
*.ipr // IntelliJ
*.iws // IntelliJ
.idea/ // IntelliJ
.DS_Store // Mac

# copied from https://github.com/flutter/plugins/blob/master/.gitignore
.DS_Store
.atom/
.buildlog/
.history
.svn/

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/

# Visual Studio Code related
.vscode/

# Flutter/Dart/Pub related
**/doc/api/
.dart_tool/
.flutter-plugins
.packages
.pub-cache/
.pub/
/build/
.dart_tool/
pubspec.lock
flutter_export_environment.sh

# Android related
**/android/**/gradle-wrapper.jar
**/android/.gradle
**/android/captures/
**/android/gradlew
**/android/gradlew.bat
**/android/local.properties
**/android/**/GeneratedPluginRegistrant.java
examples/all_plugins/pubspec.yaml

# iOS/XCode related
**/ios/**/*.mode1v3
**/ios/**/*.mode2v3
**/ios/**/*.moved-aside
**/ios/**/*.pbxuser
**/ios/**/*.perspectivev3
**/ios/**/*sync/
**/ios/**/.sconsign.dblite
**/ios/**/.tags*
**/ios/**/.vagrant/
**/ios/**/DerivedData/
**/ios/**/Icon?
**/ios/**/Pods/
**/ios/**/.symlinks/
**/ios/**/profile
**/ios/**/xcuserdata
**/ios/.generated/
**/ios/Flutter/App.framework
**/ios/Flutter/Flutter.framework
**/ios/Flutter/Generated.xcconfig
**/ios/Flutter/app.flx
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*
Podfile
Podfile.lock
Pods/
.symlinks/
**/Flutter/App.framework/
**/Flutter/Flutter.framework/
**/Flutter/Generated.xcconfig
**/Flutter/flutter_assets/
ServiceDefinitions.json
xcuserdata/
**/DerivedData/

local.properties
keystore.properties
.gradle/
gradlew
gradlew.bat
gradle-wrapper.jar
.flutter-plugins-dependencies
*.iml

GeneratedPluginRegistrant.h
GeneratedPluginRegistrant.m
GeneratedPluginRegistrant.java
build/
.flutter-plugins

# Exceptions to above rules.
!**/ios/**/default.mode1v3
!**/ios/**/default.mode2v3
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
.project
.classpath
.settings
Loading