Skip to content

Instantly share code, notes, and snippets.

View yasukotelin's full-sized avatar

Yasuhiro Kikura yasukotelin

View GitHub Profile
@yasukotelin
yasukotelin / ShowIfNotAdded.kt
Created May 30, 2022 04:04
DialogFragmentの重複表示を避ける拡張関数
/**
* 同じtagのDialogFragmentの存在チェックを実施し、ない場合に限り表示する
*
* @tag タグ名でチェックするため、一意の値を指定してください
*/
fun DialogFragment.showIfNotAdded(fragmentManager: FragmentManager, tag: String) {
if ((fragmentManager.findFragmentByTag(tag) as? DialogFragment)?.dialog == null) {
showNow(fragmentManager, tag)
}
}
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import kotlin.math.abs
enum class ScrollDirection {
FORWARD, BACKWARD, IDLE,
/**
* Eventに値が流れてきていないことをAssertする
*/
suspend fun <T> FlowTurbine<T>.assertAwaitItemIsNotReceived() {
try {
awaitItem()
Assert.fail("Expected no event was received in time")
} catch (e: TimeoutCancellationException) {
// SharedFlowに値が流れてこないと[TimeoutCancellationException]が発生するため、それを正とする
}
@yasukotelin
yasukotelin / TabLayout.kt
Last active February 14, 2022 09:12
Tabの要素数によってTab Modeを切り替えるExtension
import android.view.ViewGroup
import com.google.android.material.tabs.TabLayout
/**
* Tab表示が画面に収まる場合と収まらない場合とでTab mode指定を切り替える
*
* Tabサイズが画面に収まる場合は[TabLayout.MODE_FIXED]
* Tabサイズが画面に収まらない場合は[TabLayout.MODE_SCROLLABLE]
*/
fun TabLayout.adjustTabMode() {
@yasukotelin
yasukotelin / BottomSheetDialogFragmentExtensions.kt
Created July 29, 2021 02:11
BottomSheetDialogFragmentを全画面表示するExtension。onViewCreatedでcallする。
/**
* BottomSheetDialogを全画面表示する
*/
fun BottomSheetDialogFragment.fullScreen() {
dialog?.setOnShowListener { dialog ->
val d = dialog as BottomSheetDialog
val bottomSheet =
d.findViewById<FrameLayout>(R.id.design_bottom_sheet) ?: return@setOnShowListener
bottomSheet.layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT
val screenHeight = Resources.getSystem().displayMetrics.heightPixels
@yasukotelin
yasukotelin / Center.kt
Created June 10, 2021 03:44
Jetpack Compose Center composable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@Composable
fun Center(
modifier: Modifier = Modifier,
@yasukotelin
yasukotelin / MainBottomNavigationFragment.kt
Created November 26, 2020 16:26
android / architecture-components-samplesのNavigationExtension.ktをFragment呼び出しに対応したバージョン
class MainBottomNavigationFragment : DaggerFragment() {
private var _binding: FragmentMainBottomNavigationBinding? = null
private val binding get() = _binding!!
// activityViewModels()しないように注意
// activityスコープなどでViewModelを作りたい場合は別のViewModelを作ること(MainBottomNavigationViewModelなど
private val navigateExtensionsViewModel: NavigateExtensionsViewModel by viewModels()
private val navGraphIds = listOf(
@yasukotelin
yasukotelin / KotlinOriginalResult.kt
Last active November 25, 2020 08:55
kotlin-result紹介用のスニペットたち
fun main(args: Array<String>) {
when (val r1 = getUser()) {
is Result.Success -> {
when (val r2 = login(r1.data)) {
is Result.Success -> {
when (val r3 = setupSomething()) {
is Result.Success -> {
println("Success")
}
import android.view.HapticFeedbackConstants
import android.view.MotionEvent
import android.view.View
/**
* Viewへのタップイベントに対してHaptic feedbackするヘルパー
*/
class HapticOnTapHelper : HapticOnTouchHelper {
override fun onTouch(v: View, e: MotionEvent): Boolean {
val isHandled = v.onTouchEvent(e)
fun Fragment.performHapticFeedback(effectId: Int) {
val vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
vibrator.vibrate(VibrationEffect.createPredefined(effectId))
}
}