org.mythtv.db.dvr.ProgramDaoHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.mythtv.db.dvr.ProgramDaoHelper.java

Source

/**
 * This file is part of MythTV Android Frontend
 *
 * MythTV Android Frontend is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * MythTV Android Frontend is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with MythTV Android Frontend.  If not, see <http://www.gnu.org/licenses/>.
 *
 * This software can be found at <https://github.com/MythTV-Clients/MythTV-Android-Frontend/>
 */
package org.mythtv.db.dvr;

import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
import org.mythtv.client.ui.preferences.LocationProfile;
import org.mythtv.db.AbstractDaoHelper;
import org.mythtv.db.channel.ChannelDaoHelper;
import org.mythtv.db.content.LiveStreamConstants;
import org.mythtv.db.content.LiveStreamDaoHelper;
import org.mythtv.service.util.DateUtils;
import org.mythtv.services.api.v027.beans.ChannelInfo;
import org.mythtv.services.api.v027.beans.LiveStreamInfo;
import org.mythtv.services.api.v027.beans.Program;
import org.mythtv.services.api.v027.beans.RecordingInfo;

/**
 * @author Daniel Frey
 *
 */
public abstract class ProgramDaoHelper extends AbstractDaoHelper {

    protected static final String TAG = ProgramDaoHelper.class.getSimpleName();

    protected ChannelDaoHelper mChannelDaoHelper = ChannelDaoHelper.getInstance();
    protected LiveStreamDaoHelper mLiveStreamDaoHelper = LiveStreamDaoHelper.getInstance();
    protected RecordingDaoHelper mRecordingDaoHelper = RecordingDaoHelper.getInstance();

    protected ProgramDaoHelper() {
        super();
    }

    /**
     * @param context
     * @param uri
     * @param projection
     * @param selection
     * @param selectionArgs
     * @param sortOrder
     * @param table
     * @return
     */
    protected List<Program> findAll(final Context context, final Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder, final String table) {
        //      Log.v( TAG, "findAll : enter" );

        if (null == context) {
            throw new IllegalArgumentException("Context is required");
        }

        List<Program> programs = new ArrayList<Program>();

        Cursor cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
        while (cursor.moveToNext()) {
            Program program = convertCursorToProgram(cursor, table);
            programs.add(program);
        }
        cursor.close();

        //      Log.v( TAG, "findAll : exit" );
        return programs;
    }

    /**
     * @return
     */
    public abstract List<Program> findAll(final Context context, final LocationProfile locationProfile);

    /**
     * @param uri
     * @param projection
     * @param selection
     * @param selectionArgs
     * @param sortOrder
     * @return
     */
    protected Program findOne(final Context context, final Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder, final String table) {
        //      Log.v( TAG, "findOne : enter" );

        if (null == context) {
            throw new IllegalArgumentException("Context is required");
        }

        Program program = null;

        Cursor cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
        if (cursor.moveToFirst()) {
            program = convertCursorToProgram(cursor, table);
        }
        cursor.close();

        //      Log.v( TAG, "findOne : exit" );
        return program;
    }

    /**
     * @param context
     * @param locationProfile
     * @param channelId
     * @param startTime
     * @return
     */
    public abstract Program findOne(final Context context, final LocationProfile locationProfile,
            final int channelId, final DateTime startTime);

    /**
     * @param uri
     * @param program
     * @return
     */
    protected int save(final Context context, final Uri uri, final LocationProfile locationProfile, Program program,
            final String table) {
        //      Log.v( TAG, "save : enter" );

        if (null == context) {
            throw new IllegalArgumentException("Context is required");
        }

        ContentValues values = convertProgramToContentValues(locationProfile, new DateTime(DateTimeZone.UTC),
                program);

        String[] projection = new String[] { ProgramConstants._ID };
        String selection = table + "." + ProgramConstants.FIELD_CHANNEL_ID + " = ? AND " + table + "."
                + ProgramConstants.FIELD_START_TIME + " = ?";
        String[] selectionArgs = new String[] { String.valueOf(program.getChannel().getChanId()),
                String.valueOf(program.getStartTime().getMillis()) };

        selection = appendLocationHostname(context, locationProfile, selection, table);

        int updated = -1;
        Cursor cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
        if (cursor.moveToFirst()) {
            //         Log.v( TAG, "save : updating existing program" );

            Long id = cursor.getLong(cursor.getColumnIndexOrThrow(ProgramConstants._ID));

            updated = context.getContentResolver().update(ContentUris.withAppendedId(uri, id), values, null, null);
        } else {
            Uri inserted = context.getContentResolver().insert(uri, values);
            if (null != inserted) {
                updated = 1;
            }
        }
        cursor.close();

        if (null != program.getRecording()) {
            if (program.getRecording().getRecordId() != 0) {

                mRecordingDaoHelper.save(context,
                        RecordingConstants.ContentDetails.getValueFromParent(table).getContentUri(),
                        locationProfile, program.getStartTime(), program.getRecording(),
                        RecordingConstants.ContentDetails.getValueFromParent(table).getTableName());

            }
        }

        //      Log.v( TAG, "save : updated=" + updated );

        //      Log.v( TAG, "save : exit" );
        return updated;
    }

    /**
     * @param program
     * @return
     */
    public abstract int save(final Context context, final LocationProfile locationProfile, Program program);

    /**
     * @return
     */
    public int deleteAll(final Context context, final Uri uri) {
        //      Log.v( TAG, "deleteAll : enter" );

        if (null == context) {
            throw new IllegalArgumentException("Context is required");
        }

        int deleted = context.getContentResolver().delete(uri, null, null);
        //      Log.v( TAG, "deleteAll : deleted=" + deleted );

        //      Log.v( TAG, "deleteAll : exit" );
        return deleted;
    }

    /**
     * @return
     */
    public abstract int deleteAll(final Context context);

    /**
     * @param uri
     * @param program
     * @return
     */
    public int delete(final Context context, final Uri uri, final LocationProfile locationProfile, Program program,
            final String table) {
        //      Log.v( TAG, "delete : enter" );

        if (null == context) {
            throw new IllegalArgumentException("Context is required");
        }

        String selection = ProgramConstants.FIELD_CHANNEL_ID + " = ? AND " + ProgramConstants.FIELD_START_TIME
                + " = ?";
        String[] selectionArgs = new String[] { String.valueOf(program.getChannel().getChanId()),
                String.valueOf(program.getStartTime().getMillis()) };

        selection = appendLocationHostname(context, locationProfile, selection, null);

        int deleted = context.getContentResolver().delete(uri, selection, selectionArgs);
        //      Log.v( TAG, "delete : deleted=" + deleted );

        //      Log.v( TAG, "delete : exit" );
        return deleted;
    }

    /**
     * @param program
     * @return
     */
    public abstract int delete(final Context context, final LocationProfile locationProfile, Program program);

    /**
     * @param cursor
     * @return
     */
    public static Program convertCursorToProgram(Cursor cursor, final String table) {
        //      Log.v( TAG, "convertCursorToProgram : enter" );

        //      Long id = null;
        DateTime startTime = null, endTime = null, lastModified = null;
        String title = "", subTitle = "", category = "", categoryType = "", seriesId = "", programId = "",
                hostname = "", filename = "", description = "", inetref = "", masterHostname = "", airDate = "";
        int repeat = -1, videoProps = -1, audioProps = -1, subProps = -1, season = -1, episode = -1,
                programFlags = -1;
        long fileSize = -1;
        Double stars = 0.0;

        ChannelInfo channelInfo = null;
        RecordingInfo recording = null;
        LiveStreamInfo liveStreamInfo = null;

        //      if( cursor.getColumnIndex( ProgramConstants._ID ) != -1 ) {
        //         id = cursor.getLong( cursor.getColumnIndex( ProgramConstants._ID ) );
        //      }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_START_TIME) != -1) {
            startTime = new DateTime(cursor.getLong(cursor.getColumnIndex(ProgramConstants.FIELD_START_TIME)));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_END_TIME) != -1) {
            endTime = new DateTime(cursor.getLong(cursor.getColumnIndex(ProgramConstants.FIELD_END_TIME)));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_TITLE) != -1) {
            title = cursor.getString(cursor.getColumnIndex(ProgramConstants.FIELD_TITLE));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_SUB_TITLE) != -1) {
            subTitle = cursor.getString(cursor.getColumnIndex(ProgramConstants.FIELD_SUB_TITLE));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_CATEGORY) != -1) {
            category = cursor.getString(cursor.getColumnIndex(ProgramConstants.FIELD_CATEGORY));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_CATEGORY_TYPE) != -1) {
            categoryType = cursor.getString(cursor.getColumnIndex(ProgramConstants.FIELD_CATEGORY_TYPE));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_REPEAT) != -1) {
            repeat = cursor.getInt(cursor.getColumnIndex(ProgramConstants.FIELD_REPEAT));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_VIDEO_PROPS) != -1) {
            videoProps = cursor.getInt(cursor.getColumnIndex(ProgramConstants.FIELD_VIDEO_PROPS));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_AUDIO_PROPS) != -1) {
            audioProps = cursor.getInt(cursor.getColumnIndex(ProgramConstants.FIELD_AUDIO_PROPS));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_SUB_PROPS) != -1) {
            subProps = cursor.getInt(cursor.getColumnIndex(ProgramConstants.FIELD_SUB_PROPS));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_SERIES_ID) != -1) {
            seriesId = cursor.getString(cursor.getColumnIndex(ProgramConstants.FIELD_SERIES_ID));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_PROGRAM_ID) != -1) {
            programId = cursor.getString(cursor.getColumnIndex(ProgramConstants.FIELD_PROGRAM_ID));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_STARS) != -1) {
            stars = cursor.getDouble(cursor.getColumnIndex(ProgramConstants.FIELD_STARS));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_FILE_SIZE) != -1) {
            fileSize = cursor.getLong(cursor.getColumnIndex(ProgramConstants.FIELD_FILE_SIZE));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_LAST_MODIFIED) != -1) {
            lastModified = new DateTime(
                    cursor.getLong(cursor.getColumnIndex(ProgramConstants.FIELD_LAST_MODIFIED)));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_PROGRAM_FLAGS) != -1) {
            programFlags = cursor.getInt(cursor.getColumnIndex(ProgramConstants.FIELD_PROGRAM_FLAGS));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_HOSTNAME) != -1) {
            hostname = cursor.getString(cursor.getColumnIndex(ProgramConstants.FIELD_HOSTNAME));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_FILENAME) != -1) {
            filename = cursor.getString(cursor.getColumnIndex(ProgramConstants.FIELD_FILENAME));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_AIR_DATE) != -1) {
            airDate = cursor.getString(cursor.getColumnIndex(ProgramConstants.FIELD_AIR_DATE));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_DESCRIPTION) != -1) {
            description = cursor.getString(cursor.getColumnIndex(ProgramConstants.FIELD_DESCRIPTION));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_INETREF) != -1) {
            inetref = cursor.getString(cursor.getColumnIndex(ProgramConstants.FIELD_INETREF));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_SEASON) != -1) {
            season = cursor.getInt(cursor.getColumnIndex(ProgramConstants.FIELD_SEASON));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_EPISODE) != -1) {
            episode = cursor.getInt(cursor.getColumnIndex(ProgramConstants.FIELD_EPISODE));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_MASTER_HOSTNAME) != -1) {
            masterHostname = cursor.getString(cursor.getColumnIndex(ProgramConstants.FIELD_MASTER_HOSTNAME));
        }

        if (cursor.getColumnIndex(ProgramConstants.FIELD_CHANNEL_ID) != -1) {
            channelInfo = ChannelDaoHelper.convertCursorToChannelInfo(cursor);
        }

        if (cursor.getColumnIndex(RecordingConstants.ContentDetails.getValueFromParent(table).getTableName() + "_"
                + RecordingConstants.FIELD_RECORD_ID) != -1) {
            recording = RecordingDaoHelper.convertCursorToRecording(cursor, table);
        }

        if (cursor.getColumnIndex(LiveStreamConstants.TABLE_NAME + "_" + LiveStreamConstants.FIELD_ID) != -1) {
            liveStreamInfo = LiveStreamDaoHelper.convertCursorToLiveStreamInfo(cursor);
        }

        Program program = new Program();
        program.setStartTime(startTime);
        program.setEndTime(endTime);
        program.setTitle(title);
        program.setSubTitle(subTitle);
        program.setCategory(category);
        program.setCategory(categoryType);
        program.setRepeat(repeat == 1 ? true : false);
        program.setVideoProps(videoProps);
        program.setAudioProps(audioProps);
        program.setSubProps(subProps);
        program.setSeriesId(seriesId);
        program.setProgramId(programId);
        program.setStars(stars);
        program.setFileSize(fileSize);
        program.setLastModified(lastModified);
        program.setProgramFlags(programFlags);
        program.setHostName(hostname);
        program.setFileName(filename);
        program.setAirdate(LocalDate.parse(airDate));
        program.setDescription(description);
        program.setInetref(inetref);
        program.setSeason(season);
        program.setEpisode(episode);
        program.setChannel(channelInfo);
        program.setRecording(recording);

        //      Log.v( TAG, "convertCursorToProgram : id=" + id + ", program=" + program.toString() );

        //      Log.v( TAG, "convertCursorToProgram : exit" );
        return program;
    }

    protected static ContentValues[] convertProgramsToContentValuesArray(final LocationProfile locationProfile,
            final DateTime lastModified, final List<Program> programs) {
        //      Log.v( TAG, "convertProgramsToContentValuesArray : enter" );

        if (null != programs && !programs.isEmpty()) {

            ContentValues contentValues;
            List<ContentValues> contentValuesArray = new ArrayList<ContentValues>();

            for (Program program : programs) {

                contentValues = convertProgramToContentValues(locationProfile, lastModified, program);
                contentValuesArray.add(contentValues);

            }

            if (!contentValuesArray.isEmpty()) {

                //            Log.v( TAG, "convertProgramsToContentValuesArray : exit" );
                return contentValuesArray.toArray(new ContentValues[contentValuesArray.size()]);
            }

        }

        //      Log.v( TAG, "convertProgramsToContentValuesArray : exit, no programs to convert" );
        return null;
    }

    protected static ContentValues convertProgramToContentValues(final LocationProfile locationProfile,
            final DateTime lastModified, final Program program) {

        boolean inError;

        DateTime startTime = DateUtils.convertUtc(new DateTime(System.currentTimeMillis()));
        DateTime endTime = DateUtils.convertUtc(new DateTime(System.currentTimeMillis()));

        // If one timestamp is bad, leave them both set to 0.
        if (null == program.getStartTime() || null == program.getEndTime()) {
            //         Log.w(TAG, "convertProgramToContentValues : null starttime and or endtime" );

            inError = true;
        } else {
            startTime = program.getStartTime();
            endTime = program.getEndTime();

            inError = false;
        }

        ContentValues values = new ContentValues();
        values.put(ProgramConstants.FIELD_START_TIME, startTime.getMillis());
        values.put(ProgramConstants.FIELD_END_TIME, endTime.getMillis());
        values.put(ProgramConstants.FIELD_TITLE, null != program.getTitle() ? program.getTitle() : "");
        values.put(ProgramConstants.FIELD_SUB_TITLE, null != program.getSubTitle() ? program.getSubTitle() : "");
        values.put(ProgramConstants.FIELD_CATEGORY, null != program.getCategory() ? program.getCategory() : "");
        values.put(ProgramConstants.FIELD_CATEGORY_TYPE,
                null != program.getCategory() ? program.getCategory() : "");
        values.put(ProgramConstants.FIELD_REPEAT, program.isRepeat() ? 1 : 0);
        values.put(ProgramConstants.FIELD_VIDEO_PROPS, program.getVideoProps());
        values.put(ProgramConstants.FIELD_AUDIO_PROPS, program.getAudioProps());
        values.put(ProgramConstants.FIELD_SUB_PROPS, program.getSubProps());
        values.put(ProgramConstants.FIELD_SERIES_ID, null != program.getSeriesId() ? program.getSeriesId() : "");
        values.put(ProgramConstants.FIELD_PROGRAM_ID, null != program.getProgramId() ? program.getProgramId() : "");
        values.put(ProgramConstants.FIELD_STARS, program.getStars());
        values.put(ProgramConstants.FIELD_FILE_SIZE, program.getFileSize());
        values.put(ProgramConstants.FIELD_LAST_MODIFIED,
                null != program.getLastModified() ? program.getLastModified().getMillis() : -1);
        values.put(ProgramConstants.FIELD_PROGRAM_FLAGS, program.getProgramFlags());
        values.put(ProgramConstants.FIELD_HOSTNAME, null != program.getHostName() ? program.getHostName() : "");
        values.put(ProgramConstants.FIELD_FILENAME, null != program.getFileName() ? program.getFileName() : "");
        values.put(ProgramConstants.FIELD_AIR_DATE,
                null != program.getAirdate() ? program.getAirdate().toString() : "");
        values.put(ProgramConstants.FIELD_DESCRIPTION,
                null != program.getDescription() ? program.getDescription() : "");
        values.put(ProgramConstants.FIELD_INETREF, null != program.getInetref() ? program.getInetref() : "");
        values.put(ProgramConstants.FIELD_SEASON, program.getSeason());
        values.put(ProgramConstants.FIELD_EPISODE, program.getEpisode());
        values.put(ProgramConstants.FIELD_CHANNEL_ID,
                null != program.getChannel() ? program.getChannel().getChanId() : -1);
        values.put(ProgramConstants.FIELD_RECORD_ID,
                null != program.getRecording() ? program.getRecording().getRecordId() : -1);
        values.put(ProgramConstants.FIELD_IN_ERROR, inError ? 1 : 0);
        values.put(ProgramConstants.FIELD_MASTER_HOSTNAME, locationProfile.getHostname());
        values.put(ProgramConstants.FIELD_LAST_MODIFIED_DATE, lastModified.getMillis());

        return values;
    }

}