diff --git a/.Jules/palette.md b/.Jules/palette.md
new file mode 100644
index 0000000..f34065d
--- /dev/null
+++ b/.Jules/palette.md
@@ -0,0 +1,3 @@
+## 2025-01-30 - State Feedback for Native Operations
+**Learning:** For buttons triggering one-time native operations like library loading, providing immediate visual state changes (disabling and updating text) prevents redundant user actions and clarifies the current application state.
+**Action:** Always disable "Load" or "Hook" buttons and update their labels to "Loaded" or "Hooked" upon successful execution to provide clear, persistent feedback.
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..1572dc8 100644
--- a/app/src/main/java/com/bytedance/shadowhook/sample/MainActivity.java
+++ b/app/src/main/java/com/bytedance/shadowhook/sample/MainActivity.java
@@ -29,6 +29,7 @@
import android.os.Bundle;
import android.util.Log;
import android.view.View;
+import android.widget.Button;
import com.bytedance.shadowhook.ShadowHook;
import com.bytedance.shadowhook.systest.SysTest;
@@ -64,6 +65,10 @@ public void onUnitTestLoadClick(View view) {
if(!hookee2Loaded) {
hookee2Loaded = true;
System.loadLibrary("hookee2");
+
+ Button btn = (Button) view;
+ btn.setEnabled(false);
+ btn.setText(R.string.load_libhookee2_done);
}
}
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index c74fc8e..a29ec2a 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -39,7 +39,7 @@
+ android:text="@string/load_libhookee2" />