מדריך זה מתעד את השלבים המדויקים שביצעתי כדי לפתור בעיה נפוצה בבניות מבוססות
Launcher3QuickStep (AOSP) על מכשירים עם מסך ביחס ממדים חריג (כמו Qin F21 Pro)
כאשר החלקה למעלה במסך הבית לא פותחת את מגירת האפליקציות.
שורש הבעיה
ב-Launcher3QuickStep הסטנדרטי, המחווה של החלקה למעלה כדי לפתוח את המגירה
מיושמת דרך מחלקה בשם PortraitStatesTouchController, שנרשמת בתוך QuickstepLauncher.createTouchControllers().
הבעיה: הרישום הזה מותנה בבדיקה DeviceProfile.isVerticalBarLayout().
במכשירים עם יחס ממדים חריג (מסכים קטנים/כמעט-מרובעים), הפונקציה הזו מחזירה true בטעות — מה שגורם לקוד לעבור לענף אחר (המיועד למכשירים עם hotseat
אנכי, כמו טאבלטים/מכשירים מתקפלים), שבו PortraitStatesTouchController לא נרשם בכלל. התוצאה: אין שום דרך במגע לפתוח את המגירה.
איך לזהות את זה בעצמכם ב-APK אחר
# אחרי פירוק עם apktool:
grep -n "createTouchControllers" smali_classes2/com/android/launcher3/uioverrides/QuickstepLauncher.smali
חפשו בגוף המתודה הזו קריאה ל-DeviceProfile;->isVerticalBarLayout()Z — אם
הענף שמוסיף PortraitStatesTouchController תלוי בבדיקה הזו, זו אותה בעיה.
הפתרון שבחרתי
במקום "לתקן" את isVerticalBarLayout() (מסוכן — הוא משפיע על עוד המון
לוגיקת מסך), יצרתי controller עצמאי חדש שמזהה בעצמו החלקה למעלה על מסך
הבית ופותח את המגירה — בלי שום תלות בענף השבור. הוא נרשם תמיד, בלי תנאי,
כך שהוא עובד גם אם isVerticalBarLayout() ממשיך "לטעות".
onControllerInterceptTouchEvent עוקב אחרי כל מגע: ב-ACTION_DOWN הוא בודק
שהמסך במצב NORMAL (מסך הבית, לא במגירה/overview כבר) ושומר את נקודת
ההתחלה.
ב-ACTION_MOVE, אם התזוזה האנכית כלפי מעלה עוברת סף (4 × touch-slop של המערכת) והיא דומיננטית יותר מהתזוזה האופקית (כלומר מחווה אנכית ולא גרירה
בין מסכים) — הוא קורא ל-goToState(ALL_APPS) ומחזיר true, מה שגורם
ל-DragLayer "לגנוב" את המגע משאר הרכיבים.
onControllerTouchEvent פשוט בולע את המשך המחווה כדי שלא יקרו תופעות לוואי
בזמן שהמעבר למגירה כבר קורה.
שלב 3 — רישום ה-controller
חזרו תיקייה אחת אחורה (uioverrides/) ופתחו לעריכה את QuickstepLauncher.smali. חפשו בתוך הקובץ (יש חיפוש טקסט בעורך) את המתודה:
.method public createTouchControllers()[Lcom/android/launcher3/util/TouchController;
בתוך המתודה הזו, מיד אחרי השורה הראשונה שמוסיפה פריט ל-ArrayList (זו
שמוסיפה את ה-DragController — תזהו אותה לפי getDragController() ממש
מעליה), הוסיפו את שלוש השורות הבאות:
חשוב לפני שאתם מדביקים:v2 בקוד הזה הוא ה-register שמחזיק את
ה-ArrayList<TouchController>, ו-v3 הוא register שחייב להיות פנוי
לשימוש חוזר באותה נקודה — בדקו בעצמכם בקובץ שלכם (חפשו למעלה איפה v3
משמש לאחרונה, ולמטה איפה הוא משמש הבא). אם v3 לא פנוי שם, או אם .locals
בתחילת המתודה נמוך מדי בשביל ה-register שבחרתם — MT Manager יזרוק שגיאת קימפול Smali ברגע השמירה/יציאה מהעורך, ותצטרכו לבחור register אחר ואולי
להעלות את מספר ה-.locals.
שלב 4 — שמירה וקימפול
צאו מעורך ה-Smali (בדרך כלל כפתור "שמור" או חץ אחורה) (לא לסמן את "חתימה אוטומטית"!)
— MT Manager יקמפל
אוטומטית את השינויים בחזרה ל-dex ברגע הזה. אם יש שגיאת תחביר Smali היא
תופיע כאן; אם לא, ה-APK בתיקייה שערכתם כבר מעודכן.
אם תרצו שבאנגלית השורה תהיה באנגלית תצטרכו להוסיף סטרינג.
הכנסו בMT לקובץ resources.arsc בעורך arsc. לחצו על השורה התחתונה, הכנסו לstring ושוב לstring. לחצו בתפריט הצדדי על "הוסף" והדביקו שם:
emergency_alerts_title
זכרו את מזהה הכניסה.
לחצו על הסטרינג, בשורה "תוכן" הכניסו Wireless emergency Alerts.
צאו מstring, הכנסו לstring-iw ולחצו שוב על "הוסף". הכניסו את מזהה הכניסה של הסטרינג הקודם - והשם יהפך אוטומטית לemergency_alerts_title.
לחצו על הסטרינג, בשורה "תוכן" הכניסו התרעות חירום אלחוטיות.
אותו הדבר לסטרינג הsummary. רק שלו קוראים
emergency_alerts_summary
והתוכן הוא ניהול התראות במצבי חירום, איומים ובדיקות מערכת
ובאנגלית Emergency alerts management
לאונצ'ר עם מערכת דמוית מכשירי קיוליקס, פותח עבור לקוח שעבר מQ8 ל f21 pro.
סקירה מאת קלוד:
# Key Launcher — לאנצ'ר לניווט במקשים (עם תמיכה מלאה במגע)
מה זה?
Key Launcher הוא לאנצ'ר (מסך בית) לאנדרואיד שנבנה מהיסוד לשימוש נוח במקשים פיזיים — D-Pad, מקשי בחירה (Soft Left/Right), Back, מקש מרכזי — בדיוק כמו בפיצ'ר-פונים הישנים והטובים, אבל עם כל מה שאנדרואיד מודרני יודע לעשות. מגע נתמך באופן מלא כאפשרות משנית, אז זה עובד מצוין גם על מסך רגיל ללא מקשים.
נכתב כולו ב-Kotlin, בלי שום תלות בספריות AndroidX/Jetpack — רק framework אנדרואיד טהור. תומך מ-Android 4.4 (KitKat) ועד Android 14.
המסכים
מסך הבית
שעון דיגיטלי גדול (עם הקו המפריד המלא), תאריך לועזי ותאריך עברי מלא (כולל גימטריה — "ט"ו אלול תשפ"ו" וכו')
סטטוס כרטיס סים (כולל תמיכה ב-Dual SIM)
מציג את הטפט האמיתי של המכשיר ברקע, כמו בכל לאנצ'ר
כל הטקסטים לבנים עם מסגרת שחורה — קריאים על כל טפט, בהיר או כהה
דף קיצורים — רשת 3x2 של עד 6 אפליקציות נבחרות, עם כותרת פוקוס דינמית שמראה איזה אייקון ממוקד כרגע
דף התפריט (App Drawer) — כל האפליקציות המותקנות, ברשת 3x3, עם גלילה מעגלית בין "עמודים"
מסך "סדר" — סידור מחדש של האייקונים במנגנון "הרם-הזז-הנח" (Pick-up / Move / Drop), נשלט לגמרי דרך המקלדת
עיצוב
פלטת צבעים עקבית בכל האפליקציה — רקע שמנת חם (#F5EFE3), אייקונים בגרדיאנט כחול, הדגשות פוקוס כחולות ברורות, וטיפוגרפיה מותאמת עברית עם תמיכת RTL מלאה בכל מסך ומסך.
תאימות טכנית
Kotlin, ללא AndroidX — framework אנדרואיד טהור בלבד
minSdk 19 (KitKat) עד targetSdk 34
טעינת אייקונים עם caching לביצועים טובים גם על מכשירים חלשים
תאריך עברי: android.icu.util.HebrewCalendar ב-API 24+, עם אלגוריתם ידני (Dershowitz-Reingold) לגרסאות ישנות יותר
מצב נוכחי
עדיין בפיתוח פעיל ובבדיקות על מכשיר אמיתי (כולל מכשיר היברידי מקשים+מגע) — יש עוד כמה דברים לחדד. שמח לקבל פידבק, דיווחי באגים, והצעות!