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";
}
}