From 2b7ac5605b7ddaa41c0acd78b8356447059c6123 Mon Sep 17 00:00:00 2001 From: fkloft Date: Sun, 21 Jul 2013 00:51:21 +0200 Subject: [PATCH] Improved permalink/portal link Now shows a dialog from which you can: * share the permalink using the standard android share feature * copy the link to the clipboard * open the intel map link with an installed browser * show the map with an installed map application (that supports geo: URIs) --- code/portal_detail_display.js | 9 +- code/utils_misc.js | 11 +- main.js | 2 +- .../res/drawable-hdpi/ic_dialog_browser.png | Bin 0 -> 2516 bytes mobile/res/drawable-hdpi/ic_dialog_copy.png | Bin 0 -> 1386 bytes mobile/res/drawable-hdpi/ic_dialog_share.png | Bin 0 -> 1606 bytes .../res/drawable-mdpi/ic_dialog_browser.png | Bin 0 -> 1842 bytes mobile/res/drawable-mdpi/ic_dialog_copy.png | Bin 0 -> 1337 bytes mobile/res/drawable-mdpi/ic_dialog_share.png | Bin 0 -> 1341 bytes .../res/drawable-xhdpi/ic_dialog_browser.png | Bin 0 -> 3307 bytes mobile/res/drawable-xhdpi/ic_dialog_copy.png | Bin 0 -> 1426 bytes mobile/res/drawable-xhdpi/ic_dialog_share.png | Bin 0 -> 1780 bytes .../cradle/iitc_mobile/IITC_JSInterface.java | 31 +-- .../cradle/iitc_mobile/IITC_ShareDialog.java | 194 ++++++++++++++++++ 14 files changed, 229 insertions(+), 18 deletions(-) create mode 100644 mobile/res/drawable-hdpi/ic_dialog_browser.png create mode 100644 mobile/res/drawable-hdpi/ic_dialog_copy.png create mode 100644 mobile/res/drawable-hdpi/ic_dialog_share.png create mode 100644 mobile/res/drawable-mdpi/ic_dialog_browser.png create mode 100644 mobile/res/drawable-mdpi/ic_dialog_copy.png create mode 100644 mobile/res/drawable-mdpi/ic_dialog_share.png create mode 100644 mobile/res/drawable-xhdpi/ic_dialog_browser.png create mode 100644 mobile/res/drawable-xhdpi/ic_dialog_copy.png create mode 100644 mobile/res/drawable-xhdpi/ic_dialog_share.png create mode 100644 mobile/src/com/cradle/iitc_mobile/IITC_ShareDialog.java diff --git a/code/portal_detail_display.js b/code/portal_detail_display.js index cb2e79a7..37eb45a9 100644 --- a/code/portal_detail_display.js +++ b/code/portal_detail_display.js @@ -52,7 +52,6 @@ window.renderPortalDetails = function(guid) { var poslinks = 'window.showPortalPosLinks('+lat+','+lng+',\''+escapeJavascriptString(d.portalV2.descriptiveText.TITLE)+'\')'; var portalDetailObj = window.getPortalDescriptionFromDetailsExtended(d); - var portalDetailedDescription = ''; if(portalDetailObj) { @@ -101,8 +100,12 @@ window.renderPortalDetails = function(guid) { + randDetails + resoDetails + '
' - + '' - + '' + + ( + typeof android !== 'undefined' && android && android.intentPosLink // Android handles both links via a dialog + ? '' + : '' + + '' + ) + '' + '
' ); diff --git a/code/utils_misc.js b/code/utils_misc.js index 781fd378..541342bd 100644 --- a/code/utils_misc.js +++ b/code/utils_misc.js @@ -176,7 +176,7 @@ window.showPortalPosLinks = function(lat, lng, name) { } if (typeof android !== 'undefined' && android && android.intentPosLink) { - android.intentPosLink(lat, lng, encoded_name); + android.intentPosLink(lat, lng, map.getZoom(), name); } else { var qrcode = '
'; var script = ''; @@ -200,6 +200,15 @@ window.androidCopy = function(text) { return false; } +window.androidPermalink = function() { + if(typeof android === 'undefined' || !android || !android.copy) + return true; // i.e. execute other actions + + var center = map.getCenter(); + android.intentPosLink(center.lat, center.lng, map.getZoom(), null); + return false; +} + window.reportPortalIssue = function(info) { var t = 'Redirecting you to a Google Help Page.\n\nThe text box contains all necessary information. Press CTRL+C to copy it.'; var d = window.portals[window.selectedPortal].options.details; diff --git a/main.js b/main.js index 38136170..1256988f 100644 --- a/main.js +++ b/main.js @@ -96,7 +96,7 @@ document.getElementsByTagName('body')[0].innerHTML = '' // redeeming removed from stock site, so commented out for now. it may return... // + ' ' + '
' - + ' Permalink' + + ' Permalink' + ' About IITC' + '
' + ' ' diff --git a/mobile/res/drawable-hdpi/ic_dialog_browser.png b/mobile/res/drawable-hdpi/ic_dialog_browser.png new file mode 100644 index 0000000000000000000000000000000000000000..e154afdbcbe8ec4e9fd4354e13ac118dade86ac6 GIT binary patch literal 2516 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 literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-hdpi/ic_dialog_copy.png b/mobile/res/drawable-hdpi/ic_dialog_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..72c6bc6e213c1f730a0939be123f4f97d9aa0cfb GIT binary patch literal 1386 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi)$} z`@o#e@C|3zA3n!2w?(ypQ7YlqvKdF5|2&tii8yzFJ7c5n?gtl_H|V4t_%-35DtDYz zSPWZsZQbXPEjw~q0zSDPy84n~jyLB8xmCd`nTk&rS}ncA6ceWIRUtU%!z_XLBSKd* z6Fw%IOR-ek@Z*yzy~$<6iRZJdaJoU#&=uhhpyE=KV5>O}%*ji*7^I{aoe5RWaXRl3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsViy$<^4@$kou)$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1OnfUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dPPe$Y z;WQ7bHwCv_3~=hz2RcR{6tzfE4HE*U9}p9saDg0n(of9;ruQOX!cO_L`zQkg(+*D; z$B>F!Z)TqL77dg*mi}kQ&sH|pEN=10#ExwmS&1DJbC-lVx$5Q!HqBnt%JG*ysC&iK z5SFc5!gOz`?A+0~wd;-BBDWBMRFo2ZJ?h$_;_~>Yj3X>4y?O2DIOwwA8(isoFihqz>bHwpL-Ua?$j-u~%8`2-x)myjA zC(328lpj#sz|r&cn$k1T9ZYqZvCPg3WY094ZtyGGQ_d5^Y%0aNrRnj5{>PF(-;2Ds zqTwKxyY;Erf2qn{LA%`;MQh40FzIX*+pfhZ^fyekV+Rw@{Fzrp+>UNmxy=}O)|DEvX7#2~~h>fMxd zGdZ@GD}*9tEx6A$s%am#W9>iS{`#ivg6_>K$9x(KKNz3s-lnubM26*e<=;-bS)1qG zWIWfv{eWSAme?MK?+$9KlKgt)SlVCCZ>zKB%nR_~-*IF|?5U(2raP?bomwZ;Vu5W89YpmiD`d{l1AAj`% z{~Q+gNL?|h*CziAcbxpNe3^1~;^Bv%j1NcHMdv);?&|-iG2YbY?4>g|gH#iG6gOBY z*mFETsIfV3RRmL#yxZZlM-l2qSC_UNOUj$o^n8)X1FhxtEK@GGWoONBbUC_j!s>;Z z`WG&&+0f&eee1@i=u;x6CpZPJ>dJnzYqhp^ncBGvscuehymXptON>jG9+65{@aes} zCh)+ft=bP+bMjJ6xn`tvzGJ_kcDp;@gzJRCt{rB1*%4h!wobb&^!&cj%c+sBiI(qA ze*2|+elMfU%by4CPb+1Zlc4#o+R*C3hR3zizq8KYek3?~{+ui7z@*dJ;BmZ-ftkT( WqIi*r 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

j<(xDrq%>}x_OTIa0dTU@|3 1pe9XFcLlNGCaS`R0 zom+J**YT|cb?JU~iqgRDMkfz=o!cXgZIv6@wR?6PzY_mz|H0sDd+Bs)=a|>>V|r^L zHFrDLwDpgy3}RzFQ4jtW`pVaKw;_A3)deS{Mo%SvIGUQJr~G7Ra&F zI)bEYoCj_}ZH2tX@VAx~Ez;i@V74eUa}^Cdwk5#_26ycnO6mWZE5P zw1pI(2#!@(88-PdRGpo;xL8oNY<;%py*?__%HWs!;?IxI#gPN&TqmwL%?;!M^<{|T z&*Bk5#-ZQ{r;(4|ri12{9j6}>Zbxc1gy5k*+dmCIo+ozn9!`+*aBZOY?#DAnc~Nt`=LUtU^B4MaoLgOmNylOR z8#QIQ#)1G#NFaLU)59hV{XtCG#q#I`&21+6q#}x;0EH(s+*{POrQ@x3HCx>Xeic99 z?w2}!E+7Sd`C(<C{r^RbY5V8hO4+r;(mzPh5Z7*O?wgz}=#g67z)Uo9hYZfa)iu8;)>Q8(#&drCev zpcBWQ`~}60w!our!u$M(?45=px5Jw>Nq>1kFT_YSpp0Eb=`PO0>Xf(}f359X@#Z7D%B8_B-vcqE)wQUoz0&dSWp%puAGAD#x=2|Eu#D`mQu#s( z{uf(g+V1r2NtulfaC-W9zR&k2W&3r@)r}u!`(Ipr$XQU=j8ysZe3T# lgWyD4g$wY?h;s=*T>z}91AnP{Y1c-AFQ{2$mxl4$?{ literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-xhdpi/ic_dialog_copy.png b/mobile/res/drawable-xhdpi/ic_dialog_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..04e290d8b99915220acda5e11c81f889de57abce GIT binary patch literal 1426 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 literal 0 HcmV?d00001 diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java b/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java index 4f6dceb7..7a4d7419 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java @@ -1,5 +1,11 @@ package com.cradle.iitc_mobile; +import java.util.HashMap; + +import org.json.JSONArray; +import org.json.JSONException; + +import android.app.Activity; import android.app.AlertDialog; import android.content.ClipData; import android.content.ClipboardManager; @@ -7,17 +13,11 @@ import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.DialogInterface.OnMultiChoiceClickListener; -import android.content.Intent; -import android.net.Uri; +import android.os.Bundle; import android.util.Log; import android.webkit.JavascriptInterface; import android.widget.Toast; -import org.json.JSONArray; -import org.json.JSONException; - -import java.util.HashMap; - // provide communication between IITC script and android app public class IITC_JSInterface { @@ -35,13 +35,18 @@ public class IITC_JSInterface { context = c; } - // send geo intent for navigation apps like gmaps or waze etc... + // open dialog to send geo intent for navigation apps like gmaps or waze etc... @JavascriptInterface - public void intentPosLink(String lat, String lng, String portal_name) { - String uri = "geo:" + lat + "," + lng + "?q=" + lat + "," + lng; - Intent intent = new Intent(android.content.Intent.ACTION_VIEW, - Uri.parse(uri)); - context.startActivity(intent); + public void intentPosLink(double lat, double lng, int zoom, String portalName) { + Bundle args = new Bundle(); + args.putDouble("lat", lat); + args.putDouble("lng", lng); + args.putInt("zoom", zoom); + args.putString("title", portalName); + + IITC_ShareDialog dialog = new IITC_ShareDialog(); + dialog.setArguments(args); + dialog.show(((Activity) context).getFragmentManager(), "ShareDialog"); } // disable javascript injection while spinner is enabled diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_ShareDialog.java b/mobile/src/com/cradle/iitc_mobile/IITC_ShareDialog.java new file mode 100644 index 00000000..cf0c9a2d --- /dev/null +++ b/mobile/src/com/cradle/iitc_mobile/IITC_ShareDialog.java @@ -0,0 +1,194 @@ +package com.cradle.iitc_mobile; + +import java.util.ArrayList; +import java.util.List; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.ComponentName; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.ComponentInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.net.Uri; +import android.os.Bundle; +import android.os.Parcelable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; +import android.widget.Toast; + +public class IITC_ShareDialog extends DialogFragment { + private abstract class Action { + private int mIcon; + private String mLabel; + + private Action(String label, int icon) { + mLabel = label; + mIcon = icon; + } + + abstract void invoke(); + } + + public class OnClickListener implements DialogInterface.OnClickListener { + @Override + public void onClick(DialogInterface dialog, int which) { + mAdapter.getItem(which).invoke(); + } + } + + class ActionAdapter extends ArrayAdapter { + private LayoutInflater mInflater; + + public ActionAdapter(Context context) { + super(context, android.R.layout.simple_list_item_1, ACTIONS); + mInflater = LayoutInflater.from(context); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + Action action = getItem(position); + + if (convertView == null) + convertView = mInflater.inflate(android.R.layout.simple_list_item_1, null); + + TextView tv = (TextView) convertView; + tv.setText(action.mLabel); + tv.setCompoundDrawablePadding(8); + tv.setCompoundDrawablesWithIntrinsicBounds(action.mIcon, 0, 0, 0); + return convertView; + } + } + + private final Action[] ACTIONS = { + new Action("Share…", R.drawable.ic_dialog_share) { + void invoke() { + Intent intent = new Intent(Intent.ACTION_SEND); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + intent.setType("text/plain"); + intent.putExtra(Intent.EXTRA_TEXT, getUrl()); + intent.putExtra(Intent.EXTRA_SUBJECT, mTitle); + + startIntent(intent); + } + }, + new Action("View map with app…", R.drawable.location_map) { + void invoke() { + String geoUri = "geo:" + mLl; + Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(geoUri)); + + startIntent(intent); + } + }, + new Action("Open with browser…", R.drawable.ic_dialog_browser) { + void invoke() { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(getUrl())); + + startIntent(intent); + } + }, + new Action("Copy to clipboard", R.drawable.ic_dialog_copy) { + void invoke() { + ClipData clip = ClipData.newPlainText("Copied text", getUrl()); + + ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService( + Activity.CLIPBOARD_SERVICE); + clipboard.setPrimaryClip(clip); + + Toast.makeText(getActivity(), "copied to clipboard", Toast.LENGTH_SHORT).show(); + } + } + }; + + private ActionAdapter mAdapter; + private boolean mIsPortal = true; + private String mLl; + private String mTitle; + private int mZoom; + + private String getUrl() { + String url = "http://www.ingress.com/intel?ll=" + mLl + "&z=" + mZoom; + if (mIsPortal) + url += "&pll=" + mLl; + return url; + } + + private void startIntent(Intent intent) { + // for geo: and Intel Map intents, the user may choose a default application to handle the intent. Since we have + // suitable intent filters declared, it might be that we *are* the default application. In theses cases, a list + // of designated applications is presented to the user + + String packageName = getActivity().getPackageName(); + + PackageManager pm = getActivity().getPackageManager(); + ResolveInfo mInfo = pm.resolveActivity(intent, 0); + + if (mInfo.activityInfo.packageName.equals(packageName)) { + // note: Intent.createChooser would be shorter, but it also includes IITCm. + // Therefore, we'll filter the available activities + String label = null; + if (intent.getAction().equals(Intent.ACTION_SEND)) + label = "Share via"; + else if (intent.getAction().equals(Intent.ACTION_VIEW)) + label = "Open with"; + + List intents = new ArrayList(); + List activities = getActivity().getPackageManager().queryIntentActivities(intent, 0); + + if (!activities.isEmpty()) { + for (ResolveInfo resolveInfo : activities) { + ComponentInfo info; + if (resolveInfo.activityInfo != null) + info = resolveInfo.activityInfo; + else + // Exactly one if these two must be non-null (according to docs) + info = resolveInfo.serviceInfo; + + if (info.packageName.equals(packageName)) // don't show IITCm + continue; + + // setComponent is used to route the intent towards the component + // setPackage is used to prevent Android from showing IITCm + // (without a package set, Android would still show all available components, including IITCm) + intents.add(new Intent(intent) + .setComponent(new ComponentName(info.packageName, info.name)) + .setPackage(info.packageName)); + } + + intent = Intent.createChooser(intents.remove(intents.size() - 1), label); + intent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents.toArray(new Parcelable[] {})); + } + } + + startActivity(intent); + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + Bundle args = getArguments(); + mTitle = args.getString("title"); + mLl = args.getDouble("lat") + "," + args.getDouble("lng"); + mZoom = args.getInt("zoom"); + + if (mTitle == null) { + mTitle = "Intel Map"; + mIsPortal = false; + } + + mAdapter = new ActionAdapter(getActivity()); + + return new AlertDialog.Builder(getActivity()) + .setTitle(mTitle) + .setAdapter(mAdapter, new OnClickListener()) + .create(); + } +}