diff --git a/app/src/main/java/com/simplemobiletools/camera/Config.java b/app/src/main/java/com/simplemobiletools/camera/Config.java
index 22fbfdf9..63c25643 100644
--- a/app/src/main/java/com/simplemobiletools/camera/Config.java
+++ b/app/src/main/java/com/simplemobiletools/camera/Config.java
@@ -87,4 +87,12 @@ public class Config {
public void setLastFlashlightState(boolean enabled) {
mPrefs.edit().putBoolean(Constants.LAST_FLASHLIGHT_STATE, enabled).apply();
}
+
+ public String getTreeUri() {
+ return mPrefs.getString(Constants.TREE_URI, "");
+ }
+
+ public void setTreeUri(String uri) {
+ mPrefs.edit().putString(Constants.TREE_URI, uri).apply();
+ }
}
diff --git a/app/src/main/java/com/simplemobiletools/camera/Constants.java b/app/src/main/java/com/simplemobiletools/camera/Constants.java
index df868e53..b70a4154 100644
--- a/app/src/main/java/com/simplemobiletools/camera/Constants.java
+++ b/app/src/main/java/com/simplemobiletools/camera/Constants.java
@@ -5,6 +5,8 @@ public class Constants {
public static final int ORIENT_LANDSCAPE_LEFT = 1;
public static final int ORIENT_LANDSCAPE_RIGHT = 2;
+ public static final String TREE_URI = "tree_uri";
+
// shared preferences
public static final String PREFS_KEY = "Camera";
public static final String IS_FIRST_RUN = "is_first_run";
diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/camera/activities/SettingsActivity.kt
index e8ffc3ec..e9d92750 100644
--- a/app/src/main/kotlin/com/simplemobiletools/camera/activities/SettingsActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/camera/activities/SettingsActivity.kt
@@ -1,6 +1,9 @@
package com.simplemobiletools.camera.activities
+import android.annotation.TargetApi
+import android.app.Activity
import android.content.Intent
+import android.os.Build
import android.os.Bundle
import android.support.v4.app.TaskStackBuilder
import android.view.Menu
@@ -8,10 +11,17 @@ import android.view.MenuItem
import android.view.View
import android.widget.AdapterView
import com.simplemobiletools.camera.R
+import com.simplemobiletools.camera.dialogs.WritePermissionDialog
+import com.simplemobiletools.camera.extensions.isKitkat
+import com.simplemobiletools.camera.extensions.isPathOnSD
import com.simplemobiletools.filepicker.dialogs.FilePickerDialog
import kotlinx.android.synthetic.main.activity_settings.*
+import java.io.File
class SettingsActivity : SimpleActivity() {
+ val OPEN_DOCUMENT_TREE = 1
+ var mCurrPath: String = ""
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_settings)
@@ -49,22 +59,58 @@ class SettingsActivity : SimpleActivity() {
}
private fun setupSavePhotosFolder() {
- var currPath = mConfig.savePhotosFolder
- settings_save_photos.text = currPath.substring(currPath.lastIndexOf("/") + 1)
+ mCurrPath = mConfig.savePhotosFolder
+ settings_save_photos.text = mCurrPath.substring(mCurrPath.lastIndexOf("/") + 1)
settings_save_photos_holder.setOnClickListener {
- FilePickerDialog(this, currPath, false, false, false, object: FilePickerDialog.OnFilePickerListener {
+ FilePickerDialog(this, mCurrPath, false, false, false, object : FilePickerDialog.OnFilePickerListener {
override fun onFail(error: FilePickerDialog.FilePickerResult) {
}
override fun onSuccess(pickedPath: String) {
- currPath = pickedPath.trimEnd('/')
- mConfig.savePhotosFolder = currPath
- settings_save_photos.text = currPath.substring(currPath.lastIndexOf("/") + 1)
+ mCurrPath = pickedPath.trimEnd('/')
+ if (!File(pickedPath).canWrite() && isPathOnSD(pickedPath) && isKitkat() && mConfig.treeUri.isEmpty()) {
+ WritePermissionDialog(this@SettingsActivity, object : WritePermissionDialog.OnWritePermissionListener {
+ override fun onCancelled() {
+ mCurrPath = mConfig.savePhotosFolder
+ }
+
+ override fun onConfirmed() {
+ val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
+ startActivityForResult(intent, OPEN_DOCUMENT_TREE)
+ }
+ })
+ } else {
+ mConfig.savePhotosFolder = mCurrPath
+ settings_save_photos.text = mCurrPath.substring(mCurrPath.lastIndexOf("/") + 1)
+ }
}
})
}
}
+ @TargetApi(Build.VERSION_CODES.KITKAT)
+ override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
+ super.onActivityResult(requestCode, resultCode, resultData)
+ if (requestCode == OPEN_DOCUMENT_TREE) {
+ if (resultCode == Activity.RESULT_OK && resultData != null) {
+ mConfig.savePhotosFolder = mCurrPath
+ settings_save_photos.text = mCurrPath.substring(mCurrPath.lastIndexOf("/") + 1)
+ saveTreeUri(resultData)
+ } else {
+ mCurrPath = mConfig.savePhotosFolder
+ }
+ }
+ }
+
+ @TargetApi(Build.VERSION_CODES.KITKAT)
+ private fun saveTreeUri(resultData: Intent) {
+ val treeUri = resultData.data
+ mConfig.treeUri = resultData.data.toString()
+
+ val takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
+ contentResolver.takePersistableUriPermission(treeUri, takeFlags)
+ }
+
private fun setupSound() {
settings_sound.isChecked = mConfig.isSoundEnabled
settings_sound_holder.setOnClickListener {
diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/dialogs/WritePermissionDialog.kt b/app/src/main/kotlin/com/simplemobiletools/camera/dialogs/WritePermissionDialog.kt
new file mode 100644
index 00000000..df7312b9
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/camera/dialogs/WritePermissionDialog.kt
@@ -0,0 +1,34 @@
+package com.simplemobiletools.camera.dialogs
+
+import android.content.Context
+import android.support.v7.app.AlertDialog
+import android.view.LayoutInflater
+import com.simplemobiletools.camera.R
+
+class WritePermissionDialog(val context: Context, val listener: OnWritePermissionListener) {
+ var dialog: AlertDialog? = null
+
+ init {
+ val view = LayoutInflater.from(context).inflate(R.layout.dialog_write_permission, null)
+
+ dialog = AlertDialog.Builder(context)
+ .setTitle(context.resources.getString(R.string.confirm_storage_access_title))
+ .setView(view)
+ .setPositiveButton(R.string.ok, { dialog, which -> dialogConfirmed() })
+ .setOnCancelListener { listener?.onCancelled() }
+ .create()
+
+ dialog?.show()
+ }
+
+ private fun dialogConfirmed() {
+ dialog?.dismiss()
+ listener.onConfirmed()
+ }
+
+ interface OnWritePermissionListener {
+ fun onConfirmed()
+
+ fun onCancelled()
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/camera/extensions/Context.kt
new file mode 100644
index 00000000..a63b2741
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/camera/extensions/Context.kt
@@ -0,0 +1,9 @@
+package com.simplemobiletools.camera.extensions
+
+import android.content.Context
+import android.os.Build
+import com.simplemobiletools.filepicker.extensions.getSDCardPath
+
+fun Context.isPathOnSD(path: String) = path.startsWith(getSDCardPath())
+
+fun Context.isKitkat() = Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT
diff --git a/app/src/main/res/layout/dialog_write_permission.xml b/app/src/main/res/layout/dialog_write_permission.xml
new file mode 100644
index 00000000..5cb3ae03
--- /dev/null
+++ b/app/src/main/res/layout/dialog_write_permission.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-hdpi/write_storage.png b/app/src/main/res/mipmap-hdpi/write_storage.png
new file mode 100644
index 00000000..01110d81
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/write_storage.png differ
diff --git a/app/src/main/res/mipmap-mdpi/write_storage.png b/app/src/main/res/mipmap-mdpi/write_storage.png
new file mode 100644
index 00000000..dbdfe8f1
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/write_storage.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/write_storage.png b/app/src/main/res/mipmap-xhdpi/write_storage.png
new file mode 100644
index 00000000..758e02a0
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/write_storage.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/write_storage.png b/app/src/main/res/mipmap-xxhdpi/write_storage.png
new file mode 100644
index 00000000..9a7c465c
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/write_storage.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/write_storage.png b/app/src/main/res/mipmap-xxxhdpi/write_storage.png
new file mode 100644
index 00000000..e6191549
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/write_storage.png differ
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 0a619fa8..47a9c4a8 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -12,6 +12,9 @@
Wir benötigen Zugriff auf das Mirkofon um Videos aufnehmen zu können
Keine Galerie App verfügbar
Keine gültige Auflösung mit gewähltem Seitenverhältnis gefunden, nutze maximale Auflösung
+ OK
+ Confirm external storage access
+ Please choose the root folder of the SD card to grant write access on the next screen
Einstellungen
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index a99189aa..a0b374ec 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -12,6 +12,9 @@
È necessario l\'accesso al microfono per registrare i video
Nessuna app galleria disponibile
No valid resolution with selected aspect ratio found, using max resolution
+ OK
+ Confirm external storage access
+ Please choose the root folder of the SD card to grant write access on the next screen
Impostazioni
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index e5e85de7..7641a739 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -12,6 +12,9 @@
ビデオを記録するためにオーディオのアクセス許可が必要です
利用可能なギャラリーアプリがありません
No valid resolution with selected aspect ratio found, using max resolution
+ OK
+ Confirm external storage access
+ Please choose the root folder of the SD card to grant write access on the next screen
設定
diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml
index 049748c1..2a0247f9 100644
--- a/app/src/main/res/values-pt-rPT/strings.xml
+++ b/app/src/main/res/values-pt-rPT/strings.xml
@@ -12,6 +12,9 @@
A permissão de áudio é necessária para a gravação de vídeos
Nenhuma aplicação de galeria disponível
Nenhuma resolução encontrada que seja compatível com o rácio de aspeto selecionado, a utilizar a resolução máxima
+ OK
+ Confirm external storage access
+ Please choose the root folder of the SD card to grant write access on the next screen
Definições
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index eea9bf91..26e66464 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -12,6 +12,9 @@
Нам нужно аудио разрешение для записи видео
Нет доступного приложения-галереи
No valid resolution with selected aspect ratio found, using max resolution
+ OK
+ Confirm external storage access
+ Please choose the root folder of the SD card to grant write access on the next screen
Настройки
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index adba660b..7f057c5c 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -12,6 +12,9 @@
För att spela in video krävs ljudrättigheter
Ingen galleri-app finns tillgänglig
No valid resolution with selected aspect ratio found, using max resolution
+ OK
+ Confirm external storage access
+ Please choose the root folder of the SD card to grant write access on the next screen
Inställningar
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5c28766f..01e72fcf 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -12,6 +12,9 @@
We need the audio permission for recording videos
No gallery app available
No valid resolution with selected aspect ratio found, using max resolution
+ OK
+ Confirm external storage access
+ Please choose the root folder of the SD card to grant write access on the next screen
Settings