Skip to content

Instantly share code, notes, and snippets.

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

Eko Yulianto ekoo

🏠
Working from home
View GitHub Profile
@ekoo
ekoo / ComposeFragment.kt
Last active October 12, 2022 00:45
Base class for single activity using multiple fragment with compose view
import android.os.Bundle
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.ComposeView
import androidx.fragment.app.Fragment
import com.google.android.material.transition.MaterialSharedAxis
abstract class ComposeFragment: Fragment() {
@ekoo
ekoo / TurvlPrivacyPolicy.txt
Created November 9, 2020 03:51
Turvl Android Privacy Policy
Kebijakan Privasi Turvl
Dengan mendownload aplikasi turvl anda otomatis tunduk dengan kebijakan privasi Turvl.
Turvl saat ini masih dalam tahap mengembangan, kami menggunakan data dummy ( bukan data sebenarnya )
yang diambil dari berbagai sumber di internet guna keperluan presentasi / demo.
Selama masih dalam tahap pengembangan kami belum menggunakan data anda.
Kebijakan ini dapat berubah sewaktu-waktu, anda dapat mengecek secara berkala
class StateAdapter(private val retry: () -> Unit) : LoadStateAdapter<StateAdapter.LoadStateViewHolder>() {
override fun onBindViewHolder(holder: LoadStateViewHolder, loadState: LoadState) {
holder.bind(loadState)
}
override fun onCreateViewHolder(parent: ViewGroup, loadState: LoadState): LoadStateViewHolder {
return LoadStateViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_load_state, parent, false), retry)
}
class MainViewModel(private val repository: MainRepository = MainRepository()): ViewModel() {
fun movieList() = repository.getMovie().cachedIn(viewModelScope)
}
class MainRepository {
fun getMovie(): Flow<PagingData<ResponseModel.MovieModel>> {
val moviePagingConfig = PagingConfig(pageSize = 10)
val moviePagingFactory= { MoviePagingSource() }
return Pager(config = moviePagingConfig , pagingSourceFactory = moviePagingFactory).flow
}
class MoviePagingSource(private val service: MovieServices = MovieServiceBuilder.build()) : PagingSource<Int, ResponseModel.MovieModel>() {
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, ResponseModel.MovieModel> {
val pagePosition = params.key ?: STARTING_PAGE_INDEX
return try {
val data = service.getMovie(API_KEY, LANGUAGE, pagePosition).movieList //using retrofit
val prevKey = if (pagePosition == STARTING_PAGE_INDEX) null else pagePosition - 1
lifecycleScope.launch {
NetworkInfo().checkConnection(this@MainActivity).collect { connected ->
if (connected){
//make some magic
}
}
}
class NetworkInfo {
@Suppress("DEPRECATION")
@ExperimentalCoroutinesApi
fun checkConnection(context: Context) = callbackFlow{
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkRequest = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.................
val timeLeft: LiveData<Int> get() = _timeLeft
private val _timeLeft = MutableLiveData(60)
private val countDownTimer = flow {
for (timeLeftOnTimer in 60 downTo 0){
emit(timeLeftOnTimer)
delay(1000)
}
}
........
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProvider(this)[MainViewModel::class.java]
tapMeButton = findViewById(R.id.tapMeButton)
gameScoreTextView = findViewById(R.id.gameScoreTextView)
timeLeftTextView = findViewById(R.id.timeLeftTextView)