SubwayTooter-Android-App/app/src/main/java/jp/juggler/util/Compat.kt

127 lines
3.7 KiB
Kotlin
Raw Normal View History

package jp.juggler.util
import android.content.Intent
2022-09-10 23:09:26 +02:00
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import android.content.pm.PackageManager.PackageInfoFlags
import android.content.pm.PackageManager.ResolveInfoFlags
import android.content.pm.ResolveInfo
import android.media.RingtoneManager
import android.net.Uri
2022-09-10 23:09:26 +02:00
import android.os.Build
import android.os.Bundle
2022-09-10 23:09:26 +02:00
import androidx.activity.OnBackPressedCallback
import androidx.activity.result.ActivityResult
2022-09-10 23:09:26 +02:00
import androidx.appcompat.app.AppCompatActivity
/**
* API 33 Bundle.get() deprecatedになる
* type safeにするべきだが過去の使い方にもよるかな
*/
2022-09-10 23:09:26 +02:00
private fun Bundle.getRaw(key: String) =
@Suppress("DEPRECATION")
get(key)
fun Intent.getUriExtra(key: String) =
extras?.getRaw(key) as? Uri
fun Intent.getStreamUriExtra() =
if (Build.VERSION.SDK_INT >= 33) {
getParcelableExtra(Intent.EXTRA_STREAM, Uri::class.java)
} else {
@Suppress("DEPRECATION")
getParcelableExtra(Intent.EXTRA_STREAM) as? Uri?
}
fun Intent.getStreamUriListExtra() =
if (Build.VERSION.SDK_INT >= 33) {
getParcelableArrayListExtra(Intent.EXTRA_STREAM, Uri::class.java)
} else {
@Suppress("DEPRECATION")
getParcelableArrayListExtra(Intent.EXTRA_STREAM)
}
fun Intent.getIntentExtra(key: String) =
if (Build.VERSION.SDK_INT >= 33) {
getParcelableExtra(key, Intent::class.java)
} else {
@Suppress("DEPRECATION")
getParcelableExtra(key)
}
/**
* Ringtone pickerの処理結果のUriまたはnull
*/
fun ActivityResult.decodeRingtonePickerResult() =
when {
isNotOk -> null
2022-09-10 23:09:26 +02:00
else -> data?.getUriExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI)
}
/**
* Bundleからキーを指定してint値またはnullを得る
*/
fun Bundle.int(key: String) =
when (val v = getRaw(key)) {
null -> null
is Number -> v.toInt()
is String -> v.toIntOrNull()
else -> null
}
/**
* Bundleからキーを指定してlong値またはnullを得る
*/
fun Bundle.long(key: String) =
when (val v = getRaw(key)) {
is Number -> v.toLong()
is String -> v.toLongOrNull()
else -> null
}
/**
* IntentのExtrasからキーを指定してint値またはnullを得る
*/
fun Intent.int(key: String) = extras?.int(key)
/**
* IntentのExtrasからキーを指定してlong値またはnullを得る
*/
fun Intent.long(key: String) = extras?.long(key)
2022-09-10 23:09:26 +02:00
fun PackageManager.getPackageInfoCompat(
pakageName: String,
flags: Int = 0,
): PackageInfo? = if (Build.VERSION.SDK_INT >= 33) {
getPackageInfo(pakageName, PackageInfoFlags.of(flags.toLong()))
} else {
@Suppress("DEPRECATION")
getPackageInfo(pakageName, flags)
}
fun PackageManager.queryIntentActivitiesCompat(
intent: Intent,
queryFlag: Int = 0,
): List<ResolveInfo> = if (Build.VERSION.SDK_INT >= 33) {
queryIntentActivities(intent, ResolveInfoFlags.of(queryFlag.toLong()))
} else {
@Suppress("DEPRECATION")
queryIntentActivities(intent, queryFlag)
}
fun PackageManager.resolveActivityCompat(
intent: Intent,
queryFlag: Int = 0,
): ResolveInfo? = if (Build.VERSION.SDK_INT >= 33) {
resolveActivity(intent, ResolveInfoFlags.of(queryFlag.toLong()))
} else {
@Suppress("DEPRECATION")
resolveActivity(intent, queryFlag)
}
fun AppCompatActivity.backPressed(block: () -> Unit) {
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() = block()
})
}