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