heihei blog

Blog icon by Unsplash https://unsplash.com/@virussinside

Android TransitionにListenerを追加する

業務で少し調べたことのメモ程度に。

AndroidでViewをアニメーションさせたいときの実装方法の一つとして、Transitionがあります。

Transition

Transitionの概要については、公式ドキュメント、もしくはyarakiさんによる下記のスライドが参考になります。

yaraki.github.io

Transitionは、アニメーションの前後のViewの状態を保存、比較をして、それに応じたAnimatorを生成し実行してくれる便利なAPIです。

例えば下記のようなコードを実行すると、binding.target Viewの表示・非表示がフェードしながら切り替わります。

TransitionManager.beginDelayedTransition(binding.root) // rootとなるViewGroupを指定
binding.target.isVisible = !binding.target.isVisible // アニメーションしたいViewの描画状態を更新

beginDelayedTransition関数は魔法のような関数となっており、これを実行後にViewの表示切り替えを行うことで、よしなにアニメーションをしてくれます。

上記の例では、内部でデフォルトとして設定されているTransitionクラスを利用して動きのアニメーションを実現します。もちろんデフォルト以外の動きを実現するために、自分で独自のTransitionクラスを定義し渡すこともできます。

val myTransition = MyTransition()
TransitionManager.beginDelayedTransition(binding.root, myTransition) // 第2引数にTransitionを渡す

Listenerを追加する

よくあるパターンとして、アニメーションの終了後に何らかの処理を実行したい場合があります。

Transitionが終了したタイミングでよしなに処理を行いたい場合には、TransitionクラスのaddListener関数を使って、Listenerを追加します。

以下はTransitionクラスのaddListener関数の内部実装です。

/**
 * Adds a listener to the set of listeners that are sent events through the
 * life of an animation, such as start, repeat, and end.
 *
 * @param listener the listener to be added to the current set of listeners
 *                 for this animation.
 * @return This transition object.
 */
 @NonNull
 public Transition addListener(@NonNull TransitionListener listener) {
   if (mListeners == null) {
     mListeners = new ArrayList<>();
   }
   mListeners.add(listener);
   return this;
 }

カスタムTransitionを定義している場合はTransition初期化時にaddListener関数を呼び出すことで問題なくListenerを追加できます。

val myTransition = MyTransition().addListener(object : Transition.TransitionListener() {
  ... // 関数をoverride
})
TransitionManager.beginDelayedTransition(binding.root, myTransition)

では、カスタムTransitionを定義していない場合(=beginDelayedTransition関数の引数にTransitionクラスを渡さない場合)はどうすればいいのでしょうか?

そのような場合には、Transitionクラスが内部で保持している、デフォルトのTransitionクラスを初期化し、このクラスにListenerを追加できます。

デフォルトのTransitionクラスというのは、AutoTransitionというクラスです。内部実装を読むと、TransitionManagerクラスに、private staticフィールドとして定義されていることがわかります。

public class TransitionManager {
  ...
  private static Transition sDefaultTransition = new AutoTransition();

なのでこのAutoTransitionクラスを初期化して利用をすれば、問題ないです。

val transition = AutoTransition().addListener(...)
TransitionManager.beginDelayedTransition(binding.root, transition)

Tips

addListener関数には素直にTransitionListenerクラス自体を渡すこともできますが、代わりにこのListenerクラスを実装したTransitionListenerAdapterというクラスを渡すこともできます。AdapterクラスはAndroidAPIにあるinterfaceクラスをただoverrideしただけ(独自の処理はない)のclassです。TransitionListener以外のListenerなどに対しても定義されていることがあります。

Adapterクラスがintefaceに定義されている関数をすべて空で実装しているため、このAdapterクラスを代わりに利用することで、Listenerに定義されている関数の中で、開発者がoverrideしたい関数のみをAdapterクラスを介してoverrideして利用することができます。

最終的には以下のようなコードとなりました。

val transition = AutoTransition()
    .addListener(object : TransitionListenerAdapter() {
      override fun onTransitionEnd(transition: Transition) {
        // do something
      }
    })
TransitionManager.beginDelayedTransition(binding.root, transition)
binding.target.isVisible = !binding.target.isVisible

まとめ

  • AndroidでViewのアニメーションを行う際にはTransition APIも選択肢の一つ
  • Transition APIを使ったアニメーションで、所定のタイミングで処理を実行したい場合にはTransitionクラスのaddListener関数を利用する
  • デフォルトで用意されているTransitionクラスはAutoTransition
  • TransitionListener interfaceにはTransitionListenerAdapterクラスが用意されている

2019年6月を振り返る

今年も残り50%切ってしまいましたね。恐ろしい!!!

それではさくっと6月を振り返ります。

WorkManager入れた

業務での話ですが、FirebaseJobDispatcher使っていたのでWorkManager入れました。(リリースはまだ。)

複雑なことをしていなければ、FirebaseJobDispatcherからの移行に関しては下記を参考にすればすっとできるかもです。

developer.android.com

余談になるかもしれませんが、WorkManagerはシステム起動時に何かしらの処理をしているようで(?)、こちら側が変更していなくても、WorkManagerを追加するタイミングでRECEIVE_BOOT_COMPLETEDという新しいパーミッションがアプリに追加された。(AndroidManifest merger経由)。

stackoverflow.com

その他業務では、最近はFirebaseを触ったりリファクタリングまわりを主にしています。

June Android Weekendを開催した

人数は少なかったですが会社の後輩さんが来てくれたりとワイワイとできた。今回はgradle-versions-pluginについて発表をした。

GitHub - ben-manes/gradle-versions-plugin: Gradle plugin to discover dependency updates

www.meetup.com

その他

「アラジン」を観た

ふつうに良かった。ミュージカル調好きだなー。 アニメのキャラクターの顔と似ているなーと感じる人が多かった印象!

今月は「天気の子」も楽しみだ。

www.youtube.com

オリンピックのチケットは全部外れた

破産しなかった・・!(まだチャンスはあるらしいので観戦は諦めない)

雑ですが、以上です!6月もお疲れ様でした!

f:id:shaunkawano:20190703233427p:plain

(写真は、この前代々木公園にてたくさんのシャボン玉が生成されていたときのもの。)

2019年5月を振り返る

それでは5月をさくっと振り返ります。

May Android Weekendを開催した

www.meetup.com

@modgeさんと二人でほそぼそ初めて継続して開催している勉強会です。

f:id:shaunkawano:20190611005024j:plain

今回はJetpack Composeを動かしてみたのでセットアップについてや概要などについて発表しました。初めて参加者の方からLTの申し込みがあり、いつも以上に和気あいあいと参加者と話をすることができました。(英語にチャレンジしたいAndroid開発者の方、ぜひ!)

6月も実施します。英会話の練習・チャレンジしたいAndroid開発者の方、ぜひ参加してみてください。

www.meetup.com

伝え方が9割を読んだ

前に読んだけど忘れていた。そして読まなきゃと思い改めて読み直したかたちです。ハイライトの中から3つだけ抜粋。

  • そのまま口にするのをこらえ、 お願いに相手がどう考えるか/ふだん相手は何を考えているか、相手の頭の中を想像します。
  • どんなに面白くない内容でも、伝え方で興味をわかせることや、集中させることができます。いっぽうで面白い内容でも伝え方次第で、相手には平凡に伝わることもあります。
  • 決して楽勝で人生を過ごす技術ではありません。そう思った瞬間、うまくいかなくなります。

その他

大阪に行った

観光してきました!IT健保でUFJに行き、たこ焼き食べたり。これでもかというくらい炭水化物を摂取しました。美味しかった!

f:id:shaunkawano:20190611002422j:plain

f:id:shaunkawano:20190611002428j:plain

f:id:shaunkawano:20190611002412j:plain

オリンピックのチケットを申し込んだ

全部当選したら破産するかもしれない。

ざっくりですが、以上です!5月もお疲れ様でした!

Notes - What's New in Firebase (Google I/O'19)

f:id:shaunkawano:20190510005655p:plain

※Notes記事では、英語のセッション動画やポッドキャストの内容を(雑に)英語でメモに書き残すことを行っています。本記事は、あくまで動画を見ながら、参考程度に読んでいただくことを想定しています。Notes記事には雑メモ程度のものだったり、書き起こしのようなものもあります。これから実際の動画を見る際には、本記事の内容が少しでもお役に立てば幸いです。(内容において不備、誤字脱字等ありましたら気軽にご連絡いただけると嬉しいです!m(__)m)

本記事は、What's New in Firebase (Google I/O'19)の記事です。

The purpose of Firebase

Help mobile and web app development success

MLKit

  • Vision
  • Natural Language
  • Custom
  • Object Detection & Tracking API + Translation API

AutoML Vision Edge

Cloud Firestore

  • graduated from beta

Collection Group Query

  • query all sub collections

Cloud Functions

  • Scheduled Functions
    • like a cron job
  • Remote Config Event

Cloud Functions Emulator

  • For testing the written code locally without running remote db

Firebase Test Lab

  • Supports Wear OS, Android Q, Android App Bundle
  • Improved games testing
  • flaky tests

Firebase Performance Monitoring

  • Exporting for deeper analysis
    • BigQuery Integration
    • Performance Monitoring for Web App
      • DOM Interative
      • First content paint

Fabric + Firebase

  • Phone Number Auth
  • Crashlytics
  • Latest Release Metrics
  • Slack Jira, PagerDuty integrations
  • Export Crashlytics data into BigQuery

Future of Crahslytics Beta

  • Next generation of crashlytics beta
  • App Distribution: g.co/FirebaseAlpha
  • Roadmap: g.co/FabricRoadmap
    • March 2020 => End of Fabric

Google Analytics for Firebase

  • Filter almost all properties
  • Create new custom audience builder UI

所感・まとめ・個人的に印象に残ったことなど

  • MLKitのモデル学習させるまでやモデル作成までの流れがかなり簡単になっているのでよりとっつきやすくなっていそう。
  • BigQueryとより多くのFirebaseライブラリが連携しているので、プロダクト導入している場合は、アプリエンジニアでもBigQueryかけたりAnalytics分析とかしていくとできることがかなり増えそう。(やらねば。)
  • Cloud Functionsとかも触れていないのでRemote Configとの連携とかも含めて、使っていく。

以上です!

Notes - Build a Modular Android App Architecture (Google I/O&#39;19)

f:id:shaunkawano:20190509003256p:plain

※Notes記事では、英語のセッション動画やポッドキャストの内容を(雑に)英語でメモに書き残すことを行っています。本記事は、あくまで動画を見ながら、参考程度に読んでいただくことを想定しています。Notes記事には雑メモ程度のものだったり、書き起こしのようなものもあります。これから実際の動画を見る際には、本記事の内容が少しでもお役に立てば幸いです。(内容において不備、誤字脱字等ありましたら気軽にご連絡いただけると嬉しいです!m(__)m)

本記事は、Build a Modular Android App Architecture (Google I/O'19)の記事です。

Why Modularize your app?

  • People can specialize in certain sections of the application
  • Maintainability
    • grouping layouts based on features
  • Faster compilation
  • Faster CI
    • Only modified module and the modules that depend on that module need to be tested.
    • How we do it in AndroidX
      • Discover dependency graph
      • Find changed fines from Git History
      • Execute all testes of affected modules
      • URL: goo.gle/androidx-dependency-tracker
  • Good for business
    • Smaller APKs using the Android App bundle
  • Isolated feature testing

How to modularize?

Dynamic Feature Module

  • App can't depend on modules; modules depend on app
  • onDemand="false", onDemand="true"
  • Feature Modularization

Layer modularization

  • Plaid Features
    • Persistence
    • API client / Authentication
    • Custom Styling Library
    • Feed UI
    • Post UI

Isolation via modules

  • api vs implementation
    • if module is provided through api all of the public api are available for all the modules depending on that module.
    • if module is provided through implementation then all the modules depending on that module cannot see any public api

Feature modularization

Layer modularization

  • Isolation to your app
  • Structure to your app

If you are starting from the monolithic app

  • Start with layer modularization

Working with dynamic feature modules

  • Navigation
    • starting activity
      • setClassName
    • starting fragment
    • Class.forName()..
      • Needs ProGuard
      • No runtime performance hits

=> Currently working on it with navigation jetpack library to make this navigation as natural as possible.

Databases

  • One common database
    • Pros
      • Very easy to maintain database connection
      • Easy to share tables
    • Cons
      • No isolation between modules
      • Feature specific entities are in shared domain
  • One database per module
    • Pros
      • Isolation between modules
    • Cons
      • Database connection maintenance
      • Duplicate data
  • A hybrid approach

A bright feature with Room

  • Multi-module databases with room
    • Separate databases combined at runtime
    • Cross-module database queries
  • Not available yet

Android free modules

The benefits of it will be..

  • Faster tests
  • Minimize dependencies
  • Separation of concerns
  • Better abstractions

But do not do this if ..

  • you don't have a use case for it / do not use it
  • you don't have time; abstraction takes time

TL;DR

  • Start re-writing your application in modules
  • Just options
  • Always keep your customers and users in your mind

所感・まとめ・個人的に印象に残ったことなど

  • モジュール化することでCIでのテスト実行時間も短縮できそう
  • DFM対応のプロジェクトの画面遷移の実装方法は、今後Navigation Architecture Componentsでより自然な形に改善されそう
  • Roomには今後マルチモジュールを見据えた機能が追加されそう
  • アーキテクチャが良いからという理由で☆5つをくれるユーザーはいないよ!何するにしてもユーザーのこと考えてね!が刺さった

以上です!

2019年4月を振り返る

( ;゚Д゚)ナ、ナンダッテー!!(゚Д゚;(゚Д゚; )

GWも残りあと数日...!それでは4月を振り返ります。

真新しいことが多かった

4月になり、いろいろなものが真新しくなったのですが、一番変わったといえばオフィスが変わったことでした。

新オフィスになり、新しい建物の匂いがすごくしたり、オフィスの中の景色が変わったりといろいろと新しかったです。GW明けから社食なるものが本格的に開始するのでそれも個人的には楽しみです。

他にももちろん人の異動だったり新しいメンバーがジョインしたり、新しいことだらけでした。(新しいしか言っていない気がする)

夜のチェアリングをした

会社の上司の方に誘っていただき、初チェアリングを体験しました@代々木公園。仕事の話はもちろん、プライベートの話などいろいろ話ができて楽しかったです。そして、これがりんちゃん(ゆるキャン)がみてた景色かーとそわそわしました。

f:id:shaunkawano:20190503185247j:plain

f:id:shaunkawano:20190503185257j:plain

社会人バスケを見に行った

GW中、久しぶりにあって軽く茶をしばいた高校時代の友人から、「これから試合あるんだけど見に来ない?」と言われ急遽いくことに。@品川

あたりまえだけど高校時代のバスケとは全然違って迫力ありました。

f:id:shaunkawano:20190503185324j:plain

振り返りのために写真を見返したら思っていた以上にご飯の写真が多かった。。汗

そして最近インプット・アウトプット含めあまりブログに書けるほどできていないことに反省。GWリフレッシュできたので、気持ちリセットで、少しずつでもまたやっていきます。

以上です、4月もお疲れ様でした!

「人事と採用のセオリー」を読んだ

会社の先輩が「面白そう」と言っていたのを思い出して買って読んでみました。さくっと読み終えての印象とハイライトを3つほど紹介します。

内容

内容としては、採用難・人手不足(人口減少)という大きな今の時代の背景がある中で、どのように人事と採用を行っていくことで企業は生き残れるのか、リクルートの実例など交えて効果的な手法や考え方を紹介する、というようなものでした。

こういうときにはこうするほうが効果的である、というようなAに対してはBを、というパターン付けのような書き方が多かった印象ですが、本書のあとがきに

普遍的・体型的な人事と採用の考え方をまとめたい

とあるとおり、主に人事と採用の「考え方」に重きをおいた本だと感じました。

こんな人におすすめ

もしかしたら長年人事や採用を担当されている方からすると既知の内容も多少はあるかもしれないですが、現在人事や採用担当の方、人事や採用に関わる社員の方や、これからそのようなポジションになる方などで興味がある方はぜひ読んでみると良いかもと思いました。また、最後のほうにある海外出身人材の採用などの話も個人的には面白かったです。

最後に、ハイライトした文章の中から特に印象的だったものを3つあげて締めます。

ハイライト3つ

事業戦略に合わせて組織のあり方も変化させなくてはなりません。しかし難しいのは、組織には「慣性」が存在するため、変化が容易ではないことです。

制度だけ導入しても、制度を活かすベースがなければ効果は出ません。ベースを構築する上で最も重要なのが、「誰が」「何を」「どのように」のうちの「誰が」の部分

一般に「組織が環境変化に対応するには、外部環境と同等の多様性を組織内に作る必要がある」と言われます。