Skip to content

Instantly share code, notes, and snippets.

View osipxd's full-sized avatar
💭
I may be slow to respond.

Osip Fatkullin osipxd

💭
I may be slow to respond.
View GitHub Profile
import com.squareup.moshi.JsonClass
import com.squareup.moshi.Types
import okhttp3.ResponseBody
import retrofit2.Converter
import retrofit2.Retrofit
import java.lang.reflect.Type
/**
* Конвертер серверных ответов, построенных на принципе помещения полезной нагрузки в Json-объект data.
* Результат конвертации - содержимое data.
org.bukkit
org.bukkit.advancement
org.bukkit.attribute
org.bukkit.block
org.bukkit.block.banner
org.bukkit.block.data
org.bukkit.block.data.type
org.bukkit.block.structure
org.bukkit.boss
org.bukkit.command
@osipxd
osipxd / EventsQueue.kt
Created March 27, 2020 11:22
ViewModel and LiveData extensions
import androidx.annotation.MainThread
import androidx.lifecycle.MutableLiveData
import java.util.LinkedList
import java.util.Queue
/**
* Класс-очередь для обработки временных событий, не являющихся частью View
* Например, показ SnackBar с сообщением или ошибкой.
*/
class EventsQueue : MutableLiveData<Queue<Event>>() {
@osipxd
osipxd / EpoxyAnchorView.kt
Created February 11, 2022 06:29
Anchor view for DiffUtil.
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Canvas
import android.util.AttributeSet
import android.view.View
import com.airbnb.epoxy.ModelView
/**
* Вьюха-якорь, которая нужна чтобы в зафиксировать положение скролла в `RecyclerView`.
*
@osipxd
osipxd / tooling.md
Last active March 22, 2022 12:56
Tooling. Tips&Tricks - Notes

Tooling. Tips&Tricks

Материалы к докладу на митап Redmadrobot 30 апреля.

Habr | YouTube | Презентация

Git

  • Merging vs. Rebasing - сравнение подходов с merge и rebase от Atlassian. У них вообще много хороших статей, очень советую.
  • Why you should stop using Git rebase - какие сложности могут возникнуть, если чрезмерно увлечься rebase.
  • Pro Git. Git Tools - Rewriting History - глава из книги Pro Git. Подробно описывается работа с interactive rebase. Про stash, patch, cherry-pick можно почитать там же.
@osipxd
osipxd / 1. sign-app.sh
Last active August 13, 2022 21:23
Script to sign APK and AAB from command line
#!/usr/bin/env bash
#
# Script for APK and AAB signing.
#
# Usage: ./sign-app.sh <format> <path_to_app> <keystore_base64> <properties_base64>
#
# format - should be one of: apk or aab
# path_to_app - path to apk/aab file or '--auto' to automatically detect path
# keystore_base64 - Base64 encoded keystore file
# properties_base64 - Base64 encoded properties file. This file should contain:
package io.example
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.decodeFromStream
import okhttp3.Interceptor
import okhttp3.Response
import retrofit2.HttpException
import retrofit2.Invocation
import java.io.IOException
@osipxd
osipxd / CachingRxJava2CallAdapterFactory.kt
Last active September 15, 2022 07:41
Caching RxJava2 call adapter for Retrofit2
package retrofit2.adapter.rxjava2
import io.reactivex.Completable
import io.reactivex.Flowable
import io.reactivex.Maybe
import io.reactivex.Observable
import io.reactivex.Single
import retrofit2.Call
import retrofit2.CallAdapter
import retrofit2.Retrofit
@osipxd
osipxd / DataStoreSerializer.kt
Created November 21, 2022 10:13
DataStore Serializer using kotlinx-serialization
import androidx.datastore.core.DataStore
import androidx.datastore.core.Serializer
import kotlinx.coroutines.flow.first
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.decodeFromStream
import kotlinx.serialization.json.encodeToStream
import java.io.InputStream
import java.io.OutputStream
/**
@osipxd
osipxd / DataStoreNullableSerializer.kt
Last active November 21, 2022 10:17
Base Serializer class to store nullable values in DataStore
import androidx.datastore.core.DataStore
import androidx.datastore.core.Serializer
import java.io.InputStream
import java.io.OutputStream
abstract class NullableSerializer<T : Any> : Serializer<T?> {
override val defaultValue: T? = null
final override suspend fun readFrom(input: InputStream): T? {