Slide 1

Slide 1 text

Android 14 Meetup Nagoya 2023/08/10 Android 14 新機能

Slide 2

Slide 2 text

● Kenji Abe ● Google Developers Expert for Android, Kotlin ● DeNA Co., Ltd. ● X: @STAR_ZERO ● Bluesky: @star-zero.com 自己紹介

Slide 3

Slide 3 text

Per-app language preferences

Slide 4

Slide 4 text

● AGP 8.1.0-alpha07 から ● values-* フォルダを判別して LocaleConfig を自動で生成 LocaleConfigの自動生成

Slide 5

Slide 5 text

// app/build.gradle android { androidResources { generateLocaleConfig = true } } // res/resources.properties unqualifiedResLocale=en-US

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

● 実行中にアプリごとの言語設定を変更可能 ● A/Bテストや、地域によって設定を変えたりなど可能に LocaleConfigの動的更新

Slide 8

Slide 8 text

val localManger = getSystemService()!! // 言語設定をOverride localManger.overrideLocaleConfig = LocaleConfig( LocaleList( Locale.ENGLISH, Locale.ITALIAN ) ) // Overrideした設定を戻す localManger.overrideLocaleConfig = null

Slide 9

Slide 9 text

Grammatical Inflection API

Slide 10

Slide 10 text

● フランス語 ○ 男性: Vous êtes abonné à… ○ 女性: Vous êtes abonnée à… ○ 中立: Abonnement à...activé Grammatical Inflection API

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

val grammaticalInflectionManager = context.getSystemService()!! grammaticalInflectionManager .setRequestedApplicationGrammaticalGender( Configuration.GRAMMATICAL_GENDER_FEMININE // or Configuration.GRAMMATICAL_GENDER_MASCULINE // or Configuration.GRAMMATICAL_GENDER_NEUTRAL // or Configuration.GRAMMATICAL_GENDER_NOT_SPECIFIED )

Slide 13

Slide 13 text

地域別の設定

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

地域別の設定 // androidx.core:core:1.12.0 val temperature = LocalePreferences.getTemperatureUnit() val firstDayOfWeek = LocalePreferences.getFirstDayOfWeek()

Slide 16

Slide 16 text

Screenshot detection API

Slide 17

Slide 17 text

● スクリーンショットを撮ったことを検知できる ● スクリーンショット自体を取得することはできない Screenshot detection API

Slide 18

Slide 18 text

Slide 19

Slide 19 text

class MainActivity : ComponentActivity() { val screenCaptureCallback = ScreenCaptureCallback { // ... } override fun onStart() { super.onStart() registerScreenCaptureCallback( mainExecutor, screenCaptureCallback ) } override fun onStop() { super.onStop() unregisterScreenCaptureCallback(screenCaptureCallback) } }

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

Predictive Back Gesture

Slide 22

Slide 22 text

● Android 13で導入、Android 14で改善 ● Activity単位でのOpt-in ● Activity間でのアニメーション ● 新しいAPIが追加され、カスタムアニメーションが可能に Predictive Back Gesture

Slide 23

Slide 23 text

Slide 24

Slide 24 text

https://developer.android.com/about/versions/14/features/predictive-back

Slide 25

Slide 25 text

// androidx.activity:activity-ktx:1.8.0-alpha06 val callBack = object : OnBackPressedCallback(true) { override fun handleOnBackStarted(backEvent: BackEventCompat) { // Gestureが始まったとき } override fun handleOnBackProgressed(backEvent: BackEventCompat) { // Gestureの進捗 } override fun handleOnBackPressed() { // Gestureが完了したとき } override fun handleOnBackCancelled() { // キャンセルされたとき } }

Slide 26

Slide 26 text

Path

Slide 27

Slide 27 text

val path = Path().apply { moveTo(0f, 0f) lineTo(200f, 0f) lineTo(200f, 200f) lineTo(0f, 200f) close() } canvas.drawPath(path, paint)

Slide 28

Slide 28 text

val pathIterator = path.pathIterator pathIterator.forEach { segment -> // PathIterator.VERB_MOVE, // PathIterator.VERB_LINE, // PathIterator.VERB_CLOSE など val verb = segment.verb // verbの操作のポイントデータ val points = segment.points }

Slide 29

Slide 29 text

VERB_MOVE - [0, 0, 0, 0, 0, 0, 0, 0] VERB_LINE - [0, 0, 200, 0, 0, 0, 0, 0] VERB_LINE - [200, 0, 200, 200, 0, 0, 0, 0] VERB_LINE - [200, 200, 0, 200, 0, 0, 0, 0] VERB_CLOSE - [200, 200, 0, 200, 0, 0, 0, 0] moveTo(0f, 0f) lineTo(200f, 0f) lineTo(200f, 200f) lineTo(0f, 200f) close()

Slide 30

Slide 30 text

● androidx.graphics:graphics-path もある ○ API 21からサポート Path

Slide 31

Slide 31 text

ありがとうございました