SubwayTooter-Android-App/app/src/main/java/jp/juggler/subwaytooter/push/PushBase.kt

58 lines
1.9 KiB
Kotlin

package jp.juggler.subwaytooter.push
import android.content.Context
import androidx.annotation.StringRes
import jp.juggler.subwaytooter.pref.PrefDevice
import jp.juggler.subwaytooter.table.AccountNotificationStatus
import jp.juggler.subwaytooter.table.PushMessage
import jp.juggler.subwaytooter.table.SavedAccount
import jp.juggler.util.data.digestSHA256
import jp.juggler.util.data.encodeBase64Url
import jp.juggler.util.data.encodeUTF8
import jp.juggler.util.data.notEmpty
/**
* PushMastodon, PushMisskey13 のベースクラス
*/
abstract class PushBase {
companion object {
const val appServerUrlPrefix = "https://mastodon-msg.juggler.jp/api/v2/m"
}
interface SubscriptionLogger {
val context: Context
fun i(msg: String)
fun i(@StringRes stringId: Int) = i(context.getString(stringId))
fun e(msg: String)
fun e(@StringRes stringId: Int) = i(context.getString(stringId))
fun e(ex: Throwable, msg: String)
}
protected abstract val prefDevice: PrefDevice
protected abstract val daoStatus: AccountNotificationStatus.Access
// 購読の確認と更新
// 失敗したらエラーメッセージを返す。成功したらnull
abstract suspend fun updateSubscription(
subLog: SubscriptionLogger,
account: SavedAccount,
willRemoveSubscription: Boolean,
forceUpdate: Boolean,
): String?
// プッシュメッセージのJSONデータを通知用に整形
abstract suspend fun formatPushMessage(
a: SavedAccount,
pm: PushMessage,
)
fun deviceHash(a: SavedAccount) =
"${prefDevice.installIdv2},${a.acct}".encodeUTF8().digestSHA256().encodeBase64Url()
fun snsCallbackUrl(a: SavedAccount): String? =
daoStatus.appServerHash(a.acct)?.notEmpty()?.let {
"$appServerUrlPrefix/a_$it/dh_${deviceHash(a)}"
}
}