diff options
Diffstat (limited to 'main')
| -rw-r--r-- | main/project.properties | 3 | ||||
| -rw-r--r-- | main/res/values/showcaseview_styles.xml | 61 | ||||
| -rw-r--r-- | main/res/values/strings.xml | 9 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/LogCacheActivity.java | 10 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/MainActivity.java | 11 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/SearchActivity.java | 16 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/activity/AbstractActivity.java | 42 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/activity/ShowcaseViewBuilder.java | 58 |
8 files changed, 195 insertions, 15 deletions
diff --git a/main/project.properties b/main/project.properties index f0fa845..6348c7d 100644 --- a/main/project.properties +++ b/main/project.properties @@ -15,4 +15,5 @@ target=Google Inc.:Google APIs:19 android.library.reference.1=../mapswithme-api android.library.reference.2=../android-support-v7-appcompat java.source=1.7 -java.target=1.7
\ No newline at end of file +java.target=1.7 +android.library.reference.3=../../../workspaces/cgeo/showcaseview diff --git a/main/res/values/showcaseview_styles.xml b/main/res/values/showcaseview_styles.xml new file mode 100644 index 0000000..864982f --- /dev/null +++ b/main/res/values/showcaseview_styles.xml @@ -0,0 +1,61 @@ +<!-- + ~ Copyright 2014 Alex Curran + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<resources> + + <style name="ShowcaseButton"> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:minWidth">96dp</item> + <item name="android:gravity">center</item> + <item name="android:textStyle">bold</item> + <item name="android:textColor">#FFFFFF</item> + <item name="android:background">@drawable/button</item> + </style> + + <style name="ShowcaseView.Light"> + <item name="sv_titleTextAppearance">@style/TextAppearance.ShowcaseView.Title</item> + <item name="sv_detailTextAppearance">@style/TextAppearance.ShowcaseView.Detail.Light</item> + <item name="sv_backgroundColor">#3333B5E5</item> + <item name="sv_buttonText">@string/ok</item> + </style> + + <style name="ShowcaseView"> + <item name="sv_titleTextAppearance">@style/TextAppearance.ShowcaseView.Title</item> + <item name="sv_detailTextAppearance">@style/TextAppearance.ShowcaseView.Detail</item> + <item name="sv_backgroundColor">#EE223344</item> + <item name="sv_buttonText">@string/ok</item> + </style> + + <style name="TextAppearance.ShowcaseView.Title" parent="android:style/TextAppearance.Large"> + <item name="android:textColor">#33B5E5</item> + </style> + + <style name="TextAppearance.ShowcaseView.Detail" parent="android:style/TextAppearance"> + <item name="android:textColor">#FFFFFF</item> + </style> + + <style name="TextAppearance.ShowcaseView.Detail.Light"> + <item name="android:textColor">#333333</item> + <item name="android:shadowColor">#FF0000</item> + <item name="android:shadowRadius">0</item> + </style> + + <style name="TextAppearance.ShowcaseView.Title.Light"> + <item name="android:shadowRadius">0</item> + </style> + +</resources>
\ No newline at end of file diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml index 28d5d80..14c1fbe 100644 --- a/main/res/values/strings.xml +++ b/main/res/values/strings.xml @@ -1269,5 +1269,12 @@ <string name="cgeo_shortcut">c:geo shortcut</string> <string name="create_shortcut">Create shortcut</string> <string name="send">Send</string> - + + <string name="showcase_logcache_title">Sending the log</string> + <string name="showcase_logcache_text">Remember, many commands are now in the action bar. There you find the button for sending the finished log.</string> + <string name="showcase_main_title">Action bar</string> + <string name="showcase_main_text">c:geo now uses the Android action bar at the top for menu items. More menu items are hidden behind the dotted symbol. Long press an action bar item to see its name.</string> + <string name="showcase_search_title"></string> + <string name="showcase_search_text"></string> + </resources> diff --git a/main/src/cgeo/geocaching/LogCacheActivity.java b/main/src/cgeo/geocaching/LogCacheActivity.java index 83bbdf2..9d2fa68 100644 --- a/main/src/cgeo/geocaching/LogCacheActivity.java +++ b/main/src/cgeo/geocaching/LogCacheActivity.java @@ -2,6 +2,7 @@ package cgeo.geocaching; import butterknife.ButterKnife; +import cgeo.geocaching.activity.ShowcaseViewBuilder; import cgeo.geocaching.connector.ILoggingManager; import cgeo.geocaching.connector.ImageResult; import cgeo.geocaching.connector.LogResult; @@ -21,6 +22,8 @@ import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.LogTemplateProvider; import cgeo.geocaching.utils.LogTemplateProvider.LogContext; +import com.github.amlcurran.showcaseview.targets.ActionItemTarget; + import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -638,7 +641,14 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia menu.findItem(R.id.menu_image).setVisible(cache.supportsLogImages()); menu.findItem(R.id.save).setVisible(true); menu.findItem(R.id.clear).setVisible(true); + presentShowcase(); return true; } + @Override + protected ShowcaseViewBuilder getShowcase() { + return new ShowcaseViewBuilder(this) + .setTarget(new ActionItemTarget(this, R.id.menu_send)) + .setContent(R.string.showcase_logcache_title, R.string.showcase_logcache_text); + } } diff --git a/main/src/cgeo/geocaching/MainActivity.java b/main/src/cgeo/geocaching/MainActivity.java index 2d6e9f0..ed58875 100644 --- a/main/src/cgeo/geocaching/MainActivity.java +++ b/main/src/cgeo/geocaching/MainActivity.java @@ -4,6 +4,7 @@ import butterknife.ButterKnife; import butterknife.InjectView; import cgeo.geocaching.activity.AbstractActionBarActivity; +import cgeo.geocaching.activity.ShowcaseViewBuilder; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.capability.ILogin; import cgeo.geocaching.connector.gc.GCConnector; @@ -27,6 +28,7 @@ import cgeo.geocaching.utils.RxUtils; import cgeo.geocaching.utils.TextUtils; import cgeo.geocaching.utils.Version; +import com.github.amlcurran.showcaseview.targets.ActionViewTarget; import com.google.zxing.integration.android.IntentIntegrator; import com.google.zxing.integration.android.IntentResult; @@ -284,7 +286,7 @@ public class MainActivity extends AbstractActionBarActivity { final MenuItem searchItem = menu.findItem(R.id.menu_gosearch); final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); - + presentShowcase(); return true; } @@ -749,4 +751,11 @@ public class MainActivity extends AbstractActionBarActivity { public void showAbout(final View view) { startActivity(new Intent(this, AboutActivity.class)); } + + @Override + protected ShowcaseViewBuilder getShowcase() { + return new ShowcaseViewBuilder(this) + .setTarget(new ActionViewTarget(this, ActionViewTarget.Type.OVERFLOW)) + .setContent(R.string.showcase_main_title, R.string.showcase_main_text); + } } diff --git a/main/src/cgeo/geocaching/SearchActivity.java b/main/src/cgeo/geocaching/SearchActivity.java index 81dec98..6a4453c 100644 --- a/main/src/cgeo/geocaching/SearchActivity.java +++ b/main/src/cgeo/geocaching/SearchActivity.java @@ -177,14 +177,14 @@ public class SearchActivity extends AbstractActionBarActivity implements Coordin buttonLatitude.setOnClickListener(new OnClickListener() { @Override - public void onClick(View v) { + public void onClick(final View v) { updateCoordinates(); } }); buttonLongitude.setOnClickListener(new OnClickListener() { @Override - public void onClick(View v) { + public void onClick(final View v) { updateCoordinates(); } }); @@ -398,6 +398,7 @@ public class SearchActivity extends AbstractActionBarActivity implements Coordin @Override public final boolean onCreateOptionsMenu(final Menu menu) { getMenuInflater().inflate(R.menu.search_activity_options, menu); + presentShowcase(); return true; } @@ -417,4 +418,15 @@ public class SearchActivity extends AbstractActionBarActivity implements Coordin putExtra(Intents.EXTRA_KEYWORD_SEARCH, false); fromActivity.startActivityForResult(searchIntent, MainActivity.SEARCH_REQUEST_CODE); } + + // The showcase doesn't work well with the search activity, because on searching a geocode (or + // selecting a cache from the search field) we immediately close the activity. That in turn confuses the delayed + // creation of the showcase bitmap. + // + // @Override + // protected ShowcaseViewBuilder getShowcase() { + // return new ShowcaseViewBuilder(this) + // .setTarget(new ActionItemTarget(this, R.id.menu_search_own_caches)) + // .setContent(R.string.showcase_search_title, R.string.showcase_search_text); + // } } diff --git a/main/src/cgeo/geocaching/activity/AbstractActivity.java b/main/src/cgeo/geocaching/activity/AbstractActivity.java index e3df1f7..442217d 100644 --- a/main/src/cgeo/geocaching/activity/AbstractActivity.java +++ b/main/src/cgeo/geocaching/activity/AbstractActivity.java @@ -60,26 +60,49 @@ public abstract class AbstractActivity extends ActionBarActivity implements IAbs } @Override - public final void showToast(String text) { + public final void showToast(final String text) { ActivityMixin.showToast(this, text); } @Override - public final void showShortToast(String text) { + public final void showShortToast(final String text) { ActivityMixin.showShortToast(this, text); } @Override - public void onCreate(Bundle savedInstanceState) { + public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); initializeCommonFields(); + } + /** + * Call this method to actually present a showcase. The right time to invoke this method depends on the showcase + * target. I.e. if the showcase target is an action bar item, this method can only be invoked after that item has + * been created in onCreateOptionsMenu. + */ + protected final void presentShowcase() { + final ShowcaseViewBuilder builder = getShowcase(); + if (builder != null) { + builder.setStyle(R.style.ShowcaseView); + builder.build(); + } + } + + /** + * Override this method to create a showcase view highlighting the most important UI element. + * + * @return + */ + @SuppressWarnings("static-method") + protected ShowcaseViewBuilder getShowcase() { + // do nothing by default + return null; } @Override - public boolean onOptionsItemSelected(MenuItem item) { + public boolean onOptionsItemSelected(final MenuItem item) { if (item.getItemId() == android.R.id.home) { return ActivityMixin.navigateUp(this); } @@ -116,7 +139,6 @@ public abstract class AbstractActivity extends ActionBarActivity implements IAbs } protected void onCreate(final Bundle savedInstanceState, final int resourceLayoutID) { - super.onCreate(savedInstanceState); initializeCommonFields(); @@ -141,7 +163,7 @@ public abstract class AbstractActivity extends ActionBarActivity implements IAbs } @Override - public void setContentView(int layoutResID) { + public void setContentView(final int layoutResID) { super.setContentView(layoutResID); // initialize the action bar title with the activity title for single source @@ -206,7 +228,7 @@ public abstract class AbstractActivity extends ActionBarActivity implements IAbs public String getUri(); } - protected void initializeAndroidBeam(ActivitySharingInterface sharingInterface) { + protected void initializeAndroidBeam(final ActivitySharingInterface sharingInterface) { if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH) { initializeICSAndroidBeam(sharingInterface); } @@ -214,14 +236,14 @@ public abstract class AbstractActivity extends ActionBarActivity implements IAbs @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) protected void initializeICSAndroidBeam(final ActivitySharingInterface sharingInterface) { - NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); + final NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter == null) { return; } nfcAdapter.setNdefPushMessageCallback(new NfcAdapter.CreateNdefMessageCallback() { @Override - public NdefMessage createNdefMessage(NfcEvent event) { - NdefRecord record = NdefRecord.createUri(sharingInterface.getUri()); + public NdefMessage createNdefMessage(final NfcEvent event) { + final NdefRecord record = NdefRecord.createUri(sharingInterface.getUri()); return new NdefMessage(new NdefRecord[]{record}); } }, this); diff --git a/main/src/cgeo/geocaching/activity/ShowcaseViewBuilder.java b/main/src/cgeo/geocaching/activity/ShowcaseViewBuilder.java new file mode 100644 index 0000000..2d34b34 --- /dev/null +++ b/main/src/cgeo/geocaching/activity/ShowcaseViewBuilder.java @@ -0,0 +1,58 @@ +package cgeo.geocaching.activity; + +import com.github.amlcurran.showcaseview.ShowcaseView.Builder; +import com.github.amlcurran.showcaseview.targets.Target; + +import android.app.Activity; + +public class ShowcaseViewBuilder extends Builder { + + private final Activity activity; + + public ShowcaseViewBuilder(final Activity activity) { + super(activity); + this.activity = activity; + } + + @Override + public ShowcaseViewBuilder setContentTitle(final int resId) { + setSingleshot(activity.getResources().getString(resId)); + return (ShowcaseViewBuilder) super.setContentTitle(resId); + } + + /** + * Use the hash of the title for the single shot remembering + * + * @param resId + */ + private void setSingleshot(final CharSequence title) { + super.singleShot(title.hashCode()); + } + + @Override + public ShowcaseViewBuilder setContentText(final int resId) { + return (ShowcaseViewBuilder) super.setContentText(resId); + } + + @Override + public ShowcaseViewBuilder setContentText(final CharSequence text) { + return (ShowcaseViewBuilder) super.setContentText(text); + } + + @Override + public ShowcaseViewBuilder setContentTitle(final CharSequence title) { + setSingleshot(title); + return (ShowcaseViewBuilder) super.setContentTitle(title); + } + + @Override + public ShowcaseViewBuilder setTarget(final Target target) { + return (ShowcaseViewBuilder) super.setTarget(target); + } + + public ShowcaseViewBuilder setContent(final int titleId, final int textId) { + setContentTitle(titleId); + return setContentText(textId); + } + +} |
