From 8daad253b90db01fd35b3873321bb904e7814502 Mon Sep 17 00:00:00 2001 From: tateisu Date: Mon, 6 Feb 2023 03:08:48 +0900 Subject: [PATCH] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E6=A8=A9=E9=99=90=E3=81=AE?= =?UTF-8?q?=E8=A6=81=E6=B1=82=E3=82=92=EF=BC=91=E5=9B=9E=E3=81=A0=E3=81=91?= =?UTF-8?q?=E3=81=AB=E3=81=99=E3=82=8B=E3=80=82=E6=A8=A9=E9=99=90=E3=81=8C?= =?UTF-8?q?=E3=81=AA=E3=81=84=E5=A0=B4=E5=90=88=E3=81=AF=E3=82=B5=E3=82=A4?= =?UTF-8?q?=E3=83=89=E3=83=A1=E3=83=8B=E3=83=A5=E3=83=BC=E3=81=AB=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=99=E3=82=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/jp/juggler/subwaytooter/ActMain.kt | 6 ++- .../subwaytooter/actmain/ActMainActions.kt | 24 +++++++---- .../subwaytooter/actmain/SideMenuAdapter.kt | 40 +++++++++++++++++-- .../juggler/subwaytooter/pref/PrefDevice.kt | 13 ++++++ .../subwaytooter/util/PermissionRequester.kt | 2 +- .../subwaytooter/util/PermissionSpec.kt | 12 ++++++ app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 8 files changed, 85 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActMain.kt b/app/src/main/java/jp/juggler/subwaytooter/ActMain.kt index 43d2c0eb..2f3adbe3 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActMain.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ActMain.kt @@ -156,7 +156,7 @@ class ActMain : AppCompatActivity(), lateinit var handler: Handler lateinit var appState: AppState - private lateinit var sideMenuAdapter: SideMenuAdapter + lateinit var sideMenuAdapter: SideMenuAdapter ////////////////////////////////////////////////////////////////// // 読み取り専用のプロパティ @@ -326,7 +326,9 @@ class ActMain : AppCompatActivity(), } val prNotification = permissionSpecNotification.requester { - // 特に何もしない + launchAndShowError { + afterNotificationGranted() + } } private var startAfterJob: WeakReference? = null diff --git a/app/src/main/java/jp/juggler/subwaytooter/actmain/ActMainActions.kt b/app/src/main/java/jp/juggler/subwaytooter/actmain/ActMainActions.kt index 9f15bd1c..2ec22ef5 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/actmain/ActMainActions.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/actmain/ActMainActions.kt @@ -22,7 +22,6 @@ import jp.juggler.subwaytooter.dialog.actionsDialog import jp.juggler.subwaytooter.itemviewholder.ItemViewHolder import jp.juggler.subwaytooter.pref.* import jp.juggler.subwaytooter.push.PushWorker -import jp.juggler.subwaytooter.push.pushRepo import jp.juggler.subwaytooter.span.MyClickableSpan import jp.juggler.subwaytooter.util.checkPrivacyPolicy import jp.juggler.subwaytooter.util.openCustomTab @@ -247,13 +246,22 @@ fun ActMain.launchDialogs() { // テーマ告知 themeDefaultChangedDialog() - // 通知権限の確認 - if(!prNotification.checkOrLaunch()) return@launchAndShowError + // 通知権限の確認を一度だけ行う + if (!prefDevice.supressRequestNotificationPermission) { + prefDevice.supressRequestNotificationPermission = true + if (!prNotification.checkOrLaunch()) return@launchAndShowError + } - // Workの掃除 - WorkManager.getInstance(applicationContext).pruneWork() - - // 定期的にendpointを再登録したい - PushWorker.enqueueRegisterEndpoint(applicationContext, keepAliveMode = true) + afterNotificationGranted() } } + +fun ActMain.afterNotificationGranted() { + sideMenuAdapter.filterListItems() + + // Workの掃除 + WorkManager.getInstance(applicationContext).pruneWork() + + // 定期的にendpointを再登録したい + PushWorker.enqueueRegisterEndpoint(applicationContext, keepAliveMode = true) +} diff --git a/app/src/main/java/jp/juggler/subwaytooter/actmain/SideMenuAdapter.kt b/app/src/main/java/jp/juggler/subwaytooter/actmain/SideMenuAdapter.kt index e3b64a4c..71a8d3c2 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/actmain/SideMenuAdapter.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/actmain/SideMenuAdapter.kt @@ -214,7 +214,8 @@ class SideMenuAdapter( IT_GROUP_HEADER(1), IT_DIVIDER(2), IT_VERSION(3), - IT_TIMEZONE(4) + IT_TIMEZONE(4), + IT_NOTIFICATION_PERMISSION(5), } private class Item( @@ -229,6 +230,7 @@ class SideMenuAdapter( title == 0 -> ItemType.IT_DIVIDER title == 1 -> ItemType.IT_VERSION title == 2 -> ItemType.IT_TIMEZONE + title == 3 -> ItemType.IT_NOTIFICATION_PERMISSION icon == 0 -> ItemType.IT_GROUP_HEADER else -> ItemType.IT_NORMAL } @@ -239,11 +241,11 @@ class SideMenuAdapter( else no icon => section header with title else => menu item with icon and title */ - - private val list = arrayOf( + private val originalList = listOf( Item(icon = R.drawable.ic_info_outline, title = 1), Item(icon = R.drawable.ic_info_outline, title = 2), + Item(icon = R.drawable.ic_info_outline, title = 3), Item(), Item(title = R.string.account), @@ -453,6 +455,8 @@ class SideMenuAdapter( } ) + private var list = originalList + private val iconColor = actMain.attrColor(R.attr.colorTimeSmall) override fun getCount(): Int = list.size @@ -517,6 +521,24 @@ class SideMenuAdapter( background = null text = getTimeZoneString(context) } + ItemType.IT_NOTIFICATION_PERMISSION -> + viewOrInflate(view, parent, R.layout.lv_sidemenu_item).apply { + isAllCaps = false + text = actMain.getString(R.string.notification_permission_not_granted) + val drawable = createColoredDrawable(actMain, icon, iconColor, 1f) + setCompoundDrawablesRelativeWithIntrinsicBounds( + drawable, + null, + null, + null + ) + setOnClickListener { + drawer.closeDrawer(GravityCompat.START) + if (actMain.prNotification.checkOrLaunch()) { + filterListItems() + } + } + } } } @@ -557,8 +579,20 @@ class SideMenuAdapter( this.notifyDataSetChanged() } + fun filterListItems() { + list = originalList.filter { + when (it.itemType) { + ItemType.IT_NOTIFICATION_PERMISSION -> + actMain.prNotification.spec.listNotGranded(actMain).isNotEmpty() + else -> true + } + } + notifyDataSetChanged() + } + init { actMain.applicationContext.checkVersion() + filterListItems() ListView(actMain).apply { adapter = this@SideMenuAdapter diff --git a/app/src/main/java/jp/juggler/subwaytooter/pref/PrefDevice.kt b/app/src/main/java/jp/juggler/subwaytooter/pref/PrefDevice.kt index 9a5f3abf..d7bc41e8 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/pref/PrefDevice.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/pref/PrefDevice.kt @@ -26,6 +26,7 @@ class PrefDevice(context: Context) { private const val PREF_UP_ENDPOINT_EXPIRED = "upEndpointExpired" private const val PREF_PUSH_DISTRIBUTOR = "pushDistributor" private const val PREF_TIME_LAST_ENDPOINT_REGISTER = "timeLastEndpointRegister" + private const val PREF_SUPRESS_REQUEST_NOTIFICATION_PERMISSION = "supressRequestNotificationPermission" const val PUSH_DISTRIBUTOR_FCM = "fcm" const val PUSH_DISTRIBUTOR_NONE = "none" @@ -71,6 +72,9 @@ class PrefDevice(context: Context) { @Suppress("SameParameterValue") private fun int(key: String) = if (sp.contains(key)) sp.getInt(key, 0) else null + @Suppress("SameParameterValue") + private fun boolean(key: String) = if (sp.contains(key)) sp.getBoolean(key, false) else null + @Suppress("SameParameterValue") private fun String?.saveTo(key: String) = edit { it.putString(key, this) } @@ -82,6 +86,9 @@ class PrefDevice(context: Context) { @Suppress("SameParameterValue") private fun Int?.saveTo(key: String) = edit { it.putIntNullable(key, this) } + @Suppress("SameParameterValue") + private fun Boolean?.saveTo(key: String) = + edit { it.putBooleanNullable(key, this) } // 認証開始時の状態を覚えておく val authServerType: String? get() = string(PREF_AUTH_SERVER_TYPE) @@ -138,6 +145,12 @@ class PrefDevice(context: Context) { value.saveTo(PREF_TIME_LAST_ENDPOINT_REGISTER) } + var supressRequestNotificationPermission: Boolean + get() = boolean(PREF_SUPRESS_REQUEST_NOTIFICATION_PERMISSION)?:false + set(value) { + value.saveTo(PREF_SUPRESS_REQUEST_NOTIFICATION_PERMISSION) + } + ////////////////////////////////// // 以下は古い diff --git a/app/src/main/java/jp/juggler/subwaytooter/util/PermissionRequester.kt b/app/src/main/java/jp/juggler/subwaytooter/util/PermissionRequester.kt index 172a6a35..4240ba63 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/util/PermissionRequester.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/util/PermissionRequester.kt @@ -27,7 +27,7 @@ class PermissionRequester( /** * 権限の詳細 */ - private val spec: PermissionSpec, + val spec: PermissionSpec, /** * 権限が与えられた際に処理を再開するラムダ * - ラムダの引数にこのPermissionRequester自身が渡される diff --git a/app/src/main/java/jp/juggler/subwaytooter/util/PermissionSpec.kt b/app/src/main/java/jp/juggler/subwaytooter/util/PermissionSpec.kt index 8a28f9d9..95a6d42f 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/util/PermissionSpec.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/util/PermissionSpec.kt @@ -1,10 +1,12 @@ package jp.juggler.subwaytooter.util import android.Manifest +import android.app.Activity import android.content.Context import android.content.pm.PackageManager import android.os.Build import androidx.annotation.StringRes +import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import jp.juggler.subwaytooter.R @@ -29,6 +31,16 @@ class PermissionSpec( ContextCompat.checkSelfPermission(context, it) != PackageManager.PERMISSION_GRANTED } + + /** + * - 権限のどれかが不足している + * - 不足した権限のどれかが shouldShowRequestPermissionRationale == trueである + */ + fun shouldShowRational(activity: Activity) = + permissions.any { + ContextCompat.checkSelfPermission(activity, it) != PackageManager.PERMISSION_GRANTED && + ActivityCompat.shouldShowRequestPermissionRationale(activity, it) + } } val permissionSpecNotification = if (Build.VERSION.SDK_INT >= 33) { diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 5b1ee4e5..515766f7 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1232,4 +1232,5 @@ Downloadフォルダに保存 (秘密鍵つき。データ安全に注意。これは危険です!) 保存しました。 %1$s 見る + 通知表示権限がありません diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ae3e5ec8..9eb27778 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1246,4 +1246,5 @@ test alert notification Saved to %1$s View + notification permission not granted