add chronometer to each app widget item

This commit is contained in:
Jimmy Shih
2012-10-08 17:25:27 -07:00
parent 4792ff6d3e
commit 7d5d462a2a
7 changed files with 147 additions and 92 deletions
+6
View File
@@ -48,6 +48,9 @@ limitations under the License.
<TextView
android:id="@+id/track_widget_item1_unit"
style="@style/TrackWidgetUnit" />
<Chronometer
android:id="@+id/track_widget_item1_chronometer"
style="@style/TrackWidgetValue" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
@@ -78,6 +81,9 @@ limitations under the License.
<TextView
android:id="@+id/track_widget_item2_unit"
style="@style/TrackWidgetUnit" />
<Chronometer
android:id="@+id/track_widget_item2_chronometer"
style="@style/TrackWidgetValue" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
+12
View File
@@ -37,6 +37,9 @@ limitations under the License.
<TextView
android:id="@+id/track_widget_item1_unit"
style="@style/TrackWidgetUnit" />
<Chronometer
android:id="@+id/track_widget_item1_chronometer"
style="@style/TrackWidgetValue" />
</LinearLayout>
</LinearLayout>
<!-- vertical separator -->
@@ -62,6 +65,9 @@ limitations under the License.
<TextView
android:id="@+id/track_widget_item3_unit"
style="@style/TrackWidgetUnit" />
<Chronometer
android:id="@+id/track_widget_item3_chronometer"
style="@style/TrackWidgetValue" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
@@ -92,6 +98,9 @@ limitations under the License.
<TextView
android:id="@+id/track_widget_item2_unit"
style="@style/TrackWidgetUnit" />
<Chronometer
android:id="@+id/track_widget_item2_chronometer"
style="@style/TrackWidgetValue" />
</LinearLayout>
</LinearLayout>
<!-- vertical separator -->
@@ -117,6 +126,9 @@ limitations under the License.
<TextView
android:id="@+id/track_widget_item4_unit"
style="@style/TrackWidgetUnit" />
<Chronometer
android:id="@+id/track_widget_item4_chronometer"
style="@style/TrackWidgetValue" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
+12
View File
@@ -37,6 +37,9 @@ limitations under the License.
<TextView
android:id="@+id/track_widget_item1_unit"
style="@style/TrackWidgetUnit4x3" />
<Chronometer
android:id="@+id/track_widget_item1_chronometer"
style="@style/TrackWidgetValue4x3" />
</LinearLayout>
</LinearLayout>
<!-- vertical separator -->
@@ -60,6 +63,9 @@ limitations under the License.
<TextView
android:id="@+id/track_widget_item3_unit"
style="@style/TrackWidgetUnit4x3" />
<Chronometer
android:id="@+id/track_widget_item3_chronometer"
style="@style/TrackWidgetValue4x3" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
@@ -90,6 +96,9 @@ limitations under the License.
<TextView
android:id="@+id/track_widget_item2_unit"
style="@style/TrackWidgetUnit4x3" />
<Chronometer
android:id="@+id/track_widget_item2_chronometer"
style="@style/TrackWidgetValue4x3" />
</LinearLayout>
</LinearLayout>
<!-- vertical separator -->
@@ -113,6 +122,9 @@ limitations under the License.
<TextView
android:id="@+id/track_widget_item4_unit"
style="@style/TrackWidgetUnit4x3" />
<Chronometer
android:id="@+id/track_widget_item4_chronometer"
style="@style/TrackWidgetValue4x3" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
+12
View File
@@ -37,6 +37,9 @@ limitations under the License.
<TextView
android:id="@+id/track_widget_item1_unit"
style="@style/TrackWidgetUnit4x4" />
<Chronometer
android:id="@+id/track_widget_item1_chronometer"
style="@style/TrackWidgetValue4x4" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
@@ -67,6 +70,9 @@ limitations under the License.
<TextView
android:id="@+id/track_widget_item3_unit"
style="@style/TrackWidgetUnit4x4" />
<Chronometer
android:id="@+id/track_widget_item3_chronometer"
style="@style/TrackWidgetValue4x4" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
@@ -96,6 +102,9 @@ limitations under the License.
<TextView
android:id="@+id/track_widget_item2_unit"
style="@style/TrackWidgetUnit4x3" />
<Chronometer
android:id="@+id/track_widget_item2_chronometer"
style="@style/TrackWidgetValue4x3" />
</LinearLayout>
</LinearLayout>
<!-- vertical separator -->
@@ -121,6 +130,9 @@ limitations under the License.
<TextView
android:id="@+id/track_widget_item4_unit"
style="@style/TrackWidgetUnit4x3" />
<Chronometer
android:id="@+id/track_widget_item4_chronometer"
style="@style/TrackWidgetValue4x3" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
+9 -6
View File
@@ -22,21 +22,24 @@ limitations under the License.
<TableLayout
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:padding="8dp" >
android:padding="8dp"
android:stretchColumns="0" >
<TableRow style="@style/TrackWidgetConfigRow" >
<Spinner
android:id="@+id/track_widget_config_item1"
style="@style/TrackWidgetConfigSpinner" />
<LinearLayout style="@style/TrackWidgetConfigSpacer" />
<Spinner
android:id="@+id/track_widget_config_item3"
style="@style/TrackWidgetConfigSpinner" />
</TableRow>
<TableRow style="@style/TrackWidgetConfigRow" >
<Spinner
android:id="@+id/track_widget_config_item2"
style="@style/TrackWidgetConfigSpinner" />
<LinearLayout style="@style/TrackWidgetConfigSpacer" />
</TableRow>
<TableRow style="@style/TrackWidgetConfigRow" >
<Spinner
android:id="@+id/track_widget_config_item3"
style="@style/TrackWidgetConfigSpinner" />
</TableRow>
<TableRow style="@style/TrackWidgetConfigRow" >
<Spinner
android:id="@+id/track_widget_config_item4"
style="@style/TrackWidgetConfigSpinner" />
+4 -13
View File
@@ -231,23 +231,14 @@ limitations under the License.
</style>
<!-- track widget config row -->
<style name="TrackWidgetConfigRow">
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:paddingBottom">16dp</item>
<item name="android:paddingTop">16dp</item>
</style>
<!-- track widget config spacer -->
<style name="TrackWidgetConfigSpacer">
<item name="android:layout_height">fill_parent</item>
<item name="android:layout_weight">2</item>
<item name="android:layout_width">0dp</item>
<item name="android:paddingBottom">20dp</item>
<item name="android:paddingTop">20dp</item>
</style>
<!-- track widget config spiner -->
<style name="TrackWidgetConfigSpinner">
<item name="android:gravity">left</item>
<item name="android:layout_gravity">center_horizontal</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_weight">9</item>
<item name="android:layout_width">0dp</item>
<item name="android:layout_width">fill_parent</item>
</style>
<!-- Track widget frame -->
<style name="TrackWidgetFrame">
@@ -35,6 +35,7 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v4.app.TaskStackBuilder;
import android.util.SparseIntArray;
import android.view.View;
@@ -58,6 +59,19 @@ public class TrackWidgetProvider extends AppWidgetProvider {
private static final SparseIntArray HEIGHT_SIZE = new SparseIntArray();
private static final int DEFAULT_SIZE = 2;
private static final int[] ITEM1_IDS = { R.id.track_widget_item1_label,
R.id.track_widget_item1_value, R.id.track_widget_item1_unit,
R.id.track_widget_item1_chronometer };
private static final int[] ITEM2_IDS = { R.id.track_widget_item2_label,
R.id.track_widget_item2_value, R.id.track_widget_item2_unit,
R.id.track_widget_item2_chronometer };
private static final int[] ITEM3_IDS = { R.id.track_widget_item3_label,
R.id.track_widget_item3_value, R.id.track_widget_item3_unit,
R.id.track_widget_item3_chronometer };
private static final int[] ITEM4_IDS = { R.id.track_widget_item4_label,
R.id.track_widget_item4_value, R.id.track_widget_item4_unit,
R.id.track_widget_item4_chronometer };
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
@@ -68,7 +82,6 @@ public class TrackWidgetProvider extends AppWidgetProvider {
|| context.getString(R.string.track_stopped_broadcast_action).equals(action)
|| context.getString(R.string.track_update_broadcast_action).equals(action)) {
long trackId = intent.getLongExtra(context.getString(R.string.track_id_broadcast_extra), -1L);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(
new ComponentName(context, TrackWidgetProvider.class));
@@ -149,8 +162,8 @@ public class TrackWidgetProvider extends AppWidgetProvider {
// Get the preferences
long recordingTrackId = PreferencesUtils.getLong(context, R.string.recording_track_id_key);
boolean isRecording = recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT;
boolean recordingTrackPaused = PreferencesUtils.getBoolean(context,
R.string.recording_track_paused_key, PreferencesUtils.RECORDING_TRACK_PAUSED_DEFAULT);
boolean isPaused = PreferencesUtils.getBoolean(context, R.string.recording_track_paused_key,
PreferencesUtils.RECORDING_TRACK_PAUSED_DEFAULT);
boolean metricUnits = PreferencesUtils.getBoolean(
context, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
boolean reportSpeed = PreferencesUtils.getBoolean(
@@ -170,23 +183,23 @@ public class TrackWidgetProvider extends AppWidgetProvider {
TripStatistics tripStatistics = track == null ? null : track.getTripStatistics();
updateStatisticsContainer(context, remoteViews, track);
setItem(context, remoteViews, R.id.track_widget_item1_label, R.id.track_widget_item1_value,
R.id.track_widget_item1_unit, item1, tripStatistics, metricUnits, reportSpeed);
setItem(context, remoteViews, R.id.track_widget_item2_label, R.id.track_widget_item2_value,
R.id.track_widget_item2_unit, item2, tripStatistics, metricUnits, reportSpeed);
setItem(context, remoteViews, ITEM1_IDS, item1, tripStatistics, isRecording, isPaused,
metricUnits, reportSpeed);
setItem(context, remoteViews, ITEM2_IDS, item2, tripStatistics, isRecording, isPaused,
metricUnits, reportSpeed);
updateRecordButton(context, remoteViews, isRecording, recordingTrackPaused);
updateRecordButton(context, remoteViews, isRecording, isPaused);
updateStopButton(context, remoteViews, isRecording);
if (heightSize > 1) {
int item3 = PreferencesUtils.getInt(
context, R.string.track_widget_item3, PreferencesUtils.TRACK_WIDGET_ITEM3_DEFAULT);
int item4 = PreferencesUtils.getInt(
context, R.string.track_widget_item4, PreferencesUtils.TRACK_WIDGET_ITEM4_DEFAULT);
setItem(context, remoteViews, R.id.track_widget_item3_label, R.id.track_widget_item3_value,
R.id.track_widget_item3_unit, item3, tripStatistics, metricUnits, reportSpeed);
setItem(context, remoteViews, R.id.track_widget_item4_label, R.id.track_widget_item4_value,
R.id.track_widget_item4_unit, item4, tripStatistics, metricUnits, reportSpeed);
updateRecordStatus(context, remoteViews, isRecording, recordingTrackPaused);
setItem(context, remoteViews, ITEM3_IDS, item3, tripStatistics, isRecording, isPaused,
metricUnits, reportSpeed);
setItem(context, remoteViews, ITEM4_IDS, item4, tripStatistics, isRecording, isPaused,
metricUnits, reportSpeed);
updateRecordStatus(context, remoteViews, isRecording, isPaused);
}
return remoteViews;
}
@@ -196,37 +209,42 @@ public class TrackWidgetProvider extends AppWidgetProvider {
*
* @param context the context
* @param remoteViews the remote view
* @param labelId the label id
* @param valueId the value id
* @param unitId the unit id
* @param itemValue the item value
* @param ids the item's ids
* @param value the item value
* @param tripStatistics the trip statistics
* @param metricUnits true to use metric units
* @param reportSpeed try to report speed
*/
private static void setItem(Context context, RemoteViews remoteViews, int labelId, int valueId,
int unitId, int itemValue, TripStatistics tripStatistics, boolean metricUnits,
private static void setItem(Context context, RemoteViews remoteViews, int[] ids, int value,
TripStatistics tripStatistics, boolean isRecording, boolean isPaused, boolean metricUnits,
boolean reportSpeed) {
switch (itemValue) {
switch (value) {
case 0:
updateTotalDistance(context, remoteViews, ids, tripStatistics, metricUnits);
break;
case 1:
updateTotalTime(context, remoteViews, labelId, valueId, unitId, tripStatistics);
updateTotalTime(context, remoteViews, ids, tripStatistics, isRecording, isPaused);
break;
case 2:
updateAverageSpeed(context, remoteViews, labelId, valueId, unitId, tripStatistics,
metricUnits, reportSpeed);
updateAverageSpeed(context, remoteViews, ids, tripStatistics, metricUnits, reportSpeed);
break;
case 3:
updateMovingTime(context, remoteViews, labelId, valueId, unitId, tripStatistics);
updateMovingTime(context, remoteViews, ids, tripStatistics);
break;
case 4:
updateAverageMovingSpeed(context, remoteViews, labelId, valueId, unitId, tripStatistics,
metricUnits, reportSpeed);
updateAverageMovingSpeed(
context, remoteViews, ids, tripStatistics, metricUnits, reportSpeed);
break;
case 0:
default:
updateTotalDistance(
context, remoteViews, labelId, valueId, unitId, tripStatistics, metricUnits);
updateTotalDistance(context, remoteViews, ids, tripStatistics, metricUnits);
break;
}
if (value != 1) {
remoteViews.setViewVisibility(ids[1], View.VISIBLE);
remoteViews.setViewVisibility(ids[2], View.VISIBLE);
remoteViews.setViewVisibility(ids[3], View.GONE);
remoteViews.setChronometer(ids[3], SystemClock.elapsedRealtime(), null, false);
}
}
@@ -257,19 +275,17 @@ public class TrackWidgetProvider extends AppWidgetProvider {
*
* @param context the context
* @param remoteViews the remote views
* @param labelId the label id
* @param valueId the value id
* @param unitId the unit id
* @param ids the item's ids
* @param tripStatistics the trip statistics
* @param metricUnits true to use metric units
*/
private static void updateTotalDistance(Context context, RemoteViews remoteViews, int labelId,
int valueId, int unitId, TripStatistics tripStatistics, boolean metricUnits) {
private static void updateTotalDistance(Context context, RemoteViews remoteViews, int[] ids,
TripStatistics tripStatistics, boolean metricUnits) {
double totalDistance = tripStatistics == null ? Double.NaN : tripStatistics.getTotalDistance();
String[] totalDistanceParts = StringUtils.getDistanceParts(context, totalDistance, metricUnits);
remoteViews.setTextViewText(labelId, context.getString(R.string.stats_total_distance));
remoteViews.setTextViewText(valueId, totalDistanceParts[0]);
remoteViews.setTextViewText(unitId, totalDistanceParts[1]);
remoteViews.setTextViewText(ids[0], context.getString(R.string.stats_total_distance));
remoteViews.setTextViewText(ids[1], totalDistanceParts[0]);
remoteViews.setTextViewText(ids[2], totalDistanceParts[1]);
}
/**
@@ -277,18 +293,29 @@ public class TrackWidgetProvider extends AppWidgetProvider {
*
* @param context the context
* @param remoteViews the remote views
* @param labelId the label id
* @param valueId the value id
* @param unitId the unit id
* @param ids the item's ids
* @param tripStatistics the trip statistics
*/
private static void updateTotalTime(Context context, RemoteViews remoteViews, int labelId,
int valueId, int unitId, TripStatistics tripStatistics) {
String totalTime = tripStatistics == null ? context.getString(R.string.value_unknown)
: StringUtils.formatElapsedTime(tripStatistics.getTotalTime());
remoteViews.setTextViewText(labelId, context.getString(R.string.stats_total_time));
remoteViews.setTextViewText(valueId, totalTime);
remoteViews.setViewVisibility(unitId, View.GONE);
private static void updateTotalTime(Context context, RemoteViews remoteViews, int[] ids,
TripStatistics tripStatistics, boolean isRecording, boolean isPaused) {
if (isRecording && !isPaused && tripStatistics != null) {
long time = tripStatistics.getTotalTime() + System.currentTimeMillis()
- tripStatistics.getStopTime();
remoteViews.setChronometer(ids[3], SystemClock.elapsedRealtime() - time, null, true);
remoteViews.setViewVisibility(ids[1], View.GONE);
remoteViews.setViewVisibility(ids[2], View.GONE);
remoteViews.setViewVisibility(ids[3], View.VISIBLE);
} else {
remoteViews.setChronometer(ids[3], SystemClock.elapsedRealtime(), null, false);
remoteViews.setViewVisibility(ids[1], View.VISIBLE);
remoteViews.setViewVisibility(ids[2], View.GONE);
remoteViews.setViewVisibility(ids[3], View.GONE);
String totalTime = tripStatistics == null ? context.getString(R.string.value_unknown)
: StringUtils.formatElapsedTime(tripStatistics.getTotalTime());
remoteViews.setTextViewText(ids[0], context.getString(R.string.stats_total_time));
remoteViews.setTextViewText(ids[1], totalTime);
}
}
/**
@@ -296,24 +323,21 @@ public class TrackWidgetProvider extends AppWidgetProvider {
*
* @param context the context
* @param remoteViews the remote views
* @param labelId the label id
* @param valueId the value id
* @param unitId the unit id
* @param ids the item's ids
* @param tripStatistics the trip statistics
* @param metricUnits true to use metric units
* @param reportSpeed true to report speed
*/
private static void updateAverageSpeed(Context context, RemoteViews remoteViews, int labelId,
int valueId, int unitId, TripStatistics tripStatistics, boolean metricUnits,
boolean reportSpeed) {
private static void updateAverageSpeed(Context context, RemoteViews remoteViews, int[] ids,
TripStatistics tripStatistics, boolean metricUnits, boolean reportSpeed) {
String averageSpeedLabel = context.getString(
reportSpeed ? R.string.stats_average_speed : R.string.stats_average_pace);
remoteViews.setTextViewText(labelId, averageSpeedLabel);
remoteViews.setTextViewText(ids[0], averageSpeedLabel);
Double speed = tripStatistics == null ? Double.NaN : tripStatistics.getAverageSpeed();
String[] speedParts = StringUtils.getSpeedParts(context, speed, metricUnits, reportSpeed);
remoteViews.setTextViewText(valueId, speedParts[0]);
remoteViews.setTextViewText(unitId, speedParts[1]);
remoteViews.setTextViewText(ids[1], speedParts[0]);
remoteViews.setTextViewText(ids[2], speedParts[1]);
}
/**
@@ -321,18 +345,16 @@ public class TrackWidgetProvider extends AppWidgetProvider {
*
* @param context the context
* @param remoteViews the remote views
* @param labelId the label id
* @param valueId the value id
* @param unitId the unit id
* @param ids the item's ids
* @param tripStatistics the trip statistics
*/
private static void updateMovingTime(Context context, RemoteViews remoteViews, int labelId,
int valueId, int unitId, TripStatistics tripStatistics) {
private static void updateMovingTime(
Context context, RemoteViews remoteViews, int[] ids, TripStatistics tripStatistics) {
String movingTime = tripStatistics == null ? context.getString(R.string.value_unknown)
: StringUtils.formatElapsedTime(tripStatistics.getMovingTime());
remoteViews.setTextViewText(labelId, context.getString(R.string.stats_moving_time));
remoteViews.setTextViewText(valueId, movingTime);
remoteViews.setViewVisibility(unitId, View.GONE);
remoteViews.setTextViewText(ids[0], context.getString(R.string.stats_moving_time));
remoteViews.setTextViewText(ids[1], movingTime);
remoteViews.setViewVisibility(ids[2], View.GONE);
}
/**
@@ -340,24 +362,21 @@ public class TrackWidgetProvider extends AppWidgetProvider {
*
* @param context the context
* @param remoteViews the remote views
* @param labelId the label id
* @param valueId the value id
* @param unitId the unit id
* @param ids the item's ids
* @param tripStatistics the trip statistics
* @param metricUnits true to use metric units
* @param reportSpeed true to report speed
*/
private static void updateAverageMovingSpeed(Context context, RemoteViews remoteViews,
int labelId, int valueId, int unitId, TripStatistics tripStatistics, boolean metricUnits,
boolean reportSpeed) {
private static void updateAverageMovingSpeed(Context context, RemoteViews remoteViews, int[] ids,
TripStatistics tripStatistics, boolean metricUnits, boolean reportSpeed) {
String averageMovingSpeedLabel = context.getString(
reportSpeed ? R.string.stats_average_moving_speed : R.string.stats_average_moving_pace);
remoteViews.setTextViewText(labelId, averageMovingSpeedLabel);
remoteViews.setTextViewText(ids[0], averageMovingSpeedLabel);
Double speed = tripStatistics == null ? Double.NaN : tripStatistics.getAverageMovingSpeed();
String[] speedParts = StringUtils.getSpeedParts(context, speed, metricUnits, reportSpeed);
remoteViews.setTextViewText(valueId, speedParts[0]);
remoteViews.setTextViewText(unitId, speedParts[1]);
remoteViews.setTextViewText(ids[1], speedParts[0]);
remoteViews.setTextViewText(ids[2], speedParts[1]);
}
/**