aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo')
-rw-r--r--main/src/cgeo/geocaching/AbstractDialogFragment.java354
-rw-r--r--main/src/cgeo/geocaching/AbstractLoggingActivity.java4
-rw-r--r--main/src/cgeo/geocaching/AbstractPopupActivity.java260
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java32
-rw-r--r--main/src/cgeo/geocaching/CacheListActivity.java154
-rw-r--r--main/src/cgeo/geocaching/CacheMenuHandler.java32
-rw-r--r--main/src/cgeo/geocaching/CachePopup.java214
-rw-r--r--main/src/cgeo/geocaching/CachePopupFragment.java229
-rw-r--r--main/src/cgeo/geocaching/CompassActivity.java4
-rw-r--r--main/src/cgeo/geocaching/CreateShortcutActivity.java4
-rw-r--r--main/src/cgeo/geocaching/EditWaypointActivity.java4
-rw-r--r--main/src/cgeo/geocaching/Geocache.java8
-rw-r--r--main/src/cgeo/geocaching/ImageSelectActivity.java4
-rw-r--r--main/src/cgeo/geocaching/ImagesActivity.java4
-rw-r--r--main/src/cgeo/geocaching/MainActivity.java30
-rw-r--r--main/src/cgeo/geocaching/NavigateAnyPointActivity.java6
-rw-r--r--main/src/cgeo/geocaching/SearchActivity.java4
-rw-r--r--main/src/cgeo/geocaching/StaticMapsActivity.java6
-rw-r--r--main/src/cgeo/geocaching/TrackableActivity.java9
-rw-r--r--main/src/cgeo/geocaching/UsefulAppsActivity.java4
-rw-r--r--main/src/cgeo/geocaching/WaypointPopup.java136
-rw-r--r--main/src/cgeo/geocaching/WaypointPopupFragment.java147
-rw-r--r--main/src/cgeo/geocaching/activity/AbstractActionBarActivity.java34
-rw-r--r--main/src/cgeo/geocaching/activity/AbstractActivity.java28
-rw-r--r--main/src/cgeo/geocaching/activity/AbstractListActivity.java26
-rw-r--r--main/src/cgeo/geocaching/activity/AbstractViewPagerActivity.java2
-rw-r--r--main/src/cgeo/geocaching/activity/ActionBarListActivity.java34
-rw-r--r--main/src/cgeo/geocaching/activity/ActivityMixin.java39
-rw-r--r--main/src/cgeo/geocaching/list/AbstractList.java4
-rw-r--r--main/src/cgeo/geocaching/list/PseudoList.java10
-rw-r--r--main/src/cgeo/geocaching/list/StoredList.java57
-rw-r--r--main/src/cgeo/geocaching/maps/AbstractMap.java6
-rw-r--r--main/src/cgeo/geocaching/maps/CGeoMap.java102
-rw-r--r--main/src/cgeo/geocaching/maps/google/GoogleMapActivity.java12
-rw-r--r--main/src/cgeo/geocaching/maps/interfaces/MapActivityImpl.java1
-rw-r--r--main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java4
-rw-r--r--main/src/cgeo/geocaching/utils/TranslationUtils.java4
37 files changed, 1298 insertions, 714 deletions
diff --git a/main/src/cgeo/geocaching/AbstractDialogFragment.java b/main/src/cgeo/geocaching/AbstractDialogFragment.java
new file mode 100644
index 0000000..09a3bfc
--- /dev/null
+++ b/main/src/cgeo/geocaching/AbstractDialogFragment.java
@@ -0,0 +1,354 @@
+package cgeo.geocaching;
+
+import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.activity.ActivityMixin;
+import cgeo.geocaching.enumerations.CacheSize;
+import cgeo.geocaching.enumerations.LoadFlags;
+import cgeo.geocaching.gcvote.GCVote;
+import cgeo.geocaching.gcvote.GCVoteRating;
+import cgeo.geocaching.geopoint.Geopoint;
+import cgeo.geocaching.geopoint.Units;
+import cgeo.geocaching.sensors.GeoDirHandler;
+import cgeo.geocaching.sensors.IGeoData;
+import cgeo.geocaching.settings.Settings;
+import cgeo.geocaching.ui.CacheDetailsCreator;
+import cgeo.geocaching.ui.LoggingUI;
+import cgeo.geocaching.utils.Log;
+
+import rx.Observable;
+import rx.Subscription;
+import rx.android.observables.AndroidObservable;
+import rx.functions.Action1;
+import rx.functions.Func0;
+import rx.schedulers.Schedulers;
+import rx.subscriptions.Subscriptions;
+
+import android.annotation.TargetApi;
+import android.content.DialogInterface;
+import android.content.res.Resources;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.widget.PopupMenu;
+import android.view.ContextMenu;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+public abstract class AbstractDialogFragment extends DialogFragment implements CacheMenuHandler.ActivityInterface, PopupMenu.OnMenuItemClickListener, MenuItem.OnMenuItemClickListener {
+ protected CgeoApplication app = null;
+ protected Resources res = null;
+ protected String geocode;
+ protected CacheDetailsCreator details;
+
+ private Subscription resumeSubscription = Subscriptions.empty();
+ private TextView cacheDistance = null;
+
+
+ protected static final String GEOCODE_ARG= "GEOCODE";
+ protected static final String WAYPOINT_ARG= "WAYPOINT";
+
+ protected Geocache cache;
+
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ res = getResources();
+ app = (CgeoApplication) getActivity().getApplication();
+ setHasOptionsMenu(true);
+ }
+
+ protected void initCustomActionBar(View v)
+ {
+ final ImageView defaultNavigationImageView = (ImageView) v.findViewById(R.id.defaultNavigation);
+ defaultNavigationImageView.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ startDefaultNavigation2();
+ return true;
+ }
+ });
+ defaultNavigationImageView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ navigateTo();
+ }
+ });
+
+ final View overflowActionBar = v.findViewById(R.id.overflowActionBar);
+ overflowActionBar.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ showPopup(v);
+ }
+ });
+ /* Use a context menu instead popup where the popup menu is not working */
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
+ registerForContextMenu(overflowActionBar);
+ }
+
+ }
+
+ final public void setTitle(final CharSequence title) {
+ final TextView titleview = (TextView) getView().findViewById(R.id.actionbar_title);
+ if (titleview != null) {
+ titleview.setText(title);
+
+ }
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ geocode = getArguments().getString(GEOCODE_ARG);
+ init();
+ }
+
+
+ protected void showPopup(View view)
+ {
+ // For reason I totally not understand the PopupMenu from Appcompat is broken beyond
+ // repair. Chicken out here and show the old menu on Gingerbread.
+ // The "correct" way of implementing this is stil in
+ // showPopupCompat(view)
+
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
+ view.showContextMenu();
+ } else {
+ showPopupHoneycomb(view);
+ }
+ }
+
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ private void showPopupHoneycomb(View view) {
+ android.widget.PopupMenu popupMenu = new android.widget.PopupMenu(getActivity(), view);
+ CacheMenuHandler.addMenuItems(new MenuInflater(getActivity()), popupMenu.getMenu(), cache);
+ popupMenu.setOnMenuItemClickListener(
+ new android.widget.PopupMenu.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ return AbstractDialogFragment.this.onMenuItemClick(item);
+ }
+ }
+ );
+ popupMenu.show();
+ }
+
+ protected void showPopupCompat(View view)
+ {
+ PopupMenu popupMenu = new PopupMenu(getActivity(), view);
+
+ // Directly instantiate SupportMenuInflater instead of getActivity().getMenuinflator
+ // getMenuinflator will throw a NPE since it tries to get the not displayed ActionBar
+ // menuinflator = getActivity().getMenuInflater();
+ // MenuInflater menuinflator = new SupportMenuInflater(getActivity());
+ CacheMenuHandler.addMenuItems(popupMenu.getMenuInflater(), popupMenu.getMenu(), cache);
+ popupMenu.setOnMenuItemClickListener(this);
+ popupMenu.show();
+ }
+
+
+ protected void init()
+ {
+ cache = DataStore.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB);
+
+ if (cache == null) {
+ ((AbstractActivity) getActivity()).showToast(res.getString(R.string.err_detail_cache_find));
+
+ getActivity().finish();
+ return;
+ }
+
+ geocode = cache.getGeocode();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ this.resumeSubscription = geoUpdate.start(GeoDirHandler.UPDATE_GEODATA);
+ init();
+ }
+
+
+ @Override
+ public void onPause() {
+ resumeSubscription.unsubscribe();
+ super.onPause();
+ }
+
+
+ private void aquireGCVote() {
+ if (!Settings.isRatingWanted()) {
+ return;
+ }
+ if (!cache.supportsGCVote()) {
+ return;
+ }
+ AndroidObservable.bindActivity(getActivity(), Observable.defer(new Func0<Observable<GCVoteRating>>() {
+ @Override
+ public Observable<GCVoteRating> call() {
+ final GCVoteRating rating = GCVote.getRating(cache.getGuid(), geocode);
+ return rating != null ? Observable.just(rating) : Observable.<GCVoteRating>empty();
+ }
+ })).subscribe(new Action1<GCVoteRating>() {
+ @Override
+ public void call(final GCVoteRating rating) {
+ cache.setRating(rating.getRating());
+ cache.setVotes(rating.getVotes());
+ DataStore.saveChangedCache(cache);
+ details.addRating(cache);
+ }
+ }, Schedulers.io());
+ }
+
+ protected final void addCacheDetails() {
+ assert cache != null;
+ // cache type
+ final String cacheType = cache.getType().getL10n();
+ final String cacheSize = cache.getSize() != CacheSize.UNKNOWN ? " (" + cache.getSize().getL10n() + ")" : "";
+ details.add(R.string.cache_type, cacheType + cacheSize);
+
+ details.add(R.string.cache_geocode, cache.getGeocode());
+ details.addCacheState(cache);
+
+ details.addDistance(cache, cacheDistance);
+ cacheDistance = details.getValueView();
+
+ details.addDifficulty(cache);
+ details.addTerrain(cache);
+ details.addEventDate(cache);
+
+ // rating
+ if (cache.getRating() > 0) {
+ details.addRating(cache);
+ } else {
+ aquireGCVote();
+ }
+
+ // favorite count
+ details.add(R.string.cache_favorite, cache.getFavoritePoints() + "×");
+
+ // more details
+ final Button buttonMore = (Button) getView().findViewById(R.id.more_details);
+
+ buttonMore.setOnClickListener(new View.OnClickListener() {
+
+ @Override
+ public void onClick(View arg0) {
+ CacheDetailActivity.startActivity(getActivity(), geocode);
+ getActivity().finish();
+ }
+ });
+
+ /* Only working combination as it seems */
+ registerForContextMenu(buttonMore);
+ }
+
+ public final void showToast(String text) {
+ ActivityMixin.showToast(getActivity(), text);
+ }
+
+ private final GeoDirHandler geoUpdate = new GeoDirHandler() {
+
+ @Override
+ public void updateGeoData(final IGeoData geo) {
+ try {
+ if (geo.getCoords() != null && cache != null && cache.getCoords() != null) {
+ cacheDistance.setText(Units.getDistanceFromKilometers(geo.getCoords().distanceTo(cache.getCoords())));
+ cacheDistance.bringToFront();
+ }
+ onUpdateGeoData(geo);
+ } catch (final RuntimeException e) {
+ Log.w("Failed to UpdateLocation location.");
+ }
+ }
+ };
+
+ public void onUpdateGeoData(final IGeoData geo) {
+ }
+
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ super.onCreateOptionsMenu(menu, inflater);
+ CacheMenuHandler.addMenuItems(inflater, menu, cache);
+
+ }
+
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
+ super.onCreateContextMenu(menu, v, menuInfo);
+ CacheMenuHandler.addMenuItems(new MenuInflater(getActivity()), menu, cache);
+ for (int i=0;i<menu.size();i++) {
+ MenuItem m = menu.getItem(i);
+ m.setOnMenuItemClickListener(this);
+ }
+ }
+
+ @Override
+ public boolean onContextItemSelected(MenuItem item) {
+ return onOptionsItemSelected(item);
+ }
+
+
+ @Override
+ public boolean onMenuItemClick(MenuItem menuItem) {
+ return onOptionsItemSelected(menuItem);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (CacheMenuHandler.onMenuItemSelected(item, this, cache)) {
+ return true;
+ }
+ if (LoggingUI.onMenuItemSelected(item, getActivity(), cache)) {
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ public void onPrepareOptionsMenu(Menu menu) {
+ super.onPrepareOptionsMenu(menu);
+
+ try {
+ CacheMenuHandler.onPrepareOptionsMenu(menu, cache);
+ LoggingUI.onPrepareOptionsMenu(menu, cache);
+ } catch (final RuntimeException e) {
+ // nothing
+ }
+ }
+
+
+ protected abstract Geopoint getCoordinates();
+
+ protected abstract void startDefaultNavigation2();
+
+
+ @Override
+ public void cachesAround() {
+ final Geopoint coords = getCoordinates();
+ if (coords == null) {
+ showToast(res.getString(R.string.err_location_unknown));
+ return;
+ }
+ CacheListActivity.startActivityCoordinates((AbstractActivity) getActivity(), coords);
+ getActivity().finish();
+ }
+
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ super.onCancel(dialog);
+ getActivity().finish();
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ }
+}
diff --git a/main/src/cgeo/geocaching/AbstractLoggingActivity.java b/main/src/cgeo/geocaching/AbstractLoggingActivity.java
index c3ba7d2..3b0f78d 100644
--- a/main/src/cgeo/geocaching/AbstractLoggingActivity.java
+++ b/main/src/cgeo/geocaching/AbstractLoggingActivity.java
@@ -1,6 +1,6 @@
package cgeo.geocaching;
-import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.activity.AbstractActionBarActivity;
import cgeo.geocaching.activity.ActivityMixin;
import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.connector.gc.GCConnector;
@@ -19,7 +19,7 @@ import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.EditText;
-public abstract class AbstractLoggingActivity extends AbstractActivity {
+public abstract class AbstractLoggingActivity extends AbstractActionBarActivity {
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
diff --git a/main/src/cgeo/geocaching/AbstractPopupActivity.java b/main/src/cgeo/geocaching/AbstractPopupActivity.java
deleted file mode 100644
index 88cad01..0000000
--- a/main/src/cgeo/geocaching/AbstractPopupActivity.java
+++ /dev/null
@@ -1,260 +0,0 @@
-package cgeo.geocaching;
-
-import cgeo.geocaching.activity.AbstractActivity;
-import cgeo.geocaching.activity.ActivityMixin;
-import cgeo.geocaching.enumerations.CacheSize;
-import cgeo.geocaching.enumerations.LoadFlags;
-import cgeo.geocaching.gcvote.GCVote;
-import cgeo.geocaching.gcvote.GCVoteRating;
-import cgeo.geocaching.geopoint.Geopoint;
-import cgeo.geocaching.geopoint.Units;
-import cgeo.geocaching.sensors.GeoDirHandler;
-import cgeo.geocaching.sensors.IGeoData;
-import cgeo.geocaching.settings.Settings;
-import cgeo.geocaching.ui.CacheDetailsCreator;
-import cgeo.geocaching.ui.LoggingUI;
-import cgeo.geocaching.utils.Log;
-
-import org.apache.commons.lang3.StringUtils;
-
-import rx.Observable;
-import rx.android.observables.AndroidObservable;
-import rx.functions.Action1;
-import rx.functions.Func0;
-import rx.schedulers.Schedulers;
-
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnLongClickListener;
-import android.widget.Button;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-public abstract class AbstractPopupActivity extends AbstractActivity implements CacheMenuHandler.ActivityInterface {
-
- protected Geocache cache = null;
- protected String geocode = null;
- protected CacheDetailsCreator details;
-
- private TextView cacheDistance = null;
- private final int layout;
-
- private final GeoDirHandler geoUpdate = new GeoDirHandler() {
-
- @Override
- public void updateGeoData(final IGeoData geo) {
- try {
- if (geo.getCoords() != null && cache != null && cache.getCoords() != null) {
- cacheDistance.setText(Units.getDistanceFromKilometers(geo.getCoords().distanceTo(cache.getCoords())));
- cacheDistance.bringToFront();
- }
- onUpdateGeoData(geo);
- } catch (final RuntimeException e) {
- Log.w("Failed to UpdateLocation location.");
- }
- }
- };
-
- /**
- * Callback to run when new location information is available.
- * This may be overridden by deriving classes. The default implementation does nothing.
- *
- * @param geo
- * the new data
- */
- public void onUpdateGeoData(final IGeoData geo) {
- }
-
- protected AbstractPopupActivity(int layout) {
- this.layout = layout;
- }
-
- private void aquireGCVote() {
- if (!Settings.isRatingWanted()) {
- return;
- }
- if (!cache.supportsGCVote()) {
- return;
- }
- AndroidObservable.bindActivity(this, Observable.defer(new Func0<Observable<GCVoteRating>>() {
- @Override
- public Observable<GCVoteRating> call() {
- final GCVoteRating rating = GCVote.getRating(cache.getGuid(), geocode);
- return rating != null ? Observable.just(rating) : Observable.<GCVoteRating>empty();
- }
- })).subscribe(new Action1<GCVoteRating>() {
- @Override
- public void call(final GCVoteRating rating) {
- cache.setRating(rating.getRating());
- cache.setVotes(rating.getVotes());
- DataStore.saveChangedCache(cache);
- details.addRating(cache);
- }
- }, Schedulers.io());
- }
-
- protected void init() {
- cache = DataStore.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB);
-
- if (cache == null) {
- showToast(res.getString(R.string.err_detail_cache_find));
-
- finish();
- return;
- }
-
- geocode = cache.getGeocode();
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // set theme
- this.setTheme(ActivityMixin.getDialogTheme());
- // set layout
- setContentView(layout);
-
- // get parameters
- final Bundle extras = getIntent().getExtras();
- if (extras != null) {
- geocode = extras.getString(Intents.EXTRA_GEOCODE);
- }
-
- if (StringUtils.isBlank(geocode)) {
- showToast(res.getString(R.string.err_detail_cache_find));
-
- finish();
- return;
- }
-
- final ImageView defaultNavigationImageView = (ImageView) findViewById(R.id.defaultNavigation);
- defaultNavigationImageView.setOnLongClickListener(new OnLongClickListener() {
- @Override
- public boolean onLongClick(View v) {
- startDefaultNavigation2();
- return true;
- }
- });
-
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- CacheMenuHandler.addMenuItems(this, menu, cache);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (CacheMenuHandler.onMenuItemSelected(item, this, cache)) {
- return true;
- }
- if (LoggingUI.onMenuItemSelected(item, this, cache)) {
- return true;
- }
-
- return true;
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- super.onPrepareOptionsMenu(menu);
-
- try {
- CacheMenuHandler.onPrepareOptionsMenu(menu, cache);
- LoggingUI.onPrepareOptionsMenu(menu, cache);
- } catch (final RuntimeException e) {
- // nothing
- }
-
- return true;
- }
-
- protected abstract Geopoint getCoordinates();
-
- @Override
- public void onResume() {
- super.onResume(geoUpdate.start(GeoDirHandler.UPDATE_GEODATA));
- init();
- }
-
- @Override
- public boolean onTouchEvent(final MotionEvent event) {
- if (event.getAction() == MotionEvent.ACTION_UP) {
- final Rect r = new Rect(0, 0, 0, 0);
- getWindow().getDecorView().getHitRect(r);
- if (!r.contains((int) event.getX(), (int) event.getY())) {
- finish();
- return true;
- }
- }
- return super.onTouchEvent(event);
- }
-
- protected abstract void startDefaultNavigation2();
-
- protected final void addCacheDetails() {
- assert cache != null;
- // cache type
- final String cacheType = cache.getType().getL10n();
- final String cacheSize = cache.getSize() != CacheSize.UNKNOWN ? " (" + cache.getSize().getL10n() + ")" : "";
- details.add(R.string.cache_type, cacheType + cacheSize);
-
- details.add(R.string.cache_geocode, cache.getGeocode());
- details.addCacheState(cache);
-
- details.addDistance(cache, cacheDistance);
- cacheDistance = details.getValueView();
-
- details.addDifficulty(cache);
- details.addTerrain(cache);
- details.addEventDate(cache);
-
- // rating
- if (cache.getRating() > 0) {
- details.addRating(cache);
- } else {
- aquireGCVote();
- }
-
- // favorite count
- details.add(R.string.cache_favorite, cache.getFavoritePoints() + "×");
-
- // more details
- final Button buttonMore = (Button) findViewById(R.id.more_details);
- buttonMore.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View arg0) {
- CacheDetailActivity.startActivity(AbstractPopupActivity.this, geocode);
- finish();
- }
- });
- }
-
- @Override
- public void cachesAround() {
- final Geopoint coords = getCoordinates();
- if (coords == null) {
- showToast(res.getString(R.string.err_location_unknown));
- return;
- }
- CacheListActivity.startActivityCoordinates(this, coords);
- finish();
- }
-
- /**
- * @param view
- * unused here but needed since this method is referenced from XML layout
- */
- public final void goDefaultNavigation(View view) {
- navigateTo();
- finish();
- }
-
-}
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java
index 7d231c9..2af9f95 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -101,6 +101,7 @@ import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewParent;
+import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
@@ -272,15 +273,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
// nothing, we lost the window
}
- final ImageView defaultNavigationImageView = (ImageView) findViewById(R.id.defaultNavigation);
- defaultNavigationImageView.setOnLongClickListener(new OnLongClickListener() {
- @Override
- public boolean onLongClick(View v) {
- startDefaultNavigation2();
- return true;
- }
- });
-
final int pageToOpen = savedInstanceState != null ?
savedInstanceState.getInt(STATE_PAGE_INDEX, 0) :
Settings.isOpenLastDetailsPage() ? Settings.getLastDetailsPage() : 1;
@@ -510,7 +502,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
}
- return true;
+ return super.onOptionsItemSelected(item);
}
private static final class CacheDetailsGeoDirHandler extends GeoDirHandler {
@@ -609,11 +601,12 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
// action bar: title and icon
if (StringUtils.isNotBlank(cache.getName())) {
- setTitle(cache.getName() + " (" + cache.getGeocode() + ')');
+ getSupportActionBar().setTitle(cache.getName() + " (" + cache.getGeocode() + ')');
} else {
- setTitle(cache.getGeocode());
+ getSupportActionBar().setTitle(cache.getGeocode());
}
- ((TextView) findViewById(R.id.actionbar_title)).setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(cache.getType().markerId), null, null, null);
+
+ getSupportActionBar().setIcon(getResources().getDrawable(cache.getType().markerId));
// reset imagesList so Images view page will be redrawn
imagesList = null;
@@ -632,13 +625,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
/**
- * Tries to navigate to the {@link Geocache} of this activity.
- */
- private void startDefaultNavigation2() {
- NavigationAppFactory.startDefaultNavigationApplication(2, this, cache);
- }
-
- /**
* Wrapper for the referenced method in the xml-layout.
*/
public void goDefaultNavigation(@SuppressWarnings("unused") View view) {
@@ -2112,9 +2098,9 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
static void updateOfflineBox(final View view, final Geocache cache, final Resources res,
- final OnClickListener refreshCacheClickListener,
- final OnClickListener dropCacheClickListener,
- final OnClickListener storeCacheClickListener) {
+ final OnClickListener refreshCacheClickListener,
+ final OnClickListener dropCacheClickListener,
+ final OnClickListener storeCacheClickListener) {
// offline use
final TextView offlineText = (TextView) view.findViewById(R.id.offline_text);
final Button offlineRefresh = (Button) view.findViewById(R.id.offline_refresh);
diff --git a/main/src/cgeo/geocaching/CacheListActivity.java b/main/src/cgeo/geocaching/CacheListActivity.java
index c45d77d..fa51137 100644
--- a/main/src/cgeo/geocaching/CacheListActivity.java
+++ b/main/src/cgeo/geocaching/CacheListActivity.java
@@ -18,6 +18,7 @@ import cgeo.geocaching.files.GPXImporter;
import cgeo.geocaching.filter.FilterUserInterface;
import cgeo.geocaching.filter.IFilter;
import cgeo.geocaching.geopoint.Geopoint;
+import cgeo.geocaching.list.AbstractList;
import cgeo.geocaching.list.PseudoList;
import cgeo.geocaching.list.StoredList;
import cgeo.geocaching.loaders.AbstractSearchLoader;
@@ -71,6 +72,7 @@ import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.res.Configuration;
+import android.content.res.Resources;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
@@ -79,13 +81,17 @@ import android.os.Message;
import android.provider.OpenableColumns;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
+import android.support.v7.app.ActionBar;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.KeyEvent;
+import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
+import android.view.ViewGroup;
import android.widget.AdapterView.AdapterContextMenuInfo;
+import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
@@ -254,20 +260,30 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA
}
}
+ private static String getCacheNumberString(Resources res, int count)
+ {
+ return res.getQuantityString(R.plurals.cache_counts, count, count);
+ }
+
protected void updateTitle() {
- final ArrayList<Integer> numbers = new ArrayList<Integer>();
+
+ getSupportActionBar().setTitle(title);
+
+ final ArrayList<String> numbers = new ArrayList<String>();
if (adapter.isFiltered()) {
- numbers.add(adapter.getCount());
+ numbers.add(getCacheNumberString(getResources(), adapter.getCount()));
}
if (search != null) {
- numbers.add(search.getCount());
+ numbers.add(getCacheNumberString(getResources(), search.getCount()));
}
if (numbers.isEmpty()) {
- setTitle(title);
+ getSupportActionBar().setSubtitle(null);
}
else {
- setTitle(title + " [" + StringUtils.join(numbers, '/') + ']');
+ getSupportActionBar().setSubtitle(StringUtils.join(numbers, '/'));
}
+
+ refreshSpinnerAdapter();
}
private final CancellableHandler loadDetailsHandler = new CancellableHandler() {
@@ -378,7 +394,9 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+
setTheme();
+
setContentView(R.layout.cacheslist_activity);
// get parameters
@@ -398,22 +416,16 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA
}
}
- // Add the list selection in code. This way we can leave the XML layout of the action bar the same as for other activities.
- final View titleBar = findViewById(R.id.actionbar_title);
- titleBar.setClickable(true);
- titleBar.setOnClickListener(new View.OnClickListener() {
-
- @Override
- public void onClick(View v) {
- selectList();
- }
- });
-
setTitle(title);
+
initAdapter();
prepareFilterBar();
+ if (type.canSwitch) {
+ initActionBarSpinner();
+ }
+
currentLoader = (AbstractSearchLoader) getSupportLoaderManager().initLoader(type.getLoaderId(), extras, this);
// init
@@ -429,8 +441,102 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA
if (isInvokedFromAttachment()) {
importGpxAttachement();
}
+
+
+
+ }
+
+ static class CacheArrayAdapter extends ArrayAdapter<AbstractList> {
+
+ static class ViewHolder {
+ TextView title;
+ TextView subtitle;
+ }
+
+ private final Context mContext;
+
+ public CacheArrayAdapter(Context context, int resource) {
+ super(context, resource);
+ mContext = context;
+ }
+
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ return getCustomView(position, convertView, parent);
+ }
+
+
+ @Override
+ public View getDropDownView(int position, View convertView, ViewGroup parent) {
+ return getCustomView(position, convertView, parent);
+ }
+
+ public View getCustomView(final int position, final View convertView, final ViewGroup parent) {
+
+ View resultView = convertView;
+ LayoutInflater inflater =
+ (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+
+ ViewHolder holder;
+ if (resultView == null) {
+ resultView = inflater.inflate(R.layout.cachelist_spinneritem, parent, false);
+ holder = new ViewHolder();
+ holder.title = (TextView) resultView.findViewById(android.R.id.text1);
+ holder.subtitle = (TextView) resultView.findViewById(android.R.id.text2);
+
+ resultView.setTag(holder);
+ } else {
+ holder = (ViewHolder) resultView.getTag();
+ }
+
+ AbstractList list = getItem(position);
+ holder.title.setText(list.getTitle());
+ if (list.getCount() >= 0) {
+ holder.subtitle.setVisibility(View.VISIBLE);
+ holder.subtitle.setText(getCacheNumberString(mContext.getResources(),list.getCount()));
+ } else {
+ holder.subtitle.setVisibility(View.GONE);
+ }
+
+ return resultView;
+ }
}
+ CacheArrayAdapter mCacheListSpinnerAdapter;
+
+ private void initActionBarSpinner() {
+ mCacheListSpinnerAdapter = new CacheArrayAdapter(this, R.layout.support_simple_spinner_dropdown_item);
+ getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
+ getSupportActionBar().setDisplayShowTitleEnabled(false);
+ getSupportActionBar().setListNavigationCallbacks(mCacheListSpinnerAdapter, new ActionBar.OnNavigationListener() {
+ @Override
+ public boolean onNavigationItemSelected(int i, long l) {
+ int newListId = mCacheListSpinnerAdapter.getItem(i).id;
+ if (newListId != listId) {
+ switchListById(newListId);
+ }
+ return true;
+ }
+ });
+ }
+
+ private void refreshSpinnerAdapter() {
+ /* If the activity does not use the Spinner this will be null */
+ if (mCacheListSpinnerAdapter==null) {
+ return;
+ }
+ mCacheListSpinnerAdapter.clear();
+
+ AbstractList list = AbstractList.getListById(listId);
+
+ for (AbstractList l: StoredList.UserInterface.getMenuLists(false, PseudoList.NEW_LIST.id)) {
+ mCacheListSpinnerAdapter.add(l);
+ }
+
+ getSupportActionBar().setSelectedNavigationItem(mCacheListSpinnerAdapter.getPosition(list));
+ }
@Override
public void onConfigurationChanged(Configuration newConfig) {
@@ -617,7 +723,13 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA
@Override
public boolean onOptionsItemSelected(MenuItem item) {
+ if (super.onOptionsItemSelected(item)) {
+ return true;
+ }
switch (item.getItemId()) {
+ case R.id.menu_show_on_map:
+ goMap();
+ return true;
case R.id.menu_switch_select_mode:
adapter.switchSelectMode();
invalidateOptionsMenuCompatible();
@@ -645,6 +757,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA
return false;
case R.id.menu_create_list:
new StoredList.UserInterface(this).promptForListCreation(getListSwitchingRunnable(), newListName);
+ refreshSpinnerAdapter();
invalidateOptionsMenuCompatible();
return false;
case R.id.menu_drop_list:
@@ -1366,6 +1479,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA
private void removeListInternal() {
if (DataStore.removeList(listId)) {
showToast(res.getString(R.string.list_dialog_remove_ok));
+ refreshSpinnerAdapter();
switchListById(StoredList.STANDARD_LIST_ID);
} else {
showToast(res.getString(R.string.list_dialog_remove_err));
@@ -1394,11 +1508,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA
});
}
- /**
- * @param view
- * unused here but needed since this method is referenced from XML layout
- */
- public void goMap(View view) {
+ public void goMap() {
if (!cacheToShow()) {
return;
}
@@ -1414,6 +1524,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA
}
private void refreshCurrentList() {
+ refreshSpinnerAdapter();
switchListById(listId);
}
@@ -1576,6 +1687,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA
break;
case HISTORY:
title = res.getString(R.string.caches_history);
+ listId = PseudoList.HISTORY_LIST.id;
loader = new HistoryGeocacheListLoader(app, coords);
break;
case NEAREST:
diff --git a/main/src/cgeo/geocaching/CacheMenuHandler.java b/main/src/cgeo/geocaching/CacheMenuHandler.java
index cfe9eeb..5b0fdba 100644
--- a/main/src/cgeo/geocaching/CacheMenuHandler.java
+++ b/main/src/cgeo/geocaching/CacheMenuHandler.java
@@ -5,7 +5,11 @@ import cgeo.geocaching.apps.cache.navi.NavigationAppFactory;
import cgeo.geocaching.ui.AbstractUIFactory;
import android.app.Activity;
+import android.support.v4.app.Fragment;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v7.widget.ShareActionProvider;
import android.view.Menu;
+import android.view.MenuInflater;
import android.view.MenuItem;
/**
@@ -19,7 +23,7 @@ public class CacheMenuHandler extends AbstractUIFactory {
* Methods to be implemented by the activity to react to the cache menu selections.
*
*/
- protected interface ActivityInterface {
+ interface ActivityInterface {
public void navigateTo();
public void showNavigationMenu();
@@ -29,8 +33,14 @@ public class CacheMenuHandler extends AbstractUIFactory {
}
public static boolean onMenuItemSelected(MenuItem item, CacheMenuHandler.ActivityInterface activityInterface, Geocache cache) {
- assert activityInterface instanceof Activity;
- final Activity activity = (Activity) activityInterface;
+ assert activityInterface instanceof Activity || activityInterface instanceof Fragment;
+ final Activity activity;
+ if (activityInterface instanceof Activity) {
+ activity = (Activity) activityInterface;
+ } else {
+ activity = ((Fragment)activityInterface).getActivity();
+ }
+
switch (item.getItemId()) {
case R.id.menu_default_navigation:
activityInterface.navigateTo();
@@ -68,10 +78,22 @@ public class CacheMenuHandler extends AbstractUIFactory {
menu.findItem(R.id.menu_show_in_browser).setVisible(cache.canOpenInBrowser());
menu.findItem(R.id.menu_default_navigation).setTitle(NavigationAppFactory.getDefaultNavigationApplication().getName());
+
+ MenuItem shareItem = menu.findItem(R.id.menu_share);
+ ShareActionProvider shareActionProvider = (ShareActionProvider)
+ MenuItemCompat.getActionProvider(shareItem);
+ if(shareActionProvider != null) {
+ shareActionProvider.setShareIntent(cache.getIntent());
+ }
+
}
- public static void addMenuItems(Activity activity, Menu menu, Geocache cache) {
- activity.getMenuInflater().inflate(R.menu.cache_options, menu);
+ public static void addMenuItems(MenuInflater inflater, Menu menu, Geocache cache) {
+ inflater.inflate(R.menu.cache_options, menu);
onPrepareOptionsMenu(menu, cache);
}
+
+ public static void addMenuItems(Activity activity, Menu menu, Geocache cache) {
+ addMenuItems(activity.getMenuInflater(), menu, cache);
+ }
}
diff --git a/main/src/cgeo/geocaching/CachePopup.java b/main/src/cgeo/geocaching/CachePopup.java
index b72b67c..d886554 100644
--- a/main/src/cgeo/geocaching/CachePopup.java
+++ b/main/src/cgeo/geocaching/CachePopup.java
@@ -1,14 +1,7 @@
package cgeo.geocaching;
-import cgeo.geocaching.activity.Progress;
-import cgeo.geocaching.apps.cache.navi.NavigationAppFactory;
-import cgeo.geocaching.geopoint.Geopoint;
-import cgeo.geocaching.list.StoredList;
-import cgeo.geocaching.network.Network;
-import cgeo.geocaching.settings.Settings;
-import cgeo.geocaching.ui.CacheDetailsCreator;
-import cgeo.geocaching.utils.CancellableHandler;
-import cgeo.geocaching.utils.Log;
+import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.activity.ActivityMixin;
import org.apache.commons.lang3.StringUtils;
@@ -18,187 +11,60 @@ import rx.schedulers.Schedulers;
import android.content.Context;
import android.content.Intent;
-import android.content.res.Configuration;
-import android.os.Handler;
-import android.os.Message;
-import android.view.View;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-public class CachePopup extends AbstractPopupActivity {
- private final Progress progress = new Progress();
-
- private class StoreCacheHandler extends CancellableHandler {
- private final int progressMessage;
-
- public StoreCacheHandler(final int progressMessage) {
- this.progressMessage = progressMessage;
- }
-
- @Override
- public void handleRegularMessage(Message msg) {
- if (UPDATE_LOAD_PROGRESS_DETAIL == msg.what && msg.obj instanceof String) {
- updateStatusMsg((String) msg.obj);
- } else {
- init();
- }
- }
-
- private void updateStatusMsg(final String msg) {
- progress.setMessage(res.getString(progressMessage)
- + "\n\n"
- + msg);
- }
- }
-
- private class DropCacheHandler extends Handler {
- @Override
- public void handleMessage(Message msg) {
- CachePopup.this.finish();
+import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentTransaction;
+import android.view.Window;
+
+/**
+ * Created by arne on 23.04.2014.
+ */
+public class CachePopup extends AbstractActivity {
+
+ protected String geocode = null;
+
+
+ void showDialog() {
+ // DialogFragment.show() will take care of adding the fragment
+ // in a transaction. We also want to remove any currently showing
+ // dialog, so make our own transaction and take care of that here.
+ FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
+ Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
+ if (prev != null) {
+ ft.remove(prev);
}
- }
+ ft.addToBackStack(null);
- public CachePopup() {
- super(R.layout.popup);
+ // Create and show the dialog.
+ DialogFragment newFragment = CachePopupFragment.newInstance(geocode);
+ newFragment.show(ft, "dialog");
}
@Override
- public void showNavigationMenu() {
- NavigationAppFactory.showNavigationMenu(this, cache, null, null);
- }
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
+ this.setTheme(ActivityMixin.getDialogTheme());
- @Override
- protected void init() {
- super.init();
- try {
- if (StringUtils.isNotBlank(cache.getName())) {
- setTitle(cache.getName());
- } else {
- setTitle(geocode);
- }
-
- // actionbar icon
- ((TextView) findViewById(R.id.actionbar_title)).setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(cache.getType().markerId), null, null, null);
-
- details = new CacheDetailsCreator(this, (LinearLayout) findViewById(R.id.details_list));
- addCacheDetails();
-
- // offline use
- CacheDetailActivity.updateOfflineBox(findViewById(android.R.id.content), cache, res, new RefreshCacheClickListener(), new DropCacheClickListener(), new StoreCacheClickListener());
-
- } catch (Exception e) {
- Log.e("CachePopup.init", e);
+ final Bundle extras = getIntent().getExtras();
+ if (extras != null) {
+ geocode = extras.getString(Intents.EXTRA_GEOCODE);
}
- // cache is loaded. remove progress-popup if any there
- progress.dismiss();
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
-
- init();
- }
-
- private class StoreCacheClickListener implements View.OnClickListener {
- @Override
- public void onClick(View arg0) {
- if (progress.isShowing()) {
- showToast(res.getString(R.string.err_detail_still_working));
- return;
- }
+ if (StringUtils.isBlank(geocode)) {
+ showToast(res.getString(R.string.err_detail_cache_find));
- if (Settings.getChooseList()) {
- // let user select list to store cache in
- new StoredList.UserInterface(CachePopup.this).promptForListSelection(R.string.list_title,
- new Action1<Integer>() {
- @Override
- public void call(final Integer selectedListId) {
- storeCache(selectedListId);
- }
- }, true, StoredList.TEMPORARY_LIST_ID);
- } else {
- storeCache(StoredList.TEMPORARY_LIST_ID);
- }
- }
-
- protected void storeCache(final int listId) {
- final StoreCacheHandler storeCacheHandler = new StoreCacheHandler(R.string.cache_dialog_offline_save_message);
- progress.show(CachePopup.this, res.getString(R.string.cache_dialog_offline_save_title), res.getString(R.string.cache_dialog_offline_save_message), true, storeCacheHandler.cancelMessage());
- Schedulers.io().createWorker().schedule(new Action0() {
- @Override
- public void call() {
- cache.store(listId, storeCacheHandler);
- invalidateOptionsMenuCompatible();
- }
- });
- }
- }
-
- private class RefreshCacheClickListener implements View.OnClickListener {
- @Override
- public void onClick(View arg0) {
- if (progress.isShowing()) {
- showToast(res.getString(R.string.err_detail_still_working));
- return;
- }
-
- if (!Network.isNetworkConnected(getApplicationContext())) {
- showToast(getString(R.string.err_server));
- return;
- }
-
- final StoreCacheHandler refreshCacheHandler = new StoreCacheHandler(R.string.cache_dialog_offline_save_message);
- progress.show(CachePopup.this, res.getString(R.string.cache_dialog_refresh_title), res.getString(R.string.cache_dialog_refresh_message), true, refreshCacheHandler.cancelMessage());
- cache.refresh(refreshCacheHandler, Schedulers.io());
- }
- }
-
- private class DropCacheClickListener implements View.OnClickListener {
- @Override
- public void onClick(View arg0) {
- if (progress.isShowing()) {
- showToast(res.getString(R.string.err_detail_still_working));
- return;
- }
-
- final DropCacheHandler dropCacheHandler = new DropCacheHandler();
- progress.show(CachePopup.this, res.getString(R.string.cache_dialog_offline_drop_title), res.getString(R.string.cache_dialog_offline_drop_message), true, null);
- cache.drop(dropCacheHandler, Schedulers.io());
- }
- }
-
- @Override
- public void navigateTo() {
- NavigationAppFactory.startDefaultNavigationApplication(1, this, cache);
- }
-
- /**
- * Tries to navigate to the {@link Geocache} of this activity.
- */
- @Override
- protected void startDefaultNavigation2() {
- if (cache == null || cache.getCoords() == null) {
- showToast(res.getString(R.string.cache_coordinates_no));
+ finish();
return;
}
- NavigationAppFactory.startDefaultNavigationApplication(2, this, cache);
- finish();
+ showDialog();
}
- public static void startActivity(final Context context, final String geocode) {
+ public static void startActivity(Context context, String geocode) {
final Intent popupIntent = new Intent(context, CachePopup.class);
popupIntent.putExtra(Intents.EXTRA_GEOCODE, geocode);
context.startActivity(popupIntent);
}
-
- @Override
- protected Geopoint getCoordinates() {
- if (cache == null) {
- return null;
- }
- return cache.getCoords();
- }
}
diff --git a/main/src/cgeo/geocaching/CachePopupFragment.java b/main/src/cgeo/geocaching/CachePopupFragment.java
new file mode 100644
index 0000000..010d701
--- /dev/null
+++ b/main/src/cgeo/geocaching/CachePopupFragment.java
@@ -0,0 +1,229 @@
+package cgeo.geocaching;
+
+import cgeo.geocaching.activity.Progress;
+import cgeo.geocaching.apps.cache.navi.NavigationAppFactory;
+import cgeo.geocaching.geopoint.Geopoint;
+import cgeo.geocaching.list.StoredList;
+import cgeo.geocaching.network.Network;
+import cgeo.geocaching.settings.Settings;
+import cgeo.geocaching.ui.CacheDetailsCreator;
+import cgeo.geocaching.utils.CancellableHandler;
+import cgeo.geocaching.utils.Log;
+
+import org.apache.commons.lang3.StringUtils;
+
+import rx.functions.Action0;
+import rx.functions.Action1;
+import rx.schedulers.Schedulers;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.support.v4.app.DialogFragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+public class CachePopupFragment extends AbstractDialogFragment {
+ private final Progress progress = new Progress();
+
+ public static DialogFragment newInstance(String geocode) {
+
+ Bundle args = new Bundle();
+ args.putString(GEOCODE_ARG,geocode);
+
+ DialogFragment f = new CachePopupFragment();
+ f.setStyle(DialogFragment.STYLE_NO_TITLE,0);
+ f.setArguments(args);
+
+ return f;
+ }
+
+ private class StoreCacheHandler extends CancellableHandler {
+ private final int progressMessage;
+
+ public StoreCacheHandler(final int progressMessage) {
+ this.progressMessage = progressMessage;
+ }
+
+ @Override
+ public void handleRegularMessage(Message msg) {
+ if (UPDATE_LOAD_PROGRESS_DETAIL == msg.what && msg.obj instanceof String) {
+ updateStatusMsg((String) msg.obj);
+ } else {
+ init();
+ }
+ }
+
+ private void updateStatusMsg(final String msg) {
+ progress.setMessage(res.getString(progressMessage)
+ + "\n\n"
+ + msg);
+ }
+ }
+
+ private class DropCacheHandler extends Handler {
+ @Override
+ public void handleMessage(Message msg) {
+ getActivity().finish();
+ }
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View v = inflater.inflate(R.layout.popup, container, false);
+ initCustomActionBar(v);
+ return v;
+ }
+
+ @Override
+ protected void init() {
+ super.init();
+
+ try {
+ if (StringUtils.isNotBlank(cache.getName())) {
+ setTitle(cache.getName());
+ } else {
+ setTitle(geocode);
+ }
+
+ ((TextView) getView().findViewById(R.id.actionbar_title)).setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(cache.getType().markerId), null, null, null);
+
+ details = new CacheDetailsCreator(getActivity(), (LinearLayout) getView().findViewById(R.id.details_list));
+
+ addCacheDetails();
+
+ // offline use
+ CacheDetailActivity.updateOfflineBox(getView(), cache, res, new RefreshCacheClickListener(), new DropCacheClickListener(), new StoreCacheClickListener());
+
+ } catch (Exception e) {
+ Log.e("CachePopupFragment.init", e);
+ }
+
+ // cache is loaded. remove progress-popup if any there
+ progress.dismiss();
+ }
+
+
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+
+ init();
+ }
+
+ private class StoreCacheClickListener implements View.OnClickListener {
+ @Override
+ public void onClick(View arg0) {
+ if (progress.isShowing()) {
+ showToast(res.getString(R.string.err_detail_still_working));
+ return;
+ }
+
+ if (Settings.getChooseList()) {
+ // let user select list to store cache in
+ new StoredList.UserInterface(getActivity()).promptForListSelection(R.string.list_title,
+ new Action1<Integer>() {
+ @Override
+ public void call(final Integer selectedListId) {
+ storeCache(selectedListId);
+ }
+ }, true, StoredList.TEMPORARY_LIST_ID);
+ } else {
+ storeCache(StoredList.TEMPORARY_LIST_ID);
+ }
+ }
+
+ protected void storeCache(final int listId) {
+ final StoreCacheHandler storeCacheHandler = new StoreCacheHandler(R.string.cache_dialog_offline_save_message);
+ progress.show(getActivity(), res.getString(R.string.cache_dialog_offline_save_title), res.getString(R.string.cache_dialog_offline_save_message), true, storeCacheHandler.cancelMessage());
+ Schedulers.io().createWorker().schedule(new Action0() {
+ @Override
+ public void call() {
+ cache.store(listId, storeCacheHandler);
+ getActivity().supportInvalidateOptionsMenu();
+ }
+ });
+ }
+ }
+
+ private class RefreshCacheClickListener implements View.OnClickListener {
+ @Override
+ public void onClick(View arg0) {
+ if (progress.isShowing()) {
+ showToast(res.getString(R.string.err_detail_still_working));
+ return;
+ }
+
+ if (!Network.isNetworkConnected(getActivity())) {
+ showToast(getString(R.string.err_server));
+ return;
+ }
+
+ final StoreCacheHandler refreshCacheHandler = new StoreCacheHandler(R.string.cache_dialog_offline_save_message);
+ progress.show(getActivity(), res.getString(R.string.cache_dialog_refresh_title), res.getString(R.string.cache_dialog_refresh_message), true, refreshCacheHandler.cancelMessage());
+ cache.refresh(refreshCacheHandler, Schedulers.io());
+ }
+ }
+
+ private class DropCacheClickListener implements View.OnClickListener {
+ @Override
+ public void onClick(View arg0) {
+ if (progress.isShowing()) {
+ showToast(res.getString(R.string.err_detail_still_working));
+ return;
+ }
+
+ final DropCacheHandler dropCacheHandler = new DropCacheHandler();
+ progress.show(getActivity(), res.getString(R.string.cache_dialog_offline_drop_title), res.getString(R.string.cache_dialog_offline_drop_message), true, null);
+ cache.drop(dropCacheHandler, Schedulers.io());
+ }
+ }
+
+
+ @Override
+ public void navigateTo() {
+ NavigationAppFactory.startDefaultNavigationApplication(1, getActivity(), cache);
+ }
+
+ @Override
+ public void showNavigationMenu() {
+ // TODO
+ }
+
+
+ /**
+ * Tries to navigate to the {@link cgeo.geocaching.Geocache} of this activity.
+ */
+ @Override
+ protected void startDefaultNavigation2() {
+ if (cache == null || cache.getCoords() == null) {
+ showToast(res.getString(R.string.cache_coordinates_no));
+ return;
+ }
+ NavigationAppFactory.startDefaultNavigationApplication(2, getActivity(), cache);
+ getActivity().finish();
+ }
+
+ public static void startActivity(final Context context, final String geocode) {
+ final Intent popupIntent = new Intent(context, CachePopup.class);
+ popupIntent.putExtra(Intents.EXTRA_GEOCODE, geocode);
+ context.startActivity(popupIntent);
+ }
+
+ @Override
+ protected Geopoint getCoordinates() {
+ if (cache == null) {
+ return null;
+ }
+ return cache.getCoords();
+ }
+
+
+}
diff --git a/main/src/cgeo/geocaching/CompassActivity.java b/main/src/cgeo/geocaching/CompassActivity.java
index 36dcf27..e5c38a3 100644
--- a/main/src/cgeo/geocaching/CompassActivity.java
+++ b/main/src/cgeo/geocaching/CompassActivity.java
@@ -3,7 +3,7 @@ package cgeo.geocaching;
import butterknife.ButterKnife;
import butterknife.InjectView;
-import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.activity.AbstractActionBarActivity;
import cgeo.geocaching.enumerations.LoadFlags;
import cgeo.geocaching.geopoint.Geopoint;
import cgeo.geocaching.geopoint.Units;
@@ -38,7 +38,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
-public class CompassActivity extends AbstractActivity {
+public class CompassActivity extends AbstractActionBarActivity {
private static final int COORDINATES_OFFSET = 10;
diff --git a/main/src/cgeo/geocaching/CreateShortcutActivity.java b/main/src/cgeo/geocaching/CreateShortcutActivity.java
index c18b6f4..ffcf81b 100644
--- a/main/src/cgeo/geocaching/CreateShortcutActivity.java
+++ b/main/src/cgeo/geocaching/CreateShortcutActivity.java
@@ -1,6 +1,6 @@
package cgeo.geocaching;
-import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.activity.AbstractActionBarActivity;
import cgeo.geocaching.list.PseudoList;
import cgeo.geocaching.list.StoredList;
@@ -10,7 +10,7 @@ import android.content.Intent;
import android.content.Intent.ShortcutIconResource;
import android.os.Bundle;
-public class CreateShortcutActivity extends AbstractActivity {
+public class CreateShortcutActivity extends AbstractActionBarActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
diff --git a/main/src/cgeo/geocaching/EditWaypointActivity.java b/main/src/cgeo/geocaching/EditWaypointActivity.java
index 55de0a6..9bc46b3 100644
--- a/main/src/cgeo/geocaching/EditWaypointActivity.java
+++ b/main/src/cgeo/geocaching/EditWaypointActivity.java
@@ -1,6 +1,6 @@
package cgeo.geocaching;
-import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.activity.AbstractActionBarActivity;
import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.connector.IConnector;
import cgeo.geocaching.enumerations.CacheType;
@@ -48,7 +48,7 @@ import java.util.EnumSet;
import java.util.List;
@EActivity
-public class EditWaypointActivity extends AbstractActivity {
+public class EditWaypointActivity extends AbstractActionBarActivity {
private static final ArrayList<WaypointType> POSSIBLE_WAYPOINT_TYPES = new ArrayList<WaypointType>(WaypointType.ALL_TYPES_EXCEPT_OWN_AND_ORIGINAL);
@ViewById(R.id.buttonLatitude) protected Button buttonLat;
diff --git a/main/src/cgeo/geocaching/Geocache.java b/main/src/cgeo/geocaching/Geocache.java
index fdfdbb5..db36740 100644
--- a/main/src/cgeo/geocaching/Geocache.java
+++ b/main/src/cgeo/geocaching/Geocache.java
@@ -707,6 +707,12 @@ public class Geocache implements ICache, IWaypoint {
return;
}
+ final Intent intent = getIntent();
+
+ fromActivity.startActivity(Intent.createChooser(intent, res.getText(R.string.action_bar_share_title)));
+ }
+
+ public Intent getIntent() {
final StringBuilder subject = new StringBuilder("Geocache ");
subject.append(geocode);
if (StringUtils.isNotBlank(name)) {
@@ -718,7 +724,7 @@ public class Geocache implements ICache, IWaypoint {
intent.putExtra(Intent.EXTRA_SUBJECT, subject.toString());
intent.putExtra(Intent.EXTRA_TEXT, getUrl());
- fromActivity.startActivity(Intent.createChooser(intent, res.getText(R.string.action_bar_share_title)));
+ return intent;
}
public String getUrl() {
diff --git a/main/src/cgeo/geocaching/ImageSelectActivity.java b/main/src/cgeo/geocaching/ImageSelectActivity.java
index b5fb38e..a64b4cf 100644
--- a/main/src/cgeo/geocaching/ImageSelectActivity.java
+++ b/main/src/cgeo/geocaching/ImageSelectActivity.java
@@ -3,7 +3,7 @@ package cgeo.geocaching;
import butterknife.ButterKnife;
import butterknife.InjectView;
-import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.activity.AbstractActionBarActivity;
import cgeo.geocaching.files.LocalStorage;
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.ui.dialog.Dialogs;
@@ -37,7 +37,7 @@ import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
-public class ImageSelectActivity extends AbstractActivity {
+public class ImageSelectActivity extends AbstractActionBarActivity {
@InjectView(R.id.caption) protected EditText captionView;
@InjectView(R.id.description) protected EditText descriptionView;
diff --git a/main/src/cgeo/geocaching/ImagesActivity.java b/main/src/cgeo/geocaching/ImagesActivity.java
index 3da1ade..bc2616b 100644
--- a/main/src/cgeo/geocaching/ImagesActivity.java
+++ b/main/src/cgeo/geocaching/ImagesActivity.java
@@ -1,6 +1,6 @@
package cgeo.geocaching;
-import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.activity.AbstractActionBarActivity;
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.ui.ImagesList;
import cgeo.geocaching.ui.ImagesList.ImageType;
@@ -19,7 +19,7 @@ import android.view.View;
import java.util.ArrayList;
import java.util.List;
-public class ImagesActivity extends AbstractActivity {
+public class ImagesActivity extends AbstractActionBarActivity {
private boolean offline;
private ArrayList<Image> imageNames;
diff --git a/main/src/cgeo/geocaching/MainActivity.java b/main/src/cgeo/geocaching/MainActivity.java
index 42dd58d..d8958b4 100644
--- a/main/src/cgeo/geocaching/MainActivity.java
+++ b/main/src/cgeo/geocaching/MainActivity.java
@@ -3,7 +3,7 @@ package cgeo.geocaching;
import butterknife.ButterKnife;
import butterknife.InjectView;
-import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.activity.AbstractActionBarActivity;
import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.connector.capability.ILogin;
import cgeo.geocaching.enumerations.CacheType;
@@ -25,7 +25,9 @@ import cgeo.geocaching.utils.Version;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
+
import org.apache.commons.lang3.StringUtils;
+
import rx.Observable;
import rx.Observable.OnSubscribe;
import rx.Subscriber;
@@ -37,6 +39,7 @@ import rx.subscriptions.Subscriptions;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.SearchManager;
+import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
@@ -45,6 +48,8 @@ import android.location.Geocoder;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v7.widget.SearchView;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
@@ -61,7 +66,7 @@ import java.util.Comparator;
import java.util.List;
import java.util.Locale;
-public class MainActivity extends AbstractActivity {
+public class MainActivity extends AbstractActionBarActivity {
@InjectView(R.id.nav_satellites) protected TextView navSatellites;
@InjectView(R.id.filter_button_title)protected TextView filterTitle;
@InjectView(R.id.map) protected ImageView findOnMap;
@@ -189,6 +194,10 @@ public class MainActivity extends AbstractActivity {
public void onCreate(final Bundle savedInstanceState) {
// don't call the super implementation with the layout argument, as that would set the wrong theme
super.onCreate(savedInstanceState);
+
+ // Disable the up navigation for this activity
+ getSupportActionBar().setDisplayHomeAsUpEnabled(false);
+
setContentView(R.layout.main_activity);
ButterKnife.inject(this);
@@ -262,6 +271,11 @@ public class MainActivity extends AbstractActivity {
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.main_activity_options, menu);
+ SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
+ MenuItem searchItem = menu.findItem(R.id.menu_gosearch);
+ SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
+ searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
+
return true;
}
@@ -303,6 +317,9 @@ public class MainActivity extends AbstractActivity {
}
});
return true;
+ case R.id.menu_gosearch:
+ onSearchRequested();
+ return true;
default:
return super.onOptionsItemSelected(item);
}
@@ -712,13 +729,4 @@ public class MainActivity extends AbstractActivity {
public void showAbout(final View view) {
startActivity(new Intent(this, AboutActivity.class));
}
-
- /**
- * @param view
- * unused here but needed since this method is referenced from XML layout
- */
- public void goSearch(final View view) {
- onSearchRequested();
- }
-
}
diff --git a/main/src/cgeo/geocaching/NavigateAnyPointActivity.java b/main/src/cgeo/geocaching/NavigateAnyPointActivity.java
index 0a750e0..a4053dc 100644
--- a/main/src/cgeo/geocaching/NavigateAnyPointActivity.java
+++ b/main/src/cgeo/geocaching/NavigateAnyPointActivity.java
@@ -4,7 +4,7 @@ import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.Optional;
-import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.activity.AbstractActionBarActivity;
import cgeo.geocaching.apps.cache.navi.NavigationAppFactory;
import cgeo.geocaching.geopoint.DistanceParser;
import cgeo.geocaching.geopoint.Geopoint;
@@ -44,7 +44,7 @@ import android.widget.TextView;
import java.util.List;
-public class NavigateAnyPointActivity extends AbstractActivity {
+public class NavigateAnyPointActivity extends AbstractActionBarActivity {
@InjectView(R.id.historyList) protected ListView historyListView;
@@ -363,7 +363,7 @@ public class NavigateAnyPointActivity extends AbstractActivity {
NavigationAppFactory.showNavigationMenu(this, null, null, coords);
return true;
default:
- return false;
+ return super.onOptionsItemSelected(item);
}
}
diff --git a/main/src/cgeo/geocaching/SearchActivity.java b/main/src/cgeo/geocaching/SearchActivity.java
index d3bb2d8..f1f09d4 100644
--- a/main/src/cgeo/geocaching/SearchActivity.java
+++ b/main/src/cgeo/geocaching/SearchActivity.java
@@ -3,7 +3,7 @@ package cgeo.geocaching;
import butterknife.ButterKnife;
import butterknife.InjectView;
-import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.activity.AbstractActionBarActivity;
import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.connector.IConnector;
import cgeo.geocaching.connector.capability.ISearchByGeocode;
@@ -37,7 +37,7 @@ import android.widget.Button;
import java.util.Locale;
-public class SearchActivity extends AbstractActivity {
+public class SearchActivity extends AbstractActionBarActivity {
@InjectView(R.id.buttonLatitude) protected Button buttonLatitude;
@InjectView(R.id.buttonLongitude) protected Button buttonLongitude;
diff --git a/main/src/cgeo/geocaching/StaticMapsActivity.java b/main/src/cgeo/geocaching/StaticMapsActivity.java
index 16fce37..7474785 100644
--- a/main/src/cgeo/geocaching/StaticMapsActivity.java
+++ b/main/src/cgeo/geocaching/StaticMapsActivity.java
@@ -1,6 +1,6 @@
package cgeo.geocaching;
-import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.activity.AbstractActionBarActivity;
import cgeo.geocaching.enumerations.LoadFlags;
import cgeo.geocaching.utils.Log;
@@ -25,7 +25,7 @@ import java.util.List;
@EActivity
@OptionsMenu(R.menu.static_maps_activity_options)
-public class StaticMapsActivity extends AbstractActivity {
+public class StaticMapsActivity extends AbstractActionBarActivity {
private static final String EXTRAS_WAYPOINT = "waypoint";
private static final String EXTRAS_DOWNLOAD = "download";
@@ -169,10 +169,12 @@ public class StaticMapsActivity extends AbstractActivity {
}
public static void startActivity(final Context activity, final String geocode, final boolean download, final Waypoint waypoint) {
+ /* FIXME
StaticMapsActivity_.IntentBuilder_ builder = StaticMapsActivity_.intent(activity).geocode(geocode).download(download);
if (waypoint != null) {
builder.waypointId(waypoint.getId());
}
builder.start();
+ */
}
} \ No newline at end of file
diff --git a/main/src/cgeo/geocaching/TrackableActivity.java b/main/src/cgeo/geocaching/TrackableActivity.java
index 81d23c9..7dfc3c1 100644
--- a/main/src/cgeo/geocaching/TrackableActivity.java
+++ b/main/src/cgeo/geocaching/TrackableActivity.java
@@ -36,6 +36,7 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
+import android.support.v7.app.ActionBar;
import android.text.Html;
import android.view.ContextMenu;
import android.view.LayoutInflater;
@@ -322,9 +323,9 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
}
private static class TrackableIconHandler extends Handler {
- final private TextView view;
+ final private ActionBar view;
- public TrackableIconHandler(TextView viewIn) {
+ public TrackableIconHandler(ActionBar viewIn) {
view = viewIn;
}
@@ -333,7 +334,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
final BitmapDrawable image = (BitmapDrawable) message.obj;
if (image != null && view != null) {
image.setBounds(0, 0, view.getHeight(), view.getHeight());
- view.setCompoundDrawables(image, null, null, null);
+ view.setIcon(image);
}
}
}
@@ -392,7 +393,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
// action bar icon
if (StringUtils.isNotBlank(trackable.getIconUrl())) {
- final TrackableIconHandler iconHandler = new TrackableIconHandler(((TextView) findViewById(R.id.actionbar_title)));
+ final TrackableIconHandler iconHandler = new TrackableIconHandler(getSupportActionBar());
final TrackableIconThread iconThread = new TrackableIconThread(trackable.getIconUrl(), iconHandler);
iconThread.start();
}
diff --git a/main/src/cgeo/geocaching/UsefulAppsActivity.java b/main/src/cgeo/geocaching/UsefulAppsActivity.java
index 39c527d..1159453 100644
--- a/main/src/cgeo/geocaching/UsefulAppsActivity.java
+++ b/main/src/cgeo/geocaching/UsefulAppsActivity.java
@@ -3,7 +3,7 @@ package cgeo.geocaching;
import butterknife.ButterKnife;
import butterknife.InjectView;
-import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.activity.AbstractActionBarActivity;
import cgeo.geocaching.ui.AbstractViewHolder;
import android.app.Activity;
@@ -18,7 +18,7 @@ import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
-public class UsefulAppsActivity extends AbstractActivity {
+public class UsefulAppsActivity extends AbstractActionBarActivity {
@InjectView(R.id.apps_list) protected ListView list;
diff --git a/main/src/cgeo/geocaching/WaypointPopup.java b/main/src/cgeo/geocaching/WaypointPopup.java
index 916ad4c..f1ffc1d 100644
--- a/main/src/cgeo/geocaching/WaypointPopup.java
+++ b/main/src/cgeo/geocaching/WaypointPopup.java
@@ -1,115 +1,35 @@
package cgeo.geocaching;
-import butterknife.ButterKnife;
-import butterknife.InjectView;
-
-import cgeo.geocaching.apps.cache.navi.NavigationAppFactory;
-import cgeo.geocaching.geopoint.Geopoint;
-import cgeo.geocaching.geopoint.Units;
-import cgeo.geocaching.sensors.IGeoData;
-import cgeo.geocaching.ui.CacheDetailsCreator;
-import cgeo.geocaching.utils.Log;
-
-import org.apache.commons.lang3.StringUtils;
-
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-import android.widget.LinearLayout;
-import android.widget.TextView;
+import android.support.v4.app.DialogFragment;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentTransaction;
+import android.view.Window;
-public class WaypointPopup extends AbstractPopupActivity {
- @InjectView(R.id.actionbar_title) protected TextView actionBarTitle;
- @InjectView(R.id.waypoint_details_list) protected LinearLayout waypointDetailsLayout;
- @InjectView(R.id.edit) protected Button buttonEdit;
- @InjectView(R.id.details_list) protected LinearLayout cacheDetailsLayout;
+import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.activity.ActivityMixin;
+public class WaypointPopup extends AbstractActivity {
private int waypointId = 0;
- private Waypoint waypoint = null;
- private TextView waypointDistance = null;
-
- public WaypointPopup() {
- super(R.layout.waypoint_popup);
- }
+ private String geocode;
@Override
- public void onCreate(final Bundle savedInstanceState) {
+ public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- ButterKnife.inject(this);
- // get parameters
- final Bundle extras = getIntent().getExtras();
- if (extras != null) {
- waypointId = extras.getInt(Intents.EXTRA_WAYPOINT_ID);
- }
- }
-
- @Override
- public void onUpdateGeoData(IGeoData geo) {
- if (geo.getCoords() != null && waypoint != null && waypoint.getCoords() != null) {
- waypointDistance.setText(Units.getDistanceFromKilometers(geo.getCoords().distanceTo(waypoint.getCoords())));
- waypointDistance.bringToFront();
- }
- }
-
- @Override
- protected void init() {
- super.init();
- waypoint = DataStore.loadWaypoint(waypointId);
- try {
- if (StringUtils.isNotBlank(waypoint.getName())) {
- setTitle(waypoint.getName());
- } else {
- setTitle(waypoint.getGeocode());
- }
-
- actionBarTitle.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(waypoint.getWaypointType().markerId), null, null, null);
-
- details = new CacheDetailsCreator(this, waypointDetailsLayout);
+ supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
- //Waypoint geocode
- details.add(R.string.cache_geocode, waypoint.getPrefix() + waypoint.getGeocode().substring(2));
- details.addDistance(waypoint, waypointDistance);
- waypointDistance = details.getValueView();
- details.add(R.string.waypoint_note, waypoint.getNote());
+ this.setTheme(ActivityMixin.getDialogTheme());
- buttonEdit.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View arg0) {
- EditWaypointActivity.startActivityEditWaypoint(WaypointPopup.this, cache, waypoint.getId());
- finish();
- }
- });
-
- details = new CacheDetailsCreator(this, cacheDetailsLayout);
- details.add(R.string.cache_name, cache.getName());
-
- addCacheDetails();
-
- } catch (Exception e) {
- Log.e("WaypointPopup.init", e);
+ final Bundle extras = getIntent().getExtras();
+ if (extras != null) {
+ waypointId = extras.getInt(Intents.EXTRA_WAYPOINT_ID);
+ geocode = extras.getString(Intents.EXTRA_GEOCODE);
}
- }
-
- @Override
- public void navigateTo() {
- NavigationAppFactory.startDefaultNavigationApplication(1, this, waypoint);
- }
+ showDialog();
- /**
- * Tries to navigate to the {@link Geocache} of this activity.
- */
- @Override
- protected void startDefaultNavigation2() {
- if (waypoint == null || waypoint.getCoords() == null) {
- showToast(res.getString(R.string.cache_coordinates_no));
- return;
- }
- NavigationAppFactory.startDefaultNavigationApplication(2, this, waypoint);
- finish();
}
public static void startActivity(final Context context, final int waypointId, final String geocode) {
@@ -119,16 +39,22 @@ public class WaypointPopup extends AbstractPopupActivity {
context.startActivity(popupIntent);
}
- @Override
- public void showNavigationMenu() {
- NavigationAppFactory.showNavigationMenu(this, null, waypoint, null);
- }
- @Override
- protected Geopoint getCoordinates() {
- if (waypoint == null) {
- return null;
+ void showDialog() {
+ // DialogFragment.show() will take care of adding the fragment
+ // in a transaction. We also want to remove any currently showing
+ // dialog, so make our own transaction and take care of that here.
+ FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
+ Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
+ if (prev != null) {
+ ft.remove(prev);
}
- return waypoint.getCoords();
+ ft.addToBackStack(null);
+
+ // Create and show the dialog.
+ DialogFragment newFragment = WaypointPopupFragment.newInstance(geocode, waypointId);
+ newFragment.show(ft, "dialog");
}
+
+
}
diff --git a/main/src/cgeo/geocaching/WaypointPopupFragment.java b/main/src/cgeo/geocaching/WaypointPopupFragment.java
new file mode 100644
index 0000000..14daada
--- /dev/null
+++ b/main/src/cgeo/geocaching/WaypointPopupFragment.java
@@ -0,0 +1,147 @@
+package cgeo.geocaching;
+
+import butterknife.ButterKnife;
+import butterknife.InjectView;
+
+import cgeo.geocaching.apps.cache.navi.NavigationAppFactory;
+import cgeo.geocaching.geopoint.Geopoint;
+import cgeo.geocaching.geopoint.Units;
+import cgeo.geocaching.sensors.IGeoData;
+import cgeo.geocaching.ui.CacheDetailsCreator;
+import cgeo.geocaching.utils.Log;
+
+import org.apache.commons.lang3.StringUtils;
+
+import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+public class WaypointPopupFragment extends AbstractDialogFragment {
+ @InjectView(R.id.actionbar_title) protected TextView actionBarTitle;
+ @InjectView(R.id.waypoint_details_list) protected LinearLayout waypointDetailsLayout;
+ @InjectView(R.id.edit) protected Button buttonEdit;
+ @InjectView(R.id.details_list) protected LinearLayout cacheDetailsLayout;
+
+ private int waypointId = 0;
+ private Waypoint waypoint = null;
+ private TextView waypointDistance = null;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View v = inflater.inflate(R.layout.waypoint_popup, container, false);
+ initCustomActionBar(v);
+ ButterKnife.inject(this,v);
+
+ return v;
+ }
+
+ @Override
+ public void onCreate(final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ waypointId = getArguments().getInt(WAYPOINT_ARG);
+ }
+
+ @Override
+ public void onUpdateGeoData(IGeoData geo) {
+ if (geo.getCoords() != null && waypoint != null && waypoint.getCoords() != null) {
+ waypointDistance.setText(Units.getDistanceFromKilometers(geo.getCoords().distanceTo(waypoint.getCoords())));
+ waypointDistance.bringToFront();
+ }
+ }
+
+ @Override
+ protected void init() {
+ super.init();
+
+ waypoint = DataStore.loadWaypoint(waypointId);
+ try {
+ if (StringUtils.isNotBlank(waypoint.getName())) {
+ setTitle(waypoint.getName());
+ } else {
+ setTitle(waypoint.getGeocode());
+ }
+
+
+ actionBarTitle.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(waypoint.getWaypointType().markerId), null, null, null);
+
+ //getSupportActionBar().setIcon(getResources().getDrawable(waypoint.getWaypointType().markerId));
+
+ details = new CacheDetailsCreator(getActivity(), waypointDetailsLayout);
+
+ //Waypoint geocode
+ details.add(R.string.cache_geocode, waypoint.getPrefix() + waypoint.getGeocode().substring(2));
+ details.addDistance(waypoint, waypointDistance);
+ waypointDistance = details.getValueView();
+ details.add(R.string.waypoint_note, waypoint.getNote());
+
+ buttonEdit.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View arg0) {
+ EditWaypointActivity.startActivityEditWaypoint(getActivity(), cache, waypoint.getId());
+ getActivity().finish();
+ }
+ });
+
+ details = new CacheDetailsCreator(getActivity(), cacheDetailsLayout);
+ details.add(R.string.cache_name, cache.getName());
+
+ addCacheDetails();
+
+ } catch (Exception e) {
+ Log.e("WaypointPopup.init", e);
+ }
+ }
+
+ @Override
+ public void navigateTo() {
+ NavigationAppFactory.startDefaultNavigationApplication(1, getActivity(), waypoint);
+ }
+
+ /**
+ * Tries to navigate to the {@link Geocache} of this activity.
+ */
+ @Override
+ public void startDefaultNavigation2() {
+ if (waypoint == null || waypoint.getCoords() == null) {
+ showToast(res.getString(R.string.cache_coordinates_no));
+ return;
+ }
+ NavigationAppFactory.startDefaultNavigationApplication(2, getActivity(), waypoint);
+ getActivity().finish();
+ }
+
+
+
+ @Override
+ public void showNavigationMenu() {
+ NavigationAppFactory.showNavigationMenu(getActivity(), null, waypoint, null);
+ }
+
+ @Override
+ protected Geopoint getCoordinates() {
+ if (waypoint == null) {
+ return null;
+ }
+ return waypoint.getCoords();
+ }
+
+ public static DialogFragment newInstance(String geocode, int waypointId) {
+
+ Bundle args = new Bundle();
+ args.putInt(WAYPOINT_ARG, waypointId);
+ args.putString(GEOCODE_ARG, geocode);
+
+ DialogFragment f = new WaypointPopupFragment();
+ f.setArguments(args);
+ f.setStyle(DialogFragment.STYLE_NO_TITLE,0);
+
+ return f;
+ }
+}
diff --git a/main/src/cgeo/geocaching/activity/AbstractActionBarActivity.java b/main/src/cgeo/geocaching/activity/AbstractActionBarActivity.java
new file mode 100644
index 0000000..63100b8
--- /dev/null
+++ b/main/src/cgeo/geocaching/activity/AbstractActionBarActivity.java
@@ -0,0 +1,34 @@
+package cgeo.geocaching.activity;
+
+import android.os.Bundle;
+
+/**
+ * Classes actually having an ActionBar (as opposed to the Dialog activities)
+ */
+public class AbstractActionBarActivity extends AbstractActivity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState, int resourceLayoutID) {
+ super.onCreate(savedInstanceState, resourceLayoutID);
+ initUpAction();
+ showProgress(false);
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ initUpAction();
+ showProgress(false);
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState, int resourceLayoutID, boolean useDialogTheme) {
+ super.onCreate(savedInstanceState, resourceLayoutID, useDialogTheme);
+ initUpAction();
+ showProgress(false);
+ }
+
+ private void initUpAction()
+ {
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ }
+}
diff --git a/main/src/cgeo/geocaching/activity/AbstractActivity.java b/main/src/cgeo/geocaching/activity/AbstractActivity.java
index 542dd05..42eb825 100644
--- a/main/src/cgeo/geocaching/activity/AbstractActivity.java
+++ b/main/src/cgeo/geocaching/activity/AbstractActivity.java
@@ -13,20 +13,22 @@ import cgeo.geocaching.utils.TranslationUtils;
import org.apache.commons.lang3.StringUtils;
+import rx.Subscription;
+import rx.subscriptions.Subscriptions;
+
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
-import android.support.v4.app.FragmentActivity;
+import android.support.v7.app.ActionBarActivity;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
+import android.view.Window;
import android.widget.EditText;
-import rx.Subscription;
-import rx.subscriptions.Subscriptions;
import java.util.Locale;
-public abstract class AbstractActivity extends FragmentActivity implements IAbstractActivity {
+public abstract class AbstractActivity extends ActionBarActivity implements IAbstractActivity {
protected CgeoApplication app = null;
protected Resources res = null;
@@ -43,11 +45,7 @@ public abstract class AbstractActivity extends FragmentActivity implements IAbst
@Override
final public void goHome(final View view) {
- ActivityMixin.goHome(this);
- }
-
- final protected void setTitle(final String title) {
- ActivityMixin.setTitle(this, title);
+ ActivityMixin.navigateToMain(this);
}
final protected void showProgress(final boolean show) {
@@ -71,7 +69,19 @@ public abstract class AbstractActivity extends FragmentActivity implements IAbst
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
+
initializeCommonFields();
+
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId()== android.R.id.home) {
+ ActivityMixin.navigateToMain(this);
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
}
public void onResume(final Subscription resumeSubscription) {
diff --git a/main/src/cgeo/geocaching/activity/AbstractListActivity.java b/main/src/cgeo/geocaching/activity/AbstractListActivity.java
index a5d5c14..eaa8a96 100644
--- a/main/src/cgeo/geocaching/activity/AbstractListActivity.java
+++ b/main/src/cgeo/geocaching/activity/AbstractListActivity.java
@@ -4,10 +4,11 @@ import cgeo.geocaching.CgeoApplication;
import android.content.res.Resources;
import android.os.Bundle;
-import android.support.v4.app.FragmentListActivity;
+import android.view.MenuItem;
import android.view.View;
+import android.view.Window;
-public abstract class AbstractListActivity extends FragmentListActivity implements
+public abstract class AbstractListActivity extends ActionBarListActivity implements
IAbstractActivity {
private boolean keepScreenOn = false;
@@ -25,7 +26,7 @@ public abstract class AbstractListActivity extends FragmentListActivity implemen
@Override
final public void goHome(View view) {
- ActivityMixin.goHome(this);
+ ActivityMixin.navigateToMain(this);
}
final public void showProgress(final boolean show) {
@@ -40,7 +41,7 @@ public abstract class AbstractListActivity extends FragmentListActivity implemen
public final void showToast(String text) {
ActivityMixin.showToast(this, text);
}
-
+
@Override
public final void showShortToast(String text) {
ActivityMixin.showShortToast(this, text);
@@ -49,7 +50,24 @@ public abstract class AbstractListActivity extends FragmentListActivity implemen
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
+
initializeCommonFields();
+ initUpAction();
+ }
+
+ protected void initUpAction()
+ {
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId()== android.R.id.home) {
+ ActivityMixin.navigateToMain(this);
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
}
private void initializeCommonFields() {
diff --git a/main/src/cgeo/geocaching/activity/AbstractViewPagerActivity.java b/main/src/cgeo/geocaching/activity/AbstractViewPagerActivity.java
index 6e2900d..e98c935 100644
--- a/main/src/cgeo/geocaching/activity/AbstractViewPagerActivity.java
+++ b/main/src/cgeo/geocaching/activity/AbstractViewPagerActivity.java
@@ -30,7 +30,7 @@ import java.util.Map;
* Enum listing all available pages of this activity. The pages available at a certain point of time are
* defined by overriding {@link #getOrderedPages()}.
*/
-public abstract class AbstractViewPagerActivity<Page extends Enum<Page>> extends AbstractActivity {
+public abstract class AbstractViewPagerActivity<Page extends Enum<Page>> extends AbstractActionBarActivity {
/**
* A {@link List} of all available pages.
diff --git a/main/src/cgeo/geocaching/activity/ActionBarListActivity.java b/main/src/cgeo/geocaching/activity/ActionBarListActivity.java
new file mode 100644
index 0000000..07c7ec3
--- /dev/null
+++ b/main/src/cgeo/geocaching/activity/ActionBarListActivity.java
@@ -0,0 +1,34 @@
+package cgeo.geocaching.activity;
+
+import android.support.v7.app.ActionBarActivity;
+import android.widget.HeaderViewListAdapter;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+
+/**
+ * Compatbility Class until cgeo switches from ListActivities to ListFragments
+ */
+public class ActionBarListActivity extends ActionBarActivity {
+
+ private ListView mListView;
+ protected ListView getListView() {
+ if (mListView == null) {
+ mListView = (ListView) findViewById(android.R.id.list);
+ }
+ return mListView;
+ }
+
+ protected void setListAdapter(ListAdapter adapter) {
+ getListView().setAdapter(adapter);
+ }
+
+ protected ListAdapter getListAdapter() {
+ ListAdapter adapter = getListView().getAdapter();
+ if (adapter instanceof HeaderViewListAdapter) {
+ return ((HeaderViewListAdapter)adapter).getWrappedAdapter();
+ }
+ return adapter;
+ }
+}
+
+
diff --git a/main/src/cgeo/geocaching/activity/ActivityMixin.java b/main/src/cgeo/geocaching/activity/ActivityMixin.java
index bfd45da..c43e1bd 100644
--- a/main/src/cgeo/geocaching/activity/ActivityMixin.java
+++ b/main/src/cgeo/geocaching/activity/ActivityMixin.java
@@ -9,47 +9,33 @@ import org.apache.commons.lang3.StringUtils;
import android.app.Activity;
import android.content.Intent;
-import android.os.Build;
+import android.support.v4.app.NavUtils;
+import android.support.v7.app.ActionBarActivity;
import android.view.Gravity;
-import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;
-import android.widget.ProgressBar;
-import android.widget.TextView;
import android.widget.Toast;
public final class ActivityMixin {
- public final static void goHome(final Activity fromActivity) {
- final Intent intent = new Intent(fromActivity, MainActivity.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
-
- fromActivity.startActivity(intent);
- fromActivity.finish();
- }
-
public static void setTitle(final Activity activity, final CharSequence text) {
if (StringUtils.isBlank(text)) {
return;
}
- final TextView title = (TextView) activity.findViewById(R.id.actionbar_title);
- if (title != null) {
- title.setText(text);
+ if (((ActionBarActivity) activity).getSupportActionBar() != null) {
+ ((ActionBarActivity) activity).getSupportActionBar().setTitle(text);
}
}
- public static void showProgress(final Activity activity, final boolean show) {
+
+ public static void showProgress(final ActionBarActivity activity, final boolean show) {
if (activity == null) {
return;
}
- final ProgressBar progress = (ProgressBar) activity.findViewById(R.id.actionbar_progress);
- if (show) {
- progress.setVisibility(View.VISIBLE);
- } else {
- progress.setVisibility(View.GONE);
- }
+ activity.setSupportProgressBarIndeterminateVisibility(show);
+
}
public static void setTheme(final Activity activity) {
@@ -62,10 +48,10 @@ public final class ActivityMixin {
public static int getDialogTheme() {
// Light theme dialogs don't work on Android Api < 11
- if (Settings.isLightSkin() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ // The compat theme should fix this
+ if (Settings.isLightSkin()) {
return R.style.popup_light;
}
-
return R.style.popup_dark;
}
@@ -127,4 +113,9 @@ public final class ActivityMixin {
int newCursor = moveCursor ? start + completeText.length() : start;
editText.setSelection(newCursor);
}
+
+ public static void navigateToMain(Activity activity) {
+ final Intent main = new Intent(activity, MainActivity.class);
+ NavUtils.navigateUpTo(activity, main);
+ }
}
diff --git a/main/src/cgeo/geocaching/list/AbstractList.java b/main/src/cgeo/geocaching/list/AbstractList.java
index ec783eb..ec70deb 100644
--- a/main/src/cgeo/geocaching/list/AbstractList.java
+++ b/main/src/cgeo/geocaching/list/AbstractList.java
@@ -20,6 +20,10 @@ public abstract class AbstractList {
public abstract boolean isConcrete();
+ public abstract String getTitle();
+
+ public abstract int getCount();
+
@Nullable
public static AbstractList getListById(int listId) {
return LISTS.get(listId);
diff --git a/main/src/cgeo/geocaching/list/PseudoList.java b/main/src/cgeo/geocaching/list/PseudoList.java
index f2cc7ed..71f9123 100644
--- a/main/src/cgeo/geocaching/list/PseudoList.java
+++ b/main/src/cgeo/geocaching/list/PseudoList.java
@@ -36,6 +36,16 @@ public class PseudoList extends AbstractList {
}
@Override
+ public String getTitle() {
+ return title;
+ }
+
+ @Override
+ public int getCount() {
+ return -1;
+ }
+
+ @Override
public boolean isConcrete() {
return false;
}
diff --git a/main/src/cgeo/geocaching/list/StoredList.java b/main/src/cgeo/geocaching/list/StoredList.java
index 84e1163..e6cad56 100644
--- a/main/src/cgeo/geocaching/list/StoredList.java
+++ b/main/src/cgeo/geocaching/list/StoredList.java
@@ -78,25 +78,7 @@ public final class StoredList extends AbstractList {
}
public void promptForListSelection(final int titleId, @NonNull final Action1<Integer> runAfterwards, final boolean onlyConcreteLists, final int exceptListId, final String newListName) {
- final List<AbstractList> lists = new ArrayList<AbstractList>();
- lists.addAll(getSortedLists());
-
- if (exceptListId > StoredList.TEMPORARY_LIST_ID) {
- StoredList exceptList = DataStore.getList(exceptListId);
- if (exceptList != null) {
- lists.remove(exceptList);
- }
- }
-
- if (!onlyConcreteLists) {
- if (exceptListId != PseudoList.ALL_LIST.id) {
- lists.add(PseudoList.ALL_LIST);
- }
- if (exceptListId != PseudoList.HISTORY_LIST.id) {
- lists.add(PseudoList.HISTORY_LIST);
- }
- }
- lists.add(PseudoList.NEW_LIST);
+ final List<AbstractList> lists = getMenuLists(onlyConcreteLists, exceptListId);
final List<CharSequence> listsTitle = new ArrayList<CharSequence>();
for (AbstractList list : lists) {
@@ -124,6 +106,31 @@ public final class StoredList extends AbstractList {
builder.create().show();
}
+ public static List<AbstractList> getMenuLists(boolean onlyConcreteLists, int exceptListId) {
+ final List<AbstractList> lists = new ArrayList<AbstractList>();
+ lists.addAll(getSortedLists());
+
+ if (exceptListId > StoredList.TEMPORARY_LIST_ID) {
+ StoredList exceptList = DataStore.getList(exceptListId);
+ if (exceptList != null) {
+ lists.remove(exceptList);
+ }
+ }
+
+ if (!onlyConcreteLists) {
+ if (exceptListId != PseudoList.ALL_LIST.id) {
+ lists.add(PseudoList.ALL_LIST);
+ }
+ if (exceptListId != PseudoList.HISTORY_LIST.id) {
+ lists.add(PseudoList.HISTORY_LIST);
+ }
+ }
+ if (exceptListId != PseudoList.NEW_LIST.id) {
+ lists.add(PseudoList.NEW_LIST);
+ }
+ return lists;
+ }
+
@NonNull
private static List<StoredList> getSortedLists() {
final Collator collator = Collator.getInstance();
@@ -203,14 +210,18 @@ public final class StoredList extends AbstractList {
}
/**
- * Get the list title. This method is not public by intention to make clients use the {@link UserInterface} class.
- *
- * @return
+ * Get the list title.
*/
- protected String getTitle() {
+ @Override
+ public String getTitle() {
return title;
}
+ @Override
+ public int getCount() {
+ return count;
+ }
+
/**
* Return the given list, if it is a concrete list. Return the default list otherwise.
*/
diff --git a/main/src/cgeo/geocaching/maps/AbstractMap.java b/main/src/cgeo/geocaching/maps/AbstractMap.java
index d341823..aff9c75 100644
--- a/main/src/cgeo/geocaching/maps/AbstractMap.java
+++ b/main/src/cgeo/geocaching/maps/AbstractMap.java
@@ -5,10 +5,12 @@ import cgeo.geocaching.maps.interfaces.MapActivityImpl;
import android.app.Activity;
import android.content.res.Resources;
+import android.os.Build;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
+import android.view.Window;
/**
* Base class for the map activity. Delegates base class calls to the
@@ -31,7 +33,11 @@ public abstract class AbstractMap {
}
public void onCreate(Bundle savedInstanceState) {
+
mapActivity.superOnCreate(savedInstanceState);
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB) {
+ mapActivity.getActivity().requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
+ }
}
public void onResume() {
diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java
index b5d0b0e..004081f 100644
--- a/main/src/cgeo/geocaching/maps/CGeoMap.java
+++ b/main/src/cgeo/geocaching/maps/CGeoMap.java
@@ -50,6 +50,7 @@ import rx.schedulers.Schedulers;
import rx.subscriptions.CompositeSubscription;
import rx.subscriptions.Subscriptions;
+import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
@@ -60,6 +61,7 @@ import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.location.Location;
+import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -69,9 +71,11 @@ import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
+import android.widget.CheckBox;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
+import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.ViewSwitcher.ViewFactory;
@@ -183,7 +187,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
private int detailProgress = 0;
private long detailProgressTime = 0L;
// views
- private ImageSwitcher myLocSwitch = null;
+ private CheckBox myLocSwitch = null;
/** Controls the map behaviour */
private MapMode mapMode = null;
@@ -239,7 +243,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
title.append('[').append(lastSearchResult.getUrl()).append(']');
}
- ActivityMixin.setTitle(activity, title.toString());
+ setTitle(title.toString());
break;
case INVALIDATE_MAP:
mapView.repaintRequired(null);
@@ -250,6 +254,24 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
}
}
};
+
+ private void setTitle(String title) {
+ /* Compatibily for the old Action Bar, only used by the maps activity at the moment */
+ final TextView titleview = (TextView) activity.findViewById(R.id.actionbar_title);
+ if (titleview != null) {
+ titleview.setText(title);
+
+ }
+ if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)) {
+ setTitleHoneyComb(title);
+ }
+ }
+
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ private void setTitleHoneyComb(String title) {
+ activity.getActionBar().setTitle(title);
+ }
+
/** Updates the progress. */
final private Handler showProgressHandler = new Handler() {
@@ -261,15 +283,32 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
if (what == HIDE_PROGRESS) {
if (--counter == 0) {
- ActivityMixin.showProgress(activity, false);
+ showProgress(false);
}
} else if (what == SHOW_PROGRESS) {
- ActivityMixin.showProgress(activity, true);
+ showProgress(true);
counter++;
}
}
+
+ private void showProgress(boolean show) {
+ final ProgressBar progress = (ProgressBar) activity.findViewById(R.id.actionbar_progress);
+ if (progress != null) {
+ if (show) {
+ progress.setVisibility(View.VISIBLE);
+ } else {
+ progress.setVisibility(View.GONE);
+
+ }
+ }
+ if (Build.VERSION.SDK_INT >= 11) {
+ activity.setProgressBarIndeterminateVisibility(show);
+ }
+ }
};
+
+
final private class LoadDetailsHandler extends CancellableHandler {
@Override
@@ -360,6 +399,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
}
}
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -417,10 +457,16 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
ActivityMixin.keepScreenOn(activity, true);
+
// set layout
- ActivityMixin.setTheme(activity);
+ //ActivityMixin.setTheme(activity);
+ // TODO: set a proper theme
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB) {
+ activity.setTheme(android.R.style.Theme_Holo);
+ activity.getActionBar().setDisplayHomeAsUpEnabled(true);
+ }
activity.setContentView(mapProvider.getMapLayoutId());
- ActivityMixin.setTitle(activity, res.getString(R.string.map_map));
+ setTitle(res.getString(R.string.map_map));
// initialize map
mapView = (MapViewImpl) activity.findViewById(mapProvider.getMapViewId());
@@ -461,14 +507,11 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
centerMap(geocodeIntent, searchIntent, coordsIntent, mapStateIntent);
}
- // prepare my location button
- myLocSwitch = (ImageSwitcher) activity.findViewById(R.id.my_position);
- myLocSwitch.setFactory(this);
- myLocSwitch.setInAnimation(activity, android.R.anim.fade_in);
- myLocSwitch.setOutAnimation(activity, android.R.anim.fade_out);
- myLocSwitch.setOnClickListener(new MyLocationListener());
- switchMyLocationButton();
+ CheckBox locSwitch = (CheckBox) activity.findViewById(R.id.my_position);
+ if (locSwitch!=null) {
+ initMyLocationSwitchButton(locSwitch);
+ }
prepareFilterBar();
if (!app.isLiveMapHintShownInThisSession() && !Settings.getHideLiveMapHint() && Settings.getLiveMapHintShowCount() <= 3) {
@@ -476,6 +519,16 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
}
}
+ private void initMyLocationSwitchButton(CheckBox locSwitch) {
+ myLocSwitch = locSwitch;
+ /* TODO: Switch back to ImageSwitcher for animations?
+ myLocSwitch.setFactory(this);
+ myLocSwitch.setInAnimation(activity, android.R.anim.fade_in);
+ myLocSwitch.setOutAnimation(activity, android.R.anim.fade_out); */
+ myLocSwitch.setOnClickListener(new MyLocationListener());
+ switchMyLocationButton();
+ }
+
/**
* Set the zoom of the map. The zoom is restricted to a certain minimum in case of live map.
*
@@ -531,6 +584,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
super.onPause();
}
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// menu inflation happens in Google/Mapsforge specific classes
@@ -540,6 +594,19 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
final SubMenu subMenuStrategy = menu.findItem(R.id.submenu_strategy).getSubMenu();
subMenuStrategy.setHeaderTitle(res.getString(R.string.map_strategy_title));
+
+
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB) {
+ /* if we have an Actionbar find the my position toggle */
+ MenuItem item = menu.findItem(R.id.menu_toggle_mypos);
+ myLocSwitch = new CheckBox(activity);
+ myLocSwitch.setButtonDrawable(R.drawable.ic_menu_myposition);
+ item.setActionView(myLocSwitch);
+ initMyLocationSwitchButton(myLocSwitch);
+ } else {
+ // Already on the fake Actionbar
+ menu.removeItem(R.id.menu_toggle_mypos);
+ }
return true;
}
@@ -616,6 +683,9 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
public boolean onOptionsItemSelected(MenuItem item) {
final int id = item.getItemId();
switch (id) {
+ case android.R.id.home:
+ ActivityMixin.navigateToMain(activity);
+ return true;
case R.id.menu_trail_mode:
Settings.setMapTrail(!Settings.isMapTrail());
mapView.repaintRequired(overlayPositionAndScale);
@@ -1460,11 +1530,9 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
// switch My Location button image
private void switchMyLocationButton() {
+ myLocSwitch.setChecked(followMyLocation);
if (followMyLocation) {
- myLocSwitch.setImageResource(R.drawable.actionbar_mylocation_on);
myLocationInMiddle(app.currentGeo());
- } else {
- myLocSwitch.setImageResource(R.drawable.actionbar_mylocation_off);
}
}
@@ -1493,7 +1561,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
// close activity and open homescreen
@Override
public void goHome(View view) {
- ActivityMixin.goHome(activity);
+ ActivityMixin.navigateToMain(activity);
}
@Override
diff --git a/main/src/cgeo/geocaching/maps/google/GoogleMapActivity.java b/main/src/cgeo/geocaching/maps/google/GoogleMapActivity.java
index a98241f..8a1bad6 100644
--- a/main/src/cgeo/geocaching/maps/google/GoogleMapActivity.java
+++ b/main/src/cgeo/geocaching/maps/google/GoogleMapActivity.java
@@ -1,5 +1,6 @@
package cgeo.geocaching.maps.google;
+import cgeo.geocaching.activity.ActivityMixin;
import cgeo.geocaching.activity.FilteredActivity;
import cgeo.geocaching.maps.AbstractMap;
import cgeo.geocaching.maps.CGeoMap;
@@ -97,6 +98,11 @@ public class GoogleMapActivity extends MapActivity implements MapActivityImpl, F
}
@Override
+ public void goHome(View view) {
+ ActivityMixin.navigateToMain(this);
+ }
+
+ @Override
public void superOnResume() {
super.onResume();
}
@@ -116,12 +122,6 @@ public class GoogleMapActivity extends MapActivity implements MapActivityImpl, F
return super.onPrepareOptionsMenu(menu);
}
- // close activity and open homescreen
- @Override
- public void goHome(View view) {
- mapBase.goHome(view);
- }
-
@Override
public void showFilterMenu(View view) {
// do nothing, the filter bar only shows the global filter
diff --git a/main/src/cgeo/geocaching/maps/interfaces/MapActivityImpl.java b/main/src/cgeo/geocaching/maps/interfaces/MapActivityImpl.java
index e7deebd..08309f4 100644
--- a/main/src/cgeo/geocaching/maps/interfaces/MapActivityImpl.java
+++ b/main/src/cgeo/geocaching/maps/interfaces/MapActivityImpl.java
@@ -34,5 +34,4 @@ public interface MapActivityImpl {
boolean superOnOptionsItemSelected(MenuItem item);
public abstract void goHome(View view);
-
}
diff --git a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java
index e74751b..527f024 100644
--- a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java
+++ b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java
@@ -4,7 +4,7 @@ import butterknife.InjectView;
import cgeo.geocaching.Intents;
import cgeo.geocaching.R;
-import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.activity.AbstractActionBarActivity;
import cgeo.geocaching.utils.BundleUtils;
import cgeo.geocaching.utils.Log;
import cgeo.geocaching.utils.MatcherWrapper;
@@ -32,7 +32,7 @@ import android.widget.TextView;
import java.io.IOException;
import java.util.regex.Pattern;
-public abstract class OAuthAuthorizationActivity extends AbstractActivity {
+public abstract class OAuthAuthorizationActivity extends AbstractActionBarActivity {
public static final int NOT_AUTHENTICATED = 0;
public static final int AUTHENTICATED = 1;
diff --git a/main/src/cgeo/geocaching/utils/TranslationUtils.java b/main/src/cgeo/geocaching/utils/TranslationUtils.java
index 619db08..ea3c395 100644
--- a/main/src/cgeo/geocaching/utils/TranslationUtils.java
+++ b/main/src/cgeo/geocaching/utils/TranslationUtils.java
@@ -1,10 +1,10 @@
package cgeo.geocaching.utils;
-import cgeo.geocaching.activity.AbstractActivity;
import cgeo.geocaching.network.Network;
import org.apache.commons.lang3.StringUtils;
+import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
@@ -51,7 +51,7 @@ public final class TranslationUtils {
* @param text
* The text to be translated
*/
- public static void startActivityTranslate(final AbstractActivity context, final String toLang, final String text) {
+ public static void startActivityTranslate(final Activity context, final String toLang, final String text) {
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(buildTranslationURI(toLang, text))));
}
}