# בייביסיטר טלפוני – אפליקציה אופליין

פרויקט Android מלא (קוד מקור) למערכת בייביסיטר כמו שתואר בשרשור: שני מכשירים, אחד
נשאר בחדר הילדים ו"מאזין", ואם הוא מזהה רעש/בכי חזק - הוא מחייג אוטומטית למספר
שהוגדר (ההורה).

## חשוב לדעת לפני שמתחילים

**אני לא יכול לקמפל APK מוכן להתקנה כאן** - קימפול אפליקציית אנדרואיד דורש
Android SDK מלא עם גישה לשרתי גוגל (Maven), וזו גישה שאין לי בסביבה שבה אני
פועל. מה שיש כאן זה **קוד מקור שלם ועובד** שצריך לבנות (build) עם Android
Studio - בדיוק כמו שדנו בשרשור לגבי מציאת מישהו שיפתח את זה.

## מה זה עושה, ולמה זה "אופליין"

בניגוד להצעות בשרשור שדיברו על שרת + Gemini API לזיהוי בכי, האפליקציה הזו
**לא שולחת שום דבר לאף שרת חיצוני**. הזיהוי מבוסס על מדידת עוצמת קול מקומית
בלבד (`MediaRecorder.getMaxAmplitude`), ישירות על המכשיר. זה פחות "חכם" מזיהוי
AI אמיתי של בכי (זה מזהה כל רעש חזק, לא ספציפית בכי) - בדיוק כמו שאחד המגיבים
בשרשור ציין שזה "לדעתי מיותר, מכל סוג רעש אני אשמח לראות מה קורה". זה גם אומר
שאין תלות באינטרנט, בשרת, או בעלויות API.

**המכשיר השני (של ההורה) לא צריך שום אפליקציה** - הוא רק מקבל שיחה טלפונית
רגילה.

## מה יש בפרויקט

- `MainActivity` - מסך הגדרות: מספר טלפון, רמת רגישות, כפתור התחל/עצור.
- `CryDetectionService` - שירות רקע (Foreground Service) שמאזין למיקרופון כל
  700ms ומחייג אוטומטית (`Intent.ACTION_CALL`) כשעוצמת הקול עוברת סף.
- מוגדר עם `minSdk 19` (Android 4.4 KitKat) כדי לתמוך גם במכשיר שיאומי ישן עם
  מקשים כמו שצוין בשרשור.
- `targetSdk 22` בכוונה - כך כל ההרשאות (כולל הרשאת שיחה) ניתנות אוטומטית
  בהתקנה, בלי דיאלוגים של runtime permissions שלא תמיד עובדים טוב במכשירים
  בסיסיים/ישנים.

## איך לבנות את זה ל-APK

1. התקינו [Android Studio](https://developer.android.com/studio) (חינמי).
2. `File > Open` ובחרו את התיקייה הזו.
3. חכו שה-Gradle יסיים לסנכרן (זה מוריד תלויות מהאינטרנט).
4. `Build > Build Bundle(s) / APK(s) > Build APK(s)`.
5. ה-APK ייווצר בתוך `app/build/outputs/apk/debug/app-debug.apk`.
6. מעבירים את הקובץ למכשיר (למשל דרך USB או וואטסאפ) ומתקינים אותו ("התקנה
   ממקורות לא ידועים" צריכה להיות מופעלת).

אם אין לכם אפשרות להריץ Android Studio בעצמכם - זה בדיוק המצב שתואר בשרשור,
ואפשר לפנות למישהו שיודע לבנות פרויקט אנדרואיד (זה עניין של כמה דקות בשבילו
עם הקוד המוכן הזה).

## מה תוקן/עודכן אחרי השוואה לשתי אפליקציות אמיתיות שרצות על שיאומי מקשים

בדקתי (פירקתי ובחנתי) את שתי אפליקציות ה-APK שסיפקת, כולל אפליקציית ניהול
ותיקה ומוכחת (`ארגונית`, גרסה 4.0, המתעדכנת מזה הרבה זמן) שרצה בפועל על
מכשיר כזה. שתי הבדיקות העלו:

- **שתיהן לא משתמשות ב-AndroidX/AppCompat בכלל** - הן מרחיבות `Activity`
  רגיל ומשתמשות ב-theme הגולמי של הפלטפורמה (`android:Theme`), לא
  ב-`Theme.AppCompat` וגם לא ב-`Theme.Material`. שיניתי את הקוד בהתאם:
  הוסרו כל תלויות ה-AndroidX, `MainActivity` מרחיב `Activity` רגיל, וה-theme
  עבר ל-`android:Theme`. זה גם מפשט את הבנייה (פחות תלויות Maven להוריד).
- **`ארגונית` מוגדרת עם `targetSdk 19` בדיוק שווה ל-`minSdk 19`** - שיניתי את
  הפרויקט מ-`targetSdk 22` בדיוק לאותו ערך, כדי להתאים למה שמוכח כעובד.
- **מוסכמת העיצוב שלהן שונה לגמרי ממה שהיה לי**: רקע כהה, רצועת כותרת שחורה
  עם הדגשת צבע (טורקיז/ציאן) וטקסט לבן, עיצוב שטוח לגמרי בלי צללים/גרדיאנטים
  של Material. עיצבתי מחדש את המסך כך שיתאים לאותה מוסכמה (ראה
  `res/values/colors.xml` ו-`res/layout/activity_main.xml`).
- שתי האפליקציות **לא הצהירו על `uses-feature touchscreen required=false`**
  בכלל - זה תומך בהערכה שההצהרה הזו רלוונטית בעיקר לסינון של חנות Google
  Play, ופחות משפיעה בהתקנה ידנית (side-load) שהיא כנראה הדרך שבה אפליקציות
  כאלה מותקנות בפועל. השארתי אותה בקוד בכל זאת כי היא נכונה מבחינה טכנית
  ולא מזיקה.
- כתוצאה מהסרת AndroidX, גם ה-notification של השירות (`CryDetectionService`)
  נבנה עכשיו עם ה-API הגולמי של המערכת (`Notification.Builder`) במקום
  `NotificationCompat`.

## מה תוקן/עודכן בבדיקה השנייה

- **תוקן באג קריטי**: הערכת (theme) הקודמת דרשה אנדרואיד 21+ ולא הייתה קיימת
  בכלל באנדרואיד 4.4 - האפליקציה הייתה קורסת מיידית בפתיחה במכשיר היעד.
  הוחלפה ל-`Theme.AppCompat` שתומך אחורה עד אנדרואיד הרבה יותר ישן.
- **תוקן סיכון לאחסון**: קובץ ההקלטה הזמני (ששימש רק למדידת עוצמת קול, לא
  נשמע בפועל) היה יכול לתפוח בלי הגבלה אם האפליקציה רצה שעות ארוכות ברצף.
  עכשיו ההקלטה מתאתחלת אוטומטית כל 4 דקות והקובץ הישן נמחק.
- **נוספה התאוששות משגיאות**: אם המיקרופון תפוס (למשל בזמן שיחה פעילה),
  השירות מזהה זאת ומנסה שוב אוטומטית במקום להיתקע.
- **הותאם למכשיר מקשים ללא מסך מגע**:
  - נוסף `<uses-feature touchscreen required="false">` - בלי זה, אנדרואיד
    עלול לחסום התקנה במכשיר ללא מגע.
  - הוחלף הסליידר (SeekBar) לבחירת רגישות בשלושה כפתורי בחירה (RadioButton) -
    הרבה יותר אמין לניווט עם חצי מקשים מאשר גרירת סליידר.
  - נקבע סדר מעבר שדות ברור (טלפון → רגישות → כפתור התחל), וטקסטים/כפתורים
    גדולים יותר לנוחות קריאה ובחירה.
- **נוסף אייקון** לאפליקציה (בכל צפיפויות המסך הנתמכות).
- הוסרה הרשאת `RECEIVE_BOOT_COMPLETED` שלא הייתה בשימוש בפועל (לא הייתה
  מוגדרת שום פעולה שקורית עם המערכת בהפעלת המכשיר).

## הגבלות שכדאי לדעת

- זיהוי לפי עוצמת קול בלבד, לא זיהוי בכי אמיתי (אין AI) - כמו שנדון בשרשור,
  יש כאן טרייד-אוף בין דיוק לבין אופליין/חינמי/פרטי.
- אחרי כל שיחה יש "קירור" של דקה לפני שהאפליקציה תתקשר שוב, כדי לא לחייג שוב
  ושוב ברצף.
- מומלץ לוודא במכשיר בפועל שהאפליקציה לא נסגרת ע"י חוסכי סוללה אגרסיביים של
  MIUI (יש להוסיף אותה לרשימת "אין הגבלת סוללה" בהגדרות שיאומי).
- אם ההרשאה לחיוג אוטומטי (`CALL_PHONE`) לא זמינה מסיבה כלשהי, האפליקציה
  תיפול חזרה למסך חיוג רגיל (שידרוש לחיצה ידנית) במקום שיחה אוטומטית.
