Skip to content

Instantly share code, notes, and snippets.

@pksokolowski
pksokolowski / Spinner.kt
Last active March 13, 2022 20:09
A simplistic, generic spinner view for Jetpack Compose
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.material.DropdownMenu
import androidx.compose.material.DropdownMenuItem
import androidx.compose.material.Icon
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowDropDown
@pksokolowski
pksokolowski / PrintRGB.kt
Created December 26, 2021 10:57
Colorful print and println for Kotlin for terminals with TrueColor support.
private const val reset = "\u001b[0m"
fun printc(content: String, r: Int, g: Int, b: Int) = print("\u001b[38;2;$r;$g;${b}m" + content + reset)
fun printlnc(content: String, r: Int, g: Int, b: Int) = println("\u001b[38;2;$r;$g;${b}m" + content + reset)
@pksokolowski
pksokolowski / PermissionsShop.kt
Created May 17, 2020 17:47
A quick attempt at automatization and encapsulation of permissions handling on Android.
import android.app.Activity
import android.content.pm.PackageManager
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.github.pksokolowski.trainingplanner.di.PerApp
import javax.inject.Inject
/**
* A universal permissions helper. It should be injected both where you need to ask for a
* given permission and in the underlying activity. Within the activity, in
@pksokolowski
pksokolowski / Voice.kt
Last active March 2, 2020 20:31
A very simple class utilizing TTS engine on an Android phone to say something out loud.
/**
* Utilizes TextToSpeech engine on the device to speak out loud what you want it to say.
*/
@PerApp
class Voice @Inject constructor(
private val context: Application
) {
private var isTtsReady = false
private var tts: TextToSpeech? = null
private var postponedTextToSay: String? = null
@pksokolowski
pksokolowski / IconView.kt
Last active April 18, 2020 15:45
Android custom view starting point to copy-paste instead of remembering. This is a simple case of a view displaying parameters from xml and offering an onclick functionality.
import android.content.Context
import android.util.AttributeSet
import android.widget.LinearLayout
import kotlinx.android.synthetic.main.icon_view.view.*
class IconView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null
) : LinearLayout(context, attrs) {
@pksokolowski
pksokolowski / RequestRunner.kt
Created November 21, 2019 02:24
A helper reducing repeated code with network calls made using coroutines. Along with a usage sample.
import com.github.pksokolowski.posty.di.PerApp
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import javax.inject.Inject
@PerApp
class RequestRunner @Inject constructor(private val ongoingTasksTracker: OngoingTasksTracker) {
@pksokolowski
pksokolowski / UsageSampleDialogFragment.kt
Created October 29, 2019 07:02
Android: fix for DialogFragment's size issues when a recyclerView lives inside it. This extension method allows you to hardcode in the desired dimensions of the dialog fragment as percentages of the available screen real estate.
class HelpDialogFragment : androidx.fragment.app.DialogFragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_help, null)
}
@pksokolowski
pksokolowski / multiple.kt
Created May 25, 2019 17:09
Kotlin events, with one and many listeners.
private fun raiseMoveMade() = moveMade.forEach { it.invoke() }
val moveMade = mutableListOf<() -> Unit>()
// invoking
raiseMoveMade()
// assigning a listener (in the outside world)
moveMade += { uiSounds.playMove() }
@pksokolowski
pksokolowski / using.kt
Created March 14, 2019 17:44
Adding a language-feature-like functionality in Kotlin and Lisp for comparison. Using a simplified "using" statement as an example.
// some setup
interface IDisposable {
fun dispose()
}
data class Handle(val resource: String) : IDisposable {
override fun dispose() {
println("Disposing of $this")
}