מדריך | הוספת החלפת פרופילים לדאמבדוריד (14) ע"י סולמית
עזרה הדדית - שיאומי f21 pro ו +f21 pro
1
פוסטים
1
כותבים
24
צפיות
2
עוקבים
-
בהמשך למדריך הישן שלי כאן, כעת לפני מעבר שלי לדאמבדוריד, היה חשוב לי שתהיה האפשרות הזו.

כמובן שהעריכה על אחריותכם וכו', תגבו הכל וכו'.
אה, וכמובן שצריכה להיות לכם היכולת לערוך את הסיסטם, מה שמשיגים בעזרת RO2RW, חפשו על זה בפורום.
עוד דבר, אני לא דובר סמאלית, כמובן שזה AI..החלפת הפרופילים תעבוד בכל מקום שממשק המערכת (systemui בלעז) הוא התהליך הקדמי (בforeground), דהיינו במסך הנעילה ובכל מקום שתפתחו את חלון ההתראות (זה שמושכים למטה..).
האפליקציה הנערכת היא הsystemui, שנמצאת בנתיב:
system/system_ext/priv-app/SystemUI
השינויים:- בנתיב com/android/systemui/volume
הקובץ: VolumeDialogImpl
בתוך המתודה <init>
להוסיף בסופה לפני ה return-void
את הקוד הזה:
# --- התחלת הוספה מתוקנת --- # 1. יצירת IntentFilter new-instance v2, Landroid/content/IntentFilter; const-string v3, "com.android.systemui.volume.TOGGLE_RINGER" invoke-direct {v2, v3}, Landroid/content/IntentFilter;-><init>(Ljava/lang/String;)V # 2. יצירת הרסיבר # v0 הוא 'this' (VolumeDialogImpl) new-instance v3, Lcom/android/systemui/volume/VolumeDialogImpl$RingerReceiver; invoke-direct {v3, v0}, Lcom/android/systemui/volume/VolumeDialogImpl$RingerReceiver;-><init>(Lcom/android/systemui/volume/VolumeDialogImpl;)V # 3. השגת ה-Context בצורה בטוחה # p1 הוא הפרמטר הראשון של הבנאי (Context) # נעביר אותו ל-v4 כדי להשתמש בו (כי v1 כבר "מלוכלך") move-object v4, p1 # 4. רישום הרסיבר # v4 = Context # v3 = Receiver # v2 = Filter # v5 = Flags (0x2 = RECEIVER_EXPORTED) const/4 v5, 0x2 invoke-virtual {v4, v3, v2, v5}, Landroid/content/Context;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;I)Landroid/content/Intent; # --- סוף הוספה ---מראה מקום בספויילר:
.method public constructor <init>(Landroid/content/Context;Lcom/android/systemui/plugins/VolumeDialogController;Lcom/android/systemui/statusbar/policy/AccessibilityManagerWrapper;Lcom/android/systemui/statusbar/policy/DeviceProvisionedController;Lcom/android/systemui/statusbar/policy/ConfigurationController;Lcom/android/systemui/media/dialog/MediaOutputDialogFactory;Lcom/android/internal/jank/InteractionJankMonitor;Lcom/android/systemui/dagger/DaggerReferenceGlobalRootComponent$ReferenceSysUIComponentImpl$SwitchingProvider$12;Lcom/android/systemui/statusbar/policy/DevicePostureController;Landroid/os/Looper;Lcom/android/systemui/dump/DumpManager;Ldagger/Lazy;Lcom/android/systemui/statusbar/VibratorHelper;Lcom/android/systemui/util/time/SystemClock;)V .registers 25 move-object v0, p0 move-object v1, p1 move-object/from16 v2, p9 .line 1 invoke-direct {p0}, Ljava/lang/Object;-><init>()V # הרבה קוד באמצע... .line 62 :cond_179 iput-object v3, v0, Lcom/android/systemui/volume/VolumeDialogImpl;->mDevicePostureControllerCallback:Lcom/android/systemui/volume/VolumeDialogImpl$$ExternalSyntheticLambda2; :goto_17b # --- התחלת הוספה מתוקנת --- # 1. יצירת IntentFilter new-instance v2, Landroid/content/IntentFilter; const-string v3, "com.android.systemui.volume.TOGGLE_RINGER" invoke-direct {v2, v3}, Landroid/content/IntentFilter;-><init>(Ljava/lang/String;)V # 2. יצירת הרסיבר # v0 הוא 'this' (VolumeDialogImpl) new-instance v3, Lcom/android/systemui/volume/VolumeDialogImpl$RingerReceiver; invoke-direct {v3, v0}, Lcom/android/systemui/volume/VolumeDialogImpl$RingerReceiver;-><init>(Lcom/android/systemui/volume/VolumeDialogImpl;)V # 3. השגת ה-Context בצורה בטוחה # p1 הוא הפרמטר הראשון של הבנאי (Context) # נעביר אותו ל-v4 כדי להשתמש בו (כי v1 כבר "מלוכלך") move-object v4, p1 # 4. רישום הרסיבר # v4 = Context # v3 = Receiver # v2 = Filter # v5 = Flags (0x2 = RECEIVER_EXPORTED) const/4 v5, 0x2 invoke-virtual {v4, v3, v2, v5}, Landroid/content/Context;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;I)Landroid/content/Intent; # --- סוף הוספה --- return-void :array_17c .array-data 4 0x0 0x3f800000 # 1.0f .end array-data :array_184 .array-data 4 0x3f800000 # 1.0f 0x0 .end array-data .end method- בסוף אותו קובץ (VolumeDialogImpl)
להוסיף את המתודה הזאת:
.method public final toggleRingerMode()V .registers 6 # 1. איפוס טיימר (משתמשים ב-p0) invoke-virtual {p0}, Lcom/android/systemui/volume/VolumeDialogImpl;->rescheduleTimeoutH()V # 2. בדיקה שה-State קיים iget-object v0, p0, Lcom/android/systemui/volume/VolumeDialogImpl;->mState:Lcom/android/systemui/plugins/VolumeDialogController$State; if-nez v0, :get_current_mode return-void :get_current_mode # 3. קריאת המצב הנוכחי לתוך v0 iget v0, v0, Lcom/android/systemui/plugins/VolumeDialogController$State;->ringerModeInternal:I # נשתמש ב-v1 כדי להחזיק את המצב החדש שנרצה להגדיר # הגדרת קבועים להשוואה (v2=1 רטט, v3=2 רגיל) const/4 v2, 0x1 const/4 v3, 0x2 # --- לוגיקה (רגיל -> רטט -> שקט -> רגיל) --- # אם המצב הנוכחי הוא רגיל (2), נרצה לעבור לרטט (1) if-ne v0, v3, :check_vibrate move v1, v2 goto :apply_change :check_vibrate # אם המצב הנוכחי הוא רטט (1), נרצה לעבור לשקט (0) if-ne v0, v2, :set_normal const/4 v1, 0x0 goto :apply_change :set_normal # אחרת (שקט או לא ידוע), נחזור לרגיל (2) move v1, v3 :apply_change # 4. ביצוע השינוי באמצעות הפונקציה הפנימית של המחלקה invoke-virtual {p0, v1}, Lcom/android/systemui/volume/VolumeDialogImpl;->setRingerMode(I)V return-void .end method- באותו נתיב (com/android/systemui/volume)
(זה ליד אותו קובץ (VolumeDialogImpl))
להוסיף קלאס חדש בשם VolumeDialogImpl$RingerReceiver:
.class public Lcom/android/systemui/volume/VolumeDialogImpl$RingerReceiver; .super Landroid/content/BroadcastReceiver; .field final synthetic this$0:Lcom/android/systemui/volume/VolumeDialogImpl; .method public constructor <init>(Lcom/android/systemui/volume/VolumeDialogImpl;)V .registers 2 iput-object p1, p0, Lcom/android/systemui/volume/VolumeDialogImpl$RingerReceiver;->this$0:Lcom/android/systemui/volume/VolumeDialogImpl; invoke-direct {p0}, Landroid/content/BroadcastReceiver;-><init>()V return-void .end method .method public onReceive(Landroid/content/Context;Landroid/content/Intent;)V .registers 4 # קריאה לפונקציה הראשית שכתבנו קודם iget-object v0, p0, Lcom/android/systemui/volume/VolumeDialogImpl$RingerReceiver;->this$0:Lcom/android/systemui/volume/VolumeDialogImpl; invoke-virtual {v0}, Lcom/android/systemui/volume/VolumeDialogImpl;->toggleRingerMode()V return-void .end method- בנתיב com/android/systemui/shade
בקובץ NotificationShadeWindowView
במתודה dispatchKeyEvent
מיד אחרי השורה של הregisters
להוסיף את הקוד הזה:
# 1. בדיקה: האם זה סולמית (18)? invoke-virtual {p1}, Landroid/view/KeyEvent;->getKeyCode()I move-result v0 const/16 v1, 0x12 if-ne v0, v1, :original_code # 2. בדיקה: האם זו לחיצה (DOWN=0)? invoke-virtual {p1}, Landroid/view/KeyEvent;->getAction()I move-result v0 const/4 v1, 0x1 # אם זה UP, נבלע את המקש if-eqz v0, :check_locked return v1 :check_locked # 3. בדיקה: האם המכשיר נעול? invoke-virtual {p0}, Landroid/widget/FrameLayout;->getContext()Landroid/content/Context; move-result-object v0 const-string v2, "keyguard" invoke-virtual {v0, v2}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; move-result-object v2 check-cast v2, Landroid/app/KeyguardManager; # אם לא נעול -> לך לקוד המקורי (אל תשלח שידור) invoke-virtual {v2}, Landroid/app/KeyguardManager;->isKeyguardLocked()Z move-result v2 if-nez v2, :do_broadcast goto :original_code :do_broadcast # 4. שליחת Broadcast new-instance v2, Landroid/content/Intent; const-string v3, "com.android.systemui.volume.TOGGLE_RINGER" invoke-direct {v2, v3}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V const-string v3, "com.android.systemui" invoke-virtual {v2, v3}, Landroid/content/Intent;->setPackage(Ljava/lang/String;)Landroid/content/Intent; sget-object v3, Landroid/os/UserHandle;->CURRENT:Landroid/os/UserHandle; invoke-virtual {v0, v2, v3}, Landroid/content/Context;->sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V return v1 :original_codeמראה מקום בספויילר:
.method public final dispatchKeyEvent(Landroid/view/KeyEvent;)Z .registers 11 # תחילת הוספה # 1. בדיקה: האם זה סולמית (18)? invoke-virtual {p1}, Landroid/view/KeyEvent;->getKeyCode()I move-result v0 const/16 v1, 0x12 if-ne v0, v1, :original_code # 2. בדיקה: האם זו לחיצה (DOWN=0)? invoke-virtual {p1}, Landroid/view/KeyEvent;->getAction()I move-result v0 const/4 v1, 0x1 # אם זה UP, נבלע את המקש if-eqz v0, :check_locked return v1 :check_locked # 3. בדיקה: האם המכשיר נעול? invoke-virtual {p0}, Landroid/widget/FrameLayout;->getContext()Landroid/content/Context; move-result-object v0 const-string v2, "keyguard" invoke-virtual {v0, v2}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; move-result-object v2 check-cast v2, Landroid/app/KeyguardManager; # אם לא נעול -> לך לקוד המקורי (אל תשלח שידור) invoke-virtual {v2}, Landroid/app/KeyguardManager;->isKeyguardLocked()Z move-result v2 if-nez v2, :do_broadcast goto :original_code :do_broadcast # 4. שליחת Broadcast new-instance v2, Landroid/content/Intent; const-string v3, "com.android.systemui.volume.TOGGLE_RINGER" invoke-direct {v2, v3}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V const-string v3, "com.android.systemui" invoke-virtual {v2, v3}, Landroid/content/Intent;->setPackage(Ljava/lang/String;)Landroid/content/Intent; sget-object v3, Landroid/os/UserHandle;->CURRENT:Landroid/os/UserHandle; invoke-virtual {v0, v2, v3}, Landroid/content/Context;->sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V return v1 :original_code # עד כאן .line 1 iget-object v0, p0, Lcom/android/systemui/shade/NotificationShadeWindowView;->mInteractionEventHandler:Lcom/android/systemui/shade/NotificationShadeWindowViewController$1;בהצלחה!
- בנתיב com/android/systemui/volume