2022-08-06 00:52:31 +02:00
|
|
|
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
|
2022-08-06 00:52:31 +02:00
|
|
|
import android.media.RingtoneManager
|
|
|
|
import android.net.Uri
|
2022-09-10 23:09:26 +02:00
|
|
|
import android.os.Build
|
2022-08-06 00:52:31 +02:00
|
|
|
import android.os.Bundle
|
2022-09-10 23:09:26 +02:00
|
|
|
import androidx.activity.OnBackPressedCallback
|
2022-08-08 03:42:01 +02:00
|
|
|
import androidx.activity.result.ActivityResult
|
2022-09-10 23:09:26 +02:00
|
|
|
import androidx.appcompat.app.AppCompatActivity
|
2022-08-06 00:52:31 +02:00
|
|
|
|
|
|
|
/**
|
2022-08-08 03:42:01 +02:00
|
|
|
* API 33 で Bundle.get() が deprecatedになる。
|
|
|
|
* type safeにするべきだが、過去の使い方にもよるかな…
|
2022-08-06 00:52:31 +02:00
|
|
|
*/
|
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)
|
|
|
|
}
|
2022-08-06 00:52:31 +02:00
|
|
|
|
2022-08-08 03:42:01 +02:00
|
|
|
/**
|
|
|
|
* 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)
|
2022-08-08 03:42:01 +02:00
|
|
|
}
|
2022-08-06 00:52:31 +02:00
|
|
|
|
2022-08-08 03:42:01 +02:00
|
|
|
/**
|
|
|
|
* Bundleからキーを指定してint値またはnullを得る
|
|
|
|
*/
|
|
|
|
fun Bundle.int(key: String) =
|
2022-08-06 00:52:31 +02:00
|
|
|
when (val v = getRaw(key)) {
|
|
|
|
null -> null
|
|
|
|
is Number -> v.toInt()
|
|
|
|
is String -> v.toIntOrNull()
|
|
|
|
else -> null
|
|
|
|
}
|
|
|
|
|
2022-08-08 03:42:01 +02:00
|
|
|
/**
|
|
|
|
* Bundleからキーを指定してlong値またはnullを得る
|
|
|
|
*/
|
|
|
|
fun Bundle.long(key: String) =
|
2022-08-06 00:52:31 +02:00
|
|
|
when (val v = getRaw(key)) {
|
|
|
|
is Number -> v.toLong()
|
|
|
|
is String -> v.toLongOrNull()
|
|
|
|
else -> null
|
|
|
|
}
|
|
|
|
|
2022-08-08 03:42:01 +02:00
|
|
|
/**
|
|
|
|
* 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()
|
|
|
|
})
|
|
|
|
}
|