Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions app/src/main/kotlin/eu/hxreborn/cleanshare/CleanShareModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import android.os.Bundle
import eu.hxreborn.cleanshare.hook.deletion.CheckboxHook
import eu.hxreborn.cleanshare.hook.deletion.DeletionHook
import eu.hxreborn.cleanshare.hook.directshare.LowRamHooker
import eu.hxreborn.cleanshare.hook.directshare.ServiceTargetCountHooker
import eu.hxreborn.cleanshare.hook.directshare.ShareTargetsHooker
import eu.hxreborn.cleanshare.hook.quickshare.QuickShareFilterHooker
import eu.hxreborn.cleanshare.util.findClass
Expand Down Expand Up @@ -54,6 +55,7 @@ class CleanShareModule(
when (param.packageName) {
SHARE_SHEET_PKG -> {
hookLowRam()
hookServiceTargetCountFallback(param.classLoader)
hookScreenshotDelete(param.classLoader)
hookQuickShareFilter(param.classLoader)
}
Expand All @@ -76,6 +78,19 @@ class CleanShareModule(
}
}

// Fallback for ROMs where ART inlines isLowRamDeviceStatic() into ChooserListAdapter
private fun hookServiceTargetCountFallback(classLoader: ClassLoader) {
runCatching {
val clazz = classLoader.loadClass("com.android.intentresolver.ChooserListAdapter")
val method = clazz.getDeclaredMethod("getServiceTargetCount")
method.isAccessible = true
hook(method, ServiceTargetCountHooker::class.java)
log("Hooked ChooserListAdapter.getServiceTargetCount")
}.onFailure {
log("getServiceTargetCount hook failed: ${it.message}")
}
}

// Insert "Delete after sharing" checkbox for screenshot shares
private fun hookScreenshotDelete(classLoader: ClassLoader) {
val chooserClass = findClass(classLoader, CHOOSER_CLASS_NAMES)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package eu.hxreborn.cleanshare.hook.directshare
import eu.hxreborn.cleanshare.CleanShareModule
import eu.hxreborn.cleanshare.util.PREFS_FILE_NAME
import eu.hxreborn.cleanshare.util.PREF_KEY_HIDE_DIRECT_SHARE
import eu.hxreborn.cleanshare.util.debugLog
import io.github.libxposed.api.XposedInterface.BeforeHookCallback
import io.github.libxposed.api.XposedInterface.Hooker
import io.github.libxposed.api.annotations.BeforeInvocation
Expand Down Expand Up @@ -41,3 +42,21 @@ class ShareTargetsHooker : Hooker {
}
}
}

@XposedHooker
class ServiceTargetCountHooker : Hooker {
companion object {
@JvmStatic
@BeforeInvocation
fun before(callback: BeforeHookCallback) {
val module = CleanShareModule.instance ?: return
val prefs = module.getRemotePreferences(PREFS_FILE_NAME)
val enabled = prefs?.getBoolean(PREF_KEY_HIDE_DIRECT_SHARE, true) ?: true
debugLog { "[DirectShare] getServiceTargetCount called, enabled=$enabled" }
if (enabled) {
callback.returnAndSkip(0)
}
}
}
}

Loading