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