ifLinkマイクロサービスでGoogleアカウント選択画面を表示するには

#はじめに
ifLinkマイクロサービスを開発している八教と申します。

Google Fit API を用いて歩数取得をifLinkマイクロサービスを作成する際、
歩数を取得にはGoogleFitの情報にアクセスするための許可を得る必要があります。
UI有であれば特に気にせずアカウントID選択画面を表示するコードを組み込めば良いのですが、
UIがなくバックグラウンドでGoogle Fit情報を取得したい場合にどうやって
アカウントID選択画面を表示するかで難儀したので記載します。

#検証環境情報
開発環境：AndroidStudio 3.6
検証端末：Oppo A5 2020 Android version 10

#ifLinkとは
https://iflink.jp/

#GoogleFitのアカウント選択画面
GoogleFit情報にアクセスしたいアカウント選択の画面表示のソースコードは以下の通り
https://developers.google.com/fit/android/api-client-example

                FitnessOptions fitnessOptions =
                        FitnessOptions.builder()
                                .addDataType(DataType.TYPE_STEP_COUNT_CUMULATIVE)
                                .addDataType(DataType.TYPE_STEP_COUNT_DELTA)
                                .addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA)
                                .build();
                GoogleSignIn.requestPermissions(
                        this,
                        REQUEST_OAUTH_REQUEST_CODE,
                        GoogleSignIn.getLastSignedInAccount(getActivity()),
                        fitnessOptions);

#ifLinkマイクロサービスへの実装
ifLinkマイクロサービスではIMS設定メニューでLOG出力可否を選択する画面があります。
今回はGoogleFIT情報を取得する際に必要なアカウントID選択をIMS設定メニューで設定できるようにし、
マイクロサービスをインストール後にGoogleFIT情報取得に必要なアカウントID選択を行い認証してからマイクロサービスを利用していただく流れとします。

BaseSettingsActivity クラスを継承したクラスでGoogleアカウントID選択をされた場合にGoogleアカウントID選択画面を表示するよう実装します。
Androidでは設定画面を作る仕組みがJetpackで提供されており、PreferenceFragmentCompatがその役割を提供しています。

    @Override
    protected PreferenceFragmentCompat getFragment() {
       return new Fragment();
    }

IMS設定メニューでGoogleFit情報取得のアカウントID選択をタップされた際にアカウントID選択画面を表示します。

    public static class Fragment extends BasePreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
        @Override
        public void onDisplayPreferenceDialog(Preference preference) {
            if (preference.getKey().equals("googleaccountkey") ) {
                Log.d(TAG, "onDisplayPreferenceDialog2");
                FitnessOptions fitnessOptions =
                        FitnessOptions.builder()
                                .addDataType(DataType.TYPE_STEP_COUNT_CUMULATIVE)
                                .addDataType(DataType.TYPE_STEP_COUNT_DELTA)
                                .addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA)
                                .build();
                GoogleSignIn.requestPermissions(
                        this,
                        REQUEST_OAUTH_REQUEST_CODE,
                        GoogleSignIn.getLastSignedInAccount(getActivity()),
                        fitnessOptions);
            }else{
                super.onDisplayPreferenceDialog(preference);
                Log.d(TAG, "onDisplayPreferenceDialog4");
            }
        }

        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            Log.i(TAG, "requestCode=" + requestCode);
            Log.i(TAG, "data=" + data);

            if (resultCode == Activity.RESULT_OK) {
                if (requestCode == REQUEST_OAUTH_REQUEST_CODE) {
                    Toast.makeText(getActivity().getApplicationContext(), "googleアカウントが有効です", Toast.LENGTH_LONG).show();
                    Log.i(TAG, "googleアカウントが有効です");
                }
            }
            else{
                Toast.makeText(getActivity().getApplicationContext(), "googleアカウントが無効です", Toast.LENGTH_LONG).show();
                Log.i(TAG, "resultCode == " + resultCode);
                Log.i(TAG, "googleアカウントが無効です");
            }
        }
    }

IMS設定メニューでGoogleFitの情報を取得したいアカウント選択画面を表示します。
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <MultiSelectListPreference
        android:entries="@array/pref_log_level_list_title"
        android:entryValues="@array/pref_log_level_list_values"
        android:key="@string/pref_log_level_key"
        android:summary="@string/pref_log_level_summary"
        android:title="@string/pref_log_level" />

    <EditTextPreference
        android:defaultValue="@string/pref_ggfitimsdevice_settings_parameter_default1"
        android:key="googleaccountkey"
        android:selectAllOnFocus="true"
        android:singleLine="true"
        android:summary="@string/pref_ggfitimsdevice_settings_parameter_summary1"
        android:title="@string/pref_ggfitimsdevice_settings_parameter_name1" />

    <EditTextPreference
        android:defaultValue="@string/pref_ggfitimsdevice_settings_parameter_default2"
        android:key="@string/pref_ggfitimsdevice_settings_parameter_key2"
        android:selectAllOnFocus="true"
        android:singleLine="true"
        android:summary="@string/pref_ggfitimsdevice_settings_parameter_summary2"
        android:title="@string/pref_ggfitimsdevice_settings_parameter_name2" />

</PreferenceScreen>

ifLinkエンジンの環境設定からGoogleアカウントを選択する画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780474/cfd9e3c8-eaa5-07dc-2dc7-bd39ef02652c.png)