Skip to content

Commit af3479a

Browse files
committed
Update
1 parent 424b9fb commit af3479a

4 files changed

Lines changed: 110 additions & 3 deletions

File tree

app/src/main/assets/home/bin/notiservice

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
show_help(){
44
echo "Use: notiservice -d|--delete false -id|--id 123 -t|--title 'Hello' -m|--message 'Xin chào'"
5-
exit 0
65
}
76

87
if [[ $# -eq 0 || "$1" != -* ]]; then
9-
show_help
8+
show_help >&2
9+
exit 1
1010
fi
1111

1212
DELETE=""; ID=""; TITLE=""; MESSAGE="";
@@ -44,6 +44,7 @@ done
4444

4545
# Mặc định
4646
CMDs="startservice -n com.tool.tree/com.tool.tree.NotiService "
47+
4748
[ "$DELETE" == "true" ] && CMDs+="--ez delete true "
4849
[ "$ID" ] && CMDs+="--ei id $ID "
4950
[ "$TITLE" ] && CMDs+="--es title \"$TITLE\" "
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#!/data/data/com.tool.tree/files/home/bin/bash
2+
3+
show_help(){
4+
echo "Use: showbanner -t|--title 'Hello' -m|--message 'Xin chào'"
5+
echo
6+
echo "-ty|--type: info, warning, success, error"
7+
echo "-i|--icon: path/icon.png, kr_shortcut_logo"
8+
echo "-p|--position: top, bottom"
9+
}
10+
11+
if [[ $# -eq 0 || "$1" != -* ]]; then
12+
show_help >&2
13+
exit 1
14+
fi
15+
16+
TYPE=""; ICON=""; TITLE=""; MESSAGE=""; POSITION=""; AMON="";
17+
while [ $# -gt 0 ]; do
18+
case "$1" in
19+
-ty|--type)
20+
TYPE="$2"
21+
shift 2
22+
;;
23+
-i|--icon)
24+
ICON="$2"
25+
shift 2
26+
;;
27+
-p|--position)
28+
POSITION="$2"
29+
shift 2
30+
;;
31+
-t|--title)
32+
TITLE="$2"
33+
shift 2
34+
;;
35+
-m|--message)
36+
MESSAGE="$2"
37+
shift 2
38+
;;
39+
-a|--am)
40+
AMON=1
41+
shift
42+
;;
43+
-h|--help)
44+
show_help
45+
;;
46+
*)
47+
echo "Unknown option: $1" >&2
48+
exit 1
49+
;;
50+
esac
51+
done
52+
53+
# Mặc định
54+
CMDs="broadcast -n com.tool.tree/com.tool.tree.BannerReceiver -a com.tool.tree.broadcast.BANNER "
55+
56+
[ "$TYPE" ] && CMDs+="--es type \"$TYPE\" "
57+
[ "$ICON" ] && CMDs+="--es icon \"$ICON\" "
58+
[ "$POSITION" ] && CMDs+="--es position \"$POSITION\" "
59+
[ "$TITLE" ] && CMDs+="--es title \"$TITLE\" "
60+
[ "$MESSAGE" ] && CMDs+="--es message \"$MESSAGE\" "
61+
62+
if [ "$AMON" == 1 ] || [ -z "$shell_progres" ]; then
63+
eval "am $CMDs" &>/dev/null
64+
else
65+
echo "am:[$CMDs]"
66+
fi

app/src/main/java/com/omarea/krscript/ui/DialogLogFragment.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,22 @@ class DialogLogFragment : DialogFragment() {
621621
private fun updateLogWithColor(text: String, forcedColor: Int?) {
622622
var parsedLog: CharSequence = AnsiColorParser.parse(text)
623623

624+
// Lệnh `clear` trong script sẽ phát ra mã CSI xoá màn hình (ESC[2J/ESC[3J), được
625+
// AnsiColorParser nhận diện ở trên. Xoá sạch logBuffer ngay tại đây (background
626+
// thread) và đánh dấu invalid từ vị trí 0 để lần flushToUi() kế tiếp thay thế TOÀN
627+
// BỘ nội dung cũ đang hiển thị bằng nội dung mới (thường là rỗng), giống hệt cách
628+
// xử lý ghi đè do '\r' - không cần đụng trực tiếp vào UI thread, tránh race với
629+
// pendingUiUpdate/flushToUi.
630+
if (AnsiColorParser.consumePendingClear()) {
631+
synchronized(logBuffer) {
632+
logBuffer.clear()
633+
lineCount = 0
634+
lineStart = 0
635+
pendingOverwrite = false
636+
markInvalidFrom(0)
637+
}
638+
}
639+
624640
if (forcedColor != null && !text.contains("\u001B[")) {
625641
val spannable = SpannableStringBuilder(parsedLog)
626642
spannable.setSpan(

app/src/main/java/com/tool/tree/AnsiColorParser.kt

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ object AnsiColorParser {
4444
private var isReverse = false
4545
private var isDim = false
4646

47+
// Cờ báo hiệu đã gặp mã CSI xoá toàn bộ màn hình (ESC[2J / ESC[3J) trong lần parse() gần
48+
// nhất, để nơi gọi (DialogLogFragment) biết cần xoá sạch log buffer + UI, mô phỏng đúng
49+
// hành vi lệnh `clear` trong terminal thật (trước đây các mã này bị bỏ qua hoàn toàn).
50+
private var clearScreenRequested = false
51+
4752
private val ANSI_16_COLORS = intArrayOf(
4853
Color.BLACK,
4954
Color.RED,
@@ -107,8 +112,15 @@ object AnsiColorParser {
107112
val finalByte = m.group(3)
108113
if (finalByte == "m") {
109114
parseAnsiParameters(params)
115+
} else if (finalByte == "J") {
116+
// Erase in Display: 2 = xoá toàn màn hình, 3 = xoá toàn màn hình + scrollback
117+
// (phần mở rộng của xterm, ncurses hiện đại thường phát cả 2 mã này khi
118+
// chạy lệnh `clear`). 0/1 chỉ xoá một phần màn hình nên không coi là "clear".
119+
if (params == "2" || params == "3") {
120+
clearScreenRequested = true
121+
}
110122
}
111-
// Các CSI khác (cursor move, clear line, hide cursor...) -> bỏ qua, không render
123+
// Các CSI khác (cursor move, hide cursor...) -> bỏ qua, không render
112124
i = m.end()
113125
} else {
114126
i++ // escape hỏng/không đầy đủ, bỏ qua 1 ký tự để tránh vòng lặp vô hạn
@@ -425,5 +437,17 @@ object AnsiColorParser {
425437

426438
fun reset() {
427439
resetToDefault()
440+
clearScreenRequested = false
441+
}
442+
443+
/**
444+
* Kiểm tra xem lần gọi parse() gần nhất có gặp mã xoá toàn màn hình (lệnh `clear`) hay
445+
* không, đồng thời "tiêu thụ" (reset) cờ này để lần gọi sau không bị báo lại. Nơi gọi
446+
* (DialogLogFragment) cần gọi hàm này ngay sau parse() để biết có cần xoá log buffer + UI.
447+
*/
448+
fun consumePendingClear(): Boolean {
449+
val result = clearScreenRequested
450+
clearScreenRequested = false
451+
return result
428452
}
429453
}

0 commit comments

Comments
 (0)