// Copyright 2009 Google Inc.
// Copyright 2011 NPR
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package org.npr.android.news;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.text.Html;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;
import org.npr.android.util.DisplayUtils;
import org.npr.android.util.FavoriteStationsProvider;
import org.npr.android.util.StationCache;
import org.npr.api.Station;
import org.npr.api.Station.AudioStream;
import org.npr.api.Station.Podcast;
import java.util.ArrayList;
public class StationDetailsActivity extends RootActivity implements
AdapterView.OnItemClickListener {
private static final String LOG_TAG = StationDetailsActivity.class.getName();
private ArrayAdapter<ListItem> listAdapter;
private String stationId;
private Station station;
private boolean isFavorite;
private Handler uiHandler;
private class ListItem {
private final AudioStream stream;
private final Podcast podcast;
private final String header;
private ListItem(AudioStream stream) {
this.stream = stream;
this.podcast = null;
this.header = null;
}
private ListItem(Podcast podcast) {
this.stream = null;
this.podcast = podcast;
this.header = null;
}
private ListItem(String header) {
this.stream = null;
this.podcast = null;
this.header = header;
}
public boolean isStream() {
return stream != null;
}
public boolean isPodcast() {
return podcast != null;
}
public boolean isHeader() {
return header != null;
}
}
private class ListItemAdapter extends ArrayAdapter<ListItem> {
public ListItemAdapter(Context context, ArrayList<ListItem> listItems) {
super(context, R.layout.station_details_item, R.id.station_details_title,
listItems);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = super.getView(position, convertView, parent);
ListItem listItem = this.getItem(position);
if (listItem == null) {
return convertView;
}
ImageView favorite = (ImageView) convertView.findViewById(R.id
.station_details_favorite);
TextView title = (TextView) convertView.findViewById(R.id
.station_details_title);
TextView subtitle = (TextView) convertView.findViewById(R.id
.station_details_subtitle);
TextView tagline = (TextView) convertView.findViewById(R.id
.station_details_tagline);
if (position == 0) {
convertView.setEnabled(false);
convertView.setBackgroundDrawable(getResources().getDrawable(
R.drawable.station_name_background));
convertView.getLayoutParams().height = AbsListView.LayoutParams
.WRAP_CONTENT;
convertView.setPadding(10, 8, 10, 8);
favorite.setVisibility(View.GONE);
title.setText(Html.fromHtml(station.getName()));
title.setTextColor(getResources().getColor(R.color.black));
title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 36);
subtitle.setVisibility(View.VISIBLE);
subtitle.setText(Html.fromHtml(
new StringBuilder()
.append(station.getFrequency())
.append(" ")
.append(station.getBand())
.append(", ")
.append(station.getMarketCity())
.toString()
));
subtitle.setTextColor(getResources().getColor(R.color.black));
subtitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
tagline.setVisibility(View.VISIBLE);
tagline.setText(station.getTagline());
tagline.setTextColor(getResources().getColor(R.color.black));
tagline.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
} else if (position == 1) {
convertView.setEnabled(true);
convertView.setBackgroundDrawable(getResources().getDrawable(
R.drawable.station_favorite_background));
convertView.getLayoutParams().height = AbsListView.LayoutParams
.WRAP_CONTENT;
convertView.setPadding(10, 8, 10, 8);
favorite.setVisibility(View.VISIBLE);
if (isFavorite) {
favorite.setImageResource(R.drawable.heart_normal_selected);
title.setText(getString(R.string.msg_station_remove_favorite));
} else {
favorite.setImageResource(R.drawable.heart_normal);
title.setText(getString(R.string.msg_station_add_favorite));
}
title.setTextColor(getResources().getColor(R.color.black));
title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15);
subtitle.setVisibility(View.GONE);
tagline.setVisibility(View.GONE);
} else if (listItem.isHeader()) {
convertView.setEnabled(false);
convertView.setBackgroundDrawable(getResources().getDrawable(
R.drawable.top_stories_title_background));
convertView.getLayoutParams().height =
DisplayUtils.convertToDIP(getContext(), 20);
convertView.setPadding(10, 0, 10, 0);
favorite.setVisibility(View.GONE);
title.setText(listItem.header);
title.setTextColor(getResources().getColor(R.color.news_title_text));
title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15);
subtitle.setVisibility(View.GONE);
tagline.setVisibility(View.GONE);
} else {
convertView.setEnabled(true);
convertView.setBackgroundDrawable(null);
convertView.getLayoutParams().height = AbsListView.LayoutParams
.WRAP_CONTENT;
convertView.setPadding(10, 18, 10, 18);
favorite.setVisibility(View.GONE);
if (listItem.isStream()) {
title.setText(Html.fromHtml(listItem.stream.getTitle()));
} else if (listItem.isPodcast()) {
title.setText(Html.fromHtml(listItem.podcast.getTitle()));
}
title.setTextColor(getResources().getColor(R.color.black));
title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
subtitle.setVisibility(View.GONE);
tagline.setVisibility(View.GONE);
}
return convertView;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getIntent().hasExtra(Constants.EXTRA_STATION_ID)) {
stationId = getIntent().getStringExtra(Constants.EXTRA_STATION_ID);
} else if (getIntent().hasExtra(Constants.EXTRA_ACTIVITY_DATA)) {
stationId = getIntent().getStringExtra(Constants.EXTRA_ACTIVITY_DATA);
}
uiHandler = new Handler();
new Thread() {
@Override
public void run()
{
setupStation();
}
}.start();
}
private void setupStation()
{
station = StationCache.getStation(stationId, this);
String selection = FavoriteStationsProvider.Items.STATION_ID + " = ?";
String[] selectionArgs = new String[1];
selectionArgs[0] = stationId;
Cursor c = getContentResolver().query(
FavoriteStationsProvider.CONTENT_URI,
null, selection, selectionArgs, null);
isFavorite = c.moveToFirst();
c.close();
if (station == null) {
Log.d(LOG_TAG, "Couldn't get station. Notifying user.");
Toast.makeText(this, R.string.msg_station_not_found, Toast.LENGTH_SHORT);
if (isFavorite) {
getContentResolver().delete(
FavoriteStationsProvider.CONTENT_URI,
selection,
selectionArgs
);
}
finish();
return;
}
uiHandler.post(new Runnable() {
@Override
public void run() {
ViewGroup container = (ViewGroup) findViewById(R.id.TitleContent);
ViewGroup.inflate(StationDetailsActivity.this, R.layout.station_details, container);
ArrayList<ListItem> listItems = new ArrayList<ListItem>();
listItems.add(new ListItem(station.getName()));
listItems.add(new ListItem("Favorites")); // string is a placeholder
if (station.getAudioStreams().size() > 0) {
listItems.add(new ListItem(getString(R.string.msg_station_streams) +
" (" + station.getAudioStreams().size() + ")"));
for (AudioStream stream : station.getAudioStreams()) {
if (stream.getTitle() == null) {
listItems.add(new ListItem(new AudioStream(
stream.getUrl(),
String.format(getString(R.string.format_default_station_name),
station.getName()
)
)));
} else {
listItems.add(new ListItem(stream));
}
}
}
if (station.getPodcasts().size() > 0) {
listItems.add(new ListItem(getString(R.string.msg_station_podcasts) +
" (" + station.getPodcasts().size() + ")"));
for (Podcast podcast : station.getPodcasts()) {
listItems.add(new ListItem(podcast));
}
}
ListView streamList = (ListView) findViewById(R.id.station_details_list);
streamList.setOnItemClickListener(StationDetailsActivity.this);
listAdapter = new ListItemAdapter(StationDetailsActivity.this, listItems);
streamList.setAdapter(listAdapter);
bringPlayerNavToFront();
}
});
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
ListItem li = (ListItem) adapterView.getItemAtPosition(i);
if (i == 1) {
isFavorite = !isFavorite;
if (isFavorite) {
ContentValues values = new ContentValues();
values.put(FavoriteStationsProvider.Items.NAME, station.getName());
values.put(FavoriteStationsProvider.Items.MARKET,
station.getMarketCity());
values.put(FavoriteStationsProvider.Items.FREQUENCY,
station.getFrequency());
values.put(FavoriteStationsProvider.Items.BAND, station.getBand());
values.put(FavoriteStationsProvider.Items.STATION_ID, stationId);
getContentResolver().insert(
FavoriteStationsProvider.CONTENT_URI,
values
);
} else {
String selection = FavoriteStationsProvider.Items.STATION_ID + " = ?";
String[] selectionArgs = new String[1];
selectionArgs[0] = stationId;
getContentResolver().delete(
FavoriteStationsProvider.CONTENT_URI,
selection,
selectionArgs
);
}
listAdapter.notifyDataSetChanged();
} else if (li.isStream()) {
playSingleNow(Playable.PlayableFactory.fromStationStream(station.getId(),
li.stream));
} else if (li.isPodcast()) {
Intent intent = new Intent(this, PodcastActivity.class).putExtra(
PodcastActivity.EXTRA_PODCAST_TITLE, li.podcast.getTitle()).putExtra(
PodcastActivity.EXTRA_PODCAST_URL, li.podcast.getUrl());
startActivity(intent);
}
}
}