From 97defda41cabc0abe4935dd09d40c3dda5996493 Mon Sep 17 00:00:00 2001 From: youtaol Date: Sun, 28 Apr 2013 21:01:47 +0800 Subject: [PATCH] Merge heads --- MyTracks/res/drawable-hdpi/menu_stop_gps.png | Bin 0 -> 3698 bytes MyTracks/res/drawable-mdpi/menu_stop_gps.png | Bin 0 -> 3291 bytes MyTracks/res/drawable-xhdpi/menu_stop_gps.png | Bin 0 -> 4086 bytes MyTracks/res/layout/choose_activity_type.xml | 7 +- MyTracks/res/layout/track_edit.xml | 8 +- .../apps/mytracks/TrackEditActivity.java | 98 ++++++++++++++---- .../apps/mytracks/TrackListActivity.java | 1 + .../ChooseActivityTypeDialogFragment.java | 26 +++-- .../ChooseActivityTypeImageAdapter.java | 14 ++- .../apps/mytracks/util/Api11Adapter.java | 5 + .../apps/mytracks/util/Api8Adapter.java | 5 + .../apps/mytracks/util/ApiAdapter.java | 7 ++ .../apps/mytracks/util/TrackIconUtils.java | 98 ++++++++++++------ 13 files changed, 197 insertions(+), 72 deletions(-) create mode 100644 MyTracks/res/drawable-hdpi/menu_stop_gps.png create mode 100644 MyTracks/res/drawable-mdpi/menu_stop_gps.png create mode 100644 MyTracks/res/drawable-xhdpi/menu_stop_gps.png diff --git a/MyTracks/res/drawable-hdpi/menu_stop_gps.png b/MyTracks/res/drawable-hdpi/menu_stop_gps.png new file mode 100644 index 0000000000000000000000000000000000000000..48c28191fd4375da1e2b65047d53e5257ae3bd3a GIT binary patch literal 3698 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 QN&o-=07*qoM6N<$f;Z3B;{X5v literal 0 HcmV?d00001 diff --git a/MyTracks/res/drawable-mdpi/menu_stop_gps.png b/MyTracks/res/drawable-mdpi/menu_stop_gps.png new file mode 100644 index 0000000000000000000000000000000000000000..7181d60c027fbe10ee23a6e8764efbba7a6d03ea GIT binary patch literal 3291 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 ZX8^jU9o9MZtP=nL002ovPDHLkV1mZ`B#!_9 literal 0 HcmV?d00001 diff --git a/MyTracks/res/drawable-xhdpi/menu_stop_gps.png b/MyTracks/res/drawable-xhdpi/menu_stop_gps.png new file mode 100644 index 0000000000000000000000000000000000000000..6f6e64d9b76f99b5dba4f82a7f01a33191aba7e0 GIT binary patch literal 4086 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 literal 0 HcmV?d00001 diff --git a/MyTracks/res/layout/choose_activity_type.xml b/MyTracks/res/layout/choose_activity_type.xml index ff1fdcd5a..38fa4e80a 100644 --- a/MyTracks/res/layout/choose_activity_type.xml +++ b/MyTracks/res/layout/choose_activity_type.xml @@ -18,7 +18,6 @@ limitations under the License. android:layout_height="wrap_content" android:layout_width="match_parent" android:numColumns="4" - android:paddingBottom="20dp" - android:paddingTop="20dp" - android:stretchMode="columnWidth" - android:verticalSpacing="20dp" /> + android:padding="4dp" + android:stretchMode="spacingWidth" + android:verticalSpacing="4dp" /> diff --git a/MyTracks/res/layout/track_edit.xml b/MyTracks/res/layout/track_edit.xml index ad5dad6e9..b179b81dd 100644 --- a/MyTracks/res/layout/track_edit.xml +++ b/MyTracks/res/layout/track_edit.xml @@ -41,20 +41,20 @@ limitations under the License. android:layout_width="match_parent" android:orientation="horizontal" > - + android:layout_width="wrap_content" /> parent, View view, int position, long id) { setActivityTypeIcon(TrackIconUtils.getIconValue( TrackEditActivity.this, (String) activityType.getAdapter().getItem(position))); } }); activityType.setOnFocusChangeListener(new View.OnFocusChangeListener() { - @Override + @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { setActivityTypeIcon(TrackIconUtils.getIconValue( @@ -104,15 +111,6 @@ public class TrackEditActivity extends AbstractMyTracksActivity } }); - activityTypeIcon = (ImageButton) findViewById(R.id.track_edit_activity_type_icon); - activityTypeIcon.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - new ChooseActivityTypeDialogFragment().show(getSupportFragmentManager(), - ChooseActivityTypeDialogFragment.CHOOSE_ACTIVITY_TYPE_DIALOG_TAG); - } - }); - iconValue = null; if (bundle != null) { iconValue = bundle.getString(ICON_VALUE_KEY); @@ -120,14 +118,65 @@ public class TrackEditActivity extends AbstractMyTracksActivity if (iconValue == null) { iconValue = track.getIcon(); } - setActivityTypeIcon(iconValue); + + // Add a border around the icon + Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + BitmapFactory.decodeResource(getResources(), R.drawable.track_airplane, options); + final int padding = 4; + final int width = options.outWidth + 2 * padding; + final int height = options.outHeight + 2 * padding; + + activityTypeIcon = (Spinner) findViewById(R.id.track_edit_activity_type_icon); + ArrayAdapter activityTypeIconAdapter = new ArrayAdapter( + this, android.R.layout.simple_spinner_item, + new StringBuilder[] {new StringBuilder(iconValue)}) { + @Override + public View getView(int position, View convertView, android.view.ViewGroup parent) { + ImageView imageView = + convertView != null ? (ImageView) convertView : new ImageView(getContext()); + Bitmap source = BitmapFactory.decodeResource( + getResources(), TrackIconUtils.getIconDrawable(getItem(position).toString())); + if (ApiAdapterFactory.getApiAdapter().isSpinnerBackgroundLight()) { + source = TrackIconUtils.invertBitmap(source); + } + imageView.setImageBitmap(source); + imageView.setMinimumHeight(height); + imageView.setMinimumWidth(width); + imageView.setPadding(padding, padding, padding, padding); + return imageView; + } + }; + activityTypeIcon.setAdapter(activityTypeIconAdapter); + activityTypeIcon.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_UP) { + new ChooseActivityTypeDialogFragment().show(getSupportFragmentManager(), + ChooseActivityTypeDialogFragment.CHOOSE_ACTIVITY_TYPE_DIALOG_TAG); + } + return true; + } + }); + activityTypeIcon.setOnKeyListener(new View.OnKeyListener() { + @Override + public boolean onKey(View v, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { + new ChooseActivityTypeDialogFragment().show(getSupportFragmentManager(), + ChooseActivityTypeDialogFragment.CHOOSE_ACTIVITY_TYPE_DIALOG_TAG); + return true; + } else { + return false; + } + } + }); description = (EditText) findViewById(R.id.track_edit_description); description.setText(track.getDescription()); Button save = (Button) findViewById(R.id.track_edit_save); save.setOnClickListener(new View.OnClickListener() { - @Override + @Override public void onClick(View v) { track.setName(name.getText().toString()); String category = activityType.getText().toString(); @@ -152,7 +201,7 @@ public class TrackEditActivity extends AbstractMyTracksActivity } else { setTitle(R.string.menu_edit); cancel.setOnClickListener(new View.OnClickListener() { - @Override + @Override public void onClick(View v) { finish(); } @@ -174,12 +223,17 @@ public class TrackEditActivity extends AbstractMyTracksActivity /** * Sets the activity type icon. - * + * * @param value the icon value */ private void setActivityTypeIcon(String value) { iconValue = value; - activityTypeIcon.setImageResource(TrackIconUtils.getIconDrawable(value)); + ArrayAdapter adapter = + (ArrayAdapter) activityTypeIcon.getAdapter(); + StringBuilder stringBuilder = adapter.getItem(0); + stringBuilder.delete(0, stringBuilder.length()); + stringBuilder.append(value); + adapter.notifyDataSetChanged(); } @Override diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java index 6f555ab11..ae161b502 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java @@ -743,6 +743,7 @@ public class TrackListActivity extends AbstractSendToGoogleActivity private void updateMenuItems(boolean isRecording) { if (startGpsMenuItem != null) { startGpsMenuItem.setTitle(startGps ? R.string.menu_stop_gps : R.string.menu_start_gps); + startGpsMenuItem.setIcon(startGps ? R.drawable.menu_stop_gps : R.drawable.menu_start_gps); startGpsMenuItem.setVisible(!isRecording); } if (importAllMenuItem != null) { diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/ChooseActivityTypeDialogFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/ChooseActivityTypeDialogFragment.java index 33a6d2d8f..6211080ab 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/fragments/ChooseActivityTypeDialogFragment.java +++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/ChooseActivityTypeDialogFragment.java @@ -22,6 +22,8 @@ import com.google.android.maps.mytracks.R; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; +import android.graphics.BitmapFactory; +import android.graphics.BitmapFactory.Options; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.view.View; @@ -34,14 +36,14 @@ import java.util.List; /** * A DialogFragment to choose an activity type. - * + * * @author apoorvn */ public class ChooseActivityTypeDialogFragment extends DialogFragment { /** * Interface for caller of this dialog fragment. - * + * * @author apoorvn */ public interface ChooseActivityTypeCaller { @@ -69,8 +71,8 @@ public class ChooseActivityTypeDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - GridView gridView = (GridView) getActivity() - .getLayoutInflater().inflate(R.layout.choose_activity_type, null); + GridView gridView = + (GridView) getActivity().getLayoutInflater().inflate(R.layout.choose_activity_type, null); final List iconValues = TrackIconUtils.getAllIconValues(); List imageIds = new ArrayList(); @@ -78,11 +80,19 @@ public class ChooseActivityTypeDialogFragment extends DialogFragment { imageIds.add(TrackIconUtils.getIconDrawable(iconValue)); } - ChooseActivityTypeImageAdapter imageAdapter = new ChooseActivityTypeImageAdapter( - getActivity(), imageIds); + Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + BitmapFactory.decodeResource(getResources(), R.drawable.track_airplane, options); + int padding = 32; + int width = options.outWidth + 2 * padding; + int height = options.outHeight + 2 * padding; + gridView.setColumnWidth(width); + + ChooseActivityTypeImageAdapter imageAdapter = + new ChooseActivityTypeImageAdapter(getActivity(), imageIds, width, height, padding); gridView.setAdapter(imageAdapter); gridView.setOnItemClickListener(new OnItemClickListener() { - @Override + @Override public void onItemClick(AdapterView parent, View v, int position, long id) { dismiss(); caller.onChooseActivityTypeDone(iconValues.get(position)); @@ -92,4 +102,4 @@ public class ChooseActivityTypeDialogFragment extends DialogFragment { return new AlertDialog.Builder(getActivity()).setNegativeButton(R.string.generic_cancel, null) .setTitle(R.string.track_edit_activity_type_hint).setView(gridView).create(); } -} \ No newline at end of file +} diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/ChooseActivityTypeImageAdapter.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/ChooseActivityTypeImageAdapter.java index f0418973d..114b9016f 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/fragments/ChooseActivityTypeImageAdapter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/ChooseActivityTypeImageAdapter.java @@ -26,17 +26,24 @@ import java.util.List; /** * Image adapter for choosing an activity type. - * + * * @author apoorvn */ public class ChooseActivityTypeImageAdapter extends BaseAdapter { private final Context context; private final List imageIds; + private final int width; + private final int height; + private final int padding; - public ChooseActivityTypeImageAdapter(Context context, List imageIds) { + public ChooseActivityTypeImageAdapter( + Context context, List imageIds, int width, int height, int padding) { this.context = context; this.imageIds = imageIds; + this.width = width; + this.height = height; + this.padding = padding; } @Override @@ -63,6 +70,9 @@ public class ChooseActivityTypeImageAdapter extends BaseAdapter { imageView = (ImageView) convertView; } imageView.setImageResource(imageIds.get(position)); + imageView.setMinimumHeight(height); + imageView.setMinimumWidth(width); + imageView.setPadding(padding, padding, padding, padding); return imageView; } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/Api11Adapter.java b/MyTracks/src/com/google/android/apps/mytracks/util/Api11Adapter.java index 1ab8dca50..227b29d80 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/Api11Adapter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/Api11Adapter.java @@ -124,4 +124,9 @@ public class Api11Adapter extends Api10Adapter { public void invalidMenu(Activity activity) { activity.invalidateOptionsMenu(); } + + @Override + public boolean isSpinnerBackgroundLight() { + return false; + } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/Api8Adapter.java b/MyTracks/src/com/google/android/apps/mytracks/util/Api8Adapter.java index 3279e52eb..4fe71f9f9 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/Api8Adapter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/Api8Adapter.java @@ -133,6 +133,11 @@ public class Api8Adapter implements ApiAdapter { // Do nothing } + @Override + public boolean isSpinnerBackgroundLight() { + return true; + } + @Override public boolean handleSearchKey(MenuItem menuItem) { // Return false and allow the framework to handle the search key. diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/ApiAdapter.java b/MyTracks/src/com/google/android/apps/mytracks/util/ApiAdapter.java index d4949c47d..a8684ac8c 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/ApiAdapter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/ApiAdapter.java @@ -163,6 +163,13 @@ public interface ApiAdapter { */ public void invalidMenu(Activity activity); + /** + * True if the spinner background is light color. + *

+ * Due to changes in API level 11. + */ + public boolean isSpinnerBackgroundLight(); + /** * Handles the search key press. Returns true if handled. *

diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/TrackIconUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/TrackIconUtils.java index 475976684..741680c55 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/TrackIconUtils.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/TrackIconUtils.java @@ -19,6 +19,8 @@ package com.google.android.apps.mytracks.util; import com.google.android.maps.mytracks.R; import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Color; import android.util.Pair; import java.util.ArrayList; @@ -27,7 +29,7 @@ import java.util.List; /** * Utilities for track icon. - * + * * @author Jimmy Shih */ public class TrackIconUtils { @@ -43,48 +45,52 @@ public class TrackIconUtils { private TrackIconUtils() {} - private static LinkedHashMap> - map = new LinkedHashMap>(); + private static LinkedHashMap> map = + new LinkedHashMap>(); static { - map.put(AIRPLANE, - new Pair(R.string.activity_type_airplane, R.drawable.track_airplane)); + map.put(RUN, new Pair(R.string.activity_type_running, R.drawable.track_run)); + map.put( + WALK, new Pair(R.string.activity_type_walking, R.drawable.track_walk)); map.put(BIKE, new Pair(R.string.activity_type_biking, R.drawable.track_bike)); - map.put(BOAT, new Pair(R.string.activity_type_boat, R.drawable.track_boat)); map.put( DRIVE, new Pair(R.string.activity_type_driving, R.drawable.track_drive)); - map.put(RUN, new Pair(R.string.activity_type_running, R.drawable.track_run)); map.put(SKI, new Pair(R.string.activity_type_skiing, R.drawable.track_ski)); map.put(SNOW_BOARDING, new Pair( R.string.activity_type_snow_boarding, R.drawable.track_snow_boarding)); - map.put( - WALK, new Pair(R.string.activity_type_walking, R.drawable.track_walk)); + map.put(AIRPLANE, + new Pair(R.string.activity_type_airplane, R.drawable.track_airplane)); + map.put(BOAT, new Pair(R.string.activity_type_boat, R.drawable.track_boat)); } - private static int[] airplane = new int[] { R.string.activity_type_airplane, - R.string.activity_type_commercial_airplane, R.string.activity_type_rc_airplane }; - private static int[] bike = new int[] { R.string.activity_type_biking, - R.string.activity_type_cycling, R.string.activity_type_dirt_bike, - R.string.activity_type_motor_bike, R.string.activity_type_mountain_biking, - R.string.activity_type_road_biking, R.string.activity_type_track_cycling }; - private static int[] boat = new int[] { R.string.activity_type_boat, R.string.activity_type_ferry, - R.string.activity_type_motor_boating, R.string.activity_type_rc_boat }; - private static int[] drive = new int[] { R.string.activity_type_atv, - R.string.activity_type_driving, R.string.activity_type_driving_bus, - R.string.activity_type_driving_car }; - private static int[] run = new int[] { R.string.activity_type_running, - R.string.activity_type_street_running, R.string.activity_type_track_running, - R.string.activity_type_trail_running }; - private static int[] ski = new int[] { - R.string.activity_type_cross_country_skiing, R.string.activity_type_skiing }; - private static int[] snowBoarding = new int[] { R.string.activity_type_snow_boarding }; - private static int[] walk = new int[] { R.string.activity_type_hiking, + private static int[] airplane = new int[] { + R.string.activity_type_airplane, R.string.activity_type_commercial_airplane, + R.string.activity_type_rc_airplane}; + private static int[] bike = new int[] {R.string.activity_type_biking, + R.string.activity_type_cycling, + R.string.activity_type_dirt_bike, + R.string.activity_type_motor_bike, + R.string.activity_type_mountain_biking, + R.string.activity_type_road_biking, + R.string.activity_type_track_cycling}; + private static int[] boat = new int[] {R.string.activity_type_boat, R.string.activity_type_ferry, + R.string.activity_type_motor_boating, R.string.activity_type_rc_boat}; + private static int[] drive = new int[] { + R.string.activity_type_atv, R.string.activity_type_driving, + R.string.activity_type_driving_bus, R.string.activity_type_driving_car}; + private static int[] run = new int[] { + R.string.activity_type_running, R.string.activity_type_street_running, + R.string.activity_type_track_running, R.string.activity_type_trail_running}; + private static int[] ski = + new int[] {R.string.activity_type_cross_country_skiing, R.string.activity_type_skiing}; + private static int[] snowBoarding = new int[] {R.string.activity_type_snow_boarding}; + private static int[] walk = new int[] {R.string.activity_type_hiking, R.string.activity_type_off_trail_hiking, R.string.activity_type_speed_walking, - R.string.activity_type_trail_hiking, R.string.activity_type_walking }; + R.string.activity_type_trail_hiking, R.string.activity_type_walking}; /** * Gets the icon drawable. - * + * * @param iconValue the icon value */ public static int getIconDrawable(String iconValue) { @@ -97,7 +103,7 @@ public class TrackIconUtils { /** * Gets the icon activity type. - * + * * @param iconValue the icon value */ public static int getIconActivityType(String iconValue) { @@ -121,7 +127,7 @@ public class TrackIconUtils { /** * Gets the icon value. - * + * * @param context the context * @param activityType the activity type */ @@ -153,9 +159,37 @@ public class TrackIconUtils { return ""; } + /** + * Inverts the colors in a bitmap. + * + * @param source the source + */ + public static Bitmap invertBitmap(Bitmap source) { + Bitmap output = Bitmap.createBitmap(source.getWidth(), source.getHeight(), source.getConfig()); + int height = source.getHeight(); + int width = source.getWidth(); + int pixelColor; + int alpha; + int red; + int green; + int blue; + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + pixelColor = source.getPixel(x, y); + alpha = Color.alpha(pixelColor); + red = 255 - Color.red(pixelColor); + green = 255 - Color.green(pixelColor); + blue = 255 - Color.blue(pixelColor); + output.setPixel(x, y, Color.argb(alpha, red, green, blue)); + } + } + return output; + } + /** * Returns true if the activity type is in the list. - * + * * @param context the context * @param activityType the activity type * @param list the list