From 6b7525836dfd60f5c17cc54d02c5dfef590a0bef Mon Sep 17 00:00:00 2001 From: fkloft Date: Sun, 26 Jan 2014 14:29:44 +0100 Subject: [PATCH 1/4] add final modifiers to IITC_JSInterface --- .../cradle/iitc_mobile/IITC_JSInterface.java | 43 +++++++++---------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java b/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java index 78080700..4b22d0a8 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java @@ -17,14 +17,15 @@ public class IITC_JSInterface { // context of main activity private final IITC_Mobile mIitc; - IITC_JSInterface(IITC_Mobile iitc) { + IITC_JSInterface(final IITC_Mobile iitc) { mIitc = iitc; } // open dialog to send geo intent for navigation apps like gmaps or waze etc... @JavascriptInterface - public void intentPosLink(double lat, double lng, int zoom, String title, boolean isPortal) { - Intent intent = new Intent(mIitc, ShareActivity.class); + public void intentPosLink( + final double lat, final double lng, final int zoom, final String title, final boolean isPortal) { + final Intent intent = new Intent(mIitc, ShareActivity.class); intent.putExtra("lat", lat); intent.putExtra("lng", lng); intent.putExtra("zoom", zoom); @@ -35,8 +36,8 @@ public class IITC_JSInterface { // share a string to the IITC share activity. only uses the share tab. @JavascriptInterface - public void shareString(String str) { - Intent intent = new Intent(mIitc, ShareActivity.class); + public void shareString(final String str) { + final Intent intent = new Intent(mIitc, ShareActivity.class); intent.putExtra("shareString", str); intent.putExtra("onlyShare", true); mIitc.startActivity(intent); @@ -45,16 +46,15 @@ public class IITC_JSInterface { // disable javascript injection while spinner is enabled // prevent the spinner from closing automatically @JavascriptInterface - public void spinnerEnabled(boolean en) { + public void spinnerEnabled(final boolean en) { mIitc.getWebView().disableJS(en); } // copy link to specific portal to android clipboard @JavascriptInterface - public void copy(String s) { - ClipboardManager clipboard = (ClipboardManager) mIitc - .getSystemService(Context.CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText("Copied Text ", s); + public void copy(final String s) { + final ClipboardManager clipboard = (ClipboardManager) mIitc.getSystemService(Context.CLIPBOARD_SERVICE); + final ClipData clip = ClipData.newPlainText("Copied Text ", s); clipboard.setPrimaryClip(clip); Toast.makeText(mIitc, "copied to clipboard", Toast.LENGTH_SHORT).show(); } @@ -63,10 +63,9 @@ public class IITC_JSInterface { public int getVersionCode() { int versionCode = 0; try { - PackageInfo pInfo = mIitc.getPackageManager() - .getPackageInfo(mIitc.getPackageName(), 0); + final PackageInfo pInfo = mIitc.getPackageManager().getPackageInfo(mIitc.getPackageName(), 0); versionCode = pInfo.versionCode; - } catch (PackageManager.NameNotFoundException e) { + } catch (final PackageManager.NameNotFoundException e) { Log.w(e); } return versionCode; @@ -75,11 +74,11 @@ public class IITC_JSInterface { @JavascriptInterface public String getVersionName() { String buildVersion = "unknown"; - PackageManager pm = mIitc.getPackageManager(); + final PackageManager pm = mIitc.getPackageManager(); try { - PackageInfo info = pm.getPackageInfo(mIitc.getPackageName(), 0); + final PackageInfo info = pm.getPackageInfo(mIitc.getPackageName(), 0); buildVersion = info.versionName; - } catch (PackageManager.NameNotFoundException e) { + } catch (final PackageManager.NameNotFoundException e) { Log.w(e); } return buildVersion; @@ -93,7 +92,7 @@ public class IITC_JSInterface { Pane pane; try { pane = mIitc.getNavigationHelper().getPane(id); - } catch (IllegalArgumentException e) { + } catch (final IllegalArgumentException e) { pane = Pane.MAP; } @@ -103,12 +102,12 @@ public class IITC_JSInterface { } @JavascriptInterface - public void dialogFocused(String id) { + public void dialogFocused(final String id) { mIitc.setFocusedDialog(id); } @JavascriptInterface - public void dialogOpened(String id, boolean open) { + public void dialogOpened(final String id, final boolean open) { mIitc.dialogOpened(id, open); } @@ -190,9 +189,9 @@ public class IITC_JSInterface { @JavascriptInterface public boolean showZoom() { - PackageManager pm = mIitc.getPackageManager(); - boolean hasMultitouch = pm.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH); - boolean forcedZoom = mIitc.getPrefs().getBoolean("pref_user_zoom", false); + final PackageManager pm = mIitc.getPackageManager(); + final boolean hasMultitouch = pm.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH); + final boolean forcedZoom = mIitc.getPrefs().getBoolean("pref_user_zoom", false); return forcedZoom || !hasMultitouch; } From 23a092f187543dd91eab23ee20b2f71a911c786f Mon Sep 17 00:00:00 2001 From: fkloft Date: Sun, 26 Jan 2014 14:35:12 +0100 Subject: [PATCH 2/4] Add Android Beam (NFC) support --- code/smartphone.js | 23 ++++++++++++++++ mobile/AndroidManifest.xml | 1 + .../cradle/iitc_mobile/IITC_JSInterface.java | 5 ++++ .../com/cradle/iitc_mobile/IITC_Mobile.java | 26 ++++++++++++++++++- 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/code/smartphone.js b/code/smartphone.js index c9133aab..d39b6a03 100644 --- a/code/smartphone.js +++ b/code/smartphone.js @@ -161,6 +161,11 @@ window.runOnSmartphonesAfterBoot = function() { }); }); + if(typeof android !== 'undefined' && android && android.setPermalink) { + window.map.on('moveend', window.setAndroidPermalink); + addHook('portalSelected', window.setAndroidPermalink); + } + // Force lower render limits for mobile window.VIEWPORT_PAD_RATIO = 0.1; window.MAX_DRAWN_PORTALS = 500; @@ -168,6 +173,24 @@ window.runOnSmartphonesAfterBoot = function() { window.MAX_DRAWN_FIELDS = 100; } +window.setAndroidPermalink = function() { + var c = window.map.getCenter(); + var lat = Math.round(c.lat*1E6)/1E6; + var lng = Math.round(c.lng*1E6)/1E6; + + var href = '/intel?ll='+lat+','+lng+'&z=' + map.getZoom(); + + if(window.selectedPortal && window.portals[window.selectedPortal]) { + var p = window.portals[window.selectedPortal].getLatLng(); + lat = Math.round(p.lat*1E6)/1E6; + lng = Math.round(p.lng*1E6)/1E6; + href += '&pll='+lat+','+lng; + } + + href = $('').prop('href', href).prop('href'); // to get absolute URI + android.setPermalink(href); +} + window.useAndroidPanes = function() { // isSmartphone is important to disable panes in desktop mode return (typeof android !== 'undefined' && android && android.addPane && window.isSmartphone()); diff --git a/mobile/AndroidManifest.xml b/mobile/AndroidManifest.xml index 47e1ad36..74eeaef1 100644 --- a/mobile/AndroidManifest.xml +++ b/mobile/AndroidManifest.xml @@ -16,6 +16,7 @@ --> + mDialogStack = new Stack(); + private String mPermalink = null; // Used for custom back stack handling private final Stack mBackStack = new Stack(); @@ -142,6 +148,9 @@ public class IITC_Mobile extends Activity implements OnSharedPreferenceChangeLis // afterwards install iitc update registerReceiver(mBroadcastReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); + final NfcAdapter nfc = NfcAdapter.getDefaultAdapter(this); + nfc.setNdefPushMessageCallback(this, this); + handleIntent(getIntent(), true); } @@ -777,4 +786,19 @@ public class IITC_Mobile extends Activity implements OnSharedPreferenceChangeLis public interface ResponseHandler { void onActivityResult(int resultCode, Intent data); } + + public void setPermalink(final String href) { + mPermalink = href; + } + + @Override + public NdefMessage createNdefMessage(final NfcEvent event) { + if (mPermalink == null) { // no permalink yet, just provide AAR + return new NdefMessage(NdefRecord.createApplicationRecord(getPackageName())); + } + + return new NdefMessage( + NdefRecord.createUri(mPermalink), + NdefRecord.createApplicationRecord(getPackageName())); + } } From bb31fbd9f83d4cb2e295155fe3f0123aa6073370 Mon Sep 17 00:00:00 2001 From: fkloft Date: Sun, 26 Jan 2014 15:33:17 +0100 Subject: [PATCH 3/4] Don't crash if no NfcAdapter present; Replace constructor from API 16+ --- .../src/com/cradle/iitc_mobile/IITC_Mobile.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index 0925c120..48b34712 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -149,7 +149,7 @@ public class IITC_Mobile extends Activity registerReceiver(mBroadcastReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); final NfcAdapter nfc = NfcAdapter.getDefaultAdapter(this); - nfc.setNdefPushMessageCallback(this, this); + if (nfc != null) nfc.setNdefPushMessageCallback(this, this); handleIntent(getIntent(), true); } @@ -793,12 +793,17 @@ public class IITC_Mobile extends Activity @Override public NdefMessage createNdefMessage(final NfcEvent event) { + NdefRecord[] records; if (mPermalink == null) { // no permalink yet, just provide AAR - return new NdefMessage(NdefRecord.createApplicationRecord(getPackageName())); + records = new NdefRecord[] { + NdefRecord.createApplicationRecord(getPackageName()) + }; + } else { + records = new NdefRecord[] { + NdefRecord.createUri(mPermalink), + NdefRecord.createApplicationRecord(getPackageName()) + }; } - - return new NdefMessage( - NdefRecord.createUri(mPermalink), - NdefRecord.createApplicationRecord(getPackageName())); + return new NdefMessage(records); } } From a8c2bb21ab28f6012bd791d9ab3cf7c2b5808543 Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Sun, 26 Jan 2014 16:06:10 +0100 Subject: [PATCH 4/4] let iitcm trigger on nfc intel-url intents --- mobile/AndroidManifest.xml | 1 + mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/mobile/AndroidManifest.xml b/mobile/AndroidManifest.xml index 74eeaef1..ce1553c9 100644 --- a/mobile/AndroidManifest.xml +++ b/mobile/AndroidManifest.xml @@ -47,6 +47,7 @@ + diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index 48b34712..8c619247 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -196,7 +196,7 @@ public class IITC_Mobile extends Activity private void handleIntent(final Intent intent, final boolean onCreate) { // load new iitc web view with ingress intel page final String action = intent.getAction(); - if (Intent.ACTION_VIEW.equals(action)) { + if (Intent.ACTION_VIEW.equals(action) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) { final Uri uri = intent.getData(); Log.d("intent received url: " + uri.toString());