diff --git a/.gitignore b/.gitignore index 8b836adf..e46e9842 100644 --- a/.gitignore +++ b/.gitignore @@ -134,3 +134,6 @@ detektReport/ app/detekt-*.xml .idea/androidTestResultsUserPreferences.xml + +keystore.properties + diff --git a/anko/src/main/java/org/jetbrains/anko/Logging.kt b/anko/src/main/java/org/jetbrains/anko/Logging.kt index 0fddf28a..8c01446e 100644 --- a/anko/src/main/java/org/jetbrains/anko/Logging.kt +++ b/anko/src/main/java/org/jetbrains/anko/Logging.kt @@ -238,7 +238,7 @@ inline fun AnkoLogger.warn(message: () -> Any?) { * * @see [Log.e]. */ -inline fun AnkoLogger.error(message: () -> Any?) { +fun AnkoLogger.error(message: () -> Any?) { val tag = loggerTag if (Log.isLoggable(tag, Log.ERROR)) { Log.e(tag, message()?.toString() ?: "null") @@ -248,7 +248,7 @@ inline fun AnkoLogger.error(message: () -> Any?) { /** * Return the stack trace [String] of a throwable. */ -inline fun Throwable.getStackTraceString(): String = Log.getStackTraceString(this) +fun Throwable.getStackTraceString(): String = Log.getStackTraceString(this) private inline fun log( logger: AnkoLogger, diff --git a/apkGen.pl b/apkGen.pl new file mode 100644 index 00000000..4abab0d2 --- /dev/null +++ b/apkGen.pl @@ -0,0 +1,22 @@ +#!/usr/bin/perl -- +use strict; +use warnings; + +sub cmd($){ + print "+ ",$_[0],"\n"; + my $rv=system $_[0]; + if ($? == -1) { + die "failed to execute: $!\n"; + }elsif ($? & 127) { + die "child died with signal %d, %s coredump\n", ($? & 127), ($? & 128) ? 'with' : 'without'; + }else { + my $rv = $? >> 8; + $rv and die "child exited with value $rv\n"; + } +} + +cmd "./gradlew clean"; +cmd "./gradlew assembleNoFcmRelease"; +cmd "./gradlew assembleFcmRelease"; +cmd "mv app/build/outputs/apk/SubwayTooter*.apk app/"; +cmd " ls -1t app/SubwayTooter*.apk |head -n 5"; diff --git a/app/build.gradle b/app/build.gradle index e2361152..664e34e5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,6 +13,10 @@ plugins { id("io.gitlab.arturbosch.detekt") } +def keystorePropertiesFile = rootProject.file("keystore.properties") +def keystoreProperties = new Properties() +keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) + android { compileSdkVersion stCompileSdkVersion buildToolsVersion stBuildToolsVersion @@ -59,6 +63,15 @@ android { // kotlinCompilerExtensionVersion compose_version // } + signingConfigs { + release { + storeFile file(keystoreProperties['storeFile']) + storePassword keystoreProperties['storePassword'] + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + } + } + buildTypes { release { minifyEnabled false @@ -68,15 +81,9 @@ android { lintOptions { disable "MissingTranslation" } - // You need to specify either an absolute path or include the - // keystore file in the same directory as the build.gradle file. - storeFile file("D:\\GoogleDrive\\_private\\AndroidSignKeys\\SubwayTooter.jks") - storePassword "password" - keyAlias "my-alias" - keyPassword "password" + signingConfig signingConfigs.release } debug { - } } @@ -87,10 +94,16 @@ android { nofcm { dimension "fcmType" versionNameSuffix "-noFcm" + applicationIdSuffix ".noFcm" + def scheme = "subwaytooternofcm" + manifestPlaceholders = [customScheme: scheme] + buildConfigField("String", "customScheme", "\"$scheme\"") } fcm { dimension "fcmType" - versionNameSuffix "-play" + def scheme = "subwaytooter" + manifestPlaceholders = [customScheme: scheme] + buildConfigField("String", "customScheme", "\"$scheme\"") } } diff --git a/app/src/androidTest/java/jp/juggler/subwaytooter/api/TestTootApiClient.kt b/app/src/androidTest/java/jp/juggler/subwaytooter/api/TestTootApiClient.kt index 3d8c5430..61bf0948 100644 --- a/app/src/androidTest/java/jp/juggler/subwaytooter/api/TestTootApiClient.kt +++ b/app/src/androidTest/java/jp/juggler/subwaytooter/api/TestTootApiClient.kt @@ -6,7 +6,7 @@ import androidx.core.net.toUri import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import jp.juggler.subwaytooter.api.auth.AuthBase -import jp.juggler.subwaytooter.api.auth.MastodonAuth +import jp.juggler.subwaytooter.api.auth.AuthMastodon import jp.juggler.subwaytooter.api.entity.Host import jp.juggler.subwaytooter.api.entity.TootInstance import jp.juggler.subwaytooter.table.SavedAccount @@ -1069,7 +1069,7 @@ class TestTootApiClient { val (ti, ri) = TootInstance.get(client) ti ?: error("can't get server information. ${ri?.error}") - val auth = AuthBase.findAuthForAuthStep1(client, ti, ri) as MastodonAuth + val auth = AuthBase.findAuthForAuthStep1(client, ti, ri) as AuthMastodon val authUri = auth.authStep1(ti, forceUpdateClient = false) println("authUri=$authUri") @@ -1137,7 +1137,7 @@ class TestTootApiClient { Triple("?code=a&state=host:${testHost.ascii},other:a", null, "ignored"), ).forEach { val (suffix, exClass, exMessage) = it - val callbackUrl = "${MastodonAuth.callbackUrl}$suffix".toUri() + val callbackUrl = "${AuthMastodon.callbackUrl}$suffix".toUri() if (exClass == null) { // expect not throw auth.authStep2(callbackUrl) @@ -1151,7 +1151,7 @@ class TestTootApiClient { // 正常ケース val auth2Result = - auth.authStep2("${MastodonAuth.callbackUrl}?code=a&state=host:${testHost.ascii}".toUri()) + auth.authStep2("${AuthMastodon.callbackUrl}?code=a&state=host:${testHost.ascii}".toUri()) assertEquals( "auth2Result.tokenJson", diff --git a/app/src/fcm/AndroidManifest.xml b/app/src/fcm/AndroidManifest.xml index 2301bacb..ebc9cd51 100644 --- a/app/src/fcm/AndroidManifest.xml +++ b/app/src/fcm/AndroidManifest.xml @@ -10,5 +10,13 @@ + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0d43126b..9c2e69c5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -121,7 +121,7 @@ + android:scheme="${customScheme}" /> @@ -327,21 +327,13 @@ android:name="android.max_aspect" android:value="100.0" /> - - - - { val authUri = runApiTask2(apiHost) { it.authStep1() } + log.i("authUri=$authUri") openBrowser(authUri) dialogHost.dismissSafe() } diff --git a/app/src/main/java/jp/juggler/subwaytooter/actmain/ActMainIntent.kt b/app/src/main/java/jp/juggler/subwaytooter/actmain/ActMainIntent.kt index 27d55d7e..3d96956b 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/actmain/ActMainIntent.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/actmain/ActMainIntent.kt @@ -7,6 +7,7 @@ import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.core.net.toUri import jp.juggler.subwaytooter.ActMain +import jp.juggler.subwaytooter.BuildConfig import jp.juggler.subwaytooter.R import jp.juggler.subwaytooter.action.conversationOtherInstance import jp.juggler.subwaytooter.action.openActPostImpl @@ -54,7 +55,7 @@ fun ActMain.handleIntentUri(uri: Uri) { try { log.i("handleIntentUri $uri") when (uri.scheme) { - "subwaytooter", "misskeyclientproto" -> handleCustomSchemaUri(uri) + BuildConfig.customScheme -> handleCustomSchemaUri(uri) else -> handleOtherUri(uri) } } catch (ex: Throwable) { @@ -175,7 +176,7 @@ private fun ActMain.handleCustomSchemaUri(uri: Uri) = launchAndShowError { // subwaytooter://oauth(\d*)/?... handleOAuth2Callback(uri) } else { - // subwaytooter://notification_click/?db_id=(db_id) + // ${BuildConfig.customScheme}://notification_click/?db_id=(db_id) handleNotificationClick(uri, dataIdString) } } diff --git a/app/src/main/java/jp/juggler/subwaytooter/api/auth/MastodonAuthApi.kt b/app/src/main/java/jp/juggler/subwaytooter/api/auth/ApiAuthMastodon.kt similarity index 96% rename from app/src/main/java/jp/juggler/subwaytooter/api/auth/MastodonAuthApi.kt rename to app/src/main/java/jp/juggler/subwaytooter/api/auth/ApiAuthMastodon.kt index 85f8f113..eca93e21 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/api/auth/MastodonAuthApi.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/api/auth/ApiAuthMastodon.kt @@ -14,7 +14,7 @@ import jp.juggler.util.network.toFormRequestBody import jp.juggler.util.network.toPost import okhttp3.Request -class MastodonAuthApi( +class ApiAuthMastodon( val client: TootApiClient, ) { /** diff --git a/app/src/main/java/jp/juggler/subwaytooter/api/auth/MisskeyAuthApi10.kt b/app/src/main/java/jp/juggler/subwaytooter/api/auth/ApiAuthMisskey10.kt similarity index 94% rename from app/src/main/java/jp/juggler/subwaytooter/api/auth/MisskeyAuthApi10.kt rename to app/src/main/java/jp/juggler/subwaytooter/api/auth/ApiAuthMisskey10.kt index 8b6a7d0b..8314df33 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/api/auth/MisskeyAuthApi10.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/api/auth/ApiAuthMisskey10.kt @@ -9,7 +9,7 @@ import jp.juggler.util.data.buildJsonObject import jp.juggler.util.data.jsonObjectOf import jp.juggler.util.network.toPostRequestBuilder -class MisskeyAuthApi10(val client: TootApiClient) { +class ApiAuthMisskey10(val client: TootApiClient) { suspend fun appCreate( apiHost: Host, diff --git a/app/src/main/java/jp/juggler/subwaytooter/api/auth/MisskeyAuthApi13.kt b/app/src/main/java/jp/juggler/subwaytooter/api/auth/ApiAuthMisskey13.kt similarity index 93% rename from app/src/main/java/jp/juggler/subwaytooter/api/auth/MisskeyAuthApi13.kt rename to app/src/main/java/jp/juggler/subwaytooter/api/auth/ApiAuthMisskey13.kt index 21cd1132..5e6f7bbe 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/api/auth/MisskeyAuthApi13.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/api/auth/ApiAuthMisskey13.kt @@ -10,7 +10,7 @@ import jp.juggler.util.data.JsonObject import jp.juggler.util.data.jsonObjectOf import jp.juggler.util.network.toPostRequestBuilder -class MisskeyAuthApi13(val client: TootApiClient) { +class ApiAuthMisskey13(val client: TootApiClient) { /** * miauth のブラウザ認証URLを作成する diff --git a/app/src/main/java/jp/juggler/subwaytooter/api/auth/AuthBase.kt b/app/src/main/java/jp/juggler/subwaytooter/api/auth/AuthBase.kt index b652d7c7..1c0332ad 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/api/auth/AuthBase.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/api/auth/AuthBase.kt @@ -44,8 +44,8 @@ abstract class AuthBase { // https://github.com/misskey-dev/misskey/issues/9825 // https://github.com/misskey-dev/misskey/commit/788ae2f6ca37d297e912bfba02821543e8566522 // misskeyVersionMajor >= 13 -> MisskeyAuth13(client) - misskeyVersionMajor > 0 -> MisskeyAuth10(client) - else -> MastodonAuth(client) + misskeyVersionMajor > 0 -> AuthMisskey10(client) + else -> AuthMastodon(client) } fun findAuthForAuthStep1(client: TootApiClient, ti: TootInstance?, ri: TootApiResult?) = @@ -54,20 +54,20 @@ abstract class AuthBase { // インスタンス情報を取得できないが、マストドンだと分かる場合がある // https://github.com/tateisu/SubwayTooter/issues/155 // Mastodon's WHITELIST_MODE - 401 -> MastodonAuth(client) + 401 -> AuthMastodon(client) else -> null } fun findAuthForAuthCallback(client: TootApiClient, callbackUrl: String) = when { - MisskeyAuth10.isCallbackUrl(callbackUrl) -> MisskeyAuth10(client) - MisskeyAuth13.isCallbackUrl(callbackUrl) -> MisskeyAuth13(client) - else -> MastodonAuth(client) + AuthMisskey10.isCallbackUrl(callbackUrl) -> AuthMisskey10(client) + AuthMisskey13.isCallbackUrl(callbackUrl) -> AuthMisskey13(client) + else -> AuthMastodon(client) } fun findAuthForCreateUser(client: TootApiClient, ti: TootInstance?) = when (ti?.instanceType) { - InstanceType.Mastodon -> MastodonAuth(client) + InstanceType.Mastodon -> AuthMastodon(client) else -> null } } diff --git a/app/src/main/java/jp/juggler/subwaytooter/api/auth/MastodonAuth.kt b/app/src/main/java/jp/juggler/subwaytooter/api/auth/AuthMastodon.kt similarity index 96% rename from app/src/main/java/jp/juggler/subwaytooter/api/auth/MastodonAuth.kt rename to app/src/main/java/jp/juggler/subwaytooter/api/auth/AuthMastodon.kt index da21ca54..d99f6d14 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/api/auth/MastodonAuth.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/api/auth/AuthMastodon.kt @@ -1,6 +1,7 @@ package jp.juggler.subwaytooter.api.auth import android.net.Uri +import jp.juggler.subwaytooter.BuildConfig import jp.juggler.subwaytooter.api.SendException import jp.juggler.subwaytooter.api.TootApiClient import jp.juggler.subwaytooter.api.TootParser @@ -17,12 +18,12 @@ import jp.juggler.util.data.notEmpty import jp.juggler.util.log.LogCategory import jp.juggler.util.log.errorEx -class MastodonAuth(override val client: TootApiClient) : AuthBase() { +class AuthMastodon(override val client: TootApiClient) : AuthBase() { companion object { private val log = LogCategory("MastodonAuth") - const val callbackUrl = "subwaytooter://oauth/" + const val callbackUrl = "${BuildConfig.customScheme}://oauth/" fun mastodonScope(ti: TootInstance?) = when { // 古いサーバ @@ -36,7 +37,7 @@ class MastodonAuth(override val client: TootApiClient) : AuthBase() { } } - val api = MastodonAuthApi(client) + val api = ApiAuthMastodon(client) // クライアントアプリの登録を確認するためのトークンを生成する // oAuth2 Client Credentials の取得 diff --git a/app/src/main/java/jp/juggler/subwaytooter/api/auth/MisskeyAuth10.kt b/app/src/main/java/jp/juggler/subwaytooter/api/auth/AuthMisskey10.kt similarity index 95% rename from app/src/main/java/jp/juggler/subwaytooter/api/auth/MisskeyAuth10.kt rename to app/src/main/java/jp/juggler/subwaytooter/api/auth/AuthMisskey10.kt index 83b44041..b5dcc3d0 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/api/auth/MisskeyAuth10.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/api/auth/AuthMisskey10.kt @@ -2,6 +2,7 @@ package jp.juggler.subwaytooter.api.auth import android.net.Uri import androidx.core.net.toUri +import jp.juggler.subwaytooter.BuildConfig import jp.juggler.subwaytooter.R import jp.juggler.subwaytooter.api.TootApiClient import jp.juggler.subwaytooter.api.TootParser @@ -15,10 +16,10 @@ import jp.juggler.subwaytooter.util.LinkHelper import jp.juggler.util.data.* import jp.juggler.util.log.LogCategory -class MisskeyAuth10(override val client: TootApiClient) : AuthBase() { +class AuthMisskey10(override val client: TootApiClient) : AuthBase() { companion object { private val log = LogCategory("MisskeyOldAuth") - private const val callbackUrl = "subwaytooter://misskey/auth_callback" + private const val callbackUrl = "${BuildConfig.customScheme}://misskey/auth_callback" fun isCallbackUrl(uriStr: String) = uriStr.startsWith(callbackUrl) || @@ -88,7 +89,7 @@ class MisskeyAuth10(override val client: TootApiClient) : AuthBase() { a.encodeScopeArray() == b?.encodeScopeArray() } - val api = MisskeyAuthApi10(client) + val api = ApiAuthMisskey10(client) /** * Misskey v12 までの認証に使うURLを生成する diff --git a/app/src/main/java/jp/juggler/subwaytooter/api/auth/MisskeyAuth13.kt b/app/src/main/java/jp/juggler/subwaytooter/api/auth/AuthMisskey13.kt similarity index 88% rename from app/src/main/java/jp/juggler/subwaytooter/api/auth/MisskeyAuth13.kt rename to app/src/main/java/jp/juggler/subwaytooter/api/auth/AuthMisskey13.kt index 3a301290..0b53e059 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/api/auth/MisskeyAuth13.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/api/auth/AuthMisskey13.kt @@ -1,10 +1,11 @@ package jp.juggler.subwaytooter.api.auth import android.net.Uri +import jp.juggler.subwaytooter.BuildConfig import jp.juggler.subwaytooter.api.TootApiClient import jp.juggler.subwaytooter.api.TootParser -import jp.juggler.subwaytooter.api.auth.MisskeyAuth10.Companion.encodeScopeArray -import jp.juggler.subwaytooter.api.auth.MisskeyAuth10.Companion.getScopeArrayMisskey +import jp.juggler.subwaytooter.api.auth.AuthMisskey10.Companion.encodeScopeArray +import jp.juggler.subwaytooter.api.auth.AuthMisskey10.Companion.getScopeArrayMisskey import jp.juggler.subwaytooter.api.entity.Host import jp.juggler.subwaytooter.api.entity.TootInstance import jp.juggler.subwaytooter.pref.prefDevice @@ -19,17 +20,17 @@ import java.util.* * miauth と呼ばれている認証手順。 * STではMisskey 13から使用する。 */ -class MisskeyAuth13(override val client: TootApiClient) : AuthBase() { +class AuthMisskey13(override val client: TootApiClient) : AuthBase() { companion object { private val log = LogCategory("MisskeyMiAuth") private const val appIconUrl = "https://m1j.zzz.ac/subwaytooter-miauth-icon.png" - private const val callbackUrl = "subwaytooter://miauth/auth_callback" + private const val callbackUrl = "${BuildConfig.customScheme}://miauth/auth_callback" fun isCallbackUrl(uriStr: String) = uriStr.startsWith(callbackUrl) } - private val api10 = MisskeyAuthApi10(client) - private val api13 = MisskeyAuthApi13(client) + private val api10 = ApiAuthMisskey10(client) + private val api13 = ApiAuthMisskey13(client) // 認証されたアカウントのユーザ情報を取得する override suspend fun verifyAccount( diff --git a/app/src/main/java/jp/juggler/subwaytooter/notification/NotificationChannels.kt b/app/src/main/java/jp/juggler/subwaytooter/notification/NotificationChannels.kt index 6a57d207..1548500d 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/notification/NotificationChannels.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/notification/NotificationChannels.kt @@ -15,6 +15,7 @@ import androidx.core.app.NotificationManagerCompat import androidx.core.content.ContextCompat import androidx.startup.Initializer import androidx.work.ForegroundInfo +import jp.juggler.subwaytooter.BuildConfig import jp.juggler.subwaytooter.R import jp.juggler.subwaytooter.pref.LazyContextInitializer import jp.juggler.util.* @@ -37,6 +38,8 @@ enum class NotificationChannels( val pircDelete: Int, // 通知削除のUri prefix val uriPrefixDelete: String, + // 通知タップのUri prefix + val uriPrefixTap: String, ) { PullNotification( id = "SnsNotification", @@ -47,7 +50,8 @@ enum class NotificationChannels( notificationId = 1, pircTap = 1, pircDelete = 1, // uriでtapとdeleteを区別している - uriPrefixDelete = "subwaytooter://sns-notification", + uriPrefixDelete = "${BuildConfig.customScheme}://notification_delete/", + uriPrefixTap = "${BuildConfig.customScheme}://notification_click/", ), PullWorker( id = "PollingForegrounder", @@ -58,7 +62,8 @@ enum class NotificationChannels( notificationId = 2, pircTap = 2, pircDelete = -1, - uriPrefixDelete = "subwaytooter://checker", + uriPrefixDelete = "${BuildConfig.customScheme}://checker", + uriPrefixTap = "${BuildConfig.customScheme}://checker-tap", ), ServerTimeout( id = "ErrorNotification", @@ -69,7 +74,8 @@ enum class NotificationChannels( notificationId = 3, pircTap = 3, pircDelete = 4, - uriPrefixDelete = "subwaytooter://server-timeout", + uriPrefixDelete = "${BuildConfig.customScheme}://server-timeout", + uriPrefixTap = "${BuildConfig.customScheme}://server-timeout-tap", ), PushMessage( id = "PushMessage", @@ -80,7 +86,8 @@ enum class NotificationChannels( notificationId = 5, pircTap = 5, pircDelete = 6, - uriPrefixDelete = "subwaytooter://pushMessage", + uriPrefixDelete = "${BuildConfig.customScheme}://pushMessage", + uriPrefixTap = "${BuildConfig.customScheme}://notification_click/", ), Alert( id = "Alert", @@ -91,7 +98,8 @@ enum class NotificationChannels( notificationId = 7, pircTap = 7, pircDelete = 8, - uriPrefixDelete = "subwaytooter://alert", + uriPrefixDelete = "${BuildConfig.customScheme}://alert", + uriPrefixTap = "${BuildConfig.customScheme}://alert-tap", ), PushWorker( id = "PushMessageWorker", @@ -102,22 +110,9 @@ enum class NotificationChannels( notificationId = 9, pircTap = 9, pircDelete = 10, - uriPrefixDelete = "subwaytooter://pushWorker", + uriPrefixDelete = "${BuildConfig.customScheme}://pushWorker", + uriPrefixTap = "${BuildConfig.customScheme}://pushWorker-tag", ), - ///////////////////////////// - // 以下、通知IDやpirc を吟味していない - - // SubscriptionUpdate( -// id = "SubscriptionUpdate", -// titleId = R.string.push_subscription_update, -// descId = R.string.push_subscription_update_desc, -// importance = NotificationManagerCompat.IMPORTANCE_LOW, -// priority = NotificationCompat.PRIORITY_LOW, -// notificationId = 3, -// pircTap = 4, -// pircDelete = 5, -// uriPrefixDelete = "pushreceiverapp://subscriptionUpdate", -// ), ; @@ -175,11 +170,11 @@ enum class NotificationChannels( text: String? = context.getString(descId), piTap: PendingIntent? = null, piDelete: PendingIntent? = null, - force:Boolean = false, + force: Boolean = false, ): ForegroundInfo? { val notificationManager = NotificationManagerCompat.from(context) - if(!force){ + if (!force) { if (Build.VERSION.SDK_INT >= 33) { if (ActivityCompat.checkSelfPermission( context, diff --git a/app/src/main/java/jp/juggler/subwaytooter/notification/PullNotification.kt b/app/src/main/java/jp/juggler/subwaytooter/notification/PullNotification.kt index 27f71fa3..077ed7da 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/notification/PullNotification.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/notification/PullNotification.kt @@ -23,15 +23,15 @@ object PullNotification { const val TRACKING_NAME_DEFAULT = "" const val TRACKING_NAME_REPLY = "reply" - private val nc = NotificationChannels.PullNotification + private val ncPullNotification = NotificationChannels.PullNotification /** * メッセージ通知を消す */ fun NotificationManager.removeMessageNotification(id: String?, tag: String) { when (id) { - null -> cancel(tag, nc.notificationId) - else -> cancel("$tag/$id", nc.notificationId) + null -> cancel(tag, ncPullNotification.notificationId) + else -> cancel("$tag/$id", ncPullNotification.notificationId) } } @@ -41,13 +41,13 @@ object PullNotification { fun NotificationManager.removeMessageNotification(account: SavedAccount, tag: String) { if (PrefB.bpDivideNotification.value) { activeNotifications?.filterNotNull()?.filter { - it.id == nc.notificationId && it.tag.startsWith("$tag/") + it.id == ncPullNotification.notificationId && it.tag.startsWith("$tag/") }?.forEach { log.d("cancel: ${it.tag} context=${account.acct.pretty} $tag") - cancel(it.tag, nc.notificationId) + cancel(it.tag, ncPullNotification.notificationId) } } else { - cancel(tag, nc.notificationId) + cancel(tag, ncPullNotification.notificationId) } } @@ -56,7 +56,7 @@ object PullNotification { */ fun NotificationManager.getMessageNotifications(tag: String) = activeNotifications?.filterNotNull()?.filter { - it.id == nc.notificationId && it.tag.startsWith("$tag/") + it.id == ncPullNotification.notificationId && it.tag.startsWith("$tag/") }?.map { Pair(it.tag, it) }?.toMutableMap() ?: mutableMapOf() fun showMessageNotification( @@ -81,29 +81,29 @@ object PullNotification { }.joinToString("&") val iTap = Intent(context, ActCallback::class.java).apply { - data = "subwaytooter://notification_click/?$params".toUri() + data = "${ncPullNotification.uriPrefixTap}?$params".toUri() // FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY を付与してはいけない addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } val piTap = PendingIntent.getActivity( context, - nc.pircTap, + ncPullNotification.pircTap, iTap, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) val iDelete = Intent(context, EventReceiver::class.java).apply { action = EventReceiver.ACTION_NOTIFICATION_DELETE - data = "subwaytooter://notification_delete/?$params".toUri() + data = "${ncPullNotification.uriPrefixDelete}?$params".toUri() } val piDelete = PendingIntent.getBroadcast( context, - nc.pircDelete, + ncPullNotification.pircDelete, iDelete, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) - nc.notify(context, notificationTag) { + ncPullNotification.notify(context, notificationTag) { setContentIntent(piTap) setDeleteIntent(piDelete) setAutoCancel(true) @@ -125,9 +125,8 @@ object PullNotification { } fun openNotificationChannelSetting(context: Context) { - val nc = NotificationChannels.PullNotification val intent = Intent("android.settings.CHANNEL_NOTIFICATION_SETTINGS") - intent.putExtra(Settings.EXTRA_CHANNEL_ID, nc.id) + intent.putExtra(Settings.EXTRA_CHANNEL_ID, ncPullNotification.id) intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName) context.startActivity(intent) } diff --git a/app/src/main/java/jp/juggler/subwaytooter/pref/LazyContextHolder.kt b/app/src/main/java/jp/juggler/subwaytooter/pref/LazyContextHolder.kt index 0386e115..804227ed 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/pref/LazyContextHolder.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/pref/LazyContextHolder.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.content.Context import android.content.SharedPreferences import androidx.startup.Initializer +import jp.juggler.subwaytooter.BuildConfig import jp.juggler.util.os.applicationContextSafe import java.util.concurrent.atomic.AtomicReference @@ -20,6 +21,8 @@ val lazyPref ?: LazyContextHolder.prefNullable ?: error("LazyContextHolder not initialized") +const val FILE_PROVIDER_AUTHORITY ="${BuildConfig.APPLICATION_ID}.FileProvider" + @SuppressLint("StaticFieldLeak") object LazyContextHolder { var contextNullable: Context? = null diff --git a/app/src/main/java/jp/juggler/subwaytooter/push/PushRepo.kt b/app/src/main/java/jp/juggler/subwaytooter/push/PushRepo.kt index 46198dcc..b695f3c8 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/push/PushRepo.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/push/PushRepo.kt @@ -670,7 +670,7 @@ class PushRepo( } val iTap = Intent(context, ActCallback::class.java).apply { - data = "subwaytooter://notification_click/?$params".toUri() + data = "${ncPushMessage.uriPrefixTap}?$params".toUri() // FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY を付与してはいけない addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } @@ -684,13 +684,12 @@ class PushRepo( val urlDelete = "${ncPushMessage.uriPrefixDelete}/${pm.id}" val iDelete = context.intentNotificationDelete(urlDelete.toUri()) - val piDelete = - PendingIntent.getBroadcast( - context, - ncPushMessage.pircDelete, - iDelete, - PendingIntent.FLAG_IMMUTABLE - ) + val piDelete = PendingIntent.getBroadcast( + context, + ncPushMessage.pircDelete, + iDelete, + PendingIntent.FLAG_IMMUTABLE + ) // val iTap = intentActMessage(pm.messageDbId) // val piTap = PendingIntent.getActivity(this, nc.pircTap, iTap, PendingIntent.FLAG_IMMUTABLE) diff --git a/app/src/noFcm/res/drawable-hdpi/ic_app_popup.png b/app/src/noFcm/res/drawable-hdpi/ic_app_popup.png new file mode 100644 index 00000000..95cfcdf8 Binary files /dev/null and b/app/src/noFcm/res/drawable-hdpi/ic_app_popup.png differ diff --git a/app/src/noFcm/res/drawable-mdpi/ic_app_popup.png b/app/src/noFcm/res/drawable-mdpi/ic_app_popup.png new file mode 100644 index 00000000..a796e6b6 Binary files /dev/null and b/app/src/noFcm/res/drawable-mdpi/ic_app_popup.png differ diff --git a/app/src/noFcm/res/drawable-xhdpi/ic_app_popup.png b/app/src/noFcm/res/drawable-xhdpi/ic_app_popup.png new file mode 100644 index 00000000..1ba01331 Binary files /dev/null and b/app/src/noFcm/res/drawable-xhdpi/ic_app_popup.png differ diff --git a/app/src/noFcm/res/drawable-xxhdpi/ic_app_popup.png b/app/src/noFcm/res/drawable-xxhdpi/ic_app_popup.png new file mode 100644 index 00000000..5f33c509 Binary files /dev/null and b/app/src/noFcm/res/drawable-xxhdpi/ic_app_popup.png differ diff --git a/app/src/noFcm/res/drawable-xxxhdpi/ic_app_popup.png b/app/src/noFcm/res/drawable-xxxhdpi/ic_app_popup.png new file mode 100644 index 00000000..cd9b9933 Binary files /dev/null and b/app/src/noFcm/res/drawable-xxxhdpi/ic_app_popup.png differ diff --git a/app/src/noFcm/res/drawable/ic_launcher_monochrome.xml b/app/src/noFcm/res/drawable/ic_launcher_monochrome.xml new file mode 100644 index 00000000..78f1547c --- /dev/null +++ b/app/src/noFcm/res/drawable/ic_launcher_monochrome.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/app/src/noFcm/res/mipmap-hdpi/ic_launcher.png b/app/src/noFcm/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 00000000..3c70399f Binary files /dev/null and b/app/src/noFcm/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/noFcm/res/mipmap-hdpi/ic_launcher_background.png b/app/src/noFcm/res/mipmap-hdpi/ic_launcher_background.png new file mode 100644 index 00000000..0ab59f16 Binary files /dev/null and b/app/src/noFcm/res/mipmap-hdpi/ic_launcher_background.png differ diff --git a/app/src/noFcm/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/noFcm/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 00000000..7ee5cf70 Binary files /dev/null and b/app/src/noFcm/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/noFcm/res/mipmap-mdpi/ic_launcher.png b/app/src/noFcm/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 00000000..4b26a86b Binary files /dev/null and b/app/src/noFcm/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/noFcm/res/mipmap-mdpi/ic_launcher_background.png b/app/src/noFcm/res/mipmap-mdpi/ic_launcher_background.png new file mode 100644 index 00000000..d8563073 Binary files /dev/null and b/app/src/noFcm/res/mipmap-mdpi/ic_launcher_background.png differ diff --git a/app/src/noFcm/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/noFcm/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 00000000..76944840 Binary files /dev/null and b/app/src/noFcm/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/noFcm/res/mipmap-xhdpi/ic_launcher.png b/app/src/noFcm/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 00000000..b47cf141 Binary files /dev/null and b/app/src/noFcm/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/noFcm/res/mipmap-xhdpi/ic_launcher_background.png b/app/src/noFcm/res/mipmap-xhdpi/ic_launcher_background.png new file mode 100644 index 00000000..4715f835 Binary files /dev/null and b/app/src/noFcm/res/mipmap-xhdpi/ic_launcher_background.png differ diff --git a/app/src/noFcm/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/noFcm/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 00000000..1ec20e24 Binary files /dev/null and b/app/src/noFcm/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/noFcm/res/mipmap-xxhdpi/ic_launcher.png b/app/src/noFcm/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 00000000..48d3910b Binary files /dev/null and b/app/src/noFcm/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/noFcm/res/mipmap-xxhdpi/ic_launcher_background.png b/app/src/noFcm/res/mipmap-xxhdpi/ic_launcher_background.png new file mode 100644 index 00000000..f5fdd20d Binary files /dev/null and b/app/src/noFcm/res/mipmap-xxhdpi/ic_launcher_background.png differ diff --git a/app/src/noFcm/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/noFcm/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 00000000..4664864e Binary files /dev/null and b/app/src/noFcm/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/noFcm/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/noFcm/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 00000000..ff498abf Binary files /dev/null and b/app/src/noFcm/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/noFcm/res/mipmap-xxxhdpi/ic_launcher_background.png b/app/src/noFcm/res/mipmap-xxxhdpi/ic_launcher_background.png new file mode 100644 index 00000000..4617926a Binary files /dev/null and b/app/src/noFcm/res/mipmap-xxxhdpi/ic_launcher_background.png differ diff --git a/app/src/noFcm/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/noFcm/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 00000000..e8a75aa2 Binary files /dev/null and b/app/src/noFcm/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/makeVersionTag.pl b/makeVersionTag.pl index bfb1f2ca..3136707e 100644 --- a/makeVersionTag.pl +++ b/makeVersionTag.pl @@ -8,10 +8,10 @@ sub cmd($){ if ($? == -1) { die "failed to execute: $!\n"; }elsif ($? & 127) { - die "child died with signal %d, %s coredump\n", ($? & 127), ($? & 128) ? 'with' : 'without'; - }else { - my $rv = $? >> 8; - $rv and die "child exited with value $rv\n"; + die sprintf "child died with signal %d\n", ($? & 127); + }elseif($?){ + $rv = $? >> 8; + die "child exited with value $rv\n"; } }