13f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho/*
2816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Copyright (C) 2015 The Android Open Source Project
33f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho *
43f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho * Licensed under the Apache License, Version 2.0 (the "License");
53f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho * you may not use this file except in compliance with the License.
63f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho * You may obtain a copy of the License at
73f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho *
83f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho *      http://www.apache.org/licenses/LICENSE-2.0
93f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho *
103f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho * Unless required by applicable law or agreed to in writing, software
113f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho * distributed under the License is distributed on an "AS IS" BASIS,
123f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho * See the License for the specific language governing permissions and
143f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho * limitations under the License.
153f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho */
163f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho
17d422754c0cc8475d6e2c8c079ed2ee2e96213edbChulwoo Leepackage com.android.tv.dialog;
183f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho
193f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Choimport android.app.AlertDialog;
203f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Choimport android.app.Dialog;
213f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Choimport android.app.LoaderManager;
223f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Choimport android.content.CursorLoader;
233f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Choimport android.content.Loader;
243f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Choimport android.database.Cursor;
259035590d94d136a020e499ce720b9d2cf1f6f45cJae Seoimport android.media.tv.TvContract;
263f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Choimport android.os.Bundle;
273f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Choimport android.text.format.DateUtils;
283f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Choimport android.view.View;
293f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Choimport android.widget.ListView;
303f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Choimport android.widget.SimpleCursorAdapter;
313f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Choimport android.widget.TextView;
323f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho
33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.MainActivity;
34d422754c0cc8475d6e2c8c079ed2ee2e96213edbChulwoo Leeimport com.android.tv.R;
35816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.data.Channel;
36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.data.ChannelDataManager;
37d422754c0cc8475d6e2c8c079ed2ee2e96213edbChulwoo Lee
383f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho/**
393f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho * Displays the watch history
403f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho */
41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic class RecentlyWatchedDialogFragment extends SafeDismissDialogFragment implements
423f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        LoaderManager.LoaderCallbacks<Cursor> {
43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public static final String DIALOG_TAG = RecentlyWatchedDialogFragment.class.getSimpleName();
44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final String EMPTY_STRING = "";
46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final String TRACKER_LABEL = "Recently watched history";
473f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho
483f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho    private SimpleCursorAdapter mAdapter;
493f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho
503f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho    @Override
513f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho    public Dialog onCreateDialog(Bundle savedInstanceState) {
523f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        getLoaderManager().initLoader(0, null, this);
533f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho
54816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        final ChannelDataManager dataChannelManager =
55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                ((MainActivity) getActivity()).getChannelDataManager();
56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
573f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        String[] from = {
583f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho                TvContract.WatchedPrograms._ID,
5910e4bd79f61c624b451a4f01fc1a9ea7c16168dbJae Seo                TvContract.WatchedPrograms.COLUMN_CHANNEL_ID,
6010e4bd79f61c624b451a4f01fc1a9ea7c16168dbJae Seo                TvContract.WatchedPrograms.COLUMN_WATCH_START_TIME_UTC_MILLIS,
6110e4bd79f61c624b451a4f01fc1a9ea7c16168dbJae Seo                TvContract.WatchedPrograms.COLUMN_TITLE };
623f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        int[] to = {
633f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho                R.id.watched_program_id,
643f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho                R.id.watched_program_channel_id,
653f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho                R.id.watched_program_watch_time,
663f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho                R.id.watched_program_title};
673f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        mAdapter = new SimpleCursorAdapter(getActivity(), R.layout.list_item_watched_program, null,
683f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho                from, to, 0);
693f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        mAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
703f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho            @Override
713f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho            public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
723f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho                String name = cursor.getColumnName(columnIndex);
7310e4bd79f61c624b451a4f01fc1a9ea7c16168dbJae Seo                if (TvContract.WatchedPrograms.COLUMN_CHANNEL_ID.equals(name)) {
74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    long channelId = cursor.getLong(columnIndex);
75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    ((TextView) view).setText(String.valueOf(channelId));
76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    // Update display number
77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    String displayNumber;
78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    Channel channel = dataChannelManager.getChannel(channelId);
79816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    if (channel == null) {
80816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                        displayNumber = EMPTY_STRING;
81816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    } else {
82816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                        displayNumber = channel.getDisplayNumber();
83816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    }
84816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    TextView displayNumberView = ((TextView) ((View) view.getParent())
85816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                            .findViewById(R.id.watched_program_channel_display_number));
86816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    displayNumberView.setText(displayNumber);
873f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho                    return true;
8810e4bd79f61c624b451a4f01fc1a9ea7c16168dbJae Seo                } else if (TvContract.WatchedPrograms.COLUMN_WATCH_START_TIME_UTC_MILLIS.equals(
8910e4bd79f61c624b451a4f01fc1a9ea7c16168dbJae Seo                        name)) {
903f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho                    long time = cursor.getLong(columnIndex);
913f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho                    CharSequence timeString = DateUtils.getRelativeTimeSpanString(time,
923f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho                            System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS);
933f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho                    ((TextView) view).setText(String.valueOf(timeString));
943f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho                    return true;
953f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho                }
963f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho                return false;
973f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho            }
983f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        });
993f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho
1003f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        ListView listView = new ListView(getActivity());
1013f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        listView.setAdapter(mAdapter);
1023f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho
1033f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
1043f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        return builder.setTitle(R.string.recently_watched).setView(listView).create();
1053f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho    }
1063f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho
1073f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho    @Override
1083f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho    public void onDestroy() {
1093f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        super.onDestroy();
1103f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        // If we have an adapter we should close its cursor, which we do by assigning a null cursor.
1113f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        if (mAdapter != null) {
1123f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho            mAdapter.changeCursor(null);
1133f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        }
1143f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho    }
1153f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho
1163f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho    @Override
117816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public String getTrackerLabel() {
118816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return TRACKER_LABEL;
119816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
120816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
121816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
1223f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
1233f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        String[] projection = {
1243f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho                TvContract.WatchedPrograms._ID,
12510e4bd79f61c624b451a4f01fc1a9ea7c16168dbJae Seo                TvContract.WatchedPrograms.COLUMN_CHANNEL_ID,
12610e4bd79f61c624b451a4f01fc1a9ea7c16168dbJae Seo                TvContract.WatchedPrograms.COLUMN_WATCH_START_TIME_UTC_MILLIS,
12710e4bd79f61c624b451a4f01fc1a9ea7c16168dbJae Seo                TvContract.WatchedPrograms.COLUMN_TITLE };
1283f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        return new CursorLoader(getActivity(), TvContract.WatchedPrograms.CONTENT_URI, projection,
129562a2eba205b64df25227adc4b9bc20145265861Chulwoo Lee                null, null, TvContract.WatchedPrograms._ID + " DESC");
1303f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho    }
1313f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho
1323f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho    @Override
1333f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
1343f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        mAdapter.changeCursor(cursor);
1353f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho    }
1363f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho
1373f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho    @Override
1383f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho    public void onLoaderReset(Loader<Cursor> cursor) {
1393f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho        mAdapter.changeCursor(null);
1403f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho    }
1413f07ce6c09b77e0c9224a16a4c73c8750ff8a07bYoungsang Cho}
142