1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.tv.dialog;
18
19import android.app.AlertDialog;
20import android.app.Dialog;
21import android.app.LoaderManager;
22import android.content.CursorLoader;
23import android.content.Loader;
24import android.database.Cursor;
25import android.media.tv.TvContract;
26import android.os.Bundle;
27import android.text.format.DateUtils;
28import android.view.View;
29import android.widget.ListView;
30import android.widget.SimpleCursorAdapter;
31import android.widget.TextView;
32
33import com.android.tv.MainActivity;
34import com.android.tv.R;
35import com.android.tv.data.Channel;
36import com.android.tv.data.ChannelDataManager;
37
38/**
39 * Displays the watch history
40 */
41public class RecentlyWatchedDialogFragment extends SafeDismissDialogFragment implements
42        LoaderManager.LoaderCallbacks<Cursor> {
43    public static final String DIALOG_TAG = RecentlyWatchedDialogFragment.class.getSimpleName();
44
45    private static final String EMPTY_STRING = "";
46    private static final String TRACKER_LABEL = "Recently watched history";
47
48    private SimpleCursorAdapter mAdapter;
49
50    @Override
51    public Dialog onCreateDialog(Bundle savedInstanceState) {
52        getLoaderManager().initLoader(0, null, this);
53
54        final ChannelDataManager dataChannelManager =
55                ((MainActivity) getActivity()).getChannelDataManager();
56
57        String[] from = {
58                TvContract.WatchedPrograms._ID,
59                TvContract.WatchedPrograms.COLUMN_CHANNEL_ID,
60                TvContract.WatchedPrograms.COLUMN_WATCH_START_TIME_UTC_MILLIS,
61                TvContract.WatchedPrograms.COLUMN_TITLE };
62        int[] to = {
63                R.id.watched_program_id,
64                R.id.watched_program_channel_id,
65                R.id.watched_program_watch_time,
66                R.id.watched_program_title};
67        mAdapter = new SimpleCursorAdapter(getActivity(), R.layout.list_item_watched_program, null,
68                from, to, 0);
69        mAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
70            @Override
71            public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
72                String name = cursor.getColumnName(columnIndex);
73                if (TvContract.WatchedPrograms.COLUMN_CHANNEL_ID.equals(name)) {
74                    long channelId = cursor.getLong(columnIndex);
75                    ((TextView) view).setText(String.valueOf(channelId));
76                    // Update display number
77                    String displayNumber;
78                    Channel channel = dataChannelManager.getChannel(channelId);
79                    if (channel == null) {
80                        displayNumber = EMPTY_STRING;
81                    } else {
82                        displayNumber = channel.getDisplayNumber();
83                    }
84                    TextView displayNumberView = ((TextView) ((View) view.getParent())
85                            .findViewById(R.id.watched_program_channel_display_number));
86                    displayNumberView.setText(displayNumber);
87                    return true;
88                } else if (TvContract.WatchedPrograms.COLUMN_WATCH_START_TIME_UTC_MILLIS.equals(
89                        name)) {
90                    long time = cursor.getLong(columnIndex);
91                    CharSequence timeString = DateUtils.getRelativeTimeSpanString(time,
92                            System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS);
93                    ((TextView) view).setText(String.valueOf(timeString));
94                    return true;
95                }
96                return false;
97            }
98        });
99
100        ListView listView = new ListView(getActivity());
101        listView.setAdapter(mAdapter);
102
103        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
104        return builder.setTitle(R.string.recently_watched).setView(listView).create();
105    }
106
107    @Override
108    public void onDestroy() {
109        super.onDestroy();
110        // If we have an adapter we should close its cursor, which we do by assigning a null cursor.
111        if (mAdapter != null) {
112            mAdapter.changeCursor(null);
113        }
114    }
115
116    @Override
117    public String getTrackerLabel() {
118        return TRACKER_LABEL;
119    }
120
121    @Override
122    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
123        String[] projection = {
124                TvContract.WatchedPrograms._ID,
125                TvContract.WatchedPrograms.COLUMN_CHANNEL_ID,
126                TvContract.WatchedPrograms.COLUMN_WATCH_START_TIME_UTC_MILLIS,
127                TvContract.WatchedPrograms.COLUMN_TITLE };
128        return new CursorLoader(getActivity(), TvContract.WatchedPrograms.CONTENT_URI, projection,
129                null, null, TvContract.WatchedPrograms._ID + " DESC");
130    }
131
132    @Override
133    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
134        mAdapter.changeCursor(cursor);
135    }
136
137    @Override
138    public void onLoaderReset(Loader<Cursor> cursor) {
139        mAdapter.changeCursor(null);
140    }
141}
142