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