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 */ 16ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.tvprovider.media.tv; 170c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang 18ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP; 190c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang 200c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kangimport android.content.ContentValues; 210c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kangimport android.database.Cursor; 22b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kangimport android.os.Build; 23757f518fcb66e82116697d5a226798ae22c14a95Aurimas Liutikas 24ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.annotation.RestrictTo; 25ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.tvprovider.media.tv.TvContractCompat.PreviewPrograms; 260c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang 27aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport java.util.Objects; 28aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport java.util.Set; 29aba04fbe586f159d6625a202f02c815d51b55b2aisaid 300c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang/** 310c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * A convenience class to access {@link PreviewPrograms} entries in the system content 320c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * provider. 330c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * 340c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * <p>This class makes it easy to insert or retrieve a preview program from the system content 350c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * provider, which is defined in {@link TvContractCompat}. 360c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * 370c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * <p>Usage example when inserting a preview program: 380c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * <pre> 390c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * PreviewProgram previewProgram = new PreviewProgram.Builder() 400c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * .setChannelId(channel.getId()) 410c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * .setType(PreviewPrograms.TYPE_MOVIE) 420c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * .setTitle("Program Title") 430c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * .setDescription("Program Description") 440c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * .setPosterArtUri(Uri.parse("http://example.com/poster_art.png")) 450c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * // Set more attributes... 460c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * .build(); 470c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * Uri previewProgramUri = getContentResolver().insert(PreviewPrograms.CONTENT_URI, 480c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * previewProgram.toContentValues()); 490c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * </pre> 500c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * 510c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * <p>Usage example when retrieving a preview program: 520c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * <pre> 530c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * PreviewProgram previewProgram; 540c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * try (Cursor cursor = resolver.query(previewProgramUri, null, null, null, null)) { 550c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * if (cursor != null && cursor.getCount() != 0) { 560c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * cursor.moveToNext(); 570c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * previewProgram = PreviewProgram.fromCursor(cursor); 580c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * } 590c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * } 600c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * </pre> 61b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * 62b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * <p>Usage example when updating an existing preview program: 63b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * <pre> 64b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * PreviewProgram updatedProgram = new PreviewProgram.Builder(previewProgram) 65b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * .setWeight(20) 66b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * .build(); 67b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * getContentResolver().update(TvContractCompat.buildPreviewProgramUri(updatedProgram.getId()), 68b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * updatedProgram.toContentValues(), null, null); 69b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * </pre> 70b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * 71b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * <p>Usage example when deleting a preview program: 72b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * <pre> 73b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * getContentResolver().delete(TvContractCompat.buildPreviewProgramUri(existingProgram.getId()), 74b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * null, null); 75b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang * </pre> 760c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang */ 770c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kangpublic final class PreviewProgram extends BasePreviewProgram { 780c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang /** 790c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * @hide 800c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang */ 810c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang @RestrictTo(LIBRARY_GROUP) 820c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang public static final String[] PROJECTION = getProjection(); 830c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang 840c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang private static final long INVALID_LONG_VALUE = -1; 850c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang private static final int INVALID_INT_VALUE = -1; 860c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang 870c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang private PreviewProgram(Builder builder) { 880c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang super(builder); 890c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang } 900c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang 910c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang /** 920c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * @return The value of {@link PreviewPrograms#COLUMN_CHANNEL_ID} for the program. 930c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang */ 940c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang public long getChannelId() { 95b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang Long l = mValues.getAsLong(PreviewPrograms.COLUMN_CHANNEL_ID); 96b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang return l == null ? INVALID_LONG_VALUE : l; 970c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang } 980c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang 990c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang /** 1000c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * @return The value of {@link PreviewPrograms#COLUMN_WEIGHT} for the program. 1010c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang */ 1020c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang public int getWeight() { 103b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_WEIGHT); 104b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang return i == null ? INVALID_INT_VALUE : i; 1050c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang } 1060c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang 1070c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang @Override 1080c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang public boolean equals(Object other) { 1090c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang if (!(other instanceof PreviewProgram)) { 1100c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang return false; 1110c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang } 112b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang return mValues.equals(((PreviewProgram) other).mValues); 1130c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang } 1140c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang 115aba04fbe586f159d6625a202f02c815d51b55b2aisaid /** 116aba04fbe586f159d6625a202f02c815d51b55b2aisaid * Indicates whether some other PreviewProgram has any set attribute that is different from 117aba04fbe586f159d6625a202f02c815d51b55b2aisaid * this PreviewProgram's respective attributes. An attribute is considered "set" if its key 118aba04fbe586f159d6625a202f02c815d51b55b2aisaid * is present in the ContentValues vector. 119aba04fbe586f159d6625a202f02c815d51b55b2aisaid */ 120aba04fbe586f159d6625a202f02c815d51b55b2aisaid public boolean hasAnyUpdatedValues(PreviewProgram update) { 121aba04fbe586f159d6625a202f02c815d51b55b2aisaid Set<String> updateKeys = update.mValues.keySet(); 122aba04fbe586f159d6625a202f02c815d51b55b2aisaid for (String key : updateKeys) { 123aba04fbe586f159d6625a202f02c815d51b55b2aisaid Object updateValue = update.mValues.get(key); 124aba04fbe586f159d6625a202f02c815d51b55b2aisaid Object currValue = mValues.get(key); 125aba04fbe586f159d6625a202f02c815d51b55b2aisaid if (!Objects.deepEquals(updateValue, currValue)) { 126aba04fbe586f159d6625a202f02c815d51b55b2aisaid return true; 127aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 128aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 129aba04fbe586f159d6625a202f02c815d51b55b2aisaid return false; 130aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 131aba04fbe586f159d6625a202f02c815d51b55b2aisaid 1320c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang @Override 1330c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang public String toString() { 134b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang return "PreviewProgram{" + mValues.toString() + "}"; 1350c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang } 1360c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang 1370c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang /** 1380c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * @return The fields of the Program in the ContentValues format to be easily inserted into the 1390c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * TV Input Framework database. 1400c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang */ 14198ec0d5b378c8417156037af6389e90f0074a26eAurimas Liutikas @Override 1420c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang public ContentValues toContentValues() { 143d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang return toContentValues(false); 144d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang } 145d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang 146d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang /** 147d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang * Returns fields of the PreviewProgram in the ContentValues format to be easily inserted 148d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang * into the TV Input Framework database. 149d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang * 150d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang * @param includeProtectedFields Whether the fields protected by system is included or not. 151d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang * @hide 152d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang */ 153d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang @RestrictTo(LIBRARY_GROUP) 15498ec0d5b378c8417156037af6389e90f0074a26eAurimas Liutikas @Override 155d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang public ContentValues toContentValues(boolean includeProtectedFields) { 156d5806e8a47c37fb3a7f2b95b7465a3d6a1ef2fceDongwon Kang ContentValues values = super.toContentValues(includeProtectedFields); 157b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { 158b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang values.remove(PreviewPrograms.COLUMN_CHANNEL_ID); 159b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang values.remove(PreviewPrograms.COLUMN_WEIGHT); 1600c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang } 1610c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang return values; 1620c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang } 1630c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang 1640c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang /** 1650c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * Creates a Program object from a cursor including the fields defined in 1660c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * {@link PreviewPrograms}. 1670c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * 1680c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * @param cursor A row from the TV Input Framework database. 1690c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * @return A Program with the values taken from the cursor. 1700c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang */ 1710c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang public static PreviewProgram fromCursor(Cursor cursor) { 1720c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang // TODO: Add additional API which does not use costly getColumnIndex(). 1730c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang Builder builder = new Builder(); 1740c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang BasePreviewProgram.setFieldsFromCursor(cursor, builder); 1750c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang int index; 1760c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang if ((index = cursor.getColumnIndex(PreviewPrograms.COLUMN_CHANNEL_ID)) >= 0 1770c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang && !cursor.isNull(index)) { 1780c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang builder.setChannelId(cursor.getLong(index)); 1790c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang } 1800c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang if ((index = cursor.getColumnIndex(PreviewPrograms.COLUMN_WEIGHT)) >= 0 1810c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang && !cursor.isNull(index)) { 1820c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang builder.setWeight(cursor.getInt(index)); 1830c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang } 1840c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang return builder.build(); 1850c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang } 1860c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang 1870c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang private static String[] getProjection() { 188aba04fbe586f159d6625a202f02c815d51b55b2aisaid String[] oColumns = new String[]{ 1890c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang PreviewPrograms.COLUMN_CHANNEL_ID, 1900c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang PreviewPrograms.COLUMN_WEIGHT, 1910c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang }; 1920c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang return CollectionUtils.concatAll(BasePreviewProgram.PROJECTION, oColumns); 1930c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang } 1940c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang 1950c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang /** 1960c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * This Builder class simplifies the creation of a {@link PreviewProgram} object. 1970c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang */ 1980c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang public static final class Builder extends BasePreviewProgram.Builder<Builder> { 1990c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang 2000c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang /** 2010c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * Creates a new Builder object. 2020c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang */ 2030c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang public Builder() { 2040c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang } 2050c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang 2060c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang /** 2070c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * Creates a new Builder object with values copied from another Program. 208aba04fbe586f159d6625a202f02c815d51b55b2aisaid * 2090c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * @param other The Program you're copying from. 2100c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang */ 2110c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang public Builder(PreviewProgram other) { 212b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang mValues = new ContentValues(other.mValues); 2130c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang } 2140c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang 2150c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang /** 2160c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * Sets the ID of the {@link Channel} that contains this program. 2170c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * 2180c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * @param channelId The value of {@link PreviewPrograms#COLUMN_CHANNEL_ID for the program. 2190c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * @return This Builder object to allow for chaining of calls to builder methods. 2200c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang */ 2210c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang public Builder setChannelId(long channelId) { 222b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang mValues.put(PreviewPrograms.COLUMN_CHANNEL_ID, channelId); 2230c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang return this; 2240c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang } 2250c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang 2260c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang /** 2270c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * Sets the weight of the preview program within the channel. 2280c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * 2290c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * @param weight The value of {@link PreviewPrograms#COLUMN_WEIGHT} for the program. 2300c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * @return This Builder object to allow for chaining of calls to builder methods. 2310c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang */ 2320c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang public Builder setWeight(int weight) { 233b30fefbedf4564400015b61f991607eae61d16d0Dongwon Kang mValues.put(PreviewPrograms.COLUMN_WEIGHT, weight); 2340c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang return this; 2350c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang } 2360c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang 2370c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang /** 2380c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang * @return A new Program with values supplied by the Builder. 2390c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang */ 2400c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang public PreviewProgram build() { 2410c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang return new PreviewProgram(this); 2420c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang } 2430c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang } 2440c89a1312d7df71bec4a66a68001df26d16649d5Dongwon Kang} 245