diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt b/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt index 1cb955bf..f131b391 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt @@ -1158,7 +1158,7 @@ class ActAccountSetting } val a = ActionsDialog() - a.addAction(getString(R.string.image_pick)) { + a.addAction(getString(R.string.pick_image)) { performAttachment( if(permission_request_code == PERMISSION_REQUEST_AVATAR) REQUEST_CODE_AVATAR_ATTACHMENT diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt b/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt index 6c63f3e9..9abb0998 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt @@ -81,6 +81,7 @@ class ActPost : AppCompatActivity(), View.OnClickListener, PostAttachment.Callba private const val REQUEST_CODE_CAMERA = 2 private const val REQUEST_CODE_MUSHROOM = 3 private const val REQUEST_CODE_VIDEO = 4 + private const val REQUEST_CODE_ATTACHMENT_OLD = 5 private const val PERMISSION_REQUEST_CODE = 1 @@ -294,7 +295,19 @@ class ActPost : AppCompatActivity(), View.OnClickListener, PostAttachment.Callba } override fun onActivityResult(requestCode : Int, resultCode : Int, data : Intent?) { - if(requestCode == REQUEST_CODE_ATTACHMENT && resultCode == Activity.RESULT_OK) { + if(requestCode == REQUEST_CODE_ATTACHMENT_OLD && resultCode == Activity.RESULT_OK) { + if( data != null) { + // 単一選択 + data.data?.let { addAttachment(it, data.type) } + // 複数選択 + val cd = data.clipData + if(cd != null) { + for(i in 0 until cd.itemCount) { + cd.getItemAt(i)?.uri?.let { addAttachment(it) } + } + } + } + }else if(requestCode == REQUEST_CODE_ATTACHMENT && resultCode == Activity.RESULT_OK) { if(data != null) { // 単一選択 data.data?.let { addAttachment(it, data.type) } @@ -1333,6 +1346,17 @@ class ActPost : AppCompatActivity(), View.OnClickListener, PostAttachment.Callba } private fun openAttachment() { + + if(attachment_list.size >= 4) { + showToast(this, false, R.string.attachment_too_many) + return + } + + if(account == null) { + showToast(this, false, R.string.account_select_please) + return + } + val permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) if(permissionCheck != PackageManager.PERMISSION_GRANTED) { @@ -1347,7 +1371,8 @@ class ActPost : AppCompatActivity(), View.OnClickListener, PostAttachment.Callba // } val a = ActionsDialog() - a.addAction(getString(R.string.image_pick)) { performAttachment() } + a.addAction(getString(R.string.pick_images_saf)) { performAttachmentSaf() } + a.addAction(getString(R.string.pick_images_old)) { performAttachmentOld() } a.addAction(getString(R.string.image_capture)) { performCamera() } // a.addAction( getString( R.string.video_capture ), new Runnable() { @@ -1359,17 +1384,36 @@ class ActPost : AppCompatActivity(), View.OnClickListener, PostAttachment.Callba } - private fun performAttachment() { - - if(attachment_list.size >= 4) { - showToast(this, false, R.string.attachment_too_many) - return + private fun performAttachmentOld() { + // SAFのIntentで開く + try { + val intent = Intent(Intent.ACTION_GET_CONTENT , MediaStore.Images.Media.EXTERNAL_CONTENT_URI) + intent.addCategory( Intent.CATEGORY_OPENABLE ) + + // EXTRA_ALLOW_MULTIPLE は API 18 (4.3)以降。ACTION_GET_CONTENT でも ACTION_OPEN_DOCUMENT でも指定できる + intent.putExtra( Intent.EXTRA_ALLOW_MULTIPLE, true ); + + // EXTRA_MIME_TYPES は API 19以降。ACTION_GET_CONTENT でも ACTION_OPEN_DOCUMENT でも指定できる + intent.putExtra( "android.intent.extra.MIME_TYPES", arrayOf("image/*", "video/*") ) + + if( Build.VERSION.SDK_INT >= 23){ + // On Android 6.0 and above using "video/* image/" or "image/ video/*" type doesn't work + // it only recognizes the first filter you specify. + intent.type = "*/*" + }else { + intent.type = "image/* video/*" + } + + startActivityForResult(Intent.createChooser( intent, getString(R.string.pick_images_old) ), REQUEST_CODE_ATTACHMENT_OLD) + } catch(ex : Throwable) { + log.trace(ex) + showToast(this, ex, "ACTION_GET_CONTENT failed.") } - if(account == null) { - showToast(this, false, R.string.account_select_please) - return - } + } + private fun performAttachmentSaf() { + + // SAFのIntentで開く try { @@ -1385,7 +1429,6 @@ class ActPost : AppCompatActivity(), View.OnClickListener, PostAttachment.Callba } } - internal interface InputStreamOpener { val mimeType : String diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 395c56f6..b1223aed 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -168,7 +168,8 @@ Image Transparence de l\'image Utiliser l\'appareil photo - Choisir une image + Choisir une image + Choisir une image Instance Ex) mastodon.social Veuillez entrer seulement le nom de l\'hôte de l\'instance, sans « / » ni « \@ ». diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index c5990299..2327b972 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -350,7 +350,6 @@ 画像 画像の不透明度 カメラで撮影 - 画像を選択 アカウント切り替えできません。in_reply_toのID変換に失敗しました。 アクセストークンを指定する(上級者向け) URLとシークレットを入力してテストボタンを押してください @@ -508,7 +507,12 @@ パスワードを指定してください %1$d(%2$d)人がトゥート 性能 - 画像の選択 + + 画像を選択 + 画像を選択 + 画像を選択(SAF) + 画像を選択(旧式) + アカウントがありません。事前にアカウントの追加を行ってください 開発継続のために寄付をお願いします! ストアで評価やレビューをお願いします! diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 643d8ce2..43b6da05 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -224,7 +224,6 @@ Resize attachment image (JPEG,PNG) Don\'t resize Resize to %1$d pixels - Pick an image Take a picture Missing app permission to access media. Media attachment is uploading… @@ -295,6 +294,10 @@ Color and Background… Column\'s background Pick an image + Pick image(s) + Pick image… (SAF) + Pick image… (old apps) + Image alpha Image Column header