【Android】Firebase Remote Config で、アプリの挨拶文を変更する

体育会系エンジニア Advent Calendar 2017 16日目です。

静岡県でサッカー部でしたが、全く関係ないことを。。。

# [Firebase Remote Config](https://firebase.google.com/docs/remote-config/?hl=ja) とは

>Firebase Remote Config は、アプリのアップデートをユーザーにダウンロードしてもらわなくても、アプリの動作と外観を変更できるクラウド サービスです。

主な用途は、
`Remote Config のランダム割り当て機能` と `Firebase 向け Google アナリティクス`を使って、
ユーザー層のさまざまなセグメントに対してアプリの機能改善の A/B テストを行えるもの　

ですが、今回は、これを使って、挨拶文をコンソールから変更します。

# プロジェクト作成(主な実装)

## 1. `<プロジェクトルート>/app`に、`google-services.json` を配置する

下記をご参考ください。

- [Android プロジェクトに Firebase を追加する](https://firebase.google.com/docs/android/setup)
    - [Firebase を手動で追加する](https://firebase.google.com/docs/android/setup#manually_add_firebase)
    - [SDK を追加する](https://firebase.google.com/docs/android/setup#add_the_sdk)
    - [Firebase Remote Config を Android で使用する](https://firebase.google.com/docs/remote-config/use-config-android?hl=ja)

## 2. `remote_config_defaults.xml` を作成する
```app/src/main/res/xmlremote_config_defaults.xml
<?xml version="1.0" encoding="utf-8"?>
<defaultsMap>
    <entry>
        <key>greeting_message</key>
        <value>こんにちは！</value>
    </entry>
    <entry>
        <key>greeting_message_color</key>
        <value>#000000</value>
    </entry>
</defaultsMap>
```

ファイル名は、なんでも良いです。

## 3. `<プロジェクトルート>/build.gradle`に加筆する
```build.gradle
buildscript {
    ext.kotlin_version = '1.2.10'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        classpath 'com.google.gms:google-services:3.1.1'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

```

## 4. `<プロジェクトルート>/app/build.gradle`に加筆する
```
apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

apply plugin: 'kotlin-kapt'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "com.mkitahara.remoteconfigsample"
        minSdkVersion 18
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding {
        enabled = true
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'

    kapt 'com.android.databinding:compiler:3.0.1'

    implementation 'com.google.firebase:firebase-core:11.6.2'
    implementation 'com.google.firebase:firebase-config:11.6.2'

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'
```

ポイントは、`apply plugin: 'com.google.gms.google-services'`をファイルの最下部に定義します


## 5. MainActivity.kt を実装します
```MainActivity.kt
class MainActivity : AppCompatActivity() {

    companion object {
        // キャッシュをゼロ秒にする
        val CACHE_EXPIRATION: Long = 0L
        val KEY_GREETING_MESSAGE: String = "greeting_message"
        val KEY_GREETING_MESSAGE_COLOR: String = "greeting_message_color"
    }

    private lateinit var mFirebaseRemoteConfig: FirebaseRemoteConfig

    private lateinit var mBinding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        // FirebaseRemoteConfig の インスタンスを取得
        mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance()

        // デベロッパーモードをONにする
        val configSettings = FirebaseRemoteConfigSettings.Builder()
                .setDeveloperModeEnabled(BuildConfig.DEBUG)
                .build()
        mFirebaseRemoteConfig.setConfigSettings(configSettings)

        // 取得失敗時のデフォルトデータを用意する(1で作成したファイルを設定する)
        mFirebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults)

        // フェッチとコールバックを設定
        mFirebaseRemoteConfig.fetch(CACHE_EXPIRATION).addOnCompleteListener(this@MainActivity) { task ->
            if (task.isSuccessful) {
                Toast.makeText(this@MainActivity, "Fetch Succeeded", Toast.LENGTH_SHORT).show()
                // フェッチした値を有効にする
                mFirebaseRemoteConfig.activateFetched()
            } else {
                Toast.makeText(this@MainActivity, "Fetch Failed", Toast.LENGTH_SHORT).show()
            }
            displayWelcomeMessage()
        }
    }

    private fun displayWelcomeMessage() {
        // 文言変更
        val welcomeMessage = mFirebaseRemoteConfig.getString(KEY_GREETING_MESSAGE)
        mBinding.greetingMessage.text = welcomeMessage

        // 色変更
        val welcomeMessageColor = mFirebaseRemoteConfig.getString(KEY_GREETING_MESSAGE_COLOR)
        mBinding.greetingMessage.setTextColor(Color.parseColor(welcomeMessageColor))
    }
}
```

# 実行

![Screenshot_20171216-020903.jpg](https://qiita-image-store.s3.amazonaws.com/0/152872/fb4e3306-325f-ee8e-7e3b-455c037253e1.jpeg)

**デフォルトのメッセージが表示されます。**

# コンソールで操作する
##### 1. [Firebaseコンソール](https://console.firebase.google.com)でプロジェクトに移動
##### 2. `Remote Config` を選択
##### 3. 文言を変更する
##### 4. キーとバリューを追加して、変更を保存する

<img width="400" alt="スクリーンショット 2017-12-16 2.12.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/152872/3e2ca9e8-c242-2fe8-7e2b-efaa5f52ee85.png">

##### 5. 結果

![Screenshot_20171216-021332.jpg](https://qiita-image-store.s3.amazonaws.com/0/152872/7b2c307e-c3e4-5961-2237-c10209e39035.jpeg)

##### 6. 別のメッセージに変更する

<img width="400" alt="スクリーンショット 2017-12-16 2.32.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/152872/ac61f34a-166e-b0a3-ae68-0061ab5d91db.png">

##### 7. 再起動

![Screenshot_20171216-023300.jpg](https://qiita-image-store.s3.amazonaws.com/0/152872/6494a388-563c-8a1a-992a-07abbb008730.jpeg)


# まとめ

Firebase便利ですね〜。アプリ開発に必須なものや、サービス作れそうなものもあるのでいろいろ試してみたい。(時間があれば。。)