נבדק על ידי ועובד. מי שרוצה שאצור גם לf22 pro שידבר איתי.
המדריך דורש:
רוט - תעשו אם אין לכם
מנהל MT - מנהל-MT-מתורגם.apk
שלב 1: יצירת מחלקות הלוגיקה.
בתוך MT Manager, פתח את com.android.systemui, כנס ל-classes.dex (ב-Dex Editor Plus) וצור שני קבצים בנתיב /com/android/systemui:
1. HebrewDateHelper.smali
קובץ זה מחשב את השקיעה לפי הנוסחה המתמטית (Sin/Cos) ומפיק את הטקסט "מוצאי שבת" או "אור ל-".
.class public Lcom/android/systemui/HebrewDateHelper;
.super Ljava/lang/Object;
# --- מתודה ראשית לעדכון ה-TextView ---
.method public static updateHebrewDisplay(Landroid/widget/TextView;)V
.registers 2
if-nez p0, :cond_3
return-void
:cond_3
invoke-static {}, Lcom/android/systemui/HebrewDateHelper;->getSmartDate()Ljava/lang/String;
move-result-object v0
invoke-virtual {p0, v0}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
return-void
.end method
# --- לוגיקה חכמה לבחירת הנוסח ---
.method public static getSmartDate()Ljava/lang/String;
.registers 4
# בדיקה האם עכשיו לילה לפי החישוב המתמטי
invoke-static {}, Lcom/android/systemui/HebrewDateHelper;->isAfterNightfall()Z
move-result v0
# יצירת לוח שנה עברי (ICU)
new-instance v1, Landroid/icu/util/HebrewCalendar;
invoke-direct {v1}, Landroid/icu/util/HebrewCalendar;-><init>()V
if-eqz v0, :cond_30 # אם לילה
# בדיקה אם יום שבת (7 ב-Calendar)
const/4 v2, 0x7
invoke-virtual {v1, v2}, Landroid/icu/util/HebrewCalendar;->get(I)I
move-result v3
if-ne v3, v2, :cond_20
const-string v0, "מוצאי שבת"
return-object v0
:cond_20
# אם לילה ואינו מוצ"ש - הוסף יום (מעבר לתאריך של מחר) והוסף "אור ל-"
const/4 v2, 0x5 # DATE
const/4 v3, 0x1
invoke-virtual {v1, v2, v3}, Landroid/icu/util/HebrewCalendar;->add(II)V
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v2, "אור ל-"
invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-static {v1}, Lcom/android/systemui/HebrewDateHelper;->formatHebrew(Landroid/icu/util/HebrewCalendar;)Ljava/lang/String;
move-result-object v1
invoke-virtual {v0, v1}, 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_30 # אם יום (לפני שקיעה)
invoke-static {v1}, Lcom/android/systemui/HebrewDateHelper;->formatHebrew(Landroid/icu/util/HebrewCalendar;)Ljava/lang/String;
move-result-object v0
return-object v0
.end method
# --- פורמט התאריך העברי (ICU) ---
.method private static formatHebrew(Landroid/icu/util/HebrewCalendar;)Ljava/lang/String;
.registers 4
new-instance v0, Landroid/icu/util/ULocale;
const-string v1, "he_IL@calendar=hebrew"
invoke-direct {v0, v1}, Landroid/icu/util/ULocale;-><init>(Ljava/lang/String;)V
const/4 v1, 0x0 # LONG style
invoke-static {v1, v0}, Landroid/icu/text/DateFormat;->getDateInstance(ILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;
move-result-object v0
invoke-virtual {p0}, Landroid/icu/util/HebrewCalendar;->getTime()Ljava/util/Date;
move-result-object v1
invoke-virtual {v0, v1}, Landroid/icu/text/DateFormat;->format(Ljava/util/Date;)Ljava/lang/String;
move-result-object v0
return-object v0
.end method
# --- חישוב שקיעה מתמטי (Sin/Cos) ---
.method private static isAfterNightfall()Z
.registers 10
invoke-static {}, Ljava/util/Calendar;->getInstance()Ljava/util/Calendar;
move-result-object v0
# קבלת נתוני הזמן הנוכחיים
const/4 v1, 0x6 # DAY_OF_YEAR
invoke-virtual {v0, v1}, Ljava/util/Calendar;->get(I)I
move-result v1
const/16 v2, 0xb # HOUR_OF_DAY
invoke-virtual {v0, v2}, Ljava/util/Calendar;->get(I)I
move-result v2
const/16 v3, 0xc # MINUTE
invoke-virtual {v0, v3}, Ljava/util/Calendar;->get(I)I
move-result v3
# חישוב שעת שקיעה משוערת
const-wide v4, 0x400921fb54442d18L # 2 * PI
const-wide/high16 v6, 0x4000000000000000L # 2.0
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 # 365.0
div-double/2addr v4, v6
invoke-static {v4, v5}, Ljava/lang/Math;->sin(D)D
move-result-wide v4
const-wide v6, 0x3ff0cccccccccccdL # 1.05
mul-double/2addr v4, v6
const-wide v6, 0x403247ae147ae148L # 18.28 (שעה בסיסית לשקיעה)
add-double/2addr v4, v6
# בדיקת שעון קיץ ועדכון השעה
invoke-virtual {v0}, Ljava/util/Calendar;->getTimeZone()Ljava/util/TimeZone;
move-result-object v6
invoke-virtual {v0}, Ljava/util/Calendar;->getTime()Ljava/util/Date;
move-result-object v0
invoke-virtual {v6, v0}, Ljava/util/TimeZone;->inDaylightTime(Ljava/util/Date;)Z
move-result v0
if-eqz v0, :cond_52
const-wide/high16 v6, 0x3ff0000000000000L # +1.0
add-double/2addr v4, v6
:cond_52
# המרת התוצאה לשעות ודקות
double-to-int v0, v4 # שעת שקיעה
int-to-double v6, v0
sub-double/2addr v4, v6
const-wide v6, 0x404e000000000000L # 60.0
mul-double/2addr v4, v6
double-to-int v4, v4 # דקות שקיעה
# השוואה לזמן אמת
const/4 v5, 0x1
if-le v2, v0, :cond_62
return v5
:cond_62
if-ne v2, v0, :cond_67
if-lt v3, v4, :cond_67
return v5
:cond_67
const/4 v0, 0x0
return v0
.end method
מי שרוצה ללא הצגת היום שייקח את הקוד שבספויילר:
Spoiler
.class public Lcom/android/systemui/HebrewDateHelper;
.super Ljava/lang/Object;
# --- מתודה ראשית לעדכון ה-TextView ---
.method public static updateHebrewDisplay(Landroid/widget/TextView;)V
.registers 2
if-nez p0, :cond_3
return-void
:cond_3
invoke-static {}, Lcom/android/systemui/HebrewDateHelper;->getSmartDate()Ljava/lang/String;
move-result-object v0
invoke-virtual {p0, v0}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
return-void
.end method
# --- לוגיקה חכמה לבחירת הנוסח (יום/לילה/מוצ"ש) ---
.method public static getSmartDate()Ljava/lang/String;
.registers 4
invoke-static {}, Lcom/android/systemui/HebrewDateHelper;->isAfterNightfall()Z
move-result v0
new-instance v1, Landroid/icu/util/HebrewCalendar;
invoke-direct {v1}, Landroid/icu/util/HebrewCalendar;-><init>()V
if-eqz v0, :cond_30 # אם לילה (אחרי שקיעה)
const/4 v2, 0x7 # יום שבת ב-Calendar
invoke-virtual {v1, v2}, Landroid/icu/util/HebrewCalendar;->get(I)I
move-result v3
if-ne v3, v2, :cond_20
const-string v0, "מוצאי שבת"
return-object v0
:cond_20
# אם לילה ואינו מוצ"ש - הוספת יום והוספת "אור ל-"
const/4 v2, 0x5 # DATE
const/4 v3, 0x1
invoke-virtual {v1, v2, v3}, Landroid/icu/util/HebrewCalendar;->add(II)V
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v2, "אור ל-"
invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-static {v1}, Lcom/android/systemui/HebrewDateHelper;->formatHebrew(Landroid/icu/util/HebrewCalendar;)Ljava/lang/String;
move-result-object v1
invoke-virtual {v0, v1}, 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_30 # אם יום (לפני שקיעה)
invoke-static {v1}, Lcom/android/systemui/HebrewDateHelper;->formatHebrew(Landroid/icu/util/HebrewCalendar;)Ljava/lang/String;
move-result-object v0
return-object v0
.end method
# --- פורמט התאריך העברי ללא יום בשבוע (MEDIUM style) ---
.method private static formatHebrew(Landroid/icu/util/HebrewCalendar;)Ljava/lang/String;
.registers 4
new-instance v0, Landroid/icu/util/ULocale;
const-string v1, "he_IL@calendar=hebrew"
invoke-direct {v0, v1}, Landroid/icu/util/ULocale;-><init>(Ljava/lang/String;)V
# ערך 2 מייצג MEDIUM (תאריך בלבד) במקום 0 (LONG - הכולל יום)
const/4 v1, 0x2
invoke-static {v1, v0}, Landroid/icu/text/DateFormat;->getDateInstance(ILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;
move-result-object v0
invoke-virtual {p0}, Landroid/icu/util/HebrewCalendar;->getTime()Ljava/util/Date;
move-result-object v1
invoke-virtual {v0, v1}, Landroid/icu/text/DateFormat;->format(Ljava/util/Date;)Ljava/lang/String;
move-result-object v0
return-object v0
.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 # DAY_OF_YEAR
invoke-virtual {v0, v1}, Ljava/util/Calendar;->get(I)I
move-result v1
const/16 v2, 0xb # HOUR_OF_DAY
invoke-virtual {v0, v2}, Ljava/util/Calendar;->get(I)I
move-result v2
const/16 v3, 0xc # MINUTE
invoke-virtual {v0, v3}, Ljava/util/Calendar;->get(I)I
move-result v3
# חישוב גלי סינוס לקירוב שעת שקיעה לאורך השנה
const-wide v4, 0x400921fb54442d18L # 2 * PI
const-wide/high16 v6, 0x4000000000000000L # 2.0
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 # 365.0
div-double/2addr v4, v6
invoke-static {v4, v5}, Ljava/lang/Math;->sin(D)D
move-result-wide v4
const-wide v6, 0x3ff0cccccccccccdL # 1.05
mul-double/2addr v4, v6
const-wide v6, 0x403247ae147ae148L # 18.28 (שעה בסיסית לשקיעה)
add-double/2addr v4, v6
# בדיקת שעון קיץ
invoke-virtual {v0}, Ljava/util/Calendar;->getTimeZone()Ljava/util/TimeZone;
move-result-object v6
invoke-virtual {v0}, Ljava/util/Calendar;->getTime()Ljava/util/Date;
move-result-object v0
invoke-virtual {v6, v0}, Ljava/util/TimeZone;->inDaylightTime(Ljava/util/Date;)Z
move-result v0
if-eqz v0, :cond_52
const-wide/high16 v6, 0x3ff0000000000000L # +1.0
add-double/2addr v4, v6
:cond_52
double-to-int v0, v4 # שעות
int-to-double v6, v0
sub-double/2addr v4, v6
const-wide v6, 0x404e000000000000L # 60.0
mul-double/2addr v4, v6
double-to-int v4, v4 # דקות
const/4 v5, 0x1
if-le v2, v0, :cond_62
return v5
:cond_62
if-ne v2, v0, :cond_67
if-lt v3, v4, :cond_67
return v5
:cond_67
const/4 v0, 0x0
return v0
.end method
2. HebrewDateReceiver.smali
קובץ זה "מקשיב" למערכת ומעדכן את התצוגה.
.class public Lcom/android/systemui/HebrewDateReceiver;
.super Landroid/content/BroadcastReceiver;
.field private mView:Landroid/widget/TextView;
.method public constructor <init>(Landroid/widget/TextView;)V
.registers 2
invoke-direct {p0}, Landroid/content/BroadcastReceiver;-><init>()V
iput-object p1, p0, Lcom/android/systemui/HebrewDateReceiver;->mView:Landroid/widget/TextView;
return-void
.end method
.method public onReceive(Landroid/content/Context;Landroid/content/Intent;)V
.registers 4
iget-object v0, p0, Lcom/android/systemui/HebrewDateReceiver;->mView:Landroid/widget/TextView;
invoke-static {v0}, Lcom/android/systemui/HebrewDateHelper;->updateHebrewDisplay(Landroid/widget/TextView;)V
return-void
.end method
שלב 2: הגדרת התצוגה
הוספת מזהה (ID): כנס ל-resources.arsc -> Arsc Editor -> com.android.systemui > id
כעת תראה רשימה ארוכה של שמות. לחץ על כפתור התפריט (3 נקודות) ובחר Add.
בתיבה שנפתחת, בשדה Name, רשום בדיוק: hebrew_date_display.
לחץ על אישור. יינתן ל id מספר (Hex) באופן אוטומטי. העתק את המספר הזה!
(הוא נראה בערך ככה: 0x7f0a0123).
צא חזרה ולחץ על Save כדי לשמור את השינויים בקובץ ה-arsc.
הוספת האלמנט: בנתיב /res/layout, פתח את הקובץ האחראי על מסך הנעילה (keyguard_status_view.xml) והוסף:
<TextView
android:id="@id/hebrew_date_display"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="center_horizontal"
android:textColor="#FFFFFF"
android:textSize="16sp"
android:layout_marginTop="4dp" />
שלב 3: הזרקת הרישום לעדכון בשקיעה.
כדי שהתאריך יבדוק כל דקה אם הגיעה השקיעה, נזריק את ה-Receiver לתוך המחלקה של מסך הנעילה (KeyguardStatusView.smali) בתוך המתודה onAttachedToWindow:
שימו לב לעדכן את ה- ID!
# 1. מציאת ה-View (החלף את ה-ID בערך ה-Hex ש-MT נותן לך)
const v0, 0x7fXXXXXX
invoke-virtual {p0, v0}, Landroid/view/View;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/TextView;
# 2. יצירת ה-Receiver והפילטר
new-instance v1, Lcom/android/systemui/HebrewDateReceiver;
invoke-direct {v1, v0}, Lcom/android/systemui/HebrewDateReceiver;-><init>(Landroid/widget/TextView;)V
new-instance v2, Landroid/content/IntentFilter;
invoke-direct {v2}, Landroid/content/IntentFilter;-><init>()V
# 3. הוספת הפעולות (כולל TICK לעדכון בשקיעה)
const-string v3, "android.intent.action.TIME_TICK" # עדכון כל דקה לבדיקת שקיעה
invoke-virtual {v2, v3}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V
const-string v3, "android.intent.action.DATE_CHANGED"
invoke-virtual {v2, v3}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V
# 4. רישום בפועל
invoke-virtual {p0}, Landroid/view/View;->getContext()Landroid/content/Context;
move-result-object v3
invoke-virtual {v3, v1, v2}, Landroid/content/Context;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;
# 5. עדכון מיידי ראשוני
invoke-static {v0}, Lcom/android/systemui/HebrewDateHelper;->updateHebrewDisplay(Landroid/widget/TextView;)V
שלב 4: סיום.
שמור הכל: צא מ-Dex Editor Plus ושמור שינויים.
עדכון: MT Manager יבקש לעדכן את ה-APK. לחץ אישור ואל תסמן את "חתימה אוטומטית"!
איני לוקח אחריות על שום נזק שיהיה כתוצאה ממדריך זה.
בהצלחה!