Skip to content

Instantly share code, notes, and snippets.

View G00fY2's full-sized avatar

Thomas Wirth G00fY2

View GitHub Profile
@Module
@InstallIn(SingletonComponent::class)
internal object DataStoreModule {
@Provides
@Singleton
fun provideMyCacheDataStore(
@ApplicationContext context: Context,
moshi: Moshi,
): DataStore<MyCachedDataClass> {
@G00fY2
G00fY2 / ProjectConfiguration.kt
Last active March 24, 2023 14:55
Check for unstable dependencies in Gradle configurations which where implicitly resolved
configurations.configureEach {
if (this.name.contains("Compile") && !this.name.contains("TestCompile")) {
this.incoming.afterResolve {
this.resolutionResult.allComponents {
if (this.selectionReason.isConflictResolution &&
this.moduleVersion?.version.let {
it != null && isNonStable(it)
}
) {
throw GradleException(
@G00fY2
G00fY2 / GitHookPlugin.kt
Last active January 20, 2023 12:46
Gradle task to generate a git commit hook
package buildplugins
import org.gradle.api.DefaultTask
import org.gradle.api.GradleException
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.model.ObjectFactory
import org.gradle.api.plugins.HelpTasksPlugin.HELP_GROUP
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
@G00fY2
G00fY2 / FormatIBAN.kt
Created November 3, 2022 13:27
Extension function to format IBAN Strings
fun String.formatIBAN(): String {
val iban = replace("\\s+".toRegex(), "").uppercase(Locale.getDefault())
val maxLength = (iban.length * 1.25).roundToInt()
val result = StringBuilder(maxLength)
iban.forEachIndexed { index, c ->
when {
index > 0 && index % 4 == 0 -> result.append(" $c")
else -> result.append(c)
}
}
@G00fY2
G00fY2 / CustomRxJava2CallAdapterFactory.java
Last active November 3, 2022 13:08
CustomRxJava2CallAdapterFactory to transform HttpExceptions to custom error
import com.google.gson.Gson;
import io.reactivex.Completable;
import io.reactivex.Flowable;
import io.reactivex.Maybe;
import io.reactivex.MaybeSource;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.Scheduler;
import io.reactivex.Single;
import java.lang.annotation.Annotation;
@G00fY2
G00fY2 / CustomRxJava3CallAdapterFactory.kt
Created November 3, 2022 13:08
CustomRxJava3CallAdapterFactory to transform HttpExceptions to custom error
import com.squareup.moshi.Moshi
import io.reactivex.rxjava3.core.Completable
import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.core.Maybe
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Scheduler
import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.schedulers.Schedulers
import retrofit2.Call
import retrofit2.CallAdapter
@G00fY2
G00fY2 / TasksRxExtensions.kt
Last active November 3, 2022 12:50
Extension function to convert Google Play Services Tasks result to RxJava Single
import com.google.android.gms.tasks.Task
import io.reactivex.rxjava3.core.Single
import java.util.concurrent.CancellationException
import java.util.concurrent.TimeUnit
fun <T : Any> Task<T>.toSingle(): Single<T> {
return if (isComplete) {
Single.fromCallable(::asRequired)
} else {
Single.create<T> { emitter ->
@G00fY2
G00fY2 / r8.md
Last active September 28, 2022 05:52
R8 Shrinker tweaks

Gradle task that prints the currently used R8 version

tasks.register("printR8Version") {
  try {
    println("R8 version: ${com.android.tools.r8.Version.getVersionString()}")
  } catch (ignored: Exception) {
    println("R8 version: unknown")
  }
}
org.gradle.jvmargs=-Xmx3g -XX:+UseParallelGC
org.gradle.daemon=true
org.gradle.caching=true
org.gradle.parallel=true
org.gradle.configureondemand=false
org.gradle.vfs.watch=true
@G00fY2
G00fY2 / GetLinkPreviewDataInteractorImpl.kt
Last active March 21, 2022 18:02
Extract link preview data from given URL
class GetLinkPreviewDataInteractorImpl @Inject constructor(
private val okHttpClient: OkHttpClient
) : GetLinkPreviewDataInteractor {
override fun execute(url: String): Single<LinkPreviewData> {
return Single.fromCallable {
okHttpClient.newCall(Builder().url(url).build()).execute().use { response ->
val requestedUrl = response.request.url.toString()
Jsoup.parse(response.body!!.string()).let {