יצירת גדר

גדר מגדיר תנאי הקשר אחד או יותר שאפליקציה יכולה להגיב אליהם. כשהסטטוס של גדר משתנה, האפליקציה מקבלת קריאה חוזרת.

יש שני סוגים של גדרות: גדרות פרימיטיביות, שמייצגות את הקבוצה הבסיסית של אותות ההקשר, וגדרות משולבות, שמשלבות כמה גדרות פרימיטיביות באמצעות אופרטורים בוליאניים. כל הגדרות הגדר ההפרדה הן מופעים של AwarenessFence.

יצירת גדר פרימיטיבית

גדרות פרימיטיביות, שמייצגות את הקבוצה הבסיסית של אותות ההקשר, מוגדרות בחבילה awareness.fence. בדוגמה הבאה מוצגת יצירה של גדר פשוטה שמקבלת את הערך TRUE כשהפעילות של המשתמש שזוהתה היא WALKING, ואת הערך FALSE במקרים אחרים:

AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);

בדוגמה הקודמת, התג DetectedActivityFence נוצר על ידי קריאה ל-during. כלומר, הגדר תהיה במצב TRUE בכל פעם שהמשתמש נמצא WALKING.

שליחת תגובה למעברים

כל סוג של גדר פרימיטיבית, מלבד TimeFence, יכולה גם להפעיל אירוע באופן זמני כשמצב ההקשר עובר מעבר. לדוגמה, אפשר להגדיר ל-DetectedActivityFence הפעלה זמנית כשמשתמש starting או stopping פעילות. גדרות המעבר נמצאות במצב TRUE למשך כמה שניות לפני שהן חוזרות למצב FALSE.

יצירת גדר משולבת

בגדרות משולבות משולבים כמה סוגים של גדרות פרימיטיביות באמצעות אופרטורים בוליאניים. בדוגמה הבאה מוצגת יצירת גדר משולבת שמופעלת כשהמשתמש הולך וגם האוזניות מחוברות:

// Create the primitive fences.
AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);
AwarenessFence headphoneFence = HeadphoneFence.during(HeadphoneState.PLUGGED_IN);

// Create a combination fence to AND primitive fences.
AwarenessFence walkingWithHeadphones = AwarenessFence.and(
      walkingFence, headphoneFence
);

עצים בתצוגת עץ של AND, ‏ OR ו-NOT תקינים, כך שאפשר ליצור כל שילוב בוליאני של גדרות. בדוגמה הבאה מוצג גדר שמופעלת כשמשתמש מתרחק יותר מ-100 מטרים מהמיקום הנוכחי, או כשחלפה יותר משעה מהשעה הנוכחית.

double currentLocationLat;  // current location latitude
double currentLocationLng;  // current location longitude
long nowMillis = System.currentTimeMillis();
long oneHourMillis = 1L * 60L * 60L * 1000L;

AwarenessFence orExample = AwarenessFence.or(
        AwarenessFence.not(LocationFence.in(
                currentLocationLat,
                currentLocationLng,
                100.0,
                100.0,
                0L)),
        TimeFence.inInterval(nowMillis + oneHourMillis, Long.MAX_VALUE));

השלב הבא: רישום גדר.