@מחנה-ידידים הוספתי בספויילר.
לא ניסיתי, אבל זה אמור לעבוד.
lilo159
-
מדריך | הוספת תאריך עברי למסך הבית בגרסה הרגילה של 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 מ"ב כל פעם..
עם הזמן גם נראה כמה זמן הגרסה הערוכה מחזיקה בלי עדכון.. -
להורדה | מאגר אפליקציות - מותאמות לסינון מתעדכנות אוטומטיתשאלה למי שמשתמש בוואצפ המסונן:
האם לדעתכם קצב העדכונים גבוה מדי?
כרגע זה נראה לי משהו כמו כל יומיים שלושה... (זה כך כי פשוט וואצפ באמת משחררים כל הזמן גרסאות חדשות).
האם יש צורך בנתינת אפשרות למשתמש אפשרות לדחות את העדכון הנוכחי, עד לבא? -
בקשה | העברה של הוואטסאפ משיאומי F21 לשיאומי F25 תמורת תשלום סביר@אושפיזין לכאורה אפשר עם swiftbackup (אפליקציה) אם יש לך רוט בשני המכשירים. יש שם אפשרות לשמור את הגיבוי גם על דיסק און קי, כך זכור לי. אני כמובן לא לוקח אחריות, אבל לכאורה אין לך מה להפסיד כי זה פשוט שומר את האפליקציה ביחד עם הdata. אולי אפשר גם עם גיבוי טיטניום, אבל את זה אני לא מכיר.
-
להורדה | מאגר אפליקציות - מותאמות לסינון מתעדכנות אוטומטית@שניאור-שמח עד כעת, הוואצפ עבר עוד עריכה חוץ מעריכת סמאלי, ע"י HOOKING, שתלוי בפרוייקט בגיטהאב, ותלוי בתחזוקה שלו ע"י בעל הפרוייקט. כעת ניסיתי להעביר את הלוגיקה שלו לסמאלי, עם עוד כמה תיקונים, ולראות כמה מים זה יחזיק... כרגע זה עובד..
-
להורדה | מאגר אפליקציות - מותאמות לסינון מתעדכנות אוטומטית@שניאור-שמח אני מנסה עכשיו משהו חדש, אשמח אם תנסה להוריד שוב (כנראה שתצטרך להוריד דרך החנות כי בעצם אתה לא יכול לעדכן...), תודה.
-
מדריך | הוספת תאריך עברי למסך הנעילה בדאמבדרוידאם תרצה אני עדיין יכול להוסיף תמונות או לעשות סרטון.
אלוף, ידעתי למה אני מתעקש לראות את הקוד!
זה בדיוק ההבדל בין מדריך שעובד לבין בוטלופ (קריסת מערכת).ראית איזה יופי? ב-MTK אנדרואיד 13 של אלוף תימן, המהנדסים שינו את המבנה בשני מקומות קריטיים:
- ב-
KeyguardSliceProvider: הם הוציאו את פרמוט התאריך למתודה נפרדת בשםgetFormattedDateLocked()! אם היינו מחפשים את ה-mDateFormat->formatבתוךupdateClockLockedכמו בדאמבדרויד, לא היינו מוצאים אותו. - ב-
KeyguardSliceView: הם בכלל לא קוראים ל-setEllipsizeבקוד ה-Smali (כנראה שזה מוגדר ב-XML או בקלאסKeyguardSliceTextViewעצמו). לכן אין לנו שורות להחליף, אלא רק שורות להוסיף.
בנוסף, עשיתי לך כאן טריק קטן של אופטימיזציה ברגיסטרים: במקום להשתמש ברגיסטר
v2בשביל לבדוק אםindexOfשווה ל-(1-), השתמשתי בפקודהif-ltz(שבודקת אם התוצאה קטנה מ-0). למה? כי המתודה מוגדרת עם.registers 3, מה שאומר ש-v2הוא בעצםp0(ה-thisשל הקלאס). אם היינו דורסים אתv2, המכשיר היה קורס מיד לאחר מכן כשהיה מנסה לשמור את ה-mLastText.הנה ההוראות המדויקות לפורטינג עבור הנגן של אלוף תימן:
שלב 1: הזרקת הלוגיקה ב-
KeyguardSliceProviderבנתיב
com/android/systemui/keyguard/KeyguardSliceProvider.smali, חפש את המתודהupdateClockLocked()V.
תמצא שם את השורות הבאות:.line 406 invoke-virtual {p0}, Lcom/android/systemui/keyguard/KeyguardSliceProvider;->getFormattedDateLocked()Ljava/lang/String; move-result-object v0מיד אחריהן (ולפני ה-
iget-object v1), הוסף את הקוד שלנו. השתמשתי ב-v1בתור רגיסטר זמני כי המערכת במילא דורסת אותו שורה אחת למטה. הדבק את זה:# --- הוספת התאריך העברי --- const/16 v1, 0x2c invoke-virtual {v0, v1}, Ljava/lang/String;->indexOf(I)I move-result v1 if-ltz v1, :skip_trim add-int/lit8 v1, v1, 0x2 invoke-virtual {v0, v1}, Ljava/lang/String;->substring(I)Ljava/lang/String; move-result-object v0 :skip_trim invoke-static {v0}, Lcom/android/systemui/HebrewDateHelper;->getCombinedDateString(Ljava/lang/String;)Ljava/lang/String; move-result-object v0 # --- סוף הוספה ---שלב 2: הגדרת 2 שורות במסך הנעילה ב-
KeyguardSliceViewבנתיב
com/android/keyguard/KeyguardSliceView.smali, חפש את המתודהshowSlice.
תמצא שם את יצירת ה-TextView (סביבות שורה 168):new-instance v9, Lcom/android/keyguard/KeyguardSliceView$KeyguardSliceTextView; iget-object v10, p0, Landroid/widget/LinearLayout;->mContext:Landroid/content/Context; invoke-direct {v9, v10}, Lcom/android/keyguard/KeyguardSliceView$KeyguardSliceTextView;-><init>(Landroid/content/Context;)Vמיד אחרי ה-
<init>(לפני ה-setTextColor), אנחנו נזריק את ההגדרות שלנו למספר שורות. גם כאן השתמשתי ב-v10כי הוא פנוי לחלוטין ברגע הזה. הוסף את השורות הבאות:# --- לאפשר תצוגת 2 שורות לתאריך --- const/4 v10, 0x2 invoke-virtual {v9, v10}, Landroid/widget/TextView;->setMaxLines(I)V const/4 v10, 0x0 invoke-virtual {v9, v10}, Landroid/widget/TextView;->setSingleLine(Z)V # --- סוף הוספה ---שלב 3: הוספת ה-Class
כמובן, את השלב הראשון במדריך שלך – יצירת הקובץ
HebrewDateHelper.smaliבנתיבcom/android/systemuiעם כל הלוגיקה בפנים – צריך לעשות בדיוק כמו בדאמבדרויד, ללא שום שינוי.זהו זה! שמור, קמפל חזרה ותתקין. הקוד עכשיו תפור ברמת הפיקסל ל-MTK 13. תעביר את זה לאלוף תימן, וזה אמור לעבוד לו חלק לגמרי. עבודה מעולה שלך על המדריך המקורי!
- ב-
-
מדריך | הוספת תאריך עברי למסך הנעילה בדאמבדרויד@אלוף-תימן פשוט תגלול עד לסוף השיחה, זה כמעט אותם עריכות פשוט להדביק איפה שהסטודיו מכוון..
-
מדריך | הוספת תאריך עברי למסך הנעילה בדאמבדרויד -
מדריך | הוספת תאריך עברי למסך הנעילה בדאמבדרויד@אלוף-תימן בהמשך, אני פשוט לא ליד מחשב. זה עובד לך?