Skip to content

Instantly share code, notes, and snippets.

View art-shen's full-sized avatar
👨‍💻

Art Shendrik art-shen

👨‍💻
View GitHub Profile
@art-shen
art-shen / EncryptedSettings.kt
Created July 15, 2025 20:07 — forked from AJIEKCX/EncryptedSettings.kt
A secure implementation of SharedPreferences for the MultiplatformSettings library
import android.content.SharedPreferences
import com.google.crypto.tink.Aead
import com.google.crypto.tink.KeysetHandle
import com.google.crypto.tink.RegistryConfiguration
import com.google.crypto.tink.TinkProtoKeysetFormat
import com.google.crypto.tink.aead.AeadConfig
import com.google.crypto.tink.aead.PredefinedAeadParameters
import com.google.crypto.tink.integration.android.AndroidKeystore
import com.google.crypto.tink.subtle.Base64
import com.google.crypto.tink.subtle.Hex
Begin by enclosing all thoughts within <thinking> tags, exploring multiple angles and approaches.
Break down the solution into clear steps within <step> tags. Start with a 20-step budget, requesting more for complex problems if needed.
Use <count> tags after each step to show the remaining budget. Stop when reaching 0.
Continuously adjust your reasoning based on intermediate results and reflections, adapting your strategy as you progress.
Regularly evaluate progress using <reflection> tags. Be critical and honest about your reasoning process.
Assign a quality score between 0.0 and 1.0 using <reward> tags after each reflection. Use this to guide your approach:
0.8+: Continue current approach
0.5-0.7: Consider minor adjustments
Below 0.5: Seriously consider backtracking and trying a different approach
@art-shen
art-shen / RItemAtom.ts
Last active September 29, 2024 20:49
Reatom LazyStoreItem for WebExt
import type {Ctx, LensAtom} from "@reatom/framework";
/**
* Read-only Atom with a `set` method to update the value.
*/
export interface RItemAtom<TValue = unknown> extends LensAtom<TValue> {
readonly set: (ctx: Ctx, value: TValue) => any
}
@art-shen
art-shen / AppleCredentialLauncher.native.kt
Created September 26, 2024 10:06 — forked from Nek-12/AppleCredentialLauncher.native.kt
How to implement Apple Sign in in Kotlin Multiplatform
package pro.respawn.app.feature.account.thirdparty
import androidx.compose.runtime.Composable
import co.touchlab.kermit.Logger
import kotlinx.cinterop.ExperimentalForeignApi
import kotlinx.cinterop.cstr
import kotlinx.cinterop.memScoped
import kotlinx.cinterop.reinterpret
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.suspendCancellableCoroutine
@art-shen
art-shen / DrawGlyphs.kt
Created June 24, 2024 16:48 — forked from halilozercan/DrawGlyphs.kt
A Set of helper functions and classes to draw each individual glyph separately
import androidx.compose.ui.draw.drawWithCache
import androidx.compose.ui.geometry.CornerRadius
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.BlendMode
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.ImageBitmap
@art-shen
art-shen / ColoredShadow.kt
Created June 24, 2024 10:26 — forked from cedrickring/ColoredShadow.kt
Draw a colored shadow in Android Jetpack Compose
/*
Copyright 2020 Cedric Kring.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@art-shen
art-shen / DynamicBottomSheetScaffold.kt
Created March 20, 2024 20:34 — forked from Nek-12/DynamicBottomSheetScaffold.kt
Dynamic non-modal bottom sheet for Compose that fixes existing issues with material3 implementation
import androidx.compose.animation.core.animateDpAsState
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.consumeWindowInsets
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.windowInsetsPadding
@art-shen
art-shen / CMakeLists.txt
Created March 20, 2024 14:36 — forked from blessedbyjobs/CMakeLists.txt
Код, используемый для проверки, что устройство имеет root права
// этот файл поместить в корень проекта
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
// адаптировать под структуру вашего проекта
set(SOURCES src/main/cpp/NativeRootChecker.cpp)
add_library(root_checker_jni SHARED ${SOURCES})
@art-shen
art-shen / StackNavigator.kt
Created March 12, 2024 16:20 — forked from Nek-12/StackNavigator.kt
Decompose - Global navigation events with channel
internal class StackComponent(context: ComponentContext): Component {
private val results = Channel<NavResult<*>>(Channel.CONFLATED)
inline fun <reified R> sendResult(result: R) {
val config = stack.active.configuration
// or popWhile - bring desired page to the front
navigation.pop {
results.trySend(NavResult(config, result))