Androidの便利なヘルパークラスまとめ

## はじめに
Bison改め南里です。
筋トレアドベントカレンダー、完全に失念していました。遅れてすみません。。。
学生の頃から筋トレが好きでよく筋トレをしていました。
ただ、今は筋トレよりは、怪我をしない強靭な体づくりに集中しています。
高校でバスケを引退してからも大学のサークル、また社会人になってからも週一程度でバスケをしていたのですが、大きな怪我をしたからです。
ですので、ファンクショナルトレーニングが日課です。
なんか筋トレアドベントカレンダーなので何か言わなきゃと意味のないことを語ってしまいました。
早速参りましょう。

## Androidについて
本日はAndroid周りの知識について話したいと思います。
Android開発においての鬼門はOSの後方互換性だと思います。
ご自身で実装し、以下のような処理をすることは多々あると思います。

```back_compatible_support.kt
fun getHoge() = if (Build.VERSION.SDK_INT > 19) {
    // hogehoge
} else {
    // fugafuga
}
```

めんどくさいですよね。
IDEが警告出してくれるとはいえ、忘れてしまうこともあるのではないでしょうか？(default warningなので)
ただ、Androidでは上記のような後方互換性を意識したHelperたちが存在します。
車輪の再開発にならないように、積極的にAndroid SDKが提供する便利なAPIたちを利用していきましょう。


## ContextCompat

### Colorリソースの参照

```color_resource.kt
val color = ContextCompat.getColor(context, android.R.color.white)
textView.setTextColor(color)
```

### 各権限周りの確認

```permission.kt
// permissionは文字配列でpermissionを入れる
val checkSelfPermission = ContextCompat.checkSelfPermission(context, permission)
when (checkSelfPermission) {
    PackageManager.PERMISSION_DENIED -> {
        // permission denied
    }
    PackageManager.PERMISSION_GRANTED -> {
        // permission granted
    }
    else -> {
        // hogefuga
    }
}

```

## DrawableCompat

### Drawableリソースの参照

```drawable_resource.kt
val drawable = DrawableCompat.wrap(ContextCompat.getDrawable(context, drawableResId))

```

## ViewCompat


### ViewのBackgroundリソースの設定

```view_background.kt
val drawable = DrawableCompat.wrap(ContextCompat.getDrawable(context, drawableResId))
ViewCompat.setBackground(view, drawable);
```

## IntentCompat

### 該当Intent候補の作成

```intent_compat.kt
startActivity(IntentCompat.makeMainSelectorActivity(Intent.ACTION_MAIN, Intent.CATEGORY_LAUNCHER))
```

指定のActionとCategoryに該当するAppを以下のように選択肢として表示できます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/43762/830289e5-1d6f-6cb7-0c2c-44f158e69ac7.png" width="300"/>


## NotificationCompat
### 通知設定

```notification.kt
val builder = NotificationCompat.Builder(context, channelId)
            .setSmallIcon(R.drawable.ic_launcher)
```


以上は後方互換性を意識したAPIたちでしたが、他にも簡単に便利なUtilsたちを紹介しておきます。


## TextUtils

### 文字列チェック

```TextUtils.kt
// 空 or Nullであることのチェック
TextUtils.isEmpty(string)

// 文字列自体の同値 or 同等
TextUtils.equals(stringA, stringB)
```


## Uri.Builder

## URI作成
```uri_builder.kt
val uri = Uri.Builder().scheme("scheme")
        .authority("authority")
        .path("path")
        .appendQueryParameter("nickname", "bison")
uri.build()

// output is 'scheme://authority/path?nickname=bison'
```

## DiffUtils

### RecyclerViewの差分更新

```update_item.kt
val diff = DiffUtil.calculateDiff(object : DiffUtil.Callback() {
            override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int) = oldItems[oldItemPosition].id == newItems[newItemPosition].id

            override fun getOldListSize() = oldItems.size

            override fun getNewListSize() = newItems.size

            override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int) = oldItems[oldItemPosition] == newItems[newItemPosition]

        })
diff.dispatchUpdatesTo(adapter)
```


### 最後に
簡単ですが、よく使う機能たちを並べてみました。
他に便利なfunctionがあれば、教えて下さい。
それではよいお年を。