Skip to content

Instantly share code, notes, and snippets.

View hamurcuabi's full-sized avatar
🏠
Working from home

Emre Hamurcu hamurcuabi

🏠
Working from home
View GitHub Profile
@hamurcuabi
hamurcuabi / CancellationExceptionInCoroutineCatchRule.kt
Last active July 25, 2025 07:22
A custom Detekt rule that enforces rethrowing CancellationException (or calling ensureActive()) inside:, try/catch blocks in suspend functions and runCatching blocks used inside coroutines
import io.gitlab.arturbosch.detekt.api.CodeSmell
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.Debt
import io.gitlab.arturbosch.detekt.api.Entity
import io.gitlab.arturbosch.detekt.api.Issue
import io.gitlab.arturbosch.detekt.api.Rule
import io.gitlab.arturbosch.detekt.api.Severity
import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution
import org.jetbrains.kotlin.builtins.isSuspendFunctionType
@hamurcuabi
hamurcuabi / Bogo.kt
Created September 1, 2024 10:07
Bogo with kmp,compose,canvas
package com.hamurcuabi.bogo
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material.MaterialTheme
import androidx.compose.runtime.*
@hamurcuabi
hamurcuabi / SharedViewModel.kt
Created January 7, 2024 12:01
SharedViewModel
class SharedViewModel() : ViewModel() {
var data: String = "SharedViewModel Data"
private set
}
import android.os.Bundle
import android.widget.ProgressBar
import android.widget.TextView
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
class MainActivity : AppCompatActivity() {
private val mainViewModel: MainViewModel by viewModels()
package com.hamurcuabi.myapplication
import android.content.Context
import android.graphics.Typeface
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.FrameLayout
import androidx.core.view.isVisible
import com.hamurcuabi.myapplication.databinding.ViewCustomToolbarBinding
class HomeFragment : Fragment(),
OnBackPressedDelegation by OnBackPressedDelegationImpl() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
registerOnBackPressedDelegation(activity, this.lifecycle) {
// OnBackPressed fired!!!
}
}
}
class OnBackPressedDelegationImpl : OnBackPressedDelegation, DefaultLifecycleObserver {
private val onBackPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
onBackPressed.invoke()
}
}
private var fragmentActivity: FragmentActivity? = null
interface OnBackPressedDelegation {
fun registerOnBackPressedDelegation(
fragmentActivity: FragmentActivity?,
lifecycle: Lifecycle,
onBackPressed: () -> Unit
)
}
@hamurcuabi
hamurcuabi / HomeFragment.kt
Created October 29, 2022 13:18
Without Delegation
class HomeFragment : Fragment() {
private val onBackPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
// On back pressed
}
}
override fun onResume() {
super.onResume()
import android.app.Activity
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat.shouldShowRequestPermissionRationale
import androidx.fragment.app.Fragment
object PermissionUtil {