Slide 1

Slide 1 text

Android15(SDK35)から強制される、 Edge-to-Edgeに対応しなければならない Sansan株式会社 技術本部 Sansan Engineering Unit Mobile Application Group 原田拓眞

Slide 2

Slide 2 text

自己紹介 ⁃ 2014年4月Sansan新卒入社 ⁃ C# / webアプリエンジニアでした ⁃ 2018年11月頃からAndroidに転向 ⁃ 現在はSansanのAndroidアプリアーキテクト ⁃ 今年の3月から犬を飼い始めました ⁃ X: @teufelium

Slide 3

Slide 3 text

今日するお話 About to tell today is

Slide 4

Slide 4 text

今日するお話 ⁃ TargetSDK 35にすると、Android15以上のデバイスでEdge-to- Edgeがデフォルトに! ⁃ Sansanで試してみたところどうなったか。 ⁃ ComposeとAndroidView(xml)で対応方法が異なり、M3とM2でも 違いが。特にM2では考えることがM3と比べて多い…。

Slide 5

Slide 5 text

Edge-to-Edgeがデフォルトに! Edge-to-Edge becomes the default behavior.

Slide 6

Slide 6 text

Edge-to-Edgeがデフォルトに! https://developer.android.com/about/versions/15/behavior-changes-15#edge-to-edge edge-to-edge.webm

Slide 7

Slide 7 text

Edge-to-Edgeがデフォルトに! ⁃ Target SDK35にしていて、Android 15 [V]以上のデバイスで動か した場合、デフォルトEdge-to-Edge有効になります。 ⁃ Edge-to-Edge自体はAndroid 10 [Q] (SDK 29)から存在していて、 任意に開発者が有効にすることができました。 ⁃ Material3に対応したJetpack Compose androidx.compose.material3 を使用している場合はいい感じに対 応してくれるので、追加対応がほとんど不要。 https://developer.android.com/about/versions/15/behavior-changes-15#edge-to-edge

Slide 8

Slide 8 text

Edge-to-Edgeがデフォルトに! ⁃ Material 3対応Jetpack Compose以外は自分で頑張りましょう。 ⁃ Android Viewも自分で頑張りましょう。

Slide 9

Slide 9 text

Sansanで実際に試してみた。 Experimented with what happens at Sansan.

Slide 10

Slide 10 text

Sansanで実際に試してみた(ログイン画面)

Slide 11

Slide 11 text

良さそう。 It looks fine.

Slide 12

Slide 12 text

Sansanで実際に試してみた(企業詳細画面)

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

なんかめり込んでいる… Sink into the StatusBar ...

Slide 15

Slide 15 text

Sansanで実際に試してみた(商談議事録の詳細画面)

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

やはりめり込んでいる… Sink into the GestureNavigationBar ...

Slide 18

Slide 18 text

とりあえず直してみた。 First Aid.

Slide 19

Slide 19 text

修正前後(企業詳細画面)

Slide 20

Slide 20 text

修正前後(企業詳細画面)

Slide 21

Slide 21 text

修正内容(Jetpack Composeでの対応) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Android15未満でもEdge-to-Edgeを有効にする。 // 環境ごとにEdge-to-Edgeかどうかが異なると思わぬ体験不良が有るかも? enableEdgeToEdge() setContent { SansanAndroidTheme { Surface( modifier = Modifier .fillMaxSize() .safeDrawingPadding() // 被らない部分に配置してくれる ) { ... } } } }

Slide 22

Slide 22 text

修正内容(AndroidViewでの対応) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this, R.layout.xxx_activity) // Android15未満でもEdge-to-Edgeを有効にする。 enableEdgeToEdge() // 親Viewに対して、インセットの適用を行う。 // ステータスバーやナビゲーションバーの高さ分のmarginが自動的に設定される。 ViewCompat.setOnApplyWindowInsetsListener(binding.rootView) { view, windowInsets -> val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) view.updateLayoutParams { leftMargin = insets.left topMargin = insets.top bottomMargin = insets.bottom rightMargin = insets.right } WindowInsetsCompat.CONSUMED } }

Slide 23

Slide 23 text

ちょっとダサい部分を直す Fixing up the uncool parts.

Slide 24

Slide 24 text

背景色が出ちゃってダサい

Slide 25

Slide 25 text

修正内容(Jetpack Composeでの対応) Scaffold( modifier = modifier, topBar = { Column(Modifier.background(SansanColor.BackgroundGrayMainDuck)) { // ステータスバー分の余白をあけるSpacerをつける。 Spacer( modifier = Modifier.windowInsetsTopHeight( WindowInsets.statusBars ) ) CompanyDetailToolbar( … ) } }

Slide 26

Slide 26 text

文字入力にも対応する Let's support text input.

Slide 27

Slide 27 text

文字入力の対応前後 Screen_recording_20240723_165415.webm Screen_recording_20240723_165227.webm

Slide 28

Slide 28 text

修正内容(AndroidViewでの対応) ViewCompat.setOnApplyWindowInsetsListener(binding.bottomContainer) { view, windowInsets -> // ナビゲーションバーに取られる高さ val insets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars()) // IMEに取られる高さ val ime = windowInsets.getInsets(WindowInsetsCompat.Type.ime()) view.setPadding( insets.left, insets.top, insets.right, maxOf(insets.bottom, ime.bottom), // どっちかデカい方 ) WindowInsetsCompat.CONSUMED }

Slide 29

Slide 29 text

まとめ ⁃ TargetSDK 35にするとAndroid 15以降の端末でEdge-to-Edgeが強制に なる。 ⁃ M3対応JetpackComposeはよしなに対応してくれるが、M2や AndroidViewでは自分たちで頑張る必要あり。 ⁃ 背景色の違和感を減らしたり、IMEに張り付くようなレイアウトをする 時はちょっと工夫の必要あり。 ⁃ 頑張りましょう。

Slide 30

Slide 30 text

宣伝

Slide 31

Slide 31 text

DroidKaigiの後夜祭イベントやります!