מסתבר שאם מגדירים את ספוטיפיי כמקור, אז הוא מושך את התמונות משם, כעת טופל, שימו לב לעדכן (אפשר לעדכן דרך עדכון אוטומטי, רק שימו לב למחוק את כל המטמון).
lilo159
-
שיתוף | MELD - החיבור בין ספוטיפיי ליוטיוב מיוזיק -
שיתוף | MELD - החיבור בין ספוטיפיי ליוטיוב מיוזיק
זהו פרוייקט שהוא בעצם פורק (FORK) של מטרוליסט, שהמפתח של הפרוייקט הוסיף אינטגרציה עם ספוטיפיי, כך שתוכלו לייבא את כל הפלייליסטים, השירים האהובים וכו' ששמורים בספוטייפי שלכם.
הרעיון הוא שהאפליקציה מוצאת את השירים שהיו שמורים בספוטיפיי שלכם, ביוטיוב, כך שייתכן שהאפליקציה לא תמצא את השיר המדוייק, כיוון שהוא פשוט לא קיים ביוטיוב. מה שכן, ישנה אפשרות לתקן התאמה באופן ידני, ולשים קישור אחר לשיר הנכון.כך שאם נגיד לא מצאתם את השיר ששמרתם בספוטיפיי, ואתם ממש רוצים להפר זכויות יוצרים, לכאו' אתם יכולים להעלות את השיר ליוטיוב, ולתקן את הקישור באופן ידני. אבל אני לא אמרתי כלום..
כיוון שזה בעצם ממש מטרוליסט, הסינון של זה ממש פשוט, ועשיתי פשוט העתק הדבק לפאצ' של מטרוליסט, והוספתי גם סינון לWEBVIEW של ההתחברות לספוטיפיי.
האפליקציה המסוננת זמינה כעת להורדה בחנות של @cfopuser
https://cfopuser.github.io/app-store/סליחה שלא שאלתי קודם, מקווה שזה בסדר...
לפרוייקט בגיטהאב: https://github.com/FrancescoGrazioso/Meld
-
מדריך | VoLTE במכשיר Qin F21 Pro - בדרך פשוטה יותר ללא צורך במודול קבוע-אפשר להסיר רוט לאחר מכן (עודכן לעבוד גם עם HOT MOBILE)@reemzed123 urielk נתן לי את הסקריפט הזה: https://mitmachim.top/assets/uploads/files/1774208384933-sms-cellcom-fix.sh
-
להורדה | Scrcpy Integration IME | מקלדת למשתמשי Scrcpy@מישהו12 הממ.. לא נראה לי שאני אעזוב את GBOARD..
-
להורדה | Scrcpy Integration IME | מקלדת למשתמשי Scrcpyקובץ באט שהסטודיו כתב (הרעיון שלי, אבל פחות מתחבר לGPT
)
שמתקין את האפליקציה באם היא לא נמצאת, קולט מה המקלדת האחרונה שהשתמשתם, מחליף למקלדת העוזרת, מריץ את SCRCPY, וכשסוגרים את SCRCPY מחליף חזרה למקלדת שלכם (אם תנתקו את הטלפון זה לא יחליף..).
לשים את קובץ הבאט והאפליקציה (שם האפלקיציה בבאט הוא כמו שמישהו12 קרא לו, שימו לב) בתיקייה של SCRCPY ולהריץ משם.
IME.bat@echo off set PACKAGE_NAME=com.example.keyloggerime set APK_PATH=ScrcpyIntgratetion.apk echo ======================================== echo Scrcpy Hebrew Keyboard Launcher echo ======================================== echo [*] Checking if the app is installed... adb shell pm list packages | findstr "%PACKAGE_NAME%" >nul if %errorlevel% neq 0 ( echo [*] App not found. Installing %APK_PATH%... adb install "%APK_PATH%" ) else ( echo [*] App is already installed. ) echo [*] Backing up current keyboard (inside phone memory)... :: Saves the setting to a temp file on the Android device adb shell "settings get secure default_input_method > /data/local/tmp/prev_ime.txt" echo [*] Finding and enabling Scrcpy keyboard... :: Runs a search inside the phone and enables the keyboard immediately adb shell "ime_id=$(ime list -a -s | grep %PACKAGE_NAME%); ime enable $ime_id; ime set $ime_id" echo [*] Starting Scrcpy... :: Waits for you to close the Scrcpy window to continue start /wait scrcpy.exe echo [*] Scrcpy closed. Restoring original keyboard... :: Reads the temp file on the phone and restores the original keyboard adb shell "prev_ime=$(cat /data/local/tmp/prev_ime.txt); ime set $prev_ime" echo [*] Done! pause -
להורדה | Scrcpy Integration IME | מקלדת למשתמשי Scrcpy@מישהו12 יישר כח גדול! נצרך ביותר.
-
מדריך | הוספת תאריך עברי למסך הבית בגרסה הרגילה של f21 pro@חד-גדיא לפי הבנתי המועטה, ישנה ספריה מובנית באנדרואיד שנקראת icu, ומשם נשאב התאריך העברי.
-
מדריך | הוספת תאריך עברי למסך הבית בגרסה הרגילה של f21 pro@מחנה-ידידים הוספתי בספויילר.
לא ניסיתי, אבל זה אמור לעבוד. -
מדריך | הוספת תאריך עברי למסך הבית בגרסה הרגילה של f21 pro@מחנה-ידידים ההחלטה של מי שערך..
אם זה חשוב לך אפשר לשנות, לי היה חשוב שהתאריך העברי יהיה מעל.. -
מדריך | הוספת תאריך עברי למסך הנעילה בדאמבדרויד -
מדריך | הוספת תאריך עברי למסך הבית בגרסה הרגילה של f21 proבהמשך למדריך | הוספת תאריך עברי למסך הבית בדאמבדרויד

אז משום מה, אתם עדיין משתמשים בגרסה הרגילה של F21 PRO..
לא נורא, מתי שהוא גם אתם תתקדמו..בכל מקרה, לבינתיים:
כרגיל, הAI הוא המתכנת, אבל האחריות אצלו היא לא טעות סופר..
לשינויים:
האפליקציה שאנחנו עורכים היא הלאנצ'ר, שנמצא בנתיב:
/system_ext/priv-app/Launcher3QuickStepכל הקלאסים שנערכים או נוספים, נמצאים בנתיב:
com/android/launcher3- להוסיף את הקלאס HebrewDateHelper (בנתיב com/android/launcher3):
.class public Lcom/android/launcher3/HebrewDateHelper; .super Ljava/lang/Object; # direct methods .method public static getCombinedDateString(Ljava/lang/String;)Ljava/lang/String; .registers 12 :try_start_0 new-instance v0, Landroid/icu/util/HebrewCalendar; invoke-direct {v0}, Landroid/icu/util/HebrewCalendar;-><init>()V new-instance v1, Landroid/icu/util/ULocale; const-string v2, "he_IL@calendar=hebrew" invoke-direct {v1, v2}, Landroid/icu/util/ULocale;-><init>(Ljava/lang/String;)V const/4 v2, 0x1 invoke-static {v2, v1}, Landroid/icu/text/DateFormat;->getDateInstance(ILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat; move-result-object v2 invoke-static {}, Lcom/android/launcher3/HebrewDateHelper;->isAfterNightfall()Z move-result v3 move v10, v3 invoke-virtual {v0}, Landroid/icu/util/HebrewCalendar;->getTime()Ljava/util/Date; move-result-object v4 invoke-virtual {v2, v4}, Landroid/icu/text/DateFormat;->format(Ljava/util/Date;)Ljava/lang/String; move-result-object v3 if-eqz v3, :cond_bc const/4 v4, 0x7 invoke-virtual {v0, v4}, Landroid/icu/util/HebrewCalendar;->get(I)I move-result v5 if-ne v5, v4, :cond_33 if-eqz v10, :cond_33 const-string/jumbo v4, "יום שבת" const-string/jumbo v5, "מוצאי שבת" invoke-virtual {v3, v4, v5}, Ljava/lang/String;->replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String; move-result-object v3 :cond_33 const/16 v4, 0x20 invoke-virtual {v3, v4}, Ljava/lang/String;->lastIndexOf(I)I move-result v4 const-string v8, "" const-string v9, "" const/4 v5, -0x1 if-eq v4, v5, :cond_4b const/4 v5, 0x0 invoke-virtual {v3, v5, v4}, Ljava/lang/String;->substring(II)Ljava/lang/String; move-result-object v8 add-int/lit8 v4, v4, 0x1 invoke-virtual {v3, v4}, Ljava/lang/String;->substring(I)Ljava/lang/String; move-result-object v9 :cond_4b const/4 v3, 0x2 invoke-virtual {v0, v3}, Landroid/icu/util/HebrewCalendar;->get(I)I move-result v4 const/4 v5, 0x5 const/4 v6, 0x1 invoke-virtual {v0, v5, v6}, Landroid/icu/util/HebrewCalendar;->add(II)V invoke-virtual {v0}, Landroid/icu/util/HebrewCalendar;->getTime()Ljava/util/Date; move-result-object v5 invoke-virtual {v2, v5}, Landroid/icu/text/DateFormat;->format(Ljava/util/Date;)Ljava/lang/String; move-result-object v6 invoke-virtual {v0, v3}, Landroid/icu/util/HebrewCalendar;->get(I)I move-result v5 const-string v0, ", " invoke-virtual {v6, v0}, Ljava/lang/String;->indexOf(Ljava/lang/String;)I move-result v0 const/4 v7, -0x1 if-eq v0, v7, :cond_70 add-int/lit8 v0, v0, 0x2 invoke-virtual {v6, v0}, Ljava/lang/String;->substring(I)Ljava/lang/String; move-result-object v6 :cond_70 const/16 v0, 0x20 invoke-virtual {v6, v0}, Ljava/lang/String;->lastIndexOf(I)I move-result v0 if-eq v0, v7, :cond_7d const/4 v2, 0x0 invoke-virtual {v6, v2, v0}, Ljava/lang/String;->substring(II)Ljava/lang/String; move-result-object v6 :cond_7d if-ne v4, v5, :cond_8c const/16 v0, 0x20 invoke-virtual {v6, v0}, Ljava/lang/String;->indexOf(I)I move-result v0 if-eq v0, v7, :cond_8c const/4 v2, 0x0 invoke-virtual {v6, v2, v0}, Ljava/lang/String;->substring(II)Ljava/lang/String; move-result-object v6 :cond_8c new-instance v0, Ljava/lang/StringBuilder; invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V invoke-virtual {v0, v8}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; if-eqz v10, :cond_a7 const-string v2, " (אור ל-" invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; const-string v2, ") " invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0, v9}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; goto :goto_af :cond_a7 const-string v2, " " invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0, v9}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; :goto_af const-string v2, "\n" invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 return-object v0 :cond_bc new-instance v0, Ljava/lang/StringBuilder; invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; const-string v1, "\n" invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 return-object v0 :try_end_d1 .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_d1} :catch_d1 :catch_d1 move-exception v0 return-object p0 .end method .method private static isAfterNightfall()Z .registers 10 invoke-static {}, Ljava/util/Calendar;->getInstance()Ljava/util/Calendar; move-result-object v0 const/4 v1, 0x6 invoke-virtual {v0, v1}, Ljava/util/Calendar;->get(I)I move-result v1 const/16 v2, 0xb invoke-virtual {v0, v2}, Ljava/util/Calendar;->get(I)I move-result v2 const/16 v3, 0xc invoke-virtual {v0, v3}, Ljava/util/Calendar;->get(I)I move-result v3 invoke-virtual {v0}, Ljava/util/Calendar;->getTimeZone()Ljava/util/TimeZone; move-result-object v4 invoke-virtual {v0}, Ljava/util/Calendar;->getTime()Ljava/util/Date; move-result-object v0 invoke-virtual {v4, v0}, Ljava/util/TimeZone;->inDaylightTime(Ljava/util/Date;)Z move-result v0 const-wide v4, 0x400921fb54442d18L const-wide/high16 v6, 0x4000000000000000L mul-double/2addr v4, v6 add-int/lit8 v6, v1, -0x50 int-to-double v6, v6 mul-double/2addr v4, v6 const-wide v6, 0x4076d00000000000L div-double/2addr v4, v6 invoke-static {v4, v5}, Ljava/lang/Math;->sin(D)D move-result-wide v4 const-wide v6, 0x3ff0cccccccccccdL mul-double/2addr v4, v6 const-wide v6, 0x403247ae147ae148L add-double/2addr v4, v6 if-eqz v0, :cond_48 const-wide/high16 v6, 0x3ff0000000000000L add-double/2addr v4, v6 :cond_48 double-to-int v0, v4 int-to-double v6, v0 sub-double/2addr v4, v6 const-wide v6, 0x404e000000000000L mul-double/2addr v4, v6 double-to-int v4, v4 const/4 v5, 0x1 if-le v2, v0, :cond_56 return v5 :cond_56 if-ne v2, v0, :cond_5b if-lt v3, v4, :cond_5b return v5 :cond_5b const/4 v0, 0x0 return v0 .end methodאם אתם מעדיפים שהתאריך הלועזי יהיה למעלה, אז תקחו את הקוד שבספויילר במקום:
.class public Lcom/android/launcher3/HebrewDateHelper; .super Ljava/lang/Object; # direct methods .method public static getCombinedDateString(Ljava/lang/String;)Ljava/lang/String; .registers 12 :try_start_0 new-instance v0, Landroid/icu/util/HebrewCalendar; invoke-direct {v0}, Landroid/icu/util/HebrewCalendar;-><init>()V new-instance v1, Landroid/icu/util/ULocale; const-string v2, "he_IL@calendar=hebrew" invoke-direct {v1, v2}, Landroid/icu/util/ULocale;-><init>(Ljava/lang/String;)V const/4 v2, 0x1 invoke-static {v2, v1}, Landroid/icu/text/DateFormat;->getDateInstance(ILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat; move-result-object v2 invoke-static {}, Lcom/android/launcher3/HebrewDateHelper;->isAfterNightfall()Z move-result v3 move v10, v3 invoke-virtual {v0}, Landroid/icu/util/HebrewCalendar;->getTime()Ljava/util/Date; move-result-object v4 invoke-virtual {v2, v4}, Landroid/icu/text/DateFormat;->format(Ljava/util/Date;)Ljava/lang/String; move-result-object v3 if-eqz v3, :cond_bc const/4 v4, 0x7 invoke-virtual {v0, v4}, Landroid/icu/util/HebrewCalendar;->get(I)I move-result v5 if-ne v5, v4, :cond_33 if-eqz v10, :cond_33 const-string/jumbo v4, "יום שבת" const-string/jumbo v5, "מוצאי שבת" invoke-virtual {v3, v4, v5}, Ljava/lang/String;->replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String; move-result-object v3 :cond_33 const/16 v4, 0x20 invoke-virtual {v3, v4}, Ljava/lang/String;->lastIndexOf(I)I move-result v4 const-string v8, "" const-string v9, "" const/4 v5, -0x1 if-eq v4, v5, :cond_4b const/4 v5, 0x0 invoke-virtual {v3, v5, v4}, Ljava/lang/String;->substring(II)Ljava/lang/String; move-result-object v8 add-int/lit8 v4, v4, 0x1 invoke-virtual {v3, v4}, Ljava/lang/String;->substring(I)Ljava/lang/String; move-result-object v9 :cond_4b const/4 v3, 0x2 invoke-virtual {v0, v3}, Landroid/icu/util/HebrewCalendar;->get(I)I move-result v4 const/4 v5, 0x5 const/4 v6, 0x1 invoke-virtual {v0, v5, v6}, Landroid/icu/util/HebrewCalendar;->add(II)V invoke-virtual {v0}, Landroid/icu/util/HebrewCalendar;->getTime()Ljava/util/Date; move-result-object v5 invoke-virtual {v2, v5}, Landroid/icu/text/DateFormat;->format(Ljava/util/Date;)Ljava/lang/String; move-result-object v6 invoke-virtual {v0, v3}, Landroid/icu/util/HebrewCalendar;->get(I)I move-result v5 const-string v0, ", " invoke-virtual {v6, v0}, Ljava/lang/String;->indexOf(Ljava/lang/String;)I move-result v0 const/4 v7, -0x1 if-eq v0, v7, :cond_70 add-int/lit8 v0, v0, 0x2 invoke-virtual {v6, v0}, Ljava/lang/String;->substring(I)Ljava/lang/String; move-result-object v6 :cond_70 const/16 v0, 0x20 invoke-virtual {v6, v0}, Ljava/lang/String;->lastIndexOf(I)I move-result v0 if-eq v0, v7, :cond_7d const/4 v2, 0x0 invoke-virtual {v6, v2, v0}, Ljava/lang/String;->substring(II)Ljava/lang/String; move-result-object v6 :cond_7d if-ne v4, v5, :cond_8c const/16 v0, 0x20 invoke-virtual {v6, v0}, Ljava/lang/String;->indexOf(I)I move-result v0 if-eq v0, v7, :cond_8c const/4 v2, 0x0 invoke-virtual {v6, v2, v0}, Ljava/lang/String;->substring(II)Ljava/lang/String; move-result-object v6 :cond_8c new-instance v0, Ljava/lang/StringBuilder; invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; const-string v2, "\n" invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0, v8}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; if-eqz v10, :cond_a7 const-string v2, " (אור ל-" invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; const-string v2, ") " invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0, v9}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; goto :goto_af :cond_a7 const-string v2, " " invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0, v9}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; :goto_af invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 return-object v0 :cond_bc new-instance v0, Ljava/lang/StringBuilder; invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; const-string v1, "\n" invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 return-object v0 :try_end_d1 .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_d1} :catch_d1 :catch_d1 move-exception v0 return-object p0 .end method .method private static isAfterNightfall()Z .registers 10 invoke-static {}, Ljava/util/Calendar;->getInstance()Ljava/util/Calendar; move-result-object v0 const/4 v1, 0x6 invoke-virtual {v0, v1}, Ljava/util/Calendar;->get(I)I move-result v1 const/16 v2, 0xb invoke-virtual {v0, v2}, Ljava/util/Calendar;->get(I)I move-result v2 const/16 v3, 0xc invoke-virtual {v0, v3}, Ljava/util/Calendar;->get(I)I move-result v3 invoke-virtual {v0}, Ljava/util/Calendar;->getTimeZone()Ljava/util/TimeZone; move-result-object v4 invoke-virtual {v0}, Ljava/util/Calendar;->getTime()Ljava/util/Date; move-result-object v0 invoke-virtual {v4, v0}, Ljava/util/TimeZone;->inDaylightTime(Ljava/util/Date;)Z move-result v0 const-wide v4, 0x400921fb54442d18L const-wide/high16 v6, 0x4000000000000000L mul-double/2addr v4, v6 add-int/lit8 v6, v1, -0x50 int-to-double v6, v6 mul-double/2addr v4, v6 const-wide v6, 0x4076d00000000000L div-double/2addr v4, v6 invoke-static {v4, v5}, Ljava/lang/Math;->sin(D)D move-result-wide v4 const-wide v6, 0x3ff0cccccccccccdL mul-double/2addr v4, v6 const-wide v6, 0x403247ae147ae148L add-double/2addr v4, v6 if-eqz v0, :cond_48 const-wide/high16 v6, 0x3ff0000000000000L add-double/2addr v4, v6 :cond_48 double-to-int v0, v4 int-to-double v6, v0 sub-double/2addr v4, v6 const-wide v6, 0x404e000000000000L mul-double/2addr v4, v6 double-to-int v4, v4 const/4 v5, 0x1 if-le v2, v0, :cond_56 return v5 :cond_56 if-ne v2, v0, :cond_5b if-lt v3, v4, :cond_5b return v5 :cond_5b const/4 v0, 0x0 return v0 .end method- להוסיף את הקלאס (באותו נתיב):
WorkspaceDateReceiver
.class public Lcom/android/launcher3/WorkspaceDateReceiver; .super Landroid/content/BroadcastReceiver; .field private final mWorkspace:Lcom/android/launcher3/Workspace; .method public constructor <init>(Lcom/android/launcher3/Workspace;)V .registers 2 .line 1 invoke-direct {p0}, Landroid/content/BroadcastReceiver;-><init>()V .line 2 iput-object p1, p0, Lcom/android/launcher3/WorkspaceDateReceiver;->mWorkspace:Lcom/android/launcher3/Workspace; .line 3 return-void .end method .method public onReceive(Landroid/content/Context;Landroid/content/Intent;)V .registers 3 .line 1 iget-object p1, p0, Lcom/android/launcher3/WorkspaceDateReceiver;->mWorkspace:Lcom/android/launcher3/Workspace; if-eqz p1, :cond_end .line 2 invoke-virtual {p1}, Lcom/android/launcher3/Workspace;->refreshTime()V :cond_end return-void .end method- בקלאס Workspace (שנמצא בנתיב כדלעיל):
יחסית בתחילת הקלאס (בערך שורה 46)
אחרי השורה
# static fieldsלהוסיף את השורה הזאת:
.field private mDateReceiver:Lcom/android/launcher3/WorkspaceDateReceiver;- באותו קלאס
במתודה insertNewWorkspaceScreen (הראשונה, נראית כך):
.method public insertNewWorkspaceScreen(II)Lcom/android/launcher3/CellLayout;מתחת לשורה .line 728 ישנה השורה:
invoke-virtual {v6, v5}, Landroid/widget/TextClock;->setFocusable(Z)Vמיד אחריה להוסיף את השורות:
# הזרקה: 2 שורות ומרכוז invoke-virtual {v6, v5}, Landroid/widget/TextClock;->setSingleLine(Z)V const/4 v7, 0x2 invoke-virtual {v6, v7}, Landroid/widget/TextClock;->setMaxLines(I)V const/16 v7, 0x11 invoke-virtual {v6, v7}, Landroid/widget/TextClock;->setGravity(I)V
אמור להראות כך:.line 728 invoke-virtual {v6, v5}, Landroid/widget/TextClock;->setFocusable(Z)V # הזרקה: 2 שורות ומרכוז invoke-virtual {v6, v5}, Landroid/widget/TextClock;->setSingleLine(Z)V const/4 v7, 0x2 invoke-virtual {v6, v7}, Landroid/widget/TextClock;->setMaxLines(I)V const/16 v7, 0x11 invoke-virtual {v6, v7}, Landroid/widget/TextClock;->setGravity(I)V- באותו קלאס
במתודה refreshTime
א. לשנות את המתודה לpublic
ב. לחפש את השורה הזאת:
invoke-direct/range {p0 .. p0}, Lcom/android/launcher3/Workspace;->refreshTime()Vולהחליף עם זאת:
invoke-virtual/range {p0 .. p0}, Lcom/android/launcher3/Workspace;->refreshTime()Vג. מיד אחרי השורה הזאת (היא נמצאת פעמיים, לבצע על שני השורות שתמצאו):
sget-object v1, Lcom/android/launcher3/Workspace$Patterns;->dateView:Ljava/lang/String;להוסיף את הקוד:
invoke-static {v1}, Lcom/android/launcher3/HebrewDateHelper;->getCombinedDateString(Ljava/lang/String;)Ljava/lang/String; move-result-object v1
בסוף המתודה אמורה להראות כך:.method public refreshTime()V .registers 4 .line 779 invoke-virtual {p0}, Lcom/android/launcher3/Workspace;->getContext()Landroid/content/Context; move-result-object v0 invoke-static {v0}, Lcom/android/launcher3/Workspace$Patterns;->update(Landroid/content/Context;)V .line 780 iget-object v0, p0, Lcom/android/launcher3/Workspace;->mDateView:Landroid/widget/TextClock; sget-object v1, Lcom/android/launcher3/Workspace$Patterns;->dateView:Ljava/lang/String; # הזרקת התאריך העברי לפורמט 24 שעות invoke-static {v1}, Lcom/android/launcher3/HebrewDateHelper;->getCombinedDateString(Ljava/lang/String;)Ljava/lang/String; move-result-object v1 invoke-virtual {v0, v1}, Landroid/widget/TextClock;->setFormat24Hour(Ljava/lang/CharSequence;)V .line 781 iget-object v0, p0, Lcom/android/launcher3/Workspace;->mDateView:Landroid/widget/TextClock; sget-object v1, Lcom/android/launcher3/Workspace$Patterns;->dateView:Ljava/lang/String; # הזרקת התאריך העברי לפורמט 12 שעות invoke-static {v1}, Lcom/android/launcher3/HebrewDateHelper;->getCombinedDateString(Ljava/lang/String;)Ljava/lang/String; move-result-object v1 invoke-virtual {v0, v1}, Landroid/widget/TextClock;->setFormat12Hour(Ljava/lang/CharSequence;)V .line 783 iget-object v0, p0, Lcom/android/launcher3/Workspace;->mClockView:Landroid/widget/TextClock; .line 784 invoke-virtual {p0}, Lcom/android/launcher3/Workspace;->getResources()Landroid/content/res/Resources; move-result-object v1 sget v2, Lcom/android/launcher3/R$dimen;->am_pm_widget_font_size:I invoke-virtual {v1, v2}, Landroid/content/res/Resources;->getDimension(I)F move-result v1 float-to-int v1, v1 sget-object v2, Lcom/android/launcher3/Workspace$Patterns;->clockView12:Ljava/lang/String; .line 783 invoke-virtual {p0, v1, v2}, Lcom/android/launcher3/Workspace;->updateAmPmTextSize(ILjava/lang/String;)Ljava/lang/CharSequence; move-result-object v1 invoke-virtual {v0, v1}, Landroid/widget/TextClock;->setFormat12Hour(Ljava/lang/CharSequence;)V .line 785 iget-object v0, p0, Lcom/android/launcher3/Workspace;->mClockView:Landroid/widget/TextClock; sget-object v1, Lcom/android/launcher3/Workspace$Patterns;->clockView24:Ljava/lang/String; invoke-virtual {v0, v1}, Landroid/widget/TextClock;->setFormat24Hour(Ljava/lang/CharSequence;)V .line 788 return-void .end method- במתודה onAttachedToWindow
א. להוסיף רגיסטר אחד (להחליף מ3 ל4).
ב. בסוף המתודה ממש לפני return-void, להוסיף את הקוד:
# הזרקה: רישום המאזין new-instance v0, Lcom/android/launcher3/WorkspaceDateReceiver; invoke-direct {v0, p0}, Lcom/android/launcher3/WorkspaceDateReceiver;-><init>(Lcom/android/launcher3/Workspace;)V iput-object v0, p0, Lcom/android/launcher3/Workspace;->mDateReceiver:Lcom/android/launcher3/WorkspaceDateReceiver; new-instance v1, Landroid/content/IntentFilter; invoke-direct {v1}, Landroid/content/IntentFilter;-><init>()V const-string v2, "android.intent.action.TIME_TICK" invoke-virtual {v1, v2}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V const-string v2, "android.intent.action.TIME_SET" invoke-virtual {v1, v2}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V const-string v2, "android.intent.action.TIMEZONE_CHANGED" invoke-virtual {v1, v2}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V const-string v2, "android.intent.action.DATE_CHANGED" invoke-virtual {v1, v2}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V invoke-virtual {p0}, Lcom/android/launcher3/Workspace;->getContext()Landroid/content/Context; move-result-object v2 invoke-virtual {v2, v0, v1}, Landroid/content/Context;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;
בסוף המתודה אמורה להראות כך:.method protected onAttachedToWindow()V .registers 4 .line 1490 invoke-super {p0}, Lcom/android/launcher3/PagedView;->onAttachedToWindow()V .line 1491 iget-object v0, p0, Lcom/android/launcher3/Workspace;->mWallpaperOffset:Lcom/android/launcher3/util/WallpaperOffsetInterpolator; invoke-virtual {p0}, Lcom/android/launcher3/Workspace;->getWindowToken()Landroid/os/IBinder; move-result-object v1 invoke-virtual {v0, v1}, Lcom/android/launcher3/util/WallpaperOffsetInterpolator;->setWindowToken(Landroid/os/IBinder;)V .line 1492 invoke-virtual {p0}, Lcom/android/launcher3/Workspace;->computeScroll()V # רישום המאזין לאירועי שעון new-instance v0, Lcom/android/launcher3/WorkspaceDateReceiver; invoke-direct {v0, p0}, Lcom/android/launcher3/WorkspaceDateReceiver;-><init>(Lcom/android/launcher3/Workspace;)V iput-object v0, p0, Lcom/android/launcher3/Workspace;->mDateReceiver:Lcom/android/launcher3/WorkspaceDateReceiver; new-instance v1, Landroid/content/IntentFilter; invoke-direct {v1}, Landroid/content/IntentFilter;-><init>()V const-string v2, "android.intent.action.TIME_TICK" invoke-virtual {v1, v2}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V const-string v2, "android.intent.action.TIME_SET" invoke-virtual {v1, v2}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V const-string v2, "android.intent.action.TIMEZONE_CHANGED" invoke-virtual {v1, v2}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V const-string v2, "android.intent.action.DATE_CHANGED" invoke-virtual {v1, v2}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V invoke-virtual {p0}, Lcom/android/launcher3/Workspace;->getContext()Landroid/content/Context; move-result-object v2 invoke-virtual {v2, v0, v1}, Landroid/content/Context;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent; .line 1493 return-void .end method- במתודה onDetachedFromWindow (נמצאת ממש אחרי המתודה הקודמת)
כמו קודם, בסוף המתודה ממש לפני הreturn-void, להוסיף את הקוד הבא:
# הזרקה: ביטול המאזין iget-object v0, p0, Lcom/android/launcher3/Workspace;->mDateReceiver:Lcom/android/launcher3/WorkspaceDateReceiver; if-eqz v0, :cond_unregister_end invoke-virtual {p0}, Lcom/android/launcher3/Workspace;->getContext()Landroid/content/Context; move-result-object v1 invoke-virtual {v1, v0}, Landroid/content/Context;->unregisterReceiver(Landroid/content/BroadcastReceiver;)V const/4 v0, 0x0 iput-object v0, p0, Lcom/android/launcher3/Workspace;->mDateReceiver:Lcom/android/launcher3/WorkspaceDateReceiver; :cond_unregister_end
בסוף המתודה אמורה להראות כך:.method protected onDetachedFromWindow()V .registers 3 .line 1496 invoke-super {p0}, Lcom/android/launcher3/PagedView;->onDetachedFromWindow()V .line 1497 iget-object v0, p0, Lcom/android/launcher3/Workspace;->mWallpaperOffset:Lcom/android/launcher3/util/WallpaperOffsetInterpolator; const/4 v1, 0x0 invoke-virtual {v0, v1}, Lcom/android/launcher3/util/WallpaperOffsetInterpolator;->setWindowToken(Landroid/os/IBinder;)V # מחיקת המאזין כדי למנוע דליפת זיכרון iget-object v0, p0, Lcom/android/launcher3/Workspace;->mDateReceiver:Lcom/android/launcher3/WorkspaceDateReceiver; if-eqz v0, :cond_unregister_end invoke-virtual {p0}, Lcom/android/launcher3/Workspace;->getContext()Landroid/content/Context; move-result-object v1 invoke-virtual {v1, v0}, Landroid/content/Context;->unregisterReceiver(Landroid/content/BroadcastReceiver;)V const/4 v0, 0x0 iput-object v0, p0, Lcom/android/launcher3/Workspace;->mDateReceiver:Lcom/android/launcher3/WorkspaceDateReceiver; :cond_unregister_end .line 1498 return-void .end methodבהצלחה!
-
מדריך | Webview מסונן (רוט)@נוחעם-FM חשבתי על זה שוב, למה בעצם זה יהיה לך נוח?
הרי בשביל כל שינוי קטן תצטרך להוריד שוב 150 מ"ב של אפליקציה..
חוץ מזה שהאתר משתמש בAPI של גוגל לצורך חיפוש, וזה ייגמר מאוד מהר אם אני אפרסם את זה..
ממליץ לך כן ללכת על הגישה שכתבתי, אני יכול אפילו להביא לך קובץ מוכן, ואני אעזור לך בהגדרה של האתר של השליטה על הקובץ.. -
מדריך | Webview מסונן (רוט)@נוחעם-FM כוונתך לקובץ חיצוני (נגיד בassets), שפשוט יהיה שם בלי צורך בקובץ באינטרנט?
עריכה: עכשיו ראיתי למה הגבת.
אמור להיות אפשרי. -
מדריך | Webview מסונן (רוט)אם זה מעניין מישהו, יצרתי (AI) ממשק בVERCEL, לשליטה על הקובץ בצורה נוחה, כולל חיפוש אפליקציות בגוגל פליי, לא השקעתי יותר מידי, זה פשוט שימושי. אז אם מישהו מעוניין בקוד הפרוייקט שיעדכן.
דרך אגב, אני עכשיו קולט שהסינון הזה מגשים את המטרה של הWEBVIEW באפליקציות. אני מניח שהמפתחים באמת לא מחפשים פרצות לדפדפן, אלא להגיש תמיכה, וכעת זה אפשרי למקד את הWEBVIEW לקישורים מותרים, בלי לגלוש בטעות ליוטיוב ושאר ירקות...
-
בעיה | רוט לא תקין בדאמבדרואיד@reemzed123 כתב בבעיה | רוט לא תקין בדאמבדרואיד:
המדריך להוספת תאריך עברי
שמח לשמוע שמישהו באמת מנסה לעשות את המדריך..
-
מדריך | Webview מסונן (רוט)בין הזמנים וזה...
תמיד הפרוייקטים האלו נראים יותר גדולים ממה שהם...

בקיצור,
כמו תמיד, הAI הוא המתכנת, אבל האחריות עליכם...נתחיל מאיך זה מסנן:
אתם מאחסנים קודם כל איפה שהוא באינטרנט (נגיד בגיטהאב, בתור קובץ RAW) קובץ JSON בפורמט הזה:{ "global_whitelist":[ "example.com", "more-example.com" ], "apps": { "com.example.blocked_app": { "policy": "blocked" }, "com.tranzmate": { "policy": "open" }, "com.waze": { "policy": "global" }, "com.example.custom_app": { "policy": "custom", "custom_whitelist":[ "myspecial-api.com", "private-server.net" ] } } }יש כאן ארבעה מצבים:
- blocked - חוסם את כל הקישורים באפליקציה
- open - פותח את כל הקישורים באפליקציה
- global - פותח רק את הקישורים שהוגדרו בתוך global_whitelist
- custom - פותח רק את הקישורים שהוגדרו custom_whitelist
באם אפליקציה לא הוגדרה בתוך הרשימה, היא כמובן פשוט תהיה על מצב גלובלי.
וכן, אם לא הWEBVIEW לא יצליח לקבל את הרשימה, אז הכל יהיה חסום. (לומדים מטעויות, ע"ע אורורה סטור...)העריכה שאנחנו עושים לאפליקציה מוסיפה לה לוגים, כך שאפשר לראות את הקישור החסום שניסינו להכנס אליו לצורך פתיחה שלו.
כמו כן ישנה תמיכה בקישורים מלאים, דהיינו, אם אנחנו רוצים לפתוח קישור מסויים, אבל פתיחה של הHOST תפתח גם קישור אחר שאנחנו לא רוצים, בשביל זה אפשר לציין את הנתיב המלא או היותר כולל, דהיינו:
אם נזין את הקישור הזה:example.com/exampleאז הקישור הזה יהיה חסום:
example.com/bad-exampleעכשיו לשינויים בתוך האפליקציה:
למעשה לא ניסיתי את זה על הWEBVIEW של גוגל, כי אני משתמש בדאמבדרויד, שזה סוג של linageOS, שמשתמש בWEBVIEW משלו, אבל אולי זה אפשרי להשתמש איתו גם בגרסאות אחרות, איני יודע. אם יהיה ביקוש אני אנסה בלי נדר על של גוגל, אבל לכאורה יש להם הגנות. נראה.האפליקציה נמצאת בנתיב /product/app/webview/
- בנתיב com/android/webview/chromium
ליצור את הקלאס UrlFetcher
שזה תוכנו:
.class public Lcom/android/webview/chromium/UrlFetcher; .super Ljava/lang/Thread; .field public static sJsonConfig:Lorg/json/JSONObject; .method static constructor <clinit>()V .registers 1 const/4 v0, 0x0 sput-object v0, Lcom/android/webview/chromium/UrlFetcher;->sJsonConfig:Lorg/json/JSONObject; return-void .end method .method public constructor <init>()V .registers 1 invoke-direct {p0}, Ljava/lang/Thread;-><init>()V return-void .end method .method public static isAllowed(Ljava/lang/String;)Z .registers 11 const/4 v0, 0x0 const/4 v2, 0x1 if-nez p0, :cond_0 return v0 :cond_0 # === 1. הדפסת הכתובת המלאה והמקורית מיד כשהיא מגיעה === const-string v1, "UrlFetcher" new-instance v3, Ljava/lang/StringBuilder; invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V const-string v4, ">>> Intercepted URL: " invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v3, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v3 invoke-static {v1, v3}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I const-string v1, "javascript:" invoke-virtual {p0, v1}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z move-result v1 if-eqz v1, :cond_1 return v2 :cond_1 const-string v1, "data:text/html" invoke-virtual {p0, v1}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z move-result v1 if-eqz v1, :cond_2 return v2 :cond_2 # === 2. חילוץ ה-Host לצורך הדפסה בלוגקט (כמו שביקשת) === invoke-static {p0}, Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri; move-result-object v3 invoke-virtual {v3}, Landroid/net/Uri;->getHost()Ljava/lang/String; move-result-object v3 if-nez v3, :print_host goto :host_done :print_host const-string v1, "UrlFetcher" new-instance v4, Ljava/lang/StringBuilder; invoke-direct {v4}, Ljava/lang/StringBuilder;-><init>()V const-string v5, ">>> Extracted Host: " invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v4, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v4 invoke-static {v1, v4}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I :host_done # הופך את הכתובת לאותיות קטנות למניעת בעיות Case Sensitivity (שומר במשתנה v3) invoke-virtual {p0}, Ljava/lang/String;->toLowerCase()Ljava/lang/String; move-result-object v3 # === 3. המתנה לקובץ ה-JSON מגיטהאב === const/4 v4, 0x0 :wait_loop sget-object v1, Lcom/android/webview/chromium/UrlFetcher;->sJsonConfig:Lorg/json/JSONObject; if-nez v1, :after_wait const-wide/16 v5, 0x64 :try_start_sleep invoke-static {v5, v6}, Ljava/lang/Thread;->sleep(J)V :try_end_sleep .catch Ljava/lang/Exception; {:try_start_sleep .. :try_end_sleep} :catch_sleep :catch_sleep add-int/lit8 v4, v4, 0x1 const/16 v5, 0x1e if-lt v4, v5, :wait_loop :after_wait sget-object v1, Lcom/android/webview/chromium/UrlFetcher;->sJsonConfig:Lorg/json/JSONObject; if-nez v1, :config_ok const-string v1, "UrlFetcher" const-string v3, ">>> JSON is NULL! Blocking for safety." invoke-static {v1, v3}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I return v0 :config_ok # === 4. שליפת האפליקציה הנוכחית והמדיניות שלה מה-JSON === invoke-static {}, Landroid/app/ActivityThread;->currentPackageName()Ljava/lang/String; move-result-object v4 if-nez v4, :pkg_ok const-string v4, "unknown_package" :pkg_ok const-string v5, "apps" invoke-virtual {v1, v5}, Lorg/json/JSONObject;->optJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; move-result-object v5 const-string v6, "global" if-nez v5, :check_app_node goto :policy_set :check_app_node invoke-virtual {v5, v4}, Lorg/json/JSONObject;->optJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; move-result-object v5 if-nez v5, :get_policy goto :policy_set :get_policy const-string v7, "policy" invoke-virtual {v5, v7, v6}, Lorg/json/JSONObject;->optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; move-result-object v6 :policy_set const-string v7, "UrlFetcher" new-instance v8, Ljava/lang/StringBuilder; invoke-direct {v8}, Ljava/lang/StringBuilder;-><init>()V const-string v9, ">>> App: " invoke-virtual {v8, v9}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v8, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; const-string v4, " | Policy: " invoke-virtual {v8, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v8, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v8}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v4 invoke-static {v7, v4}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I # === 5. אכיפת המדיניות (פתוח/חסום/כללי/מותאם) === const-string v4, "blocked" invoke-virtual {v6, v4}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v4 if-eqz v4, :check_open return v0 :check_open const-string v4, "open" invoke-virtual {v6, v4}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v4 if-eqz v4, :check_custom return v2 :check_custom const-string v4, "custom" invoke-virtual {v6, v4}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v4 if-eqz v4, :check_global if-nez v5, :load_custom return v0 :load_custom const-string v4, "custom_whitelist" invoke-virtual {v5, v4}, Lorg/json/JSONObject;->optJSONArray(Ljava/lang/String;)Lorg/json/JSONArray; move-result-object v1 goto :process_array :check_global const-string v4, "global_whitelist" invoke-virtual {v1, v4}, Lorg/json/JSONObject;->optJSONArray(Ljava/lang/String;)Lorg/json/JSONArray; move-result-object v1 :process_array if-nez v1, :array_loop_init return v0 :array_loop_init invoke-virtual {v1}, Lorg/json/JSONArray;->length()I move-result v4 const/4 v5, 0x0 :array_loop if-ge v5, v4, :array_end invoke-virtual {v1, v5}, Lorg/json/JSONArray;->optString(I)Ljava/lang/String; move-result-object v6 if-eqz v6, :array_next invoke-virtual {v6}, Ljava/lang/String;->isEmpty()Z move-result v7 if-nez v7, :array_next # טריק ההתאמה המדויקת למניעת עקיפות! invoke-virtual {v6}, Ljava/lang/String;->toLowerCase()Ljava/lang/String; move-result-object v6 # בדיקה 1: מתחיל ב- :// new-instance v7, Ljava/lang/StringBuilder; invoke-direct {v7}, Ljava/lang/StringBuilder;-><init>()V const-string v8, "://" invoke-virtual {v7, v8}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v7, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v7}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v7 invoke-virtual {v3, v7}, Ljava/lang/String;->contains(Ljava/lang/CharSequence;)Z move-result v7 if-eqz v7, :check_dot goto :found_match :check_dot # בדיקה 2: מתחיל ב- . new-instance v7, Ljava/lang/StringBuilder; invoke-direct {v7}, Ljava/lang/StringBuilder;-><init>()V const-string v8, "." invoke-virtual {v7, v8}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v7, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v7}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v7 invoke-virtual {v3, v7}, Ljava/lang/String;->contains(Ljava/lang/CharSequence;)Z move-result v7 if-eqz v7, :array_next :found_match # === 6. לוג מיוחד שמדפיס איזה חוק ספציפי אישר את הגישה === const-string v0, "UrlFetcher" new-instance v1, Ljava/lang/StringBuilder; invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V const-string v3, ">>> ALLOWED by rule: " invoke-virtual {v1, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v1 invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I return v2 :array_next add-int/lit8 v5, v5, 0x1 goto :array_loop :array_end const-string v1, "UrlFetcher" const-string v2, ">>> BLOCKED (Not in whitelist)" invoke-static {v1, v2}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I return v0 .end method .method public run()V .registers 4 const-string v0, "UrlFetcher" const-string v1, ">>> Starting JSON config download..." invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I :try_start_0 new-instance v0, Ljava/net/URL; # ========================================================= # הדבק כאן את כתובת ה-RAW של קובץ ה-JSON שלך # ========================================================= const-string v1, "https://raw.githubusercontent.com/YOUR_USER/YOUR_REPO/main/config.json" invoke-direct {v0, v1}, Ljava/net/URL;-><init>(Ljava/lang/String;)V invoke-virtual {v0}, Ljava/net/URL;->openConnection()Ljava/net/URLConnection; move-result-object v0 const/16 v1, 0x1388 invoke-virtual {v0, v1}, Ljava/net/URLConnection;->setConnectTimeout(I)V invoke-virtual {v0, v1}, Ljava/net/URLConnection;->setReadTimeout(I)V invoke-virtual {v0}, Ljava/net/URLConnection;->getInputStream()Ljava/io/InputStream; move-result-object v0 new-instance v1, Ljava/util/Scanner; invoke-direct {v1, v0}, Ljava/util/Scanner;-><init>(Ljava/io/InputStream;)V const-string v0, "\\A" invoke-virtual {v1, v0}, Ljava/util/Scanner;->useDelimiter(Ljava/lang/String;)Ljava/util/Scanner; move-result-object v0 invoke-virtual {v0}, Ljava/util/Scanner;->hasNext()Z move-result v1 if-eqz v1, :cond_empty invoke-virtual {v0}, Ljava/util/Scanner;->next()Ljava/lang/String; move-result-object v0 new-instance v1, Lorg/json/JSONObject; invoke-direct {v1, v0}, Lorg/json/JSONObject;-><init>(Ljava/lang/String;)V sput-object v1, Lcom/android/webview/chromium/UrlFetcher;->sJsonConfig:Lorg/json/JSONObject; const-string v0, "UrlFetcher" const-string v1, ">>> JSON Config successfully parsed and loaded!" invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I goto :goto_end :cond_empty const-string v0, "UrlFetcher" const-string v1, ">>> JSON file is EMPTY!" invoke-static {v0, v1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I :goto_end :try_end_0 .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0 return-void :catch_0 move-exception v0 const-string v1, "UrlFetcher" const-string v2, ">>> JSON Download FAILED!" invoke-static {v1, v2, v0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I return-void .end methodתסתכלו על שורה 260, שם אתם צריכים להדביק את הקישור לקובץ שלכם.
- באותו נתיב (com/android/webview/chromium)
בקלאס WebViewChromium
במתודה method public init(Ljava/util/Map;Z)V
מיד אחרי השורה של הREGISTERS להדביק כך:
.method public init(Ljava/util/Map;Z)V .registers 21 #להדביק מכאן new-instance v0, Lcom/android/webview/chromium/UrlFetcher; invoke-direct {v0}, Lcom/android/webview/chromium/UrlFetcher;-><init>()V invoke-virtual {v0}, Lcom/android/webview/chromium/UrlFetcher;->start()V #עד כאן .line 1 move-object/from16 v1, p0בשני המתודות שנקראות loadUrl
להוסיף 5 רגיסטרים
וג"כ באותו אופן להדביק את הקוד הבא אחרי השורה של הREGISTERS:# --- מנגנון חסימה חכם --- invoke-static {p1}, Lcom/android/webview/chromium/UrlFetcher;->isAllowed(Ljava/lang/String;)Z move-result v0 # התיקון: אם הפונקציה החזירה אמת (1 - מורשה), קפוץ לאישור! if-nez v0, :allow_url_load # חסימה אלגנטית iget-object v0, p0, Lcom/android/webview/chromium/WebViewChromium;->a:Landroid/webkit/WebView; const-string v1, "http://blocked.local" const-string v2, "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><body dir=\"rtl\" style=\"display:flex;justify-content:center;align-items:center;height:100vh;background-color:rgb(248,215,218);color:rgb(114,28,36);font-family:sans-serif;margin:0;\"><div style=\"text-align:center;padding:20px;border:1px solid rgb(245,198,203);border-radius:10px;background-color:rgb(248,215,218);\"><h2>\u05e9\u05d2\u05d9\u05d0\u05ea \u05d2\u05d9\u05e9\u05d4</h2><p>\u05d0\u05ea\u05e8 \u05d6\u05d4 \u05d0\u05d9\u05e0\u05d5 \u05de\u05d5\u05e8\u05e9\u05d4</p></div></body>" const-string v3, "text/html" const-string v4, "utf-8" const/4 v5, 0x0 invoke-virtual/range {v0 .. v5}, Landroid/webkit/WebView;->loadDataWithBaseURL(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V return-void :allow_url_load.method public loadUrl(Ljava/lang/String;)V .registers 10 # כאן הוספנו 5 # --- מנגנון חסימה חכם --- invoke-static {p1}, Lcom/android/webview/chromium/UrlFetcher;->isAllowed(Ljava/lang/String;)Z move-result v0 # התיקון: אם הפונקציה החזירה אמת (1 - מורשה), קפוץ לאישור! if-nez v0, :allow_url_load # חסימה אלגנטית iget-object v0, p0, Lcom/android/webview/chromium/WebViewChromium;->a:Landroid/webkit/WebView; const-string v1, "http://blocked.local" const-string v2, "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><body dir=\"rtl\" style=\"display:flex;justify-content:center;align-items:center;height:100vh;background-color:rgb(248,215,218);color:rgb(114,28,36);font-family:sans-serif;margin:0;\"><div style=\"text-align:center;padding:20px;border:1px solid rgb(245,198,203);border-radius:10px;background-color:rgb(248,215,218);\"><h2>\u05e9\u05d2\u05d9\u05d0\u05ea \u05d2\u05d9\u05e9\u05d4</h2><p>\u05d0\u05ea\u05e8 \u05d6\u05d4 \u05d0\u05d9\u05e0\u05d5 \u05de\u05d5\u05e8\u05e9\u05d4</p></div></body>" const-string v3, "text/html" const-string v4, "utf-8" const/4 v5, 0x0 invoke-virtual/range {v0 .. v5}, Landroid/webkit/WebView;->loadDataWithBaseURL(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V return-void :allow_url_load.method public loadUrl(Ljava/lang/String;Ljava/util/Map;)V .registers 11 # גם כאן הוספנו 5 # --- מנגנון חסימה חכם --- invoke-static {p1}, Lcom/android/webview/chromium/UrlFetcher;->isAllowed(Ljava/lang/String;)Z move-result v0 # התיקון: אם הפונקציה החזירה אמת (1 - מורשה), קפוץ לאישור! if-nez v0, :allow_url_load # חסימה אלגנטית iget-object v0, p0, Lcom/android/webview/chromium/WebViewChromium;->a:Landroid/webkit/WebView; const-string v1, "http://blocked.local" const-string v2, "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><body dir=\"rtl\" style=\"display:flex;justify-content:center;align-items:center;height:100vh;background-color:rgb(248,215,218);color:rgb(114,28,36);font-family:sans-serif;margin:0;\"><div style=\"text-align:center;padding:20px;border:1px solid rgb(245,198,203);border-radius:10px;background-color:rgb(248,215,218);\"><h2>\u05e9\u05d2\u05d9\u05d0\u05ea \u05d2\u05d9\u05e9\u05d4</h2><p>\u05d0\u05ea\u05e8 \u05d6\u05d4 \u05d0\u05d9\u05e0\u05d5 \u05de\u05d5\u05e8\u05e9\u05d4</p></div></body>" const-string v3, "text/html" const-string v4, "utf-8" const/4 v5, 0x0 invoke-virtual/range {v0 .. v5}, Landroid/webkit/WebView;->loadDataWithBaseURL(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V return-void :allow_url_loadבנתיב org/chromium/android_webview
בקלאס AwContentsClientBridge
במתודה shouldOverrideUrlLoading
אחרי השורה של הREGISTERS להוסיף את הקוד הבא:.method public final shouldOverrideUrlLoading(Ljava/lang/String;ZZ[Ljava/lang/String;[Ljava/lang/String;Z)Z .registers 16 #להוסיף מכאן # יירוט ניווט פנימי invoke-static {p1}, Lcom/android/webview/chromium/UrlFetcher;->isAllowed(Ljava/lang/String;)Z move-result v0 # התיקון: אם הפונקציה החזירה אמת (1 - מורשה), קפוץ לאישור! if-nez v0, :allow_url # חסימה אלגנטית: טעינת HTML תוך זיוף כתובת iget-object v0, p0, Lorg/chromium/android_webview/AwContentsClientBridge;->a:LWV/N5; check-cast v0, LWV/vD; iget-object v0, v0, LWV/vD;->e:Landroid/webkit/WebView; const-string v1, "http://blocked.local" const-string v2, "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><body dir=\"rtl\" style=\"display:flex;justify-content:center;align-items:center;height:100vh;background-color:rgb(248,215,218);color:rgb(114,28,36);font-family:sans-serif;margin:0;\"><div style=\"text-align:center;padding:20px;border:1px solid rgb(245,198,203);border-radius:10px;background-color:rgb(248,215,218);\"><h2>\u05e9\u05d2\u05d9\u05d0\u05ea \u05d2\u05d9\u05e9\u05d4</h2><p>\u05d0\u05ea\u05e8 \u05d6\u05d4 \u05d0\u05d9\u05e0\u05d5 \u05de\u05d5\u05e8\u05e9\u05d4</p></div></body>" const-string v3, "text/html" const-string v4, "utf-8" const/4 v5, 0x0 invoke-virtual/range {v0 .. v5}, Landroid/webkit/WebView;->loadDataWithBaseURL(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V const/4 v0, 0x1 return v0 :allow_url #עד כאןשימו לב לשורות 12-14 שזה תלוי בגרסה שיש לכם, אז תוודאו את שורה 12, ע"י שתסתכלו בקוד של גרסתכם, מיד אחרי .line 29
אמורה להיות שורה כזאת:iget-object v1, p0, Lorg/chromium/android_webview/AwContentsClientBridge;->a:LWV/N5;הסוף של השורה (a:LWV/N5) זה מה שאמור להיות בסוף שורה 12
ואת שורה 13-14 תוודאו ע"י שתסתכלו על השורה שאחרי .line 91.line 91 iget-object v4, v8, LWV/vD;->e:Landroid/webkit/WebView;מה שבערך באמצע השורה ( LWV/vD;) זה מה שצריך להיות בסוף של שורה 13
ובשורה 14 גם מה שאחרי החץ (LWV/vD;->e).
או יותר פשוט, תשאלו את הAI הקרוב לביתכם איך להתאים בדיוק את הקוד, ותשמשו במייצא השרשורים של @ nh.local, זה אחלה דבר!בהצלחה!
-
מדריך | הוספת תאריך עברי למסך הנעילה בדאמבדרויד -
מדריך | הוספת תאריך עברי למסך הבית בדאמבדרוידבהמשך למדריך | הוספת תאריך עברי למסך הנעילה בדאמבדרויד.

למעשה את התוצאה נראה במסך הבית, אבל לא אותו אנחנו עורכים, אלא את הווידג'ט של השעון. (נפק"מ, שלכאורה הווידג'ט יהיה שונה גם בלאונצ'ר אחר).כמובן שנערך באמצעות AI וכו'.
באפליקציית deskclock
שנמצאת כאן:
system/product/app/DeskClock/DeskClock.apk- להוסיף את הקלאס HebrewDateHelper.smali בנתיב:
com/android/deskclock
.class public Lcom/android/deskclock/HebrewDateHelper; .super Ljava/lang/Object; # direct methods .method public static getCombinedDateString(Ljava/lang/String;)Ljava/lang/String; .registers 12 # --- חיתוך היום בשבוע (עד הפסיק) מהתאריך הלועזי --- const/16 v0, 0x2c invoke-virtual {p0, v0}, Ljava/lang/String;->indexOf(I)I move-result v0 const/4 v1, -0x1 if-eq v0, v1, :skip_trim add-int/lit8 v0, v0, 0x2 invoke-virtual {p0, v0}, Ljava/lang/String;->substring(I)Ljava/lang/String; move-result-object p0 :skip_trim # ---------------------------------------------------- :try_start_0 new-instance v0, Landroid/icu/util/HebrewCalendar; invoke-direct {v0}, Landroid/icu/util/HebrewCalendar;-><init>()V new-instance v1, Landroid/icu/util/ULocale; const-string v2, "he_IL@calendar=hebrew" invoke-direct {v1, v2}, Landroid/icu/util/ULocale;-><init>(Ljava/lang/String;)V const/4 v2, 0x0 invoke-static {v2, v1}, Landroid/icu/text/DateFormat;->getDateInstance(ILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat; move-result-object v2 invoke-static {}, Lcom/android/deskclock/HebrewDateHelper;->isAfterNightfall()Z move-result v3 move v10, v3 invoke-virtual {v0}, Landroid/icu/util/HebrewCalendar;->getTime()Ljava/util/Date; move-result-object v4 invoke-virtual {v2, v4}, Landroid/icu/text/DateFormat;->format(Ljava/util/Date;)Ljava/lang/String; move-result-object v3 if-eqz v3, :cond_bc const/4 v4, 0x7 invoke-virtual {v0, v4}, Landroid/icu/util/HebrewCalendar;->get(I)I move-result v5 if-ne v5, v4, :cond_33 if-eqz v10, :cond_33 const-string/jumbo v4, "יום שבת" const-string/jumbo v5, "מוצאי שבת" invoke-virtual {v3, v4, v5}, Ljava/lang/String;->replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String; move-result-object v3 :cond_33 const/16 v4, 0x20 invoke-virtual {v3, v4}, Ljava/lang/String;->lastIndexOf(I)I move-result v4 const-string v8, "" const-string v9, "" const/4 v5, -0x1 if-eq v4, v5, :cond_4b const/4 v5, 0x0 invoke-virtual {v3, v5, v4}, Ljava/lang/String;->substring(II)Ljava/lang/String; move-result-object v8 add-int/lit8 v4, v4, 0x1 invoke-virtual {v3, v4}, Ljava/lang/String;->substring(I)Ljava/lang/String; move-result-object v9 :cond_4b const/4 v3, 0x2 invoke-virtual {v0, v3}, Landroid/icu/util/HebrewCalendar;->get(I)I move-result v4 const/4 v5, 0x5 const/4 v6, 0x1 invoke-virtual {v0, v5, v6}, Landroid/icu/util/HebrewCalendar;->add(II)V invoke-virtual {v0}, Landroid/icu/util/HebrewCalendar;->getTime()Ljava/util/Date; move-result-object v5 invoke-virtual {v2, v5}, Landroid/icu/text/DateFormat;->format(Ljava/util/Date;)Ljava/lang/String; move-result-object v6 invoke-virtual {v0, v3}, Landroid/icu/util/HebrewCalendar;->get(I)I move-result v5 const-string v0, ", " invoke-virtual {v6, v0}, Ljava/lang/String;->indexOf(Ljava/lang/String;)I move-result v0 const/4 v7, -0x1 if-eq v0, v7, :cond_70 add-int/lit8 v0, v0, 0x2 invoke-virtual {v6, v0}, Ljava/lang/String;->substring(I)Ljava/lang/String; move-result-object v6 :cond_70 const/16 v0, 0x20 invoke-virtual {v6, v0}, Ljava/lang/String;->lastIndexOf(I)I move-result v0 if-eq v0, v7, :cond_7d const/4 v2, 0x0 invoke-virtual {v6, v2, v0}, Ljava/lang/String;->substring(II)Ljava/lang/String; move-result-object v6 :cond_7d if-ne v4, v5, :cond_8c const/16 v0, 0x20 invoke-virtual {v6, v0}, Ljava/lang/String;->indexOf(I)I move-result v0 if-eq v0, v7, :cond_8c const/4 v2, 0x0 invoke-virtual {v6, v2, v0}, Ljava/lang/String;->substring(II)Ljava/lang/String; move-result-object v6 :cond_8c new-instance v0, Ljava/lang/StringBuilder; invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V invoke-virtual {v0, v8}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; if-eqz v10, :cond_a7 const-string v2, " (אור ל-" invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; const-string v2, ") " invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0, v9}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; goto :goto_af :cond_a7 const-string v2, " " invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0, v9}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; :goto_af const-string v2, "\n" invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 return-object v0 :cond_bc new-instance v0, Ljava/lang/StringBuilder; invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; const-string v1, "\n" invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 return-object v0 :try_end_d1 .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_d1} :catch_d1 :catch_d1 move-exception v0 return-object p0 .end method .method private static isAfterNightfall()Z .registers 10 invoke-static {}, Ljava/util/Calendar;->getInstance()Ljava/util/Calendar; move-result-object v0 const/4 v1, 0x6 invoke-virtual {v0, v1}, Ljava/util/Calendar;->get(I)I move-result v1 const/16 v2, 0xb invoke-virtual {v0, v2}, Ljava/util/Calendar;->get(I)I move-result v2 const/16 v3, 0xc invoke-virtual {v0, v3}, Ljava/util/Calendar;->get(I)I move-result v3 invoke-virtual {v0}, Ljava/util/Calendar;->getTimeZone()Ljava/util/TimeZone; move-result-object v4 invoke-virtual {v0}, Ljava/util/Calendar;->getTime()Ljava/util/Date; move-result-object v0 invoke-virtual {v4, v0}, Ljava/util/TimeZone;->inDaylightTime(Ljava/util/Date;)Z move-result v0 const-wide v4, 0x400921fb54442d18L const-wide/high16 v6, 0x4000000000000000L mul-double/2addr v4, v6 add-int/lit8 v6, v1, -0x50 int-to-double v6, v6 mul-double/2addr v4, v6 const-wide v6, 0x4076d00000000000L div-double/2addr v4, v6 invoke-static {v4, v5}, Ljava/lang/Math;->sin(D)D move-result-wide v4 const-wide v6, 0x3ff0cccccccccccdL mul-double/2addr v4, v6 const-wide v6, 0x403247ae147ae148L add-double/2addr v4, v6 if-eqz v0, :cond_48 const-wide/high16 v6, 0x3ff0000000000000L add-double/2addr v4, v6 :cond_48 double-to-int v0, v4 int-to-double v6, v0 sub-double/2addr v4, v6 const-wide v6, 0x404e000000000000L mul-double/2addr v4, v6 double-to-int v4, v4 const/4 v5, 0x1 if-le v2, v0, :cond_56 return v5 :cond_56 if-ne v2, v0, :cond_5b if-lt v3, v4, :cond_5b return v5 :cond_5b const/4 v0, 0x0 return v0 .end method .method public static getNextUpdate(Ljava/util/Date;)Ljava/util/Date; .registers 14 if-nez p0, :cond_not_null const/4 v0, 0x0 return-object v0 :cond_not_null invoke-static {}, Ljava/lang/System;->currentTimeMillis()J move-result-wide v0 invoke-virtual {p0}, Ljava/util/Date;->getTime()J move-result-wide v2 invoke-static {}, Ljava/util/Calendar;->getInstance()Ljava/util/Calendar; move-result-object v4 invoke-virtual {v4, v0, v1}, Ljava/util/Calendar;->setTimeInMillis(J)V const/4 v5, 0x6 invoke-virtual {v4, v5}, Ljava/util/Calendar;->get(I)I move-result v6 invoke-virtual {v4}, Ljava/util/Calendar;->clone()Ljava/lang/Object; move-result-object v7 check-cast v7, Ljava/util/Calendar; invoke-virtual {v7, v5, v6}, Ljava/util/Calendar;->set(II)V invoke-virtual {v7}, Ljava/util/Calendar;->getTimeZone()Ljava/util/TimeZone; move-result-object v5 invoke-virtual {v7}, Ljava/util/Calendar;->getTime()Ljava/util/Date; move-result-object v8 invoke-virtual {v5, v8}, Ljava/util/TimeZone;->inDaylightTime(Ljava/util/Date;)Z move-result v5 const-wide v8, 0x400921fb54442d18L const-wide/high16 v10, 0x4000000000000000L mul-double/2addr v8, v10 add-int/lit8 v6, v6, -0x50 int-to-double v10, v6 mul-double/2addr v8, v10 const-wide v10, 0x4076d00000000000L div-double/2addr v8, v10 invoke-static {v8, v9}, Ljava/lang/Math;->sin(D)D move-result-wide v8 const-wide v10, 0x3ff0cccccccccccdL mul-double/2addr v8, v10 const-wide v10, 0x403247ae147ae148L add-double/2addr v8, v10 if-eqz v5, :skip_dst const-wide/high16 v10, 0x3ff0000000000000L add-double/2addr v8, v10 :skip_dst double-to-int v5, v8 int-to-double v10, v5 sub-double/2addr v8, v10 const-wide v10, 0x404e000000000000L mul-double/2addr v8, v10 double-to-int v6, v8 const/16 v8, 0xb invoke-virtual {v7, v8, v5}, Ljava/util/Calendar;->set(II)V const/16 v5, 0xc invoke-virtual {v7, v5, v6}, Ljava/util/Calendar;->set(II)V const/16 v5, 0xd const/4 v6, 0x0 invoke-virtual {v7, v5, v6}, Ljava/util/Calendar;->set(II)V const/16 v5, 0xe invoke-virtual {v7, v5, v6}, Ljava/util/Calendar;->set(II)V invoke-virtual {v7}, Ljava/util/Calendar;->getTimeInMillis()J move-result-wide v5 const-wide/16 v8, 0x1388 add-long/2addr v8, v0 cmp-long v7, v5, v8 if-lez v7, :skip_set cmp-long v7, v5, v2 if-gez v7, :skip_set move-wide v2, v5 :skip_set new-instance v0, Ljava/util/Date; invoke-direct {v0, v2, v3}, Ljava/util/Date;-><init>(J)V return-object v0 .end method- בקלאס DigitalAppWidgetProvider
שנמצא בנתיב com/android/alarmclock
א. להחליף את כל המתודה clinit, או להוסיף/ לשנות ע"פ הקוד המצורף:
.method static constructor <clinit>()V .registers 4 #להחליף ל4 .line 101 new-instance v0, Lcom/android/deskclock/LogUtils$Logger; const-string v1, "DigitalWidgetProvider" invoke-direct {v0, v1}, Lcom/android/deskclock/LogUtils$Logger;-><init>(Ljava/lang/String;)V sput-object v0, Lcom/android/alarmclock/DigitalAppWidgetProvider;->LOGGER:Lcom/android/deskclock/LogUtils$Logger; .line 113 new-instance v0, Landroid/content/Intent; const-string v1, "com.android.deskclock.ON_DAY_CHANGE" invoke-direct {v0, v1}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V #להוסיף מכאן new-instance v1, Landroid/content/ComponentName; const-string v2, "com.android.deskclock" const-string v3, "com.android.alarmclock.DigitalAppWidgetProvider" invoke-direct {v1, v2, v3}, Landroid/content/ComponentName;-><init>(Ljava/lang/String;Ljava/lang/String;)V invoke-virtual {v0, v1}, Landroid/content/Intent;->setComponent(Landroid/content/ComponentName;)Landroid/content/Intent; #עד כאן sput-object v0, Lcom/android/alarmclock/DigitalAppWidgetProvider;->DAY_CHANGE_INTENT:Landroid/content/Intent; return-void .end methodב. במתודה updateDayChangeCallback
בערך בשורה .line 387
להוסיף כך:.line 387 invoke-interface {v1}, Ljava/util/List;->isEmpty()Z move-result v3 const/4 v3, 0x0 # להוסיף את השורה הזאת if-eqz v3, :cond_18ב. במתודה getDateFormat
כמעט בסופה, להוסיף את השורות הבאות:.line 500 invoke-static {v0, p0}, Landroid/text/format/DateFormat;->getBestDateTimePattern(Ljava/util/Locale;Ljava/lang/String;)Ljava/lang/String; move-result-object p0 # להוסיף מכאן invoke-static {p0}, Lcom/android/deskclock/HebrewDateHelper;->getCombinedDateString(Ljava/lang/String;)Ljava/lang/String; move-result-object p0 # עד כאן return-object p0 .end method- בקלאס Utils
שנמצא באותו נתיב (com/android/deskclock)
במתודה getNextDay
כמעט בסופה, להוסיף את השורות הבאות:
invoke-virtual {v1}, Ljava/util/Calendar;->getTime()Ljava/util/Date; move-result-object v0 :goto_44 # להוסיף מכאן invoke-static {v0}, Lcom/android/deskclock/HebrewDateHelper;->getNextUpdate(Ljava/util/Date;)Ljava/util/Date; move-result-object v0 # עד כאן return-object v0- ועכשיו לעריכת XML, למרות שמשום מה אני לא אוהב את זה..
בנתיב /res/layout/
בקובץ digital_widget.xml
להוסיף/לשנות את השורות הבאות, או פשוט להחליף את התוכן עם הקוד הבא:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:gravity="0x00000011" android:orientation="1" android:id="@01020000" android:background="@7F08010A" android:padding="@7F0702BA" android:layout_width="-1" android:layout_height="-1" android:backgroundTint="?7F04003C"> <TextClock android:textAppearance="?7F040042" android:ellipsize="0" android:layout_gravity="0x00000001" android:id="@7F0A009C" android:layout_width="-2" android:layout_height="-2" android:singleLine="true" android:includeFontPadding="false" android:format12Hour="@7F130210" android:format24Hour="@7F130211"/> <LinearLayout android:gravity="0x00000001" <--- הוספה: מרכוז הפריטים בתוך הקונטיינר android:orientation="1" <--- הוספה: הגדרת כיוון אנכי (אחד מתחת לשני) android:id="@7F0A0074" android:layout_width="-2" android:layout_height="-2" android:layout_marginTop="-10.0dip"> <TextClock android:textAppearance="?7F040043" android:ellipsize="0" android:gravity="0x00000011" <--- הוספה: יישור הטקסט למרכז android:layout_gravity="0x00000011" <--- הוספה: מיקום השעון במרכז android:id="@7F0A00B8" android:layout_width="-2" android:layout_height="-2" android:maxLines="2" <--- הוספה: מאפשר לשעון לגלוש ל-2 שורות android:singleLine="false" <--- שינוי: במקור היה true, שונה ל-false android:includeFontPadding="false"/> <LinearLayout <--- הוספה: תחילת קונטיינר חדש לתמונה והטקסט android:gravity="0x00000001" <--- הוספה: יישור למרכז האופקי android:layout_gravity="0x00000001" <--- הוספה: מיקום הקונטיינר במרכז android:orientation="0" <--- הוספה: כיוון אופקי (תמונה וטקסט באותה שורה) android:layout_width="-2" <--- הוספה: רוחב לפי התוכן android:layout_height="-2" <--- הוספה: גובה לפי התוכן android:layout_marginTop="2.0dip"> <--- הוספה: מרווח קטן מלמעלה (מהשעון) <ImageView android:layout_gravity="0x00000011" android:id="@7F0A019C" android:layout_width="-2" android:layout_height="-2" android:src="@7F08007D" android:scaleType="3" android:adjustViewBounds="true" android:tint="?7F040041" app:tint="?7F040041" android:contentDescription="@00000000"/> <TextView android:textAppearance="?7F040043" android:ellipsize="0" android:layout_gravity="0x00000011" android:id="@7F0A019B" android:layout_width="-2" android:layout_height="-2" android:singleLine="true" android:includeFontPadding="false"/> </LinearLayout> <--- הוספה: סגירת הקונטיינר החדש של התמונה והטקסט </LinearLayout> <ListView android:layout_gravity="0x00000031" android:id="@7F0A029D" android:visibility="2" android:layout_width="-1" android:layout_height="-2" android:layout_marginTop="10.0dip" android:divider="@00000000"/> </LinearLayout>בהצלחה!
- להוסיף את הקלאס HebrewDateHelper.smali בנתיב:
-
להורדה | מאגר אפליקציות - מותאמות לסינון מתעדכנות אוטומטית@שניאור-שמח נכון, אבל על פניו זה כרגע עובד, לכן אולי המשתמש מעדיף לחכות עם העדכון, זה בכל זאת משהו כמו 90 מ"ב כל פעם..
עם הזמן גם נראה כמה זמן הגרסה הערוכה מחזיקה בלי עדכון.. -
להורדה | מאגר אפליקציות - מותאמות לסינון מתעדכנות אוטומטיתשאלה למי שמשתמש בוואצפ המסונן:
האם לדעתכם קצב העדכונים גבוה מדי?
כרגע זה נראה לי משהו כמו כל יומיים שלושה... (זה כך כי פשוט וואצפ באמת משחררים כל הזמן גרסאות חדשות).
האם יש צורך בנתינת אפשרות למשתמש אפשרות לדחות את העדכון הנוכחי, עד לבא?