X-Git-Url: http://git.rot13.org/?p=zxing.git;a=blobdiff_plain;f=android%2Fsrc%2Fcom%2Fgoogle%2Fzxing%2Fclient%2Fandroid%2Fresult%2FResultHandler.java;h=5c881652c4e6fd2d90a5de349d418e991de79d47;hp=48a22b7e17ce1247bb44a1b41a34a8ddc72220d3;hb=f889a908c5e40c1f073b2beb3fe9d13bf4f31e87;hpb=419298649bcec3818b5189a18ae68c365507b05d diff --git a/android/src/com/google/zxing/client/android/result/ResultHandler.java b/android/src/com/google/zxing/client/android/result/ResultHandler.java index 48a22b7e..5c881652 100644 --- a/android/src/com/google/zxing/client/android/result/ResultHandler.java +++ b/android/src/com/google/zxing/client/android/result/ResultHandler.java @@ -16,22 +16,31 @@ package com.google.zxing.client.android.result; -import android.app.Activity; -import android.app.AlertDialog; -import android.content.ActivityNotFoundException; -import android.content.Intent; -import android.content.SharedPreferences; -import android.net.Uri; -import android.preference.PreferenceManager; -import android.provider.Contacts; +import com.google.zxing.Result; import com.google.zxing.client.android.Contents; import com.google.zxing.client.android.Intents; import com.google.zxing.client.android.LocaleManager; import com.google.zxing.client.android.PreferencesActivity; import com.google.zxing.client.android.R; import com.google.zxing.client.android.book.SearchBookContentsActivity; +import com.google.zxing.client.android.wifi.WifiActivity; import com.google.zxing.client.result.ParsedResult; import com.google.zxing.client.result.ParsedResultType; +import com.google.zxing.client.result.WifiParsedResult; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.SearchManager; +import android.content.ActivityNotFoundException; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.preference.PreferenceManager; +import android.provider.Contacts; +import android.view.View; +import android.widget.Button; import java.text.DateFormat; import java.text.ParsePosition; @@ -54,20 +63,52 @@ public abstract class ResultHandler { private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyyMMdd"); private static final DateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); + private static final String GOOGLE_SHOPPER_PACKAGE = "com.google.android.apps.shopper"; + private static final String GOOGLE_SHOPPER_ACTIVITY = GOOGLE_SHOPPER_PACKAGE + + ".results.SearchResultsActivity"; + private static final String MARKET_URI_PREFIX = "market://search?q=pname:"; + private static final String MARKET_REFERRER_SUFFIX = + "&referrer=utm_source%3Dbarcodescanner%26utm_medium%3Dapps%26utm_campaign%3Dscan"; + public static final int MAX_BUTTON_COUNT = 4; private final ParsedResult result; private final Activity activity; + private final Result rawResult; + private final String customProductSearch; + + private final DialogInterface.OnClickListener shopperMarketListener = + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialogInterface, int which) { + launchIntent(new Intent(Intent.ACTION_VIEW, Uri.parse(MARKET_URI_PREFIX + + GOOGLE_SHOPPER_PACKAGE + MARKET_REFERRER_SUFFIX))); + } + }; ResultHandler(Activity activity, ParsedResult result) { + this(activity, result, null); + } + + ResultHandler(Activity activity, ParsedResult result, Result rawResult) { this.result = result; this.activity = activity; + this.rawResult = rawResult; + this.customProductSearch = parseCustomSearchURL(); + + // Make sure the Shopper button is hidden by default. Without this, scanning a product followed + // by a QR Code would leave the button on screen among the QR Code actions. + Button shopperButton = (Button) activity.findViewById(R.id.shopper_button); + shopperButton.setVisibility(View.GONE); } ParsedResult getResult() { return result; } + boolean hasCustomProductSearch() { + return customProductSearch != null; + } + /** * Indicates how many buttons the derived class wants shown. * @@ -91,6 +132,17 @@ public abstract class ResultHandler { */ public abstract void handleButtonPress(int index); + /** + * The Google Shopper button is special and is not handled by the abstract button methods above. + * + * @param listener The on click listener to install for this button. + */ + protected void showGoogleShopperButton(View.OnClickListener listener) { + Button shopperButton = (Button) activity.findViewById(R.id.shopper_button); + shopperButton.setVisibility(View.VISIBLE); + shopperButton.setOnClickListener(listener); + } + /** * Create a possibly styled string for the contents of the current barcode. * @@ -124,16 +176,27 @@ public abstract class ResultHandler { * @param summary A description of the event * @param start The start time as yyyyMMdd or yyyyMMdd'T'HHmmss or yyyyMMdd'T'HHmmss'Z' * @param end The end time as yyyyMMdd or yyyyMMdd'T'HHmmss or yyyyMMdd'T'HHmmss'Z' + * @param location a text description of the event location + * @param description a text description of the event itself */ - final void addCalendarEvent(String summary, String start, String end) { + final void addCalendarEvent(String summary, + String start, + String end, + String location, + String description) { Intent intent = new Intent(Intent.ACTION_EDIT); intent.setType("vnd.android.cursor.item/event"); intent.putExtra("beginTime", calculateMilliseconds(start)); if (start.length() == 8) { intent.putExtra("allDay", true); } + if (end == null) { + end = start; + } intent.putExtra("endTime", calculateMilliseconds(end)); intent.putExtra("title", summary); + intent.putExtra("eventLocation", location); + intent.putExtra("description", description); launchIntent(intent); } @@ -187,16 +250,19 @@ public abstract class ResultHandler { } final void shareByEmail(String contents) { - sendEmailFromUri("mailto:", activity.getString(R.string.msg_share_subject_line), contents); + sendEmailFromUri("mailto:", null, activity.getString(R.string.msg_share_subject_line), contents); } final void sendEmail(String address, String subject, String body) { - sendEmailFromUri("mailto:" + address, subject, body); + sendEmailFromUri("mailto:" + address, address, subject, body); } // Use public Intent fields rather than private GMail app fields to specify subject and body. - final void sendEmailFromUri(String uri, String subject, String body) { + final void sendEmailFromUri(String uri, String email, String subject, String body) { Intent intent = new Intent(Intent.ACTION_SEND, Uri.parse(uri)); + if (email != null) { + intent.putExtra(Intent.EXTRA_EMAIL, new String[] {email}); + } putExtra(intent, Intent.EXTRA_SUBJECT, subject); putExtra(intent, Intent.EXTRA_TEXT, body); intent.setType("text/plain"); @@ -288,6 +354,15 @@ public abstract class ResultHandler { launchIntent(intent); } + final void wifiConnect(WifiParsedResult wifiResult) { + Intent intent = new Intent(Intents.WifiConnect.ACTION); + intent.setClassName(activity, WifiActivity.class.getName()); + putExtra(intent, Intents.WifiConnect.SSID, wifiResult.getSsid()); + putExtra(intent, Intents.WifiConnect.TYPE, wifiResult.getNetworkEncryption()); + putExtra(intent, Intents.WifiConnect.PASSWORD, wifiResult.getPassword()); + launchIntent(intent); + } + final void openURL(String url) { launchIntent(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); } @@ -298,14 +373,35 @@ public abstract class ResultHandler { launchIntent(intent); } + final void openGoogleShopper(String query) { + try { + activity.getPackageManager().getPackageInfo(GOOGLE_SHOPPER_PACKAGE, 0); + // If we didn't throw, Shopper is installed, so launch it. + Intent intent = new Intent(Intent.ACTION_SEARCH); + intent.setClassName(GOOGLE_SHOPPER_PACKAGE, GOOGLE_SHOPPER_ACTIVITY); + intent.putExtra(SearchManager.QUERY, query); + activity.startActivity(intent); + } catch (PackageManager.NameNotFoundException e) { + // Otherwise offer to install it from Market. + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle(R.string.msg_google_shopper_missing); + builder.setMessage(R.string.msg_install_google_shopper); + builder.setIcon(R.drawable.shopper_icon); + builder.setPositiveButton(R.string.button_ok, shopperMarketListener); + builder.setNegativeButton(R.string.button_cancel, null); + builder.show(); + } + } + void launchIntent(Intent intent) { if (intent != null) { + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); try { activity.startActivity(intent); } catch (ActivityNotFoundException e) { AlertDialog.Builder builder = new AlertDialog.Builder(activity); - builder.setTitle(activity.getString(R.string.app_name)); - builder.setMessage(activity.getString(R.string.msg_intent_failed)); + builder.setTitle(R.string.app_name); + builder.setMessage(R.string.msg_intent_failed); builder.setPositiveButton(R.string.button_ok, null); builder.show(); } @@ -325,7 +421,7 @@ public abstract class ResultHandler { proceedListener.onClick(null, index); } else { // note the user has seen it - prefs.edit().putBoolean(PreferencesActivity.KEY_NOT_OUR_RESULTS_SHOWN, true); + prefs.edit().putBoolean(PreferencesActivity.KEY_NOT_OUR_RESULTS_SHOWN, true).commit(); AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setMessage(R.string.msg_not_our_results); builder.setPositiveButton(R.string.button_ok, proceedListener); @@ -333,4 +429,21 @@ public abstract class ResultHandler { } } -} + private String parseCustomSearchURL() { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); + String customProductSearch = prefs.getString(PreferencesActivity.KEY_CUSTOM_PRODUCT_SEARCH, null); + if (customProductSearch != null && customProductSearch.trim().length() == 0) { + return null; + } + return customProductSearch; + } + + String fillInCustomSearchURL(String text) { + String url = customProductSearch.replace("%s", text); + if (rawResult != null) { + url = url.replace("%f", rawResult.getBarcodeFormat().toString()); + } + return url; + } + +} \ No newline at end of file