Skip to content

Instantly share code, notes, and snippets.

View JoaquimLey's full-sized avatar
👨‍💻
Product oriented, software perfectionist and developer

Joaquim Ley JoaquimLey

👨‍💻
Product oriented, software perfectionist and developer
View GitHub Profile
import androidx.recyclerview.widget.ListAdapter
/**
* Creates a copy of itself if no new [data] is passed, this is used
* so [ListAdapter] correctly diffs and animates. :facepalms:
*/
fun <T> List<T>.refresh(data: List<T> = this): List<T> {
return mutableListOf<T>().apply { addAll(data) }.toList()
}
// Extension function
fun TabLayout.setupWithViewPager2(
viewPager: ViewPager2,
callback: (TabLayout.Tab, Int) -> Unit
) {
TabLayoutMediator(this, viewPager) { tab, position ->
callback.invoke(tab, position)
}.attach()
}
fun RecyclerView.applyToolbarNavigationViewWithFabInsets() {
applyVerticalInsets()
clipToPadding = false
addItemDecoration(RecyclerViewToolbarItemDecoration())
addItemDecoration(RecyclerViewBottomNavigationViewFabItemDecoration())
}
/************************************************
* Insets Section *
************************************************/
/*******************
* Utility methods *
*******************/
fun View.applySystemBarPaddingInsets() {
this.doOnApplyWindowInsets { view, insets, padding, _ ->
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
...
<item name="android:windowLightStatusBar">true</item>
<item name="android:statusBarColor">@color/colorStatusBar</item>
<item name="android:windowBackground">@color/colorWindowBackground</item>
<item name="android:navigationBarColor">@color/colorNavigationBar</item>
<item name="android:windowLightNavigationBar">true</item>
<item name="android:navigationBarDividerColor">@color/colorNavigationBarDivider</item>
open class RecyclerViewMarginItemDecoration(
private val sizeInDp: Int = 16,
private val isTop: Boolean = false
) : RecyclerView.ItemDecoration() {
override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
super.getItemOffsets(outRect, view, parent, state)
if (isTop) {
if (parent.getChildAdapterPosition(view) == 0) {
outRect.top = sizeInDp.toPx()
import androidx.annotation.MainThread
import androidx.annotation.Nullable
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import java.util.concurrent.atomic.AtomicBoolean
/**
public class BusListActivity extends AppCompatActivity implements LifecycleRegistryOwner,
BusListAdapter.ClickListener {
private final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);
private BusListViewModel viewModel;
private BusListAdapter adapter;
private ContentLoadingProgressBar progressDialogView;
public class BusRepository {
private static BusRepository sInstance;
private final RemoteRepository remoteRepository;
private final BusDao busDao;
public static BusRepository getInstance(RemoteRepository remoteRepository, BusDao busDao) {
if (sInstance == null) {
@JoaquimLey
JoaquimLey / IntroVideoView.java
Created April 12, 2017 16:02
A simple VideoView subclass that displays in full screen while keeping the aspect ration
/**
* Subclass of VideoView to enable video scaling
* CustomAttribute: "scaleType": "normal", "centerCrop", "fill"
* <p>
* Add this stylable:
* <declare-styleable name="IntroVideoView">
* <attr name="scaleType" format="integer">
* <flag name="normal" value="0" />
* <flag name="centerCrop" value="1" />
* <flag name="fill" value="2" />