Android Upgrade Invite

Upgrade Invite は、Android OS の最新メジャー アップグレードに含まれている主要な新機能を紹介するユーザーフローです。

このフローは、ユーザーが納得して最新版の OS にデバイスをアップグレードできるようにするためのものです。

ユーザーが承認を保留している OS アップグレードがデバイスにあると、新機能を表示して、アップグレードを促すプッシュ通知がユーザーに届きます。

Android OS で Upgrade Invite を有効にするには、Android Upgrade Invite の有効化リクエスト フォームを使用して登録します。

Upgrade Invite のエクスペリエンスをカスタマイズする

Upgrade Invite のエクスペリエンスは、次の方法でカスタマイズできます。

  • 無関係な機能を削除する。
  • テキスト ブロックの言語を更新する。
  • ブランドに合わせてアニメーション、色、フォントを変更する。

フローをカスタマイズするには、Upgrade Invite スタイルガイドのガイドラインを確認し、Android Upgrade Invite の有効化リクエスト フォームにカスタマイズ情報を記載します。

Upgrade Invite スタイルガイド

このスタイルガイドを使用し、独自のブランドに合わせて Upgrade Invite のデザイン(画面、色、フォント)を変更します。サイズと構造は元のデザインに近いものにすることを強くおすすめします。

Upgrade Invite のフローには、次の 3 つのコンポーネントがあります。

  • イントロ画面
  • 機能画面
  • アウトロ画面
図 1. Upgrade Invite のフローにおける 3 つの画面タイプ

各画面のアニメーションで各機能を説明できます。

イントロ画面

イントロ画面には、ユーザーを歓迎し、イントロ画面に表示されるフローを開始するよう促す短いアニメーションが含まれます。

レイアウト
図 2.Upgrade Invite のイントロ画面のワイヤーフレーム レイアウト

デバイスのアニメーションは、常に次のもので構成されます。

  • 白い背景とカラフルな図形
  • デバイス フレーム
  • UI コンテンツ
スタイル設定

Material You のスタイル設定を採用する場合は、例に示すデフォルトの色と図形を使用できます。

図 3. Upgrade Invite のフローのデフォルト カラーパターン。

独自のブランドカラーを使用する場合は、UI の背景に合ったものにしてください。

モーション

方法 1: ホーム画面に時計がある

  1. 数字が画面に現れます。
  2. 数字が中央に向かって徐々にズームアウトしていきます。スマートフォンのフレームが現れます。
  3. スマートフォンが徐々にズームアウトします。図形が画面に現れ始めます。
  4. アニメーションが完了します。図形は穏やかに動き続けます。
図 4. 時計のある Upgrade Invite のイントロ画面アニメーションのワイヤーフレーム レイアウト。
図 5. 時計のあるイントロ画面のアニメーションの例。

方法 2: ホーム画面に時計がない

  1. スマートフォンが画面に現れます。
  2. スマートフォンが中央に向かって徐々にズームインしてきます。図形が画面に現れ始めます。
  3. スマートフォンが最大サイズに達します。図形は動き続けます。
図 6. 時計のない Upgrade Invite のイントロ画面アニメーションのワイヤーフレーム レイアウト。
図 7. 時計のないイントロ画面のアニメーションの例。

機能画面

それぞれの機能画面で、新しい OS の機能が 1 つ紹介されます。

レイアウト
図 8. Upgrade Invite の機能画面のワイヤーフレーム レイアウト。

デバイスのアニメーションは、常に次のもので構成されます。

  • カラフルな背景
  • デバイスのフレーム
  • UI コンテンツ
スタイル設定
  • UI コンテンツと一般的な外観に合った背景色を選びます。
  • 画面内で読みやすいフォントサイズを設定します。必要に応じてフォントサイズを大きくします。
モーション

タップ操作を含め、各機能のフローのアニメーションを録画します。録画を Lottie ファイルとしてエクスポートします。

アウトロ画面

アウトロ画面でフローが完了し、すべての画面が表示されたことがユーザーに伝えられます。

レイアウト
図 9. Upgrade Invite のアウトロ画面のワイヤーフレーム レイアウト

デバイスのアニメーションは、常に次のもので構成されます。

  • 背景に半円(加えて、アニメーションが付いた図形)
  • デバイスのフレーム
  • UI コンテンツ
スタイル設定
  • UI コンテンツと一般的な外観に合った背景色を選びます。
  • 半円の図形を使用します。
モーション

以下の標準的なアウトロ画面のアニメーション フローに従います。

  1. スマートフォンが少し上に移動します。
  2. 背景に円が表示されます。
  3. 図形がスマートフォンの後ろから出てきます。
  4. 図形は紙吹雪のように背景から飛び出します。
図 10. Upgrade Invite のアウトロ画面アニメーションのワイヤーフレーム レイアウト
図 11. アウトロ画面のアニメーションの例

Upgrade Invite のフローをテストする

  1. Android デバイスで、[設定] > [Google] > [Upgrade Party debug] に移動します。
  2. 該当するデバイス OS での Upgrade Invite のトリガーを準備します(現在の OS バージョン、およびテストする Upgrade Invite フローによって異なります)。次のいずれかです。
    1. [疑似アップグレードの書き込み(現在のバージョン)] をクリックします(たとえば Android 13 OS を実行している場合、Android 13 のテストフローがトリガーされます)。
    2. [保留中のアップグレードの書き込み(現在のバージョン + 1)] をクリックします(たとえば Android 12 OS を実行している場合、Android 13 のテストフローがトリガーされます)。
    3. [OS アップグレードを報告] をクリックします。
  3. 届いた通知をクリックするか、[Upgrade Invite を開く] をクリックします。

Upgrade Invite のトリガー オプション

Upgrade Invite フローをトリガーするには、次の 3 つの方法があります。 1. 自動 2. ブロードキャスト 3. Play 開発者サービス SDK でトリガー

自動 - Google がトリガーする通知(gOTA を実行しているデバイスのみ)

gOTA を実行している OEM デバイスの場合、統合は自動で行われるため、Upgrade Invite の統合手順は不要です。保留中のメジャー OS アップグレードが検出されると、プッシュ通知が Google Play 開発者サービスからデバイスに送信され、Upgrade Invite フローが始まります。

Android ブロードキャスト - Google がトリガーする通知(推奨)

Upgrade Invite フローを統合する方法として推奨される最も簡単な方法が、アプリ ブロードキャストです。

ブロードキャスト レシーバにより、ブロードキャスト メッセージを使用してアプリから Upgrade Invite フローをトリガーできます。ブロードキャストによりプッシュ通知が Google Play 開発者サービスからデバイスに送信され、Upgrade Invite フローが始まります。

ブロードキャストの前提条件

アプリを準備するには、以下のセクションに示す手順を完了します。

アプリの構成ファイルで次の値が使用されていることを確認します。

  • 14 以上の minSdkVersion
  • 28 以上の compileSdkVersion
  • android.permission.RECOVERY の usesPermission

ブロードキャストを送信する

以下の手順により、OEM アプリ(またはコード)で Android ブロードキャストを送信してプッシュ通知をトリガーできます。

  1. アクション付きのブロードキャストを送信します。

    com.google.android.gms.growth.upgradeparty.upgradeinvite.ACTION_SYSTEM_UPDATE
    
  2. com.google.android.gms パッケージをブロードキャストに追加します。

    com.google.android.gms
    

追加の要件

Upgrade Invite フローを使用すると、ユーザーがこのフローから直接 OS をアップグレードすることも可能です。

そのためにはカスタム インテントを公開します。カスタム インテントは、アップグレードのダウンロードをトリガーする Upgrade Invite フローから Google が呼び出せます。

ブロードキャストの使用例

次のアプリケーション ブロードキャストの例をご覧ください。

Context context = getApplicationContext();
Intent upgradeInviteIntent = new Intent()
  .setAction( "com.google.android.gms.growth.upgradeparty.upgradeinvite.ACTION_SYSTEM_UPDATE")
  .setPackage("com.google.android.gms");
  .putExtra("com.google.android.gms.growth.upgradeparty.upgradeinvite.EXTRA_PENDING_ANDROID_OS_VERSION_NUMBER", 14);

context.sendBroadcast(updateIntent);

EXTRA_PENDING_ANDROID_OS_VERSION_NUMBER キーの値は、保留中の OS バージョンを示す整数値です(この例では、インストールする Android バージョンは 14)。この値に基づいて、トリガーされる Upgrade Invite フローが決まります。

Play 開発者サービス SDK - フローのトリガーのみ

サードパーティ SDK により、アプリまたは OTA 通知から Upgrade Invite フローをトリガーできます。サードパーティの外部 API を使用して Upgrade Invite フロー自身を有効化しますが、この方法はあまりおすすめしません。

前提条件

アプリを準備するには、以下のセクションに示す手順を完了します。

アプリのビルドファイルで次の値が使用されていることを確認します。

  • 14 以上の minSdkVersion
  • 28 以上の compileSdkVersion

アプリを構成する

次のようにしてアプリを構成します。

1. Extract the library from the provided .zip file, and place it in your

リポジトリ。 2. Google Growth SDK の依存関係をモジュールのアプリレベルの Gradle ファイル(通常は app/build.gradle)に追加します。

   dependencies {
    implementation files('<PATH_TO_BINARY>/play-services-growth-16.1.0-eap04.aar')
   }
  1. クライアントの依存関係を指定するには、次のライブラリを追加します。

    com.google.android.gms:play-services-base:18.0.1
    com.google.android.gms:play-services-basement:18.0.0
    com.google.android.gms:play-services-tasks:18.0.1
    

API の初期化

  1. クライアントを初期化するには、UpgradeParty クラスを使用します。

    import com.google.android.gms.growth.UpgradeParty;
    UpgradeParty.getClient(activity);
    
  2. アクティビティ パラメータには、起動元の Activity オブジェクトを設定します。

API 関数

得られる UpgradePartyClient は、次の関数を公開します。

isEligibleForUpgradeInvite

import com.google.android.gms.growth.UpgradeInviteEligibilityParams;

Task<Boolean> isEligibleForUpgradeInvite(UpgradeInviteEligibilityParams params);

/** Contains parameters for the eligibility query. */
class UpgradeInviteEligibilityParams {


/** Integer indicating the pending OS version (in this example, the Android version to be installed is 14). This is used to determine which Upgrade Invite flow will be triggered. */
  int pendingAndroidOsVersionNumber;
}

ユーザーが Upgrade Invite の条件を満たしているかどうかを非同期で検証する Task オブジェクトが返されます。結果のブール値は、ユーザーが条件を満たしているかどうかを示しています。

invokeUpgradeInvite

Task<Void> invokeUpgradeInvite();

Upgrade Invite アクティビティを起動します。結果の _Task_ オブジェクトは、このアクティビティの開始時にエラーが発生したかどうかを示します。

エラー コード

どちらの API メソッドも、エラーになると com.google.android.gms.common.api.ApiException 型の例外をスローします。その場合、呼び出し元は後で再試行します。想定される一般的なステータス コードは次のとおりです。

  • INTERNAL_ERROR - 内部ロジックのフローで発生したエラー
  • TIMEOUT - リクエストを時間内に処理できなかった場合
  • API_NOT_CONNECTED - API が使用できない場合(UpgradeParty モジュールがまだ用意できていない)
  • NETWORK_ERROR - ネットワーク エラーが原因でリクエストを処理できない
  • DEVELOPER_ERROR - 呼び出し元のパッケージに UpgradeParty API に対するアクセス権がない

SDK の使用例

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import com.google.android.gms.growth.UpgradeParty;
import com.google.android.gms.growth.UpgradePartyClient;

public class SampleActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   final UpgradePartyClient client = UpgradeParty.getClient(this);

   // Hide the invocation button initially
   View startUpgradeInviteButton = findViewById(R.id.__some_button__);
   startUpgradeInviteButton.setVisibility(View.GONE);

   // Register an onClick handler to invoke the Upgrade Party Activity
   startUpgradeInviteButton
       .setOnClickListener(
           view -> {
             client
                 .invokeUpgradeInvite()
                 .addOnCompleteListener(
                     task -> {
                       if (!task.isSuccessful()) {
                         // Do something with error, see task.getException()
                       }
                     });
           });
   }

   // Check if eligible for an Upgrade Party
   client
       .isEligibleForUpgradeInvite()
       .addOnCompleteListener(
           task -> {
             if (!task.isSuccessful()) {
               // Do something with error, see task.getException()
             } else {
                  // Show/Hide invocation button, based on the result
                  int visibility = 
                        task.getResult() ? View.VISIBLE : View.GONE;
                  startUpgradeInviteButton.setVisibility(visibility);
             }
           });
   }