スマホが突然壊れた時にやったこと

先日、普通に操作中に Nexus5X がシャットダウンしてしまいました
ファクトリリセットなどを試してもブートアニメーションを突破出来ず、
故障と判断して諦めてスマホを新調することになったのでその時大変だったことをまとめておきます

一応再起動出来るかの検証

cache, data パーティションの初期化、電源ボタン連打、端末を冷やしてから再起動などググって出て来る方法は一通り試しましたがダメでした
bootloader はアンロックしていなかったのでファクトリイメージの再書き込みで回復出来たのかは未検証です

SIMカードの入れ替え

悲しいことに N5X 付属のピンを紛失しており途方に暮れました
代わりになりそうなものがなかったので仕方なく爪楊枝をカッターで加工して頑張って取り出しました。。。
N5X のSIMスロットの穴は iPhone などと比べて小さく、安全ピンなどの代用品でも太さ次第では使えないので注意が必要です
新しい端末の Xperia XZ1 compact は防水のためかSIMスロットがキャップ式で、トレーも指で簡単に引き出せて感動しました

各種アカウントの復旧

新しい端末に Google アカウントをセットアップする際に、旧端末の2段階認証アプリが使えなかったため詰みかけました
結局PCブラウザでログインしっぱなしだったため、パスワード入力でリカバリコード画面にアクセス出来て助かりました
Slack もアプリで認証していたのですが、たまたまPC版クライアントがログイン状態であればなんとかなる仕様だったため助かりました

このような場合、リカバリコードを保存したり代替のアクセス手段を用意しておかないとサービス次第で詰みます
またコードの保存先も検討が必要で、例えば dropbox に置いても dropbox 自体がアプリでの2段階認証になってると詰みます
自分は最近2段階認証を有効化したものはアプリに登録するのが面倒でSMS認証になっていたため助かりました(dropboxもその一つ)
とはいえ端末の物理的紛失・盗難を考慮するとリカバリコードを紙に印刷しておくのが一番無難ということになるかもしれません…

Kotlin の Parcelize で簡単 Parcelable 実装

Kotlin 1.1.4 から Parcelable を手軽に実装できるようにする機能が追加された

KEEP/android-parcelable.md at master · Kotlin/KEEP

まだステータスは正式版ではないので gradle で

androidExtensions {
    experimental = true
}

を有効化し、

@Parcelize
class MyParcelable(val data: Int): Parcelable

このように書いておくとコンパイル時に自動的に Parcelable 相当の実装を生成してくれる
data クラスにも使用出来るので json のパース結果などを Activity 間で受け渡すのが非常に簡単になる

これまでは grandstaish/paperparcel を使っていたが CREATOR フィールドを用意する必要がないのでより手軽だ

※注意
CRETOR フィールドを用意する必要はないが、@Parcelize アノテーションを付与したクラスはIDE上で
this class implements parcelable but does not provide a CREATOR field
というエラー扱いになる(でもコンパイルは通る)
下記チケットが起票されているので、直に修正される…と思いたい
[AS3.0] Android extensions, Parcelable: editor shows warning about incomplete implementation on a class with Parcelize annotation : KT-19300

Android Studio 3.0 で Robolectric 関連の変更に追従

先日 Android Studio 3.0 が正式にリリースされたので早速ダウンロードしてビルドしたら Robolectric のテストがコケるようになってしまった
Getting Started | Robolectric に書いてある通りなのだけど以下の対応をしたら通るようになった
どうやらリソースパスを解決するAPIに変更があったらしい

1. testOptions の追加

app/build.gradle に以下の記述を追加する

android {
  testOptions {
    unitTests {
      includeAndroidResources = true
    }
  }
}

2. BuildConfig の指定を止める

テストクラスに Robolectric の BuildConfig 指定がある場合は消す
@Config(constants = BuildConfig.class)

chrome custom tabs の warmup

custom tabs を使う際は事前に chrome のプロセスを温めておくことで遷移を高速化出来るのだけど、自前で実装しようと思うと結構面倒くさい
先人の知恵を拝借しようと Github を検索すると下記の実装が見つかった

DreaminginCodeZH/CustomTabsHelper: Custom tabs, made easy.

saschpe/android-customtabs: Chrome CustomTabs for Android demystified. Simplifies development and provides higher level classes including fallback in case Chrome isn’t available on device.

CustomTabsHelper は Fragment を使う前提の実装で、今回自分は Fragment を使っていなかったので後者の android-customtabs を採用した
使い方は非常にシンプルで README と example の通りなので省略する

基本的な実装はどちらも同じ、というか下記公式の customtabs 使用例が元になっていて単にアプリ(Fragment)開始時に customtabs の service に接続し、停止時に切断している
GoogleChrome/custom-tabs-client: Chrome custom tabs examples

ちょっとしたことだけど非常に反応が良くなるので customtabs を使うならぜひ利用したい