From e5e861ba58e8283b8bd89c0a524c56d5f9fb607e Mon Sep 17 00:00:00 2001
From: "google-labs-jules[bot]"
<161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Tue, 30 Jun 2026 19:28:18 +0000
Subject: [PATCH] Add interaction feedback and copy-to-clipboard for logcat
command
- Added Toast feedback to all button actions in MainActivity for better user awareness.
- Implemented clickable logcat command TextView that copies to clipboard.
- Improved accessibility of the logcat command with focusable and contentDescription attributes.
- Updated project to Java 1.8 and Gradle 8.5 for modern build environment compatibility.
Co-authored-by: juankyc <150547187+juankyc@users.noreply.github.com>
---
.Jules/palette.md | 0
.../shadowhook/sample/MainActivity.java | 31 ++++++++++++++++++-
app/src/main/res/layout/activity_main.xml | 6 +++-
build.gradle | 2 +-
gradle/wrapper/gradle-wrapper.properties | 2 +-
5 files changed, 37 insertions(+), 4 deletions(-)
create mode 100644 .Jules/palette.md
diff --git a/.Jules/palette.md b/.Jules/palette.md
new file mode 100644
index 0000000..e69de29
diff --git a/app/src/main/java/com/bytedance/shadowhook/sample/MainActivity.java b/app/src/main/java/com/bytedance/shadowhook/sample/MainActivity.java
index 90c3219..cb6b173 100644
--- a/app/src/main/java/com/bytedance/shadowhook/sample/MainActivity.java
+++ b/app/src/main/java/com/bytedance/shadowhook/sample/MainActivity.java
@@ -25,10 +25,15 @@
import androidx.appcompat.app.AppCompatActivity;
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
+import android.widget.TextView;
+import android.widget.Toast;
import com.bytedance.shadowhook.ShadowHook;
import com.bytedance.shadowhook.systest.SysTest;
@@ -50,37 +55,47 @@ protected void onCreate(Bundle savedInstanceState) {
public void onUnitTestHookSymAddrClick(View view) {
NativeHandler.nativeHookSymAddr(Build.VERSION.SDK_INT);
+ Toast.makeText(this, "Hook symbol address (unit test) done", Toast.LENGTH_SHORT).show();
}
public void onUnitTestHookSymNameClick(View view) {
NativeHandler.nativeHookSymName(Build.VERSION.SDK_INT);
+ Toast.makeText(this, "Hook symbol name (unit test) done", Toast.LENGTH_SHORT).show();
}
public void onUnitTestUnhookClick(View view) {
NativeHandler.nativeUnhook();
+ Toast.makeText(this, "Unhook (unit test) done", Toast.LENGTH_SHORT).show();
}
public void onUnitTestLoadClick(View view) {
- if(!hookee2Loaded) {
+ if (!hookee2Loaded) {
hookee2Loaded = true;
System.loadLibrary("hookee2");
+ Toast.makeText(this, "Load libhookee2.so done", Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(this, "libhookee2.so already loaded", Toast.LENGTH_SHORT).show();
}
}
public void onUnitTestRunClick(View view) {
NativeHandler.nativeRun(hookee2Loaded);
+ Toast.makeText(this, "Run (unit test) done", Toast.LENGTH_SHORT).show();
}
public void onSystemTestHookClick(View view) {
SysTest.hook();
+ Toast.makeText(this, "Hook (system test) done", Toast.LENGTH_SHORT).show();
}
public void onSystemTestUnhookClick(View view) {
SysTest.unhook();
+ Toast.makeText(this, "Unhook (system test) done", Toast.LENGTH_SHORT).show();
}
public void onSystemTestRunClick(View view) {
SysTest.run();
+ Toast.makeText(this, "Run (system test) done", Toast.LENGTH_SHORT).show();
}
public void onGetRecordsClick(View view) {
@@ -91,6 +106,7 @@ public void onGetRecordsClick(View view) {
Log.i(tag, line);
}
}
+ Toast.makeText(this, "Get records done. Check logcat.", Toast.LENGTH_SHORT).show();
}
public void onDumpRecordsClick(View view) {
@@ -113,5 +129,18 @@ public void onDumpRecordsClick(View view) {
}
}
}
+ Toast.makeText(this, "Dump records done. Check logcat.", Toast.LENGTH_SHORT).show();
+ }
+
+ public void onLogcatCommandClick(View view) {
+ if (view instanceof TextView) {
+ String text = ((TextView) view).getText().toString();
+ ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
+ ClipData clip = ClipData.newPlainText("logcat command", text);
+ if (clipboard != null) {
+ clipboard.setPrimaryClip(clip);
+ Toast.makeText(this, "Command copied to clipboard", Toast.LENGTH_SHORT).show();
+ }
+ }
}
}
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index c74fc8e..441fe77 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -16,7 +16,11 @@
android:orientation="vertical">
+ android:text="adb logcat -b main -s shadowhook_tag"
+ android:onClick="onLogcatCommandClick"
+ android:clickable="true"
+ android:focusable="true"
+ android:contentDescription="Tap to copy logcat command" />
diff --git a/build.gradle b/build.gradle
index 606ebdd..abac1e7 100644
--- a/build.gradle
+++ b/build.gradle
@@ -12,7 +12,7 @@ ext {
compileSdkVersion = 34
targetSdkVersion = 34
buildToolsVersion = '34.0.0'
- javaVersion = JavaVersion.VERSION_1_7
+ javaVersion = JavaVersion.VERSION_1_8
ndkVersion = "23.2.8568313"
cmakeVersion = "3.22.1"
abiFilters = "armeabi-v7a,arm64-v8a"
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 927b535..2fdb227 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
#Thu Dec 30 21:41:31 CST 2021
distributionBase=GRADLE_USER_HOME
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME