המתנה בתור

ב-Cast framework יש מחלקות של תורים שתומכות ביצירת רשימות של מופעים של MediaQueueItem, שאפשר ליצור ממופעים של MediaInfo כמו סטרימינג של סרטונים או אודיו, כדי להפעיל אותם ברצף במכשיר המקבל. אפשר לערוך, לסדר מחדש, לעדכן וכו' את התוכן שמופיע בתור הזה.

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

יצירה וטעינה של פריטים בתור להפעלת מדיה

פריט בתור להפעלת מדיה מיוצג ב-Cast Framework כמופע של MediaQueueItem. כשיוצרים פריט בתור להפעלת מדיה, אם משתמשים בספריית נגן המדיה עם תוכן דינמי, אפשר להגדיר את זמן הטעינה מראש כדי שהנגן יוכל להתחיל לשמור בזיכרון את הפריט בתור להפעלת מדיה לפני שהפריט שלפניו בתור יסיים את ההפעלה. אם מגדירים את מאפיין ההפעלה האוטומטית של הפריט לערך true, המקלט יכול להפעיל אותו באופן אוטומטי. לדוגמה, אפשר להשתמש בתבנית builder כדי ליצור את הפריט בתור להפעלת מדיה באופן הבא:

Kotlin
val queueItem: MediaQueueItem = MediaQueueItem.Builder(mediaInfo)
    .setAutoplay(true)
    .setPreloadTime(20.0)
    .build()
Java
MediaQueueItem queueItem = new MediaQueueItem.Builder(mediaInfo)
  .setAutoplay(true)
  .setPreloadTime(20)
  .build();

טוענים מערך של פריטים בתור המדיה לתור באמצעות ה-method המתאים queueLoad של RemoteMediaClient.

קבלת עדכונים על סטטוס תור המדיה

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

  • getPreloadedItemId() method – אם הפריט הבא נטען מראש, הפונקציה מחזירה את מזהה הפריט שנטען מראש.
  • ‫getLoadingItemId() method - מחזיר את מזהה הפריט של הפריט שנטען כעת (אך אינו פעיל בתור) במקלט.
  • ‫getCurrentItemId() method – מחזירה את מזהה הפריט של הפריט שהיה פעיל בתור (יכול להיות שהוא לא מושמע) בזמן השינוי בסטטוס המדיה.
  • ‫getQueueItems() (הוצאה משימוש, במקומה יש להשתמש ב-MediaQueue) method – מחזירה את רשימת המופעים של MediaQueueItem כרשימה שלא ניתן לשנות.

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

  • ‫getItemIds()‫method – מחזיר את רשימת כל מזהי הפריטים בסדר מסוים.
  • השיטה getItemAtIndex() מחזירה את הפריט שנשמר במטמון באינדקס נתון. אם הפריט לא נמצא במטמון, הפונקציה MediaQueue תחזיר את הערך null ותתזמן שליפה של הפריט. כשמאחזרים את הפריט, מופעלת הפונקציה MediaQueue.Callback#itemsUpdatedAtIndexes(). אם מפעילים שוב את הפונקציה getItemAtIndex() עם אותו מזהה, הפריט יוחזר.
  • הסמל fetchMoteItemsRelativeToIndex() מוצג כשמשתמש גולל את ממשק המשתמש של תור ההשמעה לראש או לתחתית, והאפליקציה רוצה לאחזר עוד פריטים מהענן.

אפשר להשתמש בשיטות האלה יחד עם שיטות אחרות לקבלת סטטוס המדיה כדי שהאפליקציה תדע מה הסטטוס של התור ושל הפריטים בתור. בנוסף לעדכוני סטטוס של מדיה מהמקלט, האפליקציה יכולה להאזין לשינויים בתור על ידי הטמעה של RemoteMediaClient.Callback ושל MediaQueue.Callback.

בנוסף, Cast SDK מספק שני מחלקות כלי עזר ליצירת ממשק משתמש להוספה לתור.

לדוגמה, כדי ליצור RecyclerView באמצעות MediaQueueRecyclerViewAdapter:

Kotlin
class MyRecyclerViewAdapter(mediaQueue: MediaQueue?) :
    MediaQueueRecyclerViewAdapter<MyViewHolder?>(mediaQueue) {
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val item = getItem(position)

        // Update the view using `item`.
        ...
    }
}

class MyViewHolder : RecyclerView.ViewHolder {
    // Implement your own ViewHolder.
    ...
}

fun someMethod() {
    val adapter = MyRecyclerViewAdapter(
        mCastSession.remoteMediaClient.getMediaQueue())
    val recyclerView =
        activity.findViewById(R.id.my_recycler_view_id) as RecyclerView
    recyclerView.adapter = adapter
}
Java
public class MyRecyclerViewAdapter extends MediaQueueRecyclerViewAdapter<MyViewHolder> {
    public MyRecyclerViewAdapter(MediaQueue mediaQueue) {
        super(mediaQueue);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
      MediaQueueItem item = getItem(position);

      // Update the view using `item`.
      ...
    }
}

public class MyViewHolder implements RecyclerView.ViewHolder {
  // Implement your own ViewHolder.
  ...
}

public void someMethod() {
    RecyclerView.Adapter adapter = new MyRecyclerViewAdapter(
        mCastSession.getRemoteMediaClient().getMediaQueue());
    RecyclerView recyclerView =
        (RecyclerView) getActivity().findViewById(R.id.my_recycler_view_id);
    recyclerView.setAdapter(adapter);
}

עריכת התור

כדי לבצע פעולות על הפריטים בתור, משתמשים בשיטות התור של המחלקה RemoteMediaClient. הפונקציות האלה מאפשרות לטעון מערך של פריטים לתור חדש, להוסיף פריטים לתור קיים, לעדכן את המאפיינים של פריטים בתור, להעביר פריט קדימה או אחורה בתור, להגדיר את המאפיינים של התור עצמו (לדוגמה, לשנות את האלגוריתם repeatMode שבוחר את הפריט הבא), להסיר פריטים מהתור ולשנות את הסדר של הפריטים בתור.