package com.ianhanniballake.contractiontimer.appwidget;
import android.annotation.TargetApi;
import android.content.ContentUris;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Build;
import android.preference.PreferenceManager;
import android.provider.BaseColumns;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
import android.widget.AdapterView;
import android.widget.RemoteViews;
import android.widget.RemoteViewsService;
import com.ianhanniballake.contractiontimer.R;
import com.ianhanniballake.contractiontimer.provider.ContractionContract;
import com.ianhanniballake.contractiontimer.provider.ContractionContract.Contractions;
import com.ianhanniballake.contractiontimer.ui.Preferences;
/**
* Service which creates the RemoteViews used in the ListView collection in the Detail App Widgets
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class DetailAppWidgetRemoteViewsService extends RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(final Intent intent) {
return new RemoteViewsService.RemoteViewsFactory() {
private Cursor data = null;
@Override
public int getCount() {
return data == null ? 0 : data.getCount();
}
@Override
public long getItemId(final int position) {
final int idColumnIndex = data.getColumnIndex(BaseColumns._ID);
if (data.moveToPosition(position))
return data.getLong(idColumnIndex);
return position;
}
@Override
public RemoteViews getLoadingView() {
final SharedPreferences preferences = PreferenceManager
.getDefaultSharedPreferences(DetailAppWidgetRemoteViewsService.this);
RemoteViews views;
final String appwidgetBackground = preferences.getString(
Preferences.APPWIDGET_BACKGROUND_PREFERENCE_KEY,
getString(R.string.pref_appwidget_background_default));
if (appwidgetBackground.equals("light"))
views = new RemoteViews(getPackageName(), R.layout.list_item_detail_appwidget_loading_light);
else
views = new RemoteViews(getPackageName(), R.layout.list_item_detail_appwidget_loading_dark);
return views;
}
@Override
public RemoteViews getViewAt(final int position) {
final SharedPreferences preferences = PreferenceManager
.getDefaultSharedPreferences(DetailAppWidgetRemoteViewsService.this);
RemoteViews views;
final String appwidgetBackground = preferences.getString(
Preferences.APPWIDGET_BACKGROUND_PREFERENCE_KEY,
getString(R.string.pref_appwidget_background_default));
if (appwidgetBackground.equals("light"))
views = new RemoteViews(getPackageName(), R.layout.list_item_detail_appwidget_light);
else
views = new RemoteViews(getPackageName(), R.layout.list_item_detail_appwidget_dark);
if (position == AdapterView.INVALID_POSITION || data == null || !data.moveToPosition(position))
return views;
String timeFormat = "hh:mm:ssa";
if (DateFormat.is24HourFormat(DetailAppWidgetRemoteViewsService.this))
timeFormat = "kk:mm:ss";
final int startTimeColumnIndex = data
.getColumnIndex(ContractionContract.Contractions.COLUMN_NAME_START_TIME);
final long startTime = data.getLong(startTimeColumnIndex);
views.setTextViewText(R.id.start_time, DateFormat.format(timeFormat, startTime));
final int endTimeColumnIndex = data
.getColumnIndex(ContractionContract.Contractions.COLUMN_NAME_END_TIME);
final boolean isContractionOngoing = data.isNull(endTimeColumnIndex);
if (isContractionOngoing) {
views.setTextViewText(R.id.end_time, " ");
views.setTextViewText(R.id.duration, getString(R.string.duration_ongoing));
} else {
final long endTime = data.getLong(endTimeColumnIndex);
views.setTextViewText(R.id.end_time, DateFormat.format(timeFormat, endTime));
final long durationInSeconds = (endTime - startTime) / 1000;
views.setTextViewText(R.id.duration, DateUtils.formatElapsedTime(durationInSeconds));
}
// If we aren't the last entry, move to the next (previous in
// time)
// contraction to get its start time to compute the frequency
if (!data.isLast() && data.moveToNext()) {
final int prevContractionStartTimeColumnIndex = data
.getColumnIndex(ContractionContract.Contractions.COLUMN_NAME_START_TIME);
final long prevContractionStartTime = data.getLong(prevContractionStartTimeColumnIndex);
final long frequencyInSeconds = (startTime - prevContractionStartTime) / 1000;
views.setTextViewText(R.id.frequency, DateUtils.formatElapsedTime(frequencyInSeconds));
// Go back to the previous spot
data.moveToPrevious();
}
final Intent fillInIntent = new Intent();
final int idColumnIndex = data.getColumnIndex(BaseColumns._ID);
final long id = data.getLong(idColumnIndex);
fillInIntent.setData(ContentUris.withAppendedId(Contractions.CONTENT_ID_URI_BASE, id));
views.setOnClickFillInIntent(R.id.list_item_detail_appwidget, fillInIntent);
return views;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public void onCreate() {
// Nothing to do
}
@Override
public void onDataSetChanged() {
if (data != null)
data.close();
data = getContentResolver().query(Contractions.CONTENT_URI, null, null, null, null);
}
@Override
public void onDestroy() {
if (data != null) {
data.close();
data = null;
}
}
};
}
}