10c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang/*
20c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * Copyright (C) 2017 The Android Open Source Project
30c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *
40c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * Licensed under the Apache License, Version 2.0 (the "License");
50c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * you may not use this file except in compliance with the License.
60c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * You may obtain a copy of the License at
70c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *
80c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *      http://www.apache.org/licenses/LICENSE-2.0
90c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *
100c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * Unless required by applicable law or agreed to in writing, software
110c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * distributed under the License is distributed on an "AS IS" BASIS,
120c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * See the License for the specific language governing permissions and
140c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * limitations under the License.
150c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang */
160c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kangpackage android.support.media.tv;
170c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang
180c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kangimport static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
190c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang
200c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kangimport android.annotation.TargetApi;
210c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kangimport android.content.ContentValues;
220c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kangimport android.database.Cursor;
23b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kangimport android.os.Build;
240c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kangimport android.support.annotation.RestrictTo;
250c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kangimport android.support.media.tv.TvContractCompat.WatchNextPrograms;
260c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kangimport android.support.media.tv.TvContractCompat.WatchNextPrograms.WatchNextType;
270c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang
280c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang/**
290c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * A convenience class to access {@link WatchNextPrograms} entries in the system content
300c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * provider.
310c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *
320c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * <p>This class makes it easy to insert or retrieve a program from the system content provider,
330c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * which is defined in {@link TvContractCompat}.
340c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *
350c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * <p>Usage example when inserting a "watch next" program:
360c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * <pre>
370c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * WatchNextProgram watchNextProgram = new WatchNextProgram.Builder()
380c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *         .setWatchNextType(WatchNextPrograms.WATCH_NEXT_TYPE_CONTINUE)
390c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *         .setType(PreviewPrograms.TYPE_MOVIE)
400c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *         .setTitle("Program Title")
410c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *         .setDescription("Program Description")
420c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *         .setPosterArtUri(Uri.parse("http://example.com/poster_art.png"))
430c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *         // Set more attributes...
440c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *         .build();
450c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * Uri watchNextProgramUri = getContentResolver().insert(WatchNextPrograms.CONTENT_URI,
460c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *         watchNextProgram.toContentValues());
470c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * </pre>
480c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *
490c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * <p>Usage example when retrieving a "watch next" program:
500c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * <pre>
510c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * WatchNextProgram watchNextProgram;
520c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * try (Cursor cursor = resolver.query(watchNextProgramUri, null, null, null, null)) {
530c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *     if (cursor != null && cursor.getCount() != 0) {
540c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *         cursor.moveToNext();
550c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *         watchNextProgram = WatchNextProgram.fromCursor(cursor);
560c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang *     }
570c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * }
580c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * </pre>
59b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang *
60b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * <p>Usage example when updating an existing "watch next" program:
61b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * <pre>
62b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * WatchNextProgram updatedProgram = new WatchNextProgram.Builder(watchNextProgram)
63b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang *         .setLastEngagementTimeUtcMillis(System.currentTimeMillis())
64b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang *         .build();
65b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * getContentResolver().update(TvContractCompat.buildWatchNextProgramUri(updatedProgram.getId()),
66b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang *         updatedProgram.toContentValues(), null, null);
67b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * </pre>
68b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang *
69b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * <p>Usage example when deleting a "watch next" program:
70b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * <pre>
71b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * getContentResolver().delete(TvContractCompat.buildWatchNextProgramUri(existingProgram.getId()),
72b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang *         null, null);
73b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * </pre>
740c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang */
750c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang@TargetApi(26)
760c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kangpublic final class WatchNextProgram extends BasePreviewProgram {
770c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    /**
780c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang     * @hide
790c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang     */
800c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    @RestrictTo(LIBRARY_GROUP)
810c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    public static final String[] PROJECTION = getProjection();
820c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang
830c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    private static final long INVALID_LONG_VALUE = -1;
840c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    private static final int INVALID_INT_VALUE = -1;
850c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang
860c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    private WatchNextProgram(Builder builder) {
870c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        super(builder);
880c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    }
890c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang
900c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    /**
910c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang     * @return The value of {@link WatchNextPrograms#COLUMN_WATCH_NEXT_TYPE} for the program.
920c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang     */
93407fc323df9cff9ad90eec812bb6299a2d8c8558Dongwon Kang    public @WatchNextType int getWatchNextType() {
94b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang        Integer i = mValues.getAsInteger(WatchNextPrograms.COLUMN_WATCH_NEXT_TYPE);
95b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang        return i == null ? INVALID_INT_VALUE : i;
960c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    }
970c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang
980c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    /**
990c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang     * @return The value of {@link WatchNextPrograms#COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS} for the
1000c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang     * program.
1010c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang     */
1020c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    public long getLastEngagementTimeUtcMillis() {
103b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang        Long l = mValues.getAsLong(WatchNextPrograms.COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS);
104b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang        return l == null ? INVALID_LONG_VALUE : l;
1050c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    }
1060c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang
1070c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    @Override
1080c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    public boolean equals(Object other) {
1090c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        if (!(other instanceof WatchNextProgram)) {
1100c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang            return false;
1110c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        }
112b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang        return mValues.equals(((WatchNextProgram) other).mValues);
1130c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    }
1140c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang
1150c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    @Override
1160c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    public String toString() {
117b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang        return "WatchNextProgram{" + mValues.toString() + "}";
1180c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    }
1190c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang
1200c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    /**
1210c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang     * @return The fields of the Program in the ContentValues format to be easily inserted into the
1220c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang     * TV Input Framework database.
1230c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang     */
12498ec0d5b378c8417156037af6389e90f0074a26eAurimas Liutikas    @Override
1250c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    public ContentValues toContentValues() {
126d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang        return toContentValues(false);
127d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang    }
128d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang
129d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang    /**
130d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang     * Returns fields of the WatchNextProgram in the ContentValues format to be easily inserted
131d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang     * into the TV Input Framework database.
132d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang     *
133d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang     * @param includeProtectedFields Whether the fields protected by system is included or not.
134d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang     * @hide
135d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang     */
136d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang    @RestrictTo(LIBRARY_GROUP)
13798ec0d5b378c8417156037af6389e90f0074a26eAurimas Liutikas    @Override
138d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang    public ContentValues toContentValues(boolean includeProtectedFields) {
139d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang        ContentValues values = super.toContentValues(includeProtectedFields);
140b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
141b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang            values.remove(WatchNextPrograms.COLUMN_WATCH_NEXT_TYPE);
142b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang            values.remove(WatchNextPrograms.COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS);
1430c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        }
1440c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        return values;
1450c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    }
1460c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang
1470c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    /**
1480c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang     * Creates a WatchNextProgram object from a cursor including the fields defined in
1490c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang     * {@link WatchNextPrograms}.
1500c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang     *
1510c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang     * @param cursor A row from the TV Input Framework database.
1520c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang     * @return A Program with the values taken from the cursor.
1530c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang     */
1540c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    public static WatchNextProgram fromCursor(Cursor cursor) {
1550c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        // TODO: Add additional API which does not use costly getColumnIndex().
1560c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        Builder builder = new Builder();
1570c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        BasePreviewProgram.setFieldsFromCursor(cursor, builder);
1580c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        int index;
1590c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        if ((index = cursor.getColumnIndex(WatchNextPrograms.COLUMN_WATCH_NEXT_TYPE)) >= 0
1600c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang                && !cursor.isNull(index)) {
161407fc323df9cff9ad90eec812bb6299a2d8c8558Dongwon Kang            builder.setWatchNextType(cursor.getInt(index));
1620c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        }
1630c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        if ((index = cursor.getColumnIndex(
1640c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang                WatchNextPrograms.COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS)) >= 0
1650c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang                && !cursor.isNull(index)) {
1660c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang            builder.setLastEngagementTimeUtcMillis(cursor.getLong(index));
1670c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        }
1680c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        return builder.build();
1690c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    }
1700c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang
1710c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    private static String[] getProjection() {
1720c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        String[] oColumns = new String[] {
1730c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang                WatchNextPrograms.COLUMN_WATCH_NEXT_TYPE,
1740c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang                WatchNextPrograms.COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS,
1750c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        };
1760c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        return CollectionUtils.concatAll(BasePreviewProgram.PROJECTION, oColumns);
1770c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    }
1780c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang
1790c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    /**
1800c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang     * This Builder class simplifies the creation of a {@link WatchNextProgram} object.
1810c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang     */
1820c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    public static final class Builder extends BasePreviewProgram.Builder<Builder> {
1830c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang
1840c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        /**
1850c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         * Creates a new Builder object.
1860c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         */
1870c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        public Builder() {
1880c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        }
1890c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang
1900c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        /**
1910c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         * Creates a new Builder object with values copied from another Program.
1920c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         * @param other The Program you're copying from.
1930c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         */
1940c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        public Builder(WatchNextProgram other) {
195b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang            mValues = new ContentValues(other.mValues);
1960c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        }
1970c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang
1980c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        /**
1990c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         * Sets the "watch next" type of this program content.
2000c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         *
2010c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         * <p>The value should match one of the followings:
2020c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         * {@link WatchNextPrograms#WATCH_NEXT_TYPE_CONTINUE},
2030c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         * {@link WatchNextPrograms#WATCH_NEXT_TYPE_NEXT}, and
2040c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         * {@link WatchNextPrograms#WATCH_NEXT_TYPE_NEW}.
2050c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         *
2060c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         * @param watchNextType The value of {@link WatchNextPrograms#COLUMN_WATCH_NEXT_TYPE} for
2070c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         *                      the program.
2080c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         * @return This Builder object to allow for chaining of calls to builder methods.
2090c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         */
210407fc323df9cff9ad90eec812bb6299a2d8c8558Dongwon Kang        public Builder setWatchNextType(@WatchNextType int watchNextType) {
211b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang            mValues.put(WatchNextPrograms.COLUMN_WATCH_NEXT_TYPE, watchNextType);
2120c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang            return this;
2130c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        }
2140c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang
2150c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        /**
2160c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         * Sets the time when the program is going to begin in milliseconds since the epoch.
2170c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         *
2180c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         * @param lastEngagementTimeUtcMillis The value of
2190c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         * {@link WatchNextPrograms#COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS} for the program.
2200c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         * @return This Builder object to allow for chaining of calls to builder methods.
2210c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         */
2220c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        public Builder setLastEngagementTimeUtcMillis(long lastEngagementTimeUtcMillis) {
223b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang            mValues.put(WatchNextPrograms.COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS,
224b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang                    lastEngagementTimeUtcMillis);
2250c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang            return this;
2260c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        }
2270c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang
2280c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        /**
2290c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         * @return A new Program with values supplied by the Builder.
2300c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang         */
2310c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        public WatchNextProgram build() {
2320c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang            return new WatchNextProgram(this);
2330c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang        }
2340c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang    }
2350c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang}
236