diff --git a/.gitignore b/.gitignore index d2d07c24..af7e35cf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -mobile/IngressIntelTC/bin build localbuildsettings.py *.pyc diff --git a/build.py b/build.py index 5c2e3cb9..2a3eb7d9 100755 --- a/build.py +++ b/build.py @@ -225,7 +225,7 @@ if buildMobile: except: pass shutil.rmtree("mobile/assets/plugins") - shutil.copytree(os.path.join(outDir,"plugins"), "mobile/assets/plugins", ignore=shutil.ignore_patterns('*.meta.js', 'force-https*', 'privacy-view*')) + shutil.copytree(os.path.join(outDir,"plugins"), "mobile/assets/plugins", ignore=shutil.ignore_patterns('*.meta.js', 'force-https*', 'privacy-view*', 'speech-search*')) if buildMobile != 'copyonly': diff --git a/code/geosearch.js b/code/geosearch.js index 7bd7d1ee..ab67a56c 100644 --- a/code/geosearch.js +++ b/code/geosearch.js @@ -6,24 +6,29 @@ window.setupGeosearch = function() { if((e.keyCode ? e.keyCode : e.which) != 13) return; var search = $(this).val(); - + + if ( window.search(search) ) return; + + e.preventDefault(); + }); + $('#geosearchwrapper img').click(function(){ + map.locate({setView : true, maxZoom: 13}); + }); +} + +window.search = function(search) { if (!runHooks('geoSearch', search)) { - return; + return true; } $.getJSON(NOMINATIM + encodeURIComponent(search), function(data) { - if(!data || !data[0]) return; + if(!data || !data[0]) return true; var b = data[0].boundingbox; - if(!b) return; + if(!b) return true; var southWest = new L.LatLng(b[0], b[2]), northEast = new L.LatLng(b[1], b[3]), bounds = new L.LatLngBounds(southWest, northEast); window.map.fitBounds(bounds); if(window.isSmartphone()) window.smartphone.mapButton.click(); }); - e.preventDefault(); - }); - $('#geosearchwrapper img').click(function(){ - map.locate({setView : true, maxZoom: 13});; - }); } diff --git a/mobile/.gitignore b/mobile/.gitignore index 42e4ba7c..2f94c701 100644 --- a/mobile/.gitignore +++ b/mobile/.gitignore @@ -1,11 +1,34 @@ -.classpath -.project .settings/ -bin/ -gen/ -libs/ -proguard-project.txt -local.properties assets/total-conversion-build.user.js assets/user-location.user.js assets/plugins/ + +# built application files +*.apk +*.ap_ + +# files for the dex VM +*.dex + +# Java class files +*.class + +# generated files +bin/ +gen/ +out/ + +# Local configuration file (sdk path, etc) +local.properties + +# Eclipse project files +.classpath +.project + +# IntelliJ IDEA user settings +*.iws +.idea/workspace.xml +.idea/tasks.xml + +# Proguard logs +proguard_logs/ diff --git a/mobile/.idea/.name b/mobile/.idea/.name new file mode 100644 index 00000000..d884b924 --- /dev/null +++ b/mobile/.idea/.name @@ -0,0 +1 @@ +IITC-Mobile \ No newline at end of file diff --git a/mobile/.idea/compiler.xml b/mobile/.idea/compiler.xml new file mode 100644 index 00000000..217af471 --- /dev/null +++ b/mobile/.idea/compiler.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/mobile/.idea/copyright/profiles_settings.xml b/mobile/.idea/copyright/profiles_settings.xml new file mode 100644 index 00000000..3572571a --- /dev/null +++ b/mobile/.idea/copyright/profiles_settings.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/mobile/.idea/encodings.xml b/mobile/.idea/encodings.xml new file mode 100644 index 00000000..e206d70d --- /dev/null +++ b/mobile/.idea/encodings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/mobile/.idea/misc.xml b/mobile/.idea/misc.xml new file mode 100644 index 00000000..e0d90dd8 --- /dev/null +++ b/mobile/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/mobile/.idea/modules.xml b/mobile/.idea/modules.xml new file mode 100644 index 00000000..c7429177 --- /dev/null +++ b/mobile/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/mobile/.idea/scopes/scope_settings.xml b/mobile/.idea/scopes/scope_settings.xml new file mode 100644 index 00000000..922003b8 --- /dev/null +++ b/mobile/.idea/scopes/scope_settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/mobile/.idea/vcs.xml b/mobile/.idea/vcs.xml new file mode 100644 index 00000000..2e0588cc --- /dev/null +++ b/mobile/.idea/vcs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/mobile/AndroidManifest.xml b/mobile/AndroidManifest.xml index f9fc9e4d..b0fa5c5a 100644 --- a/mobile/AndroidManifest.xml +++ b/mobile/AndroidManifest.xml @@ -24,13 +24,23 @@ android:name="com.cradle.iitc_mobile.IITC_Mobile" android:theme="@style/AppBaseTheme" android:label="@string/app_name" + android:launchMode="singleTop" android:configChanges="orientation|keyboard|keyboardHidden|screenSize"> + + + + + + + + + @@ -46,6 +56,10 @@ android:scheme="http" android:pathPrefix="/intel"> + + + + @@ -74,7 +89,12 @@ + + + diff --git a/mobile/IITC-Mobile.iml b/mobile/IITC-Mobile.iml new file mode 100644 index 00000000..57c35466 --- /dev/null +++ b/mobile/IITC-Mobile.iml @@ -0,0 +1,25 @@ + + + + + + + MANIFEST_FILE_PATH + RESOURCES_DIR_PATH + ASSETS_DIR_PATH + NATIVE_LIBS_DIR_PATH + + + + + + + + + + + + + + + diff --git a/mobile/build.gradle b/mobile/build.gradle new file mode 100644 index 00000000..2fa22689 --- /dev/null +++ b/mobile/build.gradle @@ -0,0 +1,35 @@ +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:0.4' + } +} +apply plugin: 'android' + +dependencies { +} + +android { + compileSdkVersion 17 + buildToolsVersion "17" + + defaultConfig { + minSdkVersion 14 + targetSdkVersion 17 + } + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + resources.srcDirs = ['src'] + aidl.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + res.srcDirs = ['res'] + assets.srcDirs = ['assets'] + } + + instrumentTest.setRoot('tests') + } +} diff --git a/mobile/mobile.iml b/mobile/mobile.iml new file mode 100644 index 00000000..25a68b77 --- /dev/null +++ b/mobile/mobile.iml @@ -0,0 +1,25 @@ + + + + + + + MANIFEST_FILE_PATH + RESOURCES_DIR_PATH + ASSETS_DIR_PATH + NATIVE_LIBS_DIR_PATH + + + + + + + + + + + + + + + diff --git a/mobile/proguard-project.txt b/mobile/proguard-project.txt new file mode 100644 index 00000000..34f9866f --- /dev/null +++ b/mobile/proguard-project.txt @@ -0,0 +1,16 @@ +# view res/xml/preferences.xml #generated:4 +-keep class com.cradle.iitc_mobile.IITC_AboutDialogPreference { (...); } + +# view AndroidManifest.xml #generated:23 +-keep class com.cradle.iitc_mobile.IITC_Mobile { (...); } + +# view AndroidManifest.xml #generated:56 +-keep class com.cradle.iitc_mobile.IITC_SearchableActivity { (...); } + +# view AndroidManifest.xml #generated:50 +-keep class com.cradle.iitc_mobile.IITC_Settings { (...); } + +# view res/layout/activity_main.xml #generated:6 +-keep class com.cradle.iitc_mobile.IITC_WebView { (...); } + +-keep class com.cradle.iitc_mobile.IITC_JSInterface { (...); } \ No newline at end of file diff --git a/mobile/res/menu/main.xml b/mobile/res/menu/main.xml index eba307b5..e203e4fb 100644 --- a/mobile/res/menu/main.xml +++ b/mobile/res/menu/main.xml @@ -1,5 +1,9 @@ - + - - + + Debug Choose account to login Login failed. + Search Locations + Search \ No newline at end of file diff --git a/mobile/res/xml/searchable.xml b/mobile/res/xml/searchable.xml new file mode 100644 index 00000000..19c27279 --- /dev/null +++ b/mobile/res/xml/searchable.xml @@ -0,0 +1,8 @@ + + + diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index 88604777..d98ca631 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -4,6 +4,7 @@ import java.io.IOException; import android.app.ActionBar; import android.app.Activity; +import android.app.SearchManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -25,6 +26,7 @@ import android.view.MenuItem; import android.view.Window; import android.view.WindowManager; import android.webkit.WebView; +import android.widget.SearchView; import android.widget.Toast; public class IITC_Mobile extends Activity { @@ -42,6 +44,7 @@ public class IITC_Mobile extends Activity { private boolean fullscreen_actionbar = false; private ActionBar actionBar; private IITC_DeviceAccountLogin mLogin; + private MenuItem searchMenuItem; @Override protected void onCreate(Bundle savedInstanceState) { @@ -98,7 +101,7 @@ public class IITC_Mobile extends Activity { } public void onStatusChanged(String provider, int status, - Bundle extras) { + Bundle extras) { } public void onProviderEnabled(String provider) { @@ -120,8 +123,17 @@ public class IITC_Mobile extends Activity { fullscreen_actionbar = sharedPref.getBoolean("pref_fullscreen_actionbar", false); + handleIntent(getIntent(), true); + } + + @Override + protected void onNewIntent(Intent intent) { + setIntent(intent); + handleIntent(intent, false); + } + + private void handleIntent(Intent intent, boolean onCreate) { // load new iitc web view with ingress intel page - Intent intent = getIntent(); String action = intent.getAction(); if (Intent.ACTION_VIEW.equals(action)) { Uri uri = intent.getData(); @@ -133,7 +145,15 @@ public class IITC_Mobile extends Activity { Log.d("iitcm", "loading url..."); this.loadUrl(url); } - } else { + } else if (Intent.ACTION_SEARCH.equals(action)) { + String query = intent.getStringExtra(SearchManager.QUERY); + query = query.replace("'", "''"); + final SearchView searchView = + (SearchView) searchMenuItem.getActionView(); + searchView.setQuery(query, false); + searchView.clearFocus(); + iitc_view.loadUrl("javascript:search('" + query + "');"); + } else if (onCreate){ this.loadUrl(intel_url); } } @@ -238,7 +258,14 @@ public class IITC_Mobile extends Activity { public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); - + // Get the SearchView and set the searchable configuration + SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); + this.searchMenuItem = menu.findItem(R.id.menu_search); + final SearchView searchView = + (SearchView) searchMenuItem.getActionView(); + // Assumes current activity is the searchable activity + searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); + searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default return true; } @@ -246,63 +273,63 @@ public class IITC_Mobile extends Activity { public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection switch (item.getItemId()) { - case android.R.id.home : + case android.R.id.home: iitc_view.loadUrl("javascript: window.show('map');"); actionBar.setTitle(getString(R.string.menu_map)); return true; - case R.id.menu_map : + case R.id.menu_map: iitc_view.loadUrl("javascript: window.show('map');"); actionBar.setTitle(getString(R.string.menu_map)); return true; - case R.id.reload_button : + case R.id.reload_button: this.loadUrl(intel_url); actionBar.setTitle(getString(R.string.menu_map)); return true; - case R.id.toggle_fullscreen : + case R.id.toggle_fullscreen: toggleFullscreen(); return true; case R.id.layer_chooser: // the getLayers function calls the setLayers method of IITC_JSInterface iitc_view.loadUrl("javascript: window.layerChooser.getLayers()"); return true; - // get the users current location and focus it on map - case R.id.locate : + // get the users current location and focus it on map + case R.id.locate: iitc_view.loadUrl("javascript: window.show('map');"); iitc_view.loadUrl("javascript: window.map.locate({setView : true, maxZoom: 15});"); actionBar.setTitle(getString(R.string.menu_map)); return true; - // start settings activity - case R.id.action_settings : + // start settings activity + case R.id.action_settings: Intent intent = new Intent(this, IITC_Settings.class); intent.putExtra("iitc_version", iitc_view.getWebViewClient() .getIITCVersion()); startActivity(intent); return true; - case R.id.menu_info : + case R.id.menu_info: iitc_view.loadUrl("javascript: window.show('info');"); actionBar.setTitle(getString(R.string.menu_info)); return true; - case R.id.menu_full : + case R.id.menu_full: iitc_view.loadUrl("javascript: window.show('full');"); actionBar.setTitle(getString(R.string.menu_full)); return true; - case R.id.menu_compact : + case R.id.menu_compact: iitc_view.loadUrl("javascript: window.show('compact');"); actionBar.setTitle(getString(R.string.menu_compact)); return true; - case R.id.menu_public : + case R.id.menu_public: iitc_view.loadUrl("javascript: window.show('public');"); actionBar.setTitle(getString(R.string.menu_public)); return true; - case R.id.menu_faction : + case R.id.menu_faction: iitc_view.loadUrl("javascript: window.show('faction');"); actionBar.setTitle(getString(R.string.menu_faction)); return true; - case R.id.menu_debug : + case R.id.menu_debug: iitc_view.loadUrl("javascript: window.show('debug')"); actionBar.setTitle(getString(R.string.menu_debug)); return true; - default : + default: return super.onOptionsItemSelected(item); } } @@ -377,12 +404,12 @@ public class IITC_Mobile extends Activity { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { - case REQUEST_LOGIN : + case REQUEST_LOGIN: // authentication activity has returned. mLogin will continue authentication mLogin.onActivityResult(resultCode, data); break; - default : + default: super.onActivityResult(requestCode, resultCode, data); } } @@ -391,7 +418,7 @@ public class IITC_Mobile extends Activity { * called by IITC_WebViewClient when the Google login form is opened. */ public void onReceivedLoginRequest(IITC_WebViewClient client, WebView view, - String realm, String account, String args) { + String realm, String account, String args) { mLogin = new IITC_DeviceAccountLogin(this, view, client); mLogin.startLogin(realm, account, args); } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_WebView.java b/mobile/src/com/cradle/iitc_mobile/IITC_WebView.java index b3a752a3..2a910f2a 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_WebView.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_WebView.java @@ -26,6 +26,7 @@ public class IITC_WebView extends WebView { // init web view private void iitc_init(Context c) { + if ( this.isInEditMode() ) return; settings = this.getSettings(); settings.setJavaScriptEnabled(true); settings.setDomStorageEnabled(true);