Skip to content

Instantly share code, notes, and snippets.

@ivaniskandar
ivaniskandar / reflection thingy
Last active December 13, 2017 13:44
usual java reflection to see overlay apk and see the overlayed apk
for (PackageInfo pi : context.getPackageManager().getInstalledPackages(0)) {
try {
Class piClass = pi.getClass();
Field overlaytargetField = piClass.getDeclaredField("overlayTarget");
overlaytargetField.setAccessible(true);
String target = overlaytargetField.get(pi).toString();
if (target != null) {
Log.d("lmao", pi.packageName + " is overlaying: " + target);
}
@ivaniskandar
ivaniskandar / hextransparency.txt
Last active April 6, 2020 10:32
Hex transparency
100% — FF (primary text dark)
99% — FC
98% — FA
97% — F7
96% — F5
95% — F2
94% — F0
93% — ED
92% — EB
91% — E8
@ivaniskandar
ivaniskandar / keybase.md
Created February 19, 2020 16:35
keybase.md

Keybase proof

I hereby claim:

  • I am ivaniskandar on github.
  • I am ivaniskandar (https://keybase.io/ivaniskandar) on keybase.
  • I have a public key ASAYZyLMAFWWHq8uqugLKb3m7HTKK7egjP9xrQf0N8VZSgo

To claim this, I am signing this object:

@ivaniskandar
ivaniskandar / SYNO.API.Info.json
Last active January 7, 2022 22:52
Synology DSM 6 API query
{
"data":{
"SYNO.API.Auth":{
"maxVersion":6,
"minVersion":1,
"path":"auth.cgi"
},
"SYNO.API.Encryption":{
"maxVersion":1,
"minVersion":1,
@ivaniskandar
ivaniskandar / SignUtils.kt
Created June 7, 2020 05:57
get signature
// https://stackoverflow.com/a/53407183
fun Context.getApplicationSignature(packageName: String): List<String> {
val signatureList: List<String>
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
// New signature
val sig = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES).signingInfo
signatureList = if (sig.hasMultipleSigners()) {
// Send all with apkContentsSigners
sig.apkContentsSigners.map {
@ivaniskandar
ivaniskandar / utils.kt
Created June 9, 2020 07:24
Get device Samsung OneUI version
fun Context.getOneUiVersion(): Double {
if (!isSemAvailable()) {
return 1.0
}
val semPlatformIntField: Field = Build.VERSION::class.java.getDeclaredField("SEM_PLATFORM_INT")
val version: Int = semPlatformIntField.getInt(null) - 90000
return if (version < 0) {
1.0
} else {
((version / 10000).toString() + "." + version % 10000 / 100).toDouble()
/**
* ui_night_mode | ui_night_mode_override
* twilight-night-on 0 | 0
* twilight-night-off 0 | 1
* twilight-day-on 0 | 1
* twilight-night-off 0 | 0
* manual-on 2 | 1
* manual-off 1 | 1
*
* References:
@ivaniskandar
ivaniskandar / gist:e4a0f630437db7035ba731218daa8d4a
Created April 14, 2022 17:47
get android app round icon id
val appContext = context.createPackageContext(packageName, 0)
val res = appContext.resources
// val cookie = res.assets.findCookieForPath(appContext.applicationInfo.sourceDir)
val apkCount = appContext.applicationInfo.splitSourceDirs.count() + 1
(0..apkCount).forEach { cookie ->
res.assets.openXmlResourceParser(cookie, "AndroidManifest.xml").use {
var eventType: Int
while (true) {
eventType = it.nextToken()
if (eventType == XmlPullParser.START_TAG && it.name == "application") {
@ivaniskandar
ivaniskandar / ScreenTransition.kt
Last active October 23, 2024 14:56
Predictive Back gesture support for Voyager (Jetpack Compose 1.7.0-alpha05+)
import androidx.activity.BackEventCompat
import androidx.activity.compose.PredictiveBackHandler
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.AnimatedContentTransitionScope
import androidx.compose.animation.ContentTransform
import androidx.compose.animation.EnterTransition
import androidx.compose.animation.ExitTransition
import androidx.compose.animation.SizeTransform
import androidx.compose.animation.core.AnimationSpec
import androidx.compose.animation.core.ExperimentalTransitionApi