Paging3 ライブラリ

👉 Paging 3 library overview  |  Android デベロッパー  |  Android Developers 

「ページングライブラリ」は、ローカルストレージやネットワーク経由のより大きなデータセットを読み込みページを表示する処理に使います。これを使うことで、ネットワーク帯域幅とシステムのリソースを効果的に使うことができます。Android app architecture にフィットするように設計されており、他の JetPack コンポーネントとも綺麗に統合することができます。

メリット

ページングライブラリには以下の機能があります。

- ページ分けされたデータのメモリーキャッシュ化。システムリソースを効果的に使います、
- 重複リクエストの排除。ネットワーク帯域とシステムリソースを効果的に使います。
- 設定可能な指導リクエスト付き RecyclerView Adapter。ロード済みデータとスクロールを考慮。
- Kotlin coroutine と Flow を最優先。LiveData や RxJava のように利用可能。
- リフレッシュやリトライを含んだエラーハンドリング。

👉 componentid:413106 status:open - Issue Tracker 

設定

build.gradle に以下のようにして dependencies に追加します。


dependencies {
  def paging_version = "3.0.0-alpha01"

  implementation "androidx.paging:paging-runtime:$paging_version"

  // alternatively - without Android dependencies for tests
  testImplementation "androidx.paging:paging-common:$paging_version"

  // optional - RxJava2 support
  implementation "androidx.paging:paging-rxjava2:$paging_version"

  // optional - Guava ListenableFuture support
  implementation "androidx.paging:paging-guava:$paging_version"
}

構成

Paging ライブラリは、推奨されている Android app architecture に直接統合できます。ライブラリコンポーネンツはアプリの中で3つのレイヤーを持っています。

- Repository レイヤー
- ViewModel レイヤー
- UI レイヤー

ここでは、Pagingライブラリコンポーネントがそれぞれのレイヤーでどのように組み合わせてく使われ、データ読み込みからページを表示するまでを説明します。

Repository レイヤー

Repository レイヤーで、主要な Pagingライブラリコンポーネントとなるのが PagingSource です。それぞれの PagingSource オブジェクトはデータソースとそれをどう走査するかを定義します。PagingSource オブジェクトは、ネットワークやローカルデータベースなど一つのソースからデータをロードします。

もうひとつは、RemoteMediator です。 これは、ネットワークデータソースとローカルデータキャッシュのようなレイヤー分けされたデータからのページングを管理します。

ViewModel レイヤー

Pager コンポーネントは、PagingSource や PagingConfig オブジェクトから PagingData インスタンスを作成するためのパブリックなAPIを提供します。

ViewModelレイヤーとUIを接続するコンポーネントは、PagingData です。PagingData オブジェクトは、ページ付けされたスナップショットのコンテナです。PagingSourceオブジェクトに問い合わせし、その結果を保持します。

UI レイヤー

UIレイヤーで主要ページングライブラリコンポーネントは、PagingDataAdapterです。RecyclerView のアダプターでページ付けされたデータを取り扱います。

代替として、 独自のカスタムアダプターを作るのに AsyncPagingDataDiffer コンポーネントを使うこともできます。

その他

ページングライブラリについてもっと学ぶために、以下のリソースも参照してください。

👉 Android Paging 
👉 architecture-components-samples/PagingSample at paging3 · android/architecture-components-samples 
👉 architecture-components-samples/PagingWithNetworkSample at paging3 · android/architecture-components-samples 


Detached HEAD を消したい【Android Studio】

以下3つを使います!!

[New Branch]
→ 新ブランチの作成

[Checkout]
→ カレントブランチの移動

[Merge into Current]
→ ブランチのマージ

👉 Android Studio GIT · Ethantron/DRSS_19_20_Season_Auto_Update Wiki 

 

手順

すべて、Android Studio 上のメニューの [VCS] - [Git] から行うことができます。

(または、右下の 「Git:master」から。)

1. テンポラリな新ブランチを作ってローカル [Commit] のみしておく。

2. 「detached HEAD」の起きたブランチを選択して [Checkout] する。

3. テンポラリな新ブランチを選択して [Merge into Current] する。

4. これまで通り、[Commit] や [Push] する。

どうですか。成功しましたね!!

詳細は以下の手順を参考にどうぞ。

1. [VCS] - [Git] - [Branches] - [+New Branch] で テンポラリな名前を入力する。

2. New branch に commit する。 push はしない。

3. [VCS] - [Git] - [Branches]

4. 「detached head」の起きたブランチを選択して checkout する。

5. [VCS] - [Git] - [Branches]

6. 新しく作成したブランチを選択して、merge into current

7. マージが成功したら、 push すると、「detached head」なしに成功する。

👉 git - Detached HEAD Issue in Android Studio - Stack Overflow 


android 電池の最適化 | Doze | スタンバイ | バッテリーセーバー

以前にも書きましたが、いろいろな節電処理が自動に行われているということで。

「電池の最適化」とは、バックグラウンド時にアプリを「スリープ」すること。

👉 ラジオや音楽アプリが勝手に終了する場合 

まずは、adb でカレントなステータスを確認したり、エミュレートしたりして自在に試してみることですよね。

以下の公式リファレンスベースに確認しながら関連の操作や語彙に馴染んでいきましょう。

👉 Doze とアプリ スタンバイ用に最適化する  |  Android デベロッパー  |  Android Developers 

 

Dozeモード

端末を使っていなければアプリのバックグラウンド処理を保留する

アイドルモード開始


$ adb shell dumpsys deviceidle force-idle

アイドルモード終了


$ adb shell dumpsys deviceidle unforce

デバイスを再度アクティブにする


$ adb shell dumpsys battery reset

 

スタンバイモード

アプリを操作していなければ、そのアプリのバックグランド処理を保留します。

スタンバイモードにする


$ adb shell dumpsys battery unplug
$ adb shell am set-inactive {PACKAGENAME} true

アプリ復帰する


$ adb shell am set-inactive {PACKAGENAME} false
$ adb shell am get-inactive {PACKAGENAME}

👉 電源に関する問題をテストする  |  Android デベロッパー  |  Android Developers 

 

アプリ スタンバイ バケット 

各アプリは、その使用パターンに基づいて 5 つの優先度バケットのいずれかに振り分けられます。システムは、各アプリが入っているバケットに基づいて、そのアプリで使用できるデバイス リソースを制限します。


$ adb shell dumpsys battery unplug


$ adb shell am set-standby-bucket {PACKAGENAME} active|working_set|frequent|rare


$ adb shell am set-standby-bucket {PACKAGENAME1} {BUCKET1} {PACKAGENAME2} {BUCKET2}...


$ adb shell am get-standby-bucket [PACKAGENAME]

👉 アプリ スタンバイ バケット  |  Android デベロッパー  |  Android Developers 

 

バックグラウンド制限


$ adb shell cmd appops set {PACKAGENAME} RUN_ANY_IN_BACKGROUND ignore


$ adb shell cmd appops set {PACKAGENAME} RUN_ANY_IN_BACKGROUND allow

 

バッテリーセーバー


$ adb shell dumpsys battery unplug
$ adb shell settings put global low_power 1
$ adb shell dumpsys battery reset

👉 電源管理に関する制限  |  Android デベロッパー  |  Android Developers 

バッテリー操作系


$ adb shell dumpsys battery


$ adb shell dumpsys battery -h

電源を抜く


$ adb shell dumpsys battery unplug 

30%にセット


$ adb shell dumpsys battery set level 30

電源を元に戻す


$ adb shell dumpsys battery reset

 

まとめ

端末や対象のアプリそれぞれのステータスを確認しながら進むと良いででしょう。


$ adb shell dumpsys deviceidle


$ adb shell dumpsys battery


$ adb shell settings list {system|secure|global}


$ adb shell am get-inactive {PACKAGENAME}


$ adb shell am get-standby-bucket [PACKAGENAME]


$ adb shell cmd appops get {PACKAGENAME}

カレントな状態が目で見てはっきり分かると、

自然に次にやるべきことはきちんと見つかります。

👉 電源に関する問題をテストする  |  Android デベロッパー  |  Android Developers 


新型コロナ関連アプリを作っても公開停止だろ?

👉 AppleとGoogleが共同開発のコロナの接触者追跡アプリのインターフェースが公開 - iPhone Mania 

公開されてます。Javaライブラリとして。

👉 google/exposure-notifications-android: Exposure Notifications Android Reference Design 

よおし!

これを利用してアプリ作っちゃうか!

 

新型コロナアプリは勝手に公開できない

2020年4月に、「10万円給付」の前に「30万円給付」という話がありました。

このときに、30万円給付に該当するか確認するアプリを作って公開しようとPlayストアにアップしたのですが、

即停止されました。

その時のメール。

アプリのステータス: Life support temporary benefit (reference) ポリシー違反により   Google Play での公開停止中

審査の結果、お客様のアプリは配慮が求められる事象に関するポリシーに違反していることが判明いたしました。自然災害、残虐行為、紛争、死、その他の悲劇的な事象に対する妥当な配慮を欠く、またはそのような事象を利用するという違反が含まれております。詳しくは、配慮が求められる事象のページをご参照ください。
たとえば、お客様のアプリには現在、正当な情報源なしに、コロナウイルス(COVID-19)への参照が含まれています。

以下のいずれかに該当する場合は、その旨が確認できる書類をご提出ください。

1. アプリの製作者が政府または公的医療機関である場合。
2. アプリの製作者が政府または公的医療機関にアプリ制作依頼を受けている場合(例:WHO、赤十字社、その他の医療機関等にアプリ制作依頼を受けている)。
3. アプリが政府または公的医療機関の承認を得て作成されている場合。

販売 / 配布停止の対象になりますと、Google Play デベロッパー アカウントの状態が良好ではなくなりますので、ご注意ください。違反の繰り返しがあったアプリが否承認となったり削除されたりする場合と同様、著しいポリシー違反や複数のポリシー違反があったアプリは停止となることがございます。

また、文中内「配慮が求められる事象」。

自然災害、残虐行為、紛争、死、その他の悲劇的な事象に対する妥当な配慮を欠く、またはそのような事象を利用するアプリは認められません。
以下に一般的な違反の例を示します。

• 自殺、薬物の過剰摂取、自然死などによる人間の死への配慮が欠けている。
• 大規模な悲劇的事象を否定する。
• 悲劇的な事象から利益を得ているように見える(被害者に恩恵が届いているのか明確でない)。

👉 不適切なコンテンツ | 制限されているコンテンツ - Developer Policy Center 

「corona」でストアを検索すると結構ある。

開発元、パッケージドメインからみるに、政府や公的機関な雰囲気。

👉 corona - Google Play の Android アプリ 

「covid-19」で検索すると、WHOのものしかない。

👉 covid-19 - Google Play の Android アプリ 

 

まとめ

政府や公的医療機関の依頼がない限り、Playストアから公開は無理なのでしょう。

👉 マイナンバーカードの暗証番号入力間違い回数の確認やリセットする方法 
👉 Google | Exposure Notifications API 
👉 Google COVID-19 Exposure Notications Service Additional Terms 


オードリー・タン氏のPRにみる言語選択肢の表示文字

これ。

👉 東京都のコロナ対策サイト、台湾の“天才IT大臣”も改善に参加 オープンソースの取り組み、「胸アツ展開」と話題 - ITmedia NEWS 

👉 Fix language selector label for zh-TW (体 -> 體) by audreyt · Pull Request #827 · tokyo-metropolitan-gov/covid19 

❌ 繁体
⭕ 繁體

ということになります。

あれ、

「繁体」

のほうをよく見かけるような気がしませんか??

本当に「繁体」は間違い?

繁体字(はんたいじ、繁體字、拼音: fántǐzì)

特に中華人民共和国の一連の「文字改革」政策による簡体字(簡化字)との対比によりこう呼ぶ。現在では主に台湾のほか、中華人民共和国の特別行政区である香港・マカオで使用され、中華圏外の華人コミュニティーでも見られる。

👉 繁体字 - Wikipedia 

Google 翻訳のWEB版とアプリ版の選択肢をみてみます。

そうか、

サイトやアプリの「表示している言語」の設定で「言語の選択肢」の表示文字が変わるのですね!

👉 Google Language Codes - tomihasa 

4つの言語に関して、表示されるべき選択肢の文字を見ておきましょう。

hl=ja

英語
中国語(簡体)
中国語(繁体)
日本語

hl=en

English
Chinese (Simplified)
Chinese (Traditional)
Japanese

hl=zh_CN

英语
中文(简体)
中文(繁体)
日语

hl=zh_TW

英文
中文(簡體)
中文(繁體)
日文

オードリー・タン氏は、台湾の方なので、台湾向け言語表示としては

「中文(繁體)」

が選択肢に表示されるべき文字となるのでしょうか。

しかし、東京都のように選択肢の文字自体を表示言語に合わせて翻訳してないサイトもあります。

👉 都内の最新感染動向 | 東京都 新型コロナウイルス感染症対策サイト 

Android Pie 言語設定画面。

Android端末では、以前からこのような実装になっています。

フォントの事情がありますので、端末や文字によっては豆腐や文字化けなどに注意が必要です。

まとめ

呼称や表記でもめたりするネット上で

オードリー・タン氏の台湾愛を見たような気がします。