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