Skip to content

Instantly share code, notes, and snippets.

View omkar-tenkale's full-sized avatar
☸️
Planning

Omkar Tenkale omkar-tenkale

☸️
Planning
View GitHub Profile
@omkar-tenkale
omkar-tenkale / README.md
Created October 27, 2024 08:31
Example of declaring Android signing configs using Gradle Kotlin DSL with gitignore keystore.properties

Using keystore.properties files (create it in project root, gitignored)

Contents of keystore.properties

storePassword=mypass
keyPassword=mypass
keyAlias=key0
@omkar-tenkale
omkar-tenkale / OpusFileUtil.java
Last active September 20, 2024 12:45
Trim opus without FFMPEG in JAVA
// I had partial success, the file plays but in media players the duration will be shown of original audio and the position jumping to trimmed section
// with dependency on https://github.com/leonfancy/oggus
// See issue: https://github.com/leonfancy/oggus/issues/2
import org.chenliang.oggus.ogg.OggPage;
import org.chenliang.oggus.ogg.OggStream;
suspendCoroutineUninterceptedOrReturn<Unit> { cont ->
Compressor.compress(image)(
onSuccess = {
DispatcherContinuation(cont.context, cont).resumeWith(Result.success(Unit))
}
)
COROUTINE_SUSPENDED
}
fun copyFiles(files: List<File>, destination: File){
for(file in files){
launch(Dispatcher.Background){
...
}
}
}
class FileCopyFragment : Fragment() {
fun copyFiles(files: List<File>, destination: File) {
launch(Dispatcher.Background) {
for (file in files) {
val needsOverride = destination.listFiles()?.any { it.name == file.name } ?: false
if (needsOverride && !confirmFileOverride(file.name)) {
continue
}
file.copyTo(destination)
}
fun <T> (suspend () -> T).createCoroutine(
completion: Continuation<T>
): Continuation<Unit> {
val coroutine = createCoroutineUnintercepted(completion)
return DispatcherContinuation(completion.context,coroutine)
}
import android.os.Handler
import android.os.Looper
import kotlin.concurrent.thread
import kotlin.coroutines.Continuation
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.intrinsics.createCoroutineUnintercepted
import kotlin.coroutines.intrinsics.suspendCoroutineUninterceptedOrReturn
import kotlin.coroutines.intrinsics.COROUTINE_SUSPENDED
sealed class Dispatcher : CoroutineContext.Element {
suspend fun <T> suspendCoroutine(block: (Continuation<T>) -> Unit): T {
return suspendCoroutineUninterceptedOrReturn { cont ->
// block(cont)
val dispatchedContinuation = DispatcherContinuation(cont.context, cont)
block(dispatchedContinuation)
COROUTINE_SUSPENDED
}
}
// Resumes a coroutine on specified dispatcher
class DispatcherContinuation<T>(
override val context: CoroutineContext,
val continuation: Continuation<T>
) : Continuation<T> {
override fun resumeWith(result: Result<T>) {
when (context as Dispatcher) {
Dispatcher.Main -> Handler(Looper.getMainLooper()).post {
continuation.resumeWith(result)
}
fun launch(dispatcher: Dispatcher, block: suspend () -> Unit) {
val callback = object : Continuation<Unit> {
override val context: CoroutineContext = dispatcher
override fun resumeWith(result: Result<Unit>) {}
}
val coroutine = block.createCoroutineUnintercepted(callback)
// Duplicate code #1
when (dispatcher) {
Dispatcher.Main -> Handler(Looper.getMainLooper()).post {
coroutine.resumeWith(Result.success(Unit))