Merge pull request #246 from hastarin/actionbar
Actionbar changes for IITC Mobile
							
								
								
									
										22
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,22 @@ | ||||
| # Auto detect text files and perform LF normalization | ||||
| * text=auto | ||||
|  | ||||
| # Custom for Visual Studio | ||||
| *.cs     diff=csharp | ||||
| *.sln    merge=union | ||||
| *.csproj merge=union | ||||
| *.vbproj merge=union | ||||
| *.fsproj merge=union | ||||
| *.dbproj merge=union | ||||
|  | ||||
| # Standard to msysgit | ||||
| *.doc	 diff=astextplain | ||||
| *.DOC	 diff=astextplain | ||||
| *.docx diff=astextplain | ||||
| *.DOCX diff=astextplain | ||||
| *.dot  diff=astextplain | ||||
| *.DOT  diff=astextplain | ||||
| *.pdf  diff=astextplain | ||||
| *.PDF	 diff=astextplain | ||||
| *.rtf	 diff=astextplain | ||||
| *.RTF	 diff=astextplain | ||||
							
								
								
									
										4
									
								
								build.py
									
									
									
									
									
								
							
							
						
						| @@ -220,6 +220,10 @@ if buildMobile: | ||||
|     # copy the user location script into the mobile folder. | ||||
|     shutil.copy(os.path.join(outDir,"user-location.user.js"), "mobile/assets/user-location.user.js") | ||||
|     # also copy plugins | ||||
|     try: | ||||
|         os.makedirs("mobile/assets/plugins") | ||||
|     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*')) | ||||
|  | ||||
|   | ||||
| @@ -3,6 +3,8 @@ | ||||
| // created a basic framework. All of these functions should only ever | ||||
| // be run once. | ||||
|  | ||||
| // Used to disable on multitouch devices | ||||
| window.showZoom = true; | ||||
|  | ||||
| window.setupBackButton = function() { | ||||
|   var c = window.isSmartphone() | ||||
| @@ -156,7 +158,7 @@ window.setupMap = function() { | ||||
|  | ||||
|  | ||||
|   window.map = new L.Map('map', $.extend(getPosition(), | ||||
|     {zoomControl: true} | ||||
|     {zoomControl: window.showZoom} | ||||
|   )); | ||||
|  | ||||
|   var addLayers = {}; | ||||
|   | ||||
							
								
								
									
										23
									
								
								code/chat.js
									
									
									
									
									
								
							
							
						
						| @@ -473,16 +473,14 @@ window.chat.needMoreMessages = function() { | ||||
|     chat.requestPublic(true); | ||||
| } | ||||
|  | ||||
|  | ||||
| window.chat.chooser = function(event) { | ||||
|   var t = $(event.target); | ||||
| window.chat.chooseAnchor = function(t) { | ||||
|   var tt = t.text(); | ||||
|  | ||||
|   var mark = $('#chatinput mark'); | ||||
|   var input = $('#chatinput input'); | ||||
|  | ||||
|   $('#chatcontrols .active').removeClass('active'); | ||||
|   t.addClass('active'); | ||||
|   $("#chatcontrols a:contains('" + tt + "')").addClass('active'); | ||||
|  | ||||
|   $('#chat > div').hide(); | ||||
|  | ||||
| @@ -520,10 +518,23 @@ window.chat.chooser = function(event) { | ||||
|     elm.scrollTop(elm.data('needsScrollTop')); | ||||
|     elm.data('needsScrollTop', null); | ||||
|   } | ||||
|  | ||||
|   chat.needMoreMessages(); | ||||
| } | ||||
|  | ||||
| window.chat.show = function(name) { | ||||
|         window.isSmartphone | ||||
|                 ? $('#updatestatus').hide() | ||||
|                 : $('#updatestatus').show(); | ||||
|     $('#chat, #chatinput').show(); | ||||
|     $('#map').css('visibility', 'hidden'); | ||||
|  | ||||
|     var t = $('<a>'+name+'</a>'); | ||||
|     window.chat.chooseAnchor(t); | ||||
| } | ||||
|  | ||||
| window.chat.chooser = function(event) { | ||||
|   var t = $(event.target); | ||||
|   window.chat.chooseAnchor(t); | ||||
| } | ||||
|  | ||||
| // contains the logic to keep the correct scroll position. | ||||
| window.chat.keepScrollPosition = function(box, scrollBefore, isOldMsgs) { | ||||
|   | ||||
| @@ -48,16 +48,23 @@ window.debug.console = function() { | ||||
|   $('#debugconsole').text(); | ||||
| } | ||||
|  | ||||
| window.debug.console.create = function() { | ||||
|   if($('#debugconsole').length) return; | ||||
|   $('#chatcontrols').append('<a>debug</a>'); | ||||
|   $('#chatcontrols a:last').click(function() { | ||||
| window.debug.console.show = function() { | ||||
|     $('#scrollwrapper, #updatestatus').hide(); | ||||
|     // not displaying the map causes bugs in Leaflet | ||||
|     $('#map').css('visibility', 'hidden'); | ||||
|     $('#chat, #chatinput').show(); | ||||
|          window.debug.console.create(); | ||||
|     $('#chatinput mark').css('cssText', 'color: #bbb !important').text('debug:'); | ||||
|     $('#chat > div').hide(); | ||||
|     $('#debugconsole').show(); | ||||
|     $('#chatcontrols .active').removeClass('active'); | ||||
|     $(this).addClass('active'); | ||||
|   }); | ||||
|     $("#chatcontrols a:contains('debug')").addClass('active'); | ||||
| } | ||||
|  | ||||
| window.debug.console.create = function() { | ||||
|   if($('#debugconsole').length) return; | ||||
|   $('#chatcontrols').append('<a>debug</a>'); | ||||
|   $('#chatcontrols a:last').click(window.debug.console.show); | ||||
|   $('#chat').append('<div style="display: none" id="debugconsole"><table></table></div>'); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -34,20 +34,12 @@ window.runOnSmartphonesBeforeBoot = function() { | ||||
|       + '</style>'); | ||||
|   } | ||||
|  | ||||
|   // this also matches the expand button, but it is hidden via CSS | ||||
|   $('#chatcontrols a').click(function() { | ||||
|     $('#scrollwrapper, #updatestatus').hide(); | ||||
|     // not displaying the map causes bugs in Leaflet | ||||
|     $('#map').css('visibility', 'hidden'); | ||||
|     $('#chat, #chatinput').show(); | ||||
|   }); | ||||
|  | ||||
|   window.smartphone.mapButton = $('<a>map</a>').click(function() { | ||||
|     $('#chat, #chatinput, #scrollwrapper').hide(); | ||||
|     $('#map').css('visibility', 'visible'); | ||||
|     $('#updatestatus').show(); | ||||
|     $('.active').removeClass('active'); | ||||
|     $(this).addClass('active'); | ||||
|     $('#chatcontrols a .active').removeClass('active'); | ||||
|     $("#chatcontrols a:contains('map')").addClass('active'); | ||||
|   }); | ||||
|  | ||||
|   window.smartphone.sideButton = $('<a>info</a>').click(function() { | ||||
| @@ -55,7 +47,7 @@ window.runOnSmartphonesBeforeBoot = function() { | ||||
|     $('#map').css('visibility', 'hidden'); | ||||
|     $('#scrollwrapper').show(); | ||||
|     $('.active').removeClass('active'); | ||||
|     $(this).addClass('active'); | ||||
|     $("#chatcontrols a:contains('info')").addClass('active'); | ||||
|   }); | ||||
|  | ||||
|   $('#chatcontrols').append(smartphone.mapButton).append(smartphone.sideButton); | ||||
| @@ -80,7 +72,6 @@ window.runOnSmartphonesAfterBoot = function() { | ||||
|   if(!isSmartphone()) return; | ||||
|   console.warn('running smartphone post boot stuff'); | ||||
|  | ||||
|   chat.toggle(); | ||||
|   smartphone.mapButton.click(); | ||||
|  | ||||
|   // disable img full view | ||||
|   | ||||
							
								
								
									
										30
									
								
								code/window_management.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,30 @@ | ||||
| // created to start cleaning up "window" interaction | ||||
| // | ||||
| window.show = function(id) { | ||||
|         switch(id) { | ||||
|                 case 'full': | ||||
|                         window.chat.show('full'); | ||||
|                         break; | ||||
|                 case 'compact': | ||||
|                         window.chat.show('compact'); | ||||
|                         break; | ||||
|                 case 'public': | ||||
|                         window.chat.show('public'); | ||||
|                         break; | ||||
|                 case 'faction': | ||||
|                         window.chat.show('faction'); | ||||
|                         break; | ||||
|                 case 'debug': | ||||
|                         window.debug.console.show(); | ||||
|                         break; | ||||
|                 case 'map': | ||||
|                         window.smartphone.mapButton.click(); | ||||
|                         break; | ||||
|                 case 'info': | ||||
|                         window.smartphone.sideButton.click(); | ||||
|                         break; | ||||
|                 default: | ||||
|                         window.smartphone.mapButton.click(); | ||||
|                         break; | ||||
|         } | ||||
| } | ||||
| @@ -16,7 +16,7 @@ | ||||
|         android:allowBackup="true" | ||||
|         android:icon="@drawable/ic_iitcm" | ||||
|         android:label="@string/app_name" | ||||
|         android:theme="@style/AppTheme" > | ||||
|         android:theme="@style/AppTheme" android:uiOptions="splitActionBarWhenNarrow"> | ||||
|         <activity | ||||
|             android:name="com.cradle.iitc_mobile.IITC_Mobile" | ||||
|             android:theme="@style/AppBaseTheme" | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-hdpi/action_about.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-hdpi/action_search.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-hdpi/action_settings.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.5 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-hdpi/alerts_and_states_warning.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-hdpi/av_full_screen.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-hdpi/content_remove.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-hdpi/device_access_location_found.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.7 KiB | 
| Before Width: | Height: | Size: 2.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-hdpi/location_map.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-hdpi/navigation_refresh.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-hdpi/social_group.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.0 KiB | 
| Before Width: | Height: | Size: 1.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-mdpi/action_about.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-mdpi/action_search.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-mdpi/action_settings.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-mdpi/alerts_and_states_warning.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-mdpi/av_full_screen.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-mdpi/content_remove.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-mdpi/device_access_location_found.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.4 KiB | 
| Before Width: | Height: | Size: 1.2 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-mdpi/location_map.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-mdpi/navigation_refresh.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-mdpi/social_group.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-xhdpi/action_about.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-xhdpi/action_search.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-xhdpi/action_settings.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-xhdpi/alerts_and_states_warning.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-xhdpi/av_full_screen.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-xhdpi/content_remove.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-xhdpi/device_access_location_found.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.2 KiB | 
| Before Width: | Height: | Size: 2.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-xhdpi/location_map.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.5 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-xhdpi/navigation_refresh.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mobile/res/drawable-xhdpi/social_group.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.5 KiB | 
| @@ -1,30 +1,92 @@ | ||||
| <menu xmlns:android="http://schemas.android.com/apk/res/android" > | ||||
|     <item android:id="@+id/reload_button" | ||||
|         android:icon="@drawable/ic_menu_refresh" | ||||
|         android:orderInCategory="90" | ||||
|         android:showAsAction="ifRoom" | ||||
|         android:title="@string/reload"></item> | ||||
|  | ||||
|     <item android:id="@+id/settings" | ||||
|         android:orderInCategory="120" | ||||
|     <item | ||||
|         android:id="@+id/menu_map" | ||||
|         android:icon="@drawable/location_map" | ||||
|         android:orderInCategory="20" | ||||
|         android:showAsAction="ifRoom" | ||||
|         android:title="@string/menu_map"> | ||||
|     </item> | ||||
|     <item | ||||
|         android:id="@+id/menu_info" | ||||
|         android:icon="@drawable/action_about" | ||||
|         android:orderInCategory="30" | ||||
|         android:showAsAction="ifRoom" | ||||
|         android:title="@string/menu_info"> | ||||
|     </item> | ||||
|     <item | ||||
|         android:id="@+id/menu_chat" | ||||
|         android:icon="@drawable/social_group" | ||||
|         android:orderInCategory="35" | ||||
|         android:showAsAction="ifRoom" | ||||
|         android:title="@string/menu_chat"> | ||||
|         <menu> | ||||
|             <item | ||||
|                 android:id="@+id/menu_full" | ||||
|                 android:orderInCategory="40" | ||||
|                 android:showAsAction="never" | ||||
|         android:title="@string/action_settings"></item> | ||||
|  | ||||
|     <item android:id="@+id/cache_clear" | ||||
|         android:orderInCategory="100" | ||||
|                 android:title="@string/menu_full"> | ||||
|             </item> | ||||
|             <item | ||||
|                 android:id="@+id/menu_compact" | ||||
|                 android:orderInCategory="50" | ||||
|                 android:showAsAction="never" | ||||
|         android:title="@string/cache_clear"></item> | ||||
|  | ||||
|     <item android:id="@+id/toggle_fullscreen" | ||||
|         android:orderInCategory="100" | ||||
|         android:showAsAction="ifRoom" | ||||
|         android:title="@string/toggle_fullscreen" | ||||
|         android:icon="@android:drawable/ic_menu_zoom"></item> | ||||
|  | ||||
|     <item android:id="@+id/locate" | ||||
|         android:icon="@android:drawable/ic_menu_mylocation" | ||||
|         android:orderInCategory="80" | ||||
|         android:showAsAction="ifRoom" | ||||
|         android:title="@string/locate"></item> | ||||
|  | ||||
|                 android:title="@string/menu_compact"> | ||||
|             </item> | ||||
|             <item | ||||
|                 android:id="@+id/menu_public" | ||||
|                 android:orderInCategory="60" | ||||
|                 android:showAsAction="never" | ||||
|                 android:title="@string/menu_public"> | ||||
|             </item> | ||||
|             <item | ||||
|                 android:id="@+id/menu_faction" | ||||
|                 android:orderInCategory="70" | ||||
|                 android:showAsAction="never" | ||||
|                 android:title="@string/menu_faction"> | ||||
|             </item> | ||||
|         </menu> | ||||
|     </item> | ||||
|     <item | ||||
|         android:id="@+id/locate" | ||||
|         android:icon="@drawable/device_access_location_found" | ||||
|         android:orderInCategory="100" | ||||
|         android:showAsAction="ifRoom" | ||||
|         android:title="@string/locate"> | ||||
|     </item> | ||||
|     <item | ||||
|         android:id="@+id/reload_button" | ||||
|         android:icon="@drawable/navigation_refresh" | ||||
|         android:orderInCategory="110" | ||||
|         android:showAsAction="ifRoom" | ||||
|         android:title="@string/reload"> | ||||
|     </item> | ||||
|     <item | ||||
|         android:id="@+id/toggle_fullscreen" | ||||
|         android:icon="@drawable/av_full_screen" | ||||
|         android:orderInCategory="120" | ||||
|         android:showAsAction="ifRoom" | ||||
|         android:title="@string/toggle_fullscreen"> | ||||
|     </item> | ||||
|     <item | ||||
|         android:id="@+id/action_settings" | ||||
|         android:icon="@drawable/action_settings" | ||||
|         android:orderInCategory="130" | ||||
|         android:showAsAction="ifRoom" | ||||
|         android:title="@string/action_settings"> | ||||
|     </item> | ||||
|     <item | ||||
|         android:id="@+id/cache_clear" | ||||
|         android:icon="@drawable/content_remove" | ||||
|         android:orderInCategory="150" | ||||
|         android:showAsAction="never" | ||||
|         android:title="@string/cache_clear"> | ||||
|     </item> | ||||
|     <item | ||||
|         android:id="@+id/menu_debug" | ||||
|         android:icon="@drawable/alerts_and_states_warning" | ||||
|         android:orderInCategory="190" | ||||
|         android:showAsAction="never" | ||||
|         android:title="@string/menu_debug"> | ||||
|     </item> | ||||
| </menu> | ||||
| @@ -34,8 +34,8 @@ | ||||
|     <string name="pref_misc_cat">Misc</string> | ||||
|     <string name="pref_plugins">Plugins</string> | ||||
|     <string name="pref_plugins_title">Available plugins</string> | ||||
|     <string name="pref_force_desktop">Force desktop mode</string> | ||||
|     <string name="pref_force_desktop_sum">Nice for tablets, looks awful on smartphones</string> | ||||
|     <string name="pref_user_zoom">Show zoom control</string> | ||||
|     <string name="pref_user_zoom_sum">Shows +/- buttons even on multitouch capable devices.</string> | ||||
|     <string name="pref_user_loc">Display user location</string> | ||||
|     <string name="pref_user_loc_sum">Show users position on map</string> | ||||
|     <string name="pref_force_https">Force https</string> | ||||
| @@ -46,4 +46,12 @@ | ||||
| 	    Please copy all sources from $IITC_folder/build/mobile/ to /sdcard/IITC_Mobile/dev/.</string> | ||||
|     <string name="pref_select_iitc">IITC source</string> | ||||
|  | ||||
|     <string name="menu_chat">Chat</string> | ||||
|     <string name="menu_map">Map</string> | ||||
|     <string name="menu_full">Full</string> | ||||
|     <string name="menu_compact">Compact</string> | ||||
|     <string name="menu_public">Public</string> | ||||
|     <string name="menu_faction">Faction</string> | ||||
|     <string name="menu_info">Info</string> | ||||
|     <string name="menu_debug">Debug</string> | ||||
| </resources> | ||||
| @@ -13,9 +13,9 @@ | ||||
|         android:key="pref_about_cat" | ||||
|         android:title="@string/pref_ui_cat"> | ||||
| 	    <CheckBoxPreference | ||||
| 	        android:key="pref_force_desktop" | ||||
| 	        android:title="@string/pref_force_desktop" | ||||
| 	        android:summary="@string/pref_force_desktop_sum" | ||||
|                 android:key="pref_user_zoom" | ||||
|                 android:title="@string/pref_user_zoom" | ||||
|                 android:summary="@string/pref_user_zoom_sum" | ||||
| 	        android:defaultValue="false" /> | ||||
| 	    <CheckBoxPreference | ||||
| 	        android:key="pref_user_loc" | ||||
|   | ||||
| @@ -30,6 +30,7 @@ body { | ||||
| #chatcontrols { | ||||
|   height: 38px; | ||||
|   width: 100%; | ||||
|   display: none !important; | ||||
| } | ||||
|  | ||||
| /* hide shrink button */ | ||||
| @@ -52,7 +53,7 @@ body { | ||||
| #chat { | ||||
|   left:0; | ||||
|   right:0; | ||||
|   top:37px !important; | ||||
|   top: 1px !important; | ||||
|   bottom:30px; | ||||
|   width: auto; | ||||
| } | ||||
| @@ -66,15 +67,21 @@ body { | ||||
|   width: 77px; | ||||
| } | ||||
|  | ||||
| #chatcontrols a.active { | ||||
|   border-color: #FFCE00; | ||||
|   border-bottom-width:0px; | ||||
|   font-weight:bold | ||||
| } | ||||
|  | ||||
|  | ||||
| #chatcontrols a.active + a { | ||||
|   border-left-color: #FFCE00 | ||||
| } | ||||
|  | ||||
| #sidebartoggle { | ||||
|   display: none !important; | ||||
| } | ||||
|  | ||||
| #scrollwrapper { | ||||
|   top: 36px; | ||||
|   bottom: 0; | ||||
|   max-height: none !important; | ||||
|   width: 100% !important; | ||||
|   | ||||
| @@ -20,11 +20,10 @@ public class IITC_AboutDialogPreference extends DialogPreference{ | ||||
|     } | ||||
|  | ||||
|     /* | ||||
|      * start a little about-dialog | ||||
|      * srsly...I found no better way for clickable links in a TextView then | ||||
|      * using Html.fromHtml...Linkify is just broken and does not understand | ||||
|      * html href tags...so let's tag the @string/about_msg with CDATA and | ||||
|      * use Html.fromHtml(...) for clickable hrefs with tags. | ||||
|      * start a little about-dialog srsly...I found no better way for clickable | ||||
|      * links in a TextView then using Html.fromHtml...Linkify is just broken and | ||||
|      * does not understand html href tags...so let's tag the @string/about_msg | ||||
|      * with CDATA and use Html.fromHtml(...) for clickable hrefs with tags. | ||||
|      */ | ||||
|     @Override | ||||
|     protected void onPrepareDialogBuilder(Builder builder) { | ||||
| @@ -32,8 +31,7 @@ public class IITC_AboutDialogPreference extends DialogPreference{ | ||||
|         String about_msg = context.getText(R.string.pref_about_msg).toString(); | ||||
|         message.setText(Html.fromHtml(about_msg)); | ||||
|         message.setMovementMethod(LinkMovementMethod.getInstance()); | ||||
|         builder.setView(message) | ||||
|                .setTitle(R.string.about) | ||||
|         builder.setView(message).setTitle(R.string.about) | ||||
|                 .setIcon(android.R.drawable.ic_dialog_info) | ||||
|                 .setNeutralButton(R.string.close, new OnClickListener() { | ||||
|                     public void onClick(DialogInterface dialog, int id) { | ||||
|   | ||||
| @@ -21,7 +21,8 @@ public class IITC_JSInterface { | ||||
|     // 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 + portal_name; | ||||
|         String uri = "geo:" + lat + "," + lng + "?q=" + lat + "," + lng | ||||
|                 + portal_name; | ||||
|         Intent intent = new Intent(android.content.Intent.ACTION_VIEW, | ||||
|                 Uri.parse(uri)); | ||||
|         context.startActivity(intent); | ||||
| @@ -30,9 +31,11 @@ public class IITC_JSInterface { | ||||
|     // copy link to specific portal to android clipboard | ||||
|     @JavascriptInterface | ||||
|     public void copy(String s) { | ||||
|         ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); | ||||
|         ClipboardManager clipboard = (ClipboardManager) context | ||||
|                 .getSystemService(Context.CLIPBOARD_SERVICE); | ||||
|         ClipData clip = ClipData.newPlainText("Copied Text ", s); | ||||
|         clipboard.setPrimaryClip(clip); | ||||
|         Toast.makeText(context, "copied to clipboard", Toast.LENGTH_SHORT).show(); | ||||
|         Toast.makeText(context, "copied to clipboard", Toast.LENGTH_SHORT) | ||||
|                 .show(); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -3,7 +3,6 @@ package com.cradle.iitc_mobile; | ||||
| import java.io.IOException; | ||||
|  | ||||
| import com.cradle.iitc_mobile.R; | ||||
|  | ||||
| import android.location.Location; | ||||
| import android.location.LocationListener; | ||||
| import android.location.LocationManager; | ||||
| @@ -14,6 +13,7 @@ import android.os.Bundle; | ||||
| import android.os.Handler; | ||||
| import android.os.StrictMode; | ||||
| import android.preference.PreferenceManager; | ||||
| import android.app.ActionBar; | ||||
| import android.app.Activity; | ||||
| import android.content.Context; | ||||
| import android.content.Intent; | ||||
| @@ -32,7 +32,6 @@ public class IITC_Mobile extends Activity { | ||||
|  | ||||
|     private IITC_WebView iitc_view; | ||||
|     private boolean back_button_pressed = false; | ||||
|     private boolean desktop = false; | ||||
|     private OnSharedPreferenceChangeListener listener; | ||||
|     private String intel_url = "https://www.ingress.com/intel"; | ||||
|     private boolean user_loc = false; | ||||
| @@ -40,36 +39,49 @@ public class IITC_Mobile extends Activity { | ||||
|     private LocationListener loc_listener = null; | ||||
|     private boolean keyboad_open = false; | ||||
|     private boolean fullscreen_mode = false; | ||||
|     private ActionBar actionBar; | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|  | ||||
|         // TODO build an async task for url.openStream() in IITC_WebViewClient | ||||
|         StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); | ||||
|         StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() | ||||
|                 .permitAll().build(); | ||||
|         StrictMode.setThreadPolicy(policy); | ||||
|         setContentView(R.layout.activity_main); | ||||
|         iitc_view = (IITC_WebView) findViewById(R.id.iitc_webview); | ||||
|  | ||||
|         SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); | ||||
|         actionBar = this.getActionBar(); | ||||
|         actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ||||
|                 | ActionBar.DISPLAY_USE_LOGO | ActionBar.DISPLAY_SHOW_TITLE); | ||||
|         actionBar.setTitle(getString(R.string.menu_map)); | ||||
|         actionBar.setHomeButtonEnabled(true); | ||||
|  | ||||
|         SharedPreferences sharedPref = PreferenceManager | ||||
|                 .getDefaultSharedPreferences(this); | ||||
|         listener = new OnSharedPreferenceChangeListener() { | ||||
|             @Override | ||||
|             public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { | ||||
|                 if (key.equals("pref_force_desktop")) | ||||
|                     desktop = sharedPreferences.getBoolean("pref_force_desktop", false); | ||||
|             public void onSharedPreferenceChanged( | ||||
|                     SharedPreferences sharedPreferences, String key) { | ||||
|                 if (key.equals("pref_user_loc")) | ||||
|                     user_loc = sharedPreferences.getBoolean("pref_user_loc", false); | ||||
|                     user_loc = sharedPreferences.getBoolean("pref_user_loc", | ||||
|                             false); | ||||
|                 IITC_Mobile.this.loadUrl(intel_url); | ||||
|             } | ||||
|         }; | ||||
|         sharedPref.registerOnSharedPreferenceChangeListener(listener); | ||||
|  | ||||
|         // we need this one to prevent location updates to javascript when keyboard is open | ||||
|         // we need this one to prevent location updates to javascript when | ||||
|         // keyboard is open | ||||
|         // it closes on updates | ||||
|         iitc_view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { | ||||
|         iitc_view.getViewTreeObserver().addOnGlobalLayoutListener( | ||||
|                 new OnGlobalLayoutListener() { | ||||
|                     @Override | ||||
|                     public void onGlobalLayout() { | ||||
|                         Rect r = new Rect(); | ||||
|               //r will be populated with the coordinates of your view that area still visible. | ||||
|                         // r will be populated with the coordinates of your view | ||||
|                         // that area still visible. | ||||
|                         iitc_view.getWindowVisibleDisplayFrame(r); | ||||
|  | ||||
|                         int screenHeight = iitc_view.getRootView().getHeight(); | ||||
| @@ -85,27 +97,36 @@ public class IITC_Mobile extends Activity { | ||||
|                     } | ||||
|                 }); | ||||
|         // Acquire a reference to the system Location Manager | ||||
|         loc_mngr = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); | ||||
|         loc_mngr = (LocationManager) this | ||||
|                 .getSystemService(Context.LOCATION_SERVICE); | ||||
|  | ||||
|         // Define a listener that responds to location updates | ||||
|         loc_listener = new LocationListener() { | ||||
|             public void onLocationChanged(Location location) { | ||||
|               // Called when a new location is found by the network location provider. | ||||
|                 // Called when a new location is found by the network location | ||||
|                 // provider. | ||||
|                 drawMarker(location); | ||||
|             } | ||||
|  | ||||
|             public void onStatusChanged(String provider, int status, Bundle extras) {} | ||||
|             public void onStatusChanged(String provider, int status, | ||||
|                     Bundle extras) { | ||||
|             } | ||||
|  | ||||
|             public void onProviderEnabled(String provider) {} | ||||
|             public void onProviderEnabled(String provider) { | ||||
|             } | ||||
|  | ||||
|             public void onProviderDisabled(String provider) {} | ||||
|             public void onProviderDisabled(String provider) { | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         user_loc = sharedPref.getBoolean("pref_user_loc", false); | ||||
|         if (user_loc == true) { | ||||
|             // Register the listener with the Location Manager to receive location updates | ||||
|             loc_mngr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, loc_listener); | ||||
|             loc_mngr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, loc_listener); | ||||
|             // Register the listener with the Location Manager to receive | ||||
|             // location updates | ||||
|             loc_mngr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, | ||||
|                     0, 0, loc_listener); | ||||
|             loc_mngr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, | ||||
|                     loc_listener); | ||||
|         } | ||||
|  | ||||
|         // load new iitc web view with ingress intel page | ||||
| @@ -121,8 +142,7 @@ public class IITC_Mobile extends Activity { | ||||
|                 Log.d("iitcm", "loading url..."); | ||||
|                 this.loadUrl(url); | ||||
|             } | ||||
|         } | ||||
|         else { | ||||
|         } else { | ||||
|             this.loadUrl(intel_url); | ||||
|         } | ||||
|     } | ||||
| @@ -138,9 +158,12 @@ public class IITC_Mobile extends Activity { | ||||
|         iitc_view.updateCaching(); | ||||
|  | ||||
|         if (user_loc == true) { | ||||
|             // Register the listener with the Location Manager to receive location updates | ||||
|             loc_mngr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, loc_listener); | ||||
|             loc_mngr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, loc_listener); | ||||
|             // Register the listener with the Location Manager to receive | ||||
|             // location updates | ||||
|             loc_mngr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, | ||||
|                     0, 0, loc_listener); | ||||
|             loc_mngr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, | ||||
|                     loc_listener); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -148,25 +171,32 @@ public class IITC_Mobile extends Activity { | ||||
|     protected void onStop() { | ||||
|         ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); | ||||
|  | ||||
|         NetworkInfo mobile = conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); | ||||
|         NetworkInfo mobile = conMan | ||||
|                 .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); | ||||
|         NetworkInfo wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI); | ||||
|  | ||||
|         // check if Mobile or Wifi module is available..then handle states | ||||
|         // TODO: theory...we do not have to check for a Wifi module...every android device should have one | ||||
|         // TODO: theory...we do not have to check for a Wifi module...every | ||||
|         // android device should have one | ||||
|         if (mobile != null) { | ||||
|             Log.d("iitcm", "mobile internet module detected...check states"); | ||||
|             if (mobile.getState() == NetworkInfo.State.CONNECTED || mobile.getState() == NetworkInfo.State.CONNECTING) { | ||||
|                 Log.d("iitcm", "connected to mobile net...abort all running requests"); | ||||
|             if (mobile.getState() == NetworkInfo.State.CONNECTED | ||||
|                     || mobile.getState() == NetworkInfo.State.CONNECTING) { | ||||
|                 Log.d("iitcm", | ||||
|                         "connected to mobile net...abort all running requests"); | ||||
|                 // cancel all current requests | ||||
|                 iitc_view.loadUrl("javascript: window.requests.abort()"); | ||||
|                 // set idletime to maximum...no need for more | ||||
|                 iitc_view.loadUrl("javascript: window.idleTime = 999"); | ||||
|             } else if (wifi.getState() == NetworkInfo.State.CONNECTED || wifi.getState() == NetworkInfo.State.CONNECTING) { | ||||
|             } else if (wifi.getState() == NetworkInfo.State.CONNECTED | ||||
|                     || wifi.getState() == NetworkInfo.State.CONNECTING) { | ||||
|                 iitc_view.loadUrl("javascript: window.idleTime = 999"); | ||||
|             } | ||||
|         } else { | ||||
|             Log.d("iitcm", "no mobile internet module detected...check wifi state"); | ||||
|             if (wifi.getState() == NetworkInfo.State.CONNECTED || wifi.getState() == NetworkInfo.State.CONNECTING) { | ||||
|             Log.d("iitcm", | ||||
|                     "no mobile internet module detected...check wifi state"); | ||||
|             if (wifi.getState() == NetworkInfo.State.CONNECTED | ||||
|                     || wifi.getState() == NetworkInfo.State.CONNECTING) { | ||||
|                 iitc_view.loadUrl("javascript: window.idleTime = 999"); | ||||
|             } | ||||
|         } | ||||
| @@ -193,7 +223,7 @@ public class IITC_Mobile extends Activity { | ||||
|         // leave fullscreen mode if it is enabled | ||||
|         if (fullscreen_mode) { | ||||
|             // get back action bar | ||||
|             this.getActionBar().show(); | ||||
|             actionBar.show(); | ||||
|             // show notification bar again | ||||
|             WindowManager.LayoutParams attrs = getWindow().getAttributes(); | ||||
|             attrs.flags ^= WindowManager.LayoutParams.FLAG_FULLSCREEN; | ||||
| @@ -223,6 +253,7 @@ 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); | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
| @@ -230,8 +261,17 @@ public class IITC_Mobile extends Activity { | ||||
|     public boolean onOptionsItemSelected(MenuItem item) { | ||||
|         // Handle item selection | ||||
|         switch (item.getItemId()) { | ||||
|             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 : | ||||
|                 iitc_view.loadUrl("javascript: window.show('map');"); | ||||
|                 actionBar.setTitle(getString(R.string.menu_map)); | ||||
|                 return true; | ||||
|             case R.id.reload_button : | ||||
|                 this.loadUrl(intel_url); | ||||
|                 actionBar.setTitle(getString(R.string.menu_map)); | ||||
|                 return true; | ||||
|                 // clear cache | ||||
|             case R.id.cache_clear : | ||||
| @@ -245,18 +285,21 @@ public class IITC_Mobile extends Activity { | ||||
|                     // get rid of action bar | ||||
|                     this.getActionBar().hide(); | ||||
|                     // hide notification bar | ||||
|                 WindowManager.LayoutParams attrs = getWindow().getAttributes(); | ||||
|                     WindowManager.LayoutParams attrs = getWindow() | ||||
|                             .getAttributes(); | ||||
|                     attrs.flags ^= WindowManager.LayoutParams.FLAG_FULLSCREEN; | ||||
|                     this.getWindow().setAttributes(attrs); | ||||
|                     this.fullscreen_mode = true; | ||||
|                     // show a little toast for the user | ||||
|                 Toast.makeText(this, "Press back button to exit fullscreen", Toast.LENGTH_SHORT).show(); | ||||
|             } | ||||
|             else { | ||||
|                     Toast.makeText(this, | ||||
|                             "Press back button to exit fullscreen", | ||||
|                             Toast.LENGTH_SHORT).show(); | ||||
|                 } else { | ||||
|                     // get back action bar | ||||
|                     this.getActionBar().show(); | ||||
|                     // show notification bar again | ||||
|                 WindowManager.LayoutParams attrs = getWindow().getAttributes(); | ||||
|                     WindowManager.LayoutParams attrs = getWindow() | ||||
|                             .getAttributes(); | ||||
|                     attrs.flags ^= WindowManager.LayoutParams.FLAG_FULLSCREEN; | ||||
|                     this.getWindow().setAttributes(attrs); | ||||
|                     this.fullscreen_mode = false; | ||||
| @@ -264,14 +307,42 @@ public class IITC_Mobile extends Activity { | ||||
|                 return true; | ||||
|                 // get the users current location and focus it on map | ||||
|             case R.id.locate : | ||||
|             iitc_view.loadUrl("javascript: window.map.locate({setView : true, maxZoom: 13});"); | ||||
|                 iitc_view.loadUrl("javascript: window.show('map');"); | ||||
|                 iitc_view | ||||
|                         .loadUrl("javascript: window.map.locate({setView : true, maxZoom: 13});"); | ||||
|                 actionBar.setTitle(getString(R.string.menu_map)); | ||||
|                 return true; | ||||
|                 // start settings activity | ||||
|         case R.id.settings: | ||||
|             case R.id.action_settings : | ||||
|                 Intent intent = new Intent(this, IITC_Settings.class); | ||||
|             intent.putExtra("iitc_version", iitc_view.getWebViewClient().getIITCVersion()); | ||||
|                 intent.putExtra("iitc_version", iitc_view.getWebViewClient() | ||||
|                         .getIITCVersion()); | ||||
|                 startActivity(intent); | ||||
|                 return true; | ||||
|             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 : | ||||
|                 iitc_view.loadUrl("javascript: window.show('full');"); | ||||
|                 actionBar.setTitle(getString(R.string.menu_full)); | ||||
|                 return true; | ||||
|             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 : | ||||
|                 iitc_view.loadUrl("javascript: window.show('public');"); | ||||
|                 actionBar.setTitle(getString(R.string.menu_public)); | ||||
|                 return true; | ||||
|             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 : | ||||
|                 iitc_view.loadUrl("javascript: window.show('debug')"); | ||||
|                 actionBar.setTitle(getString(R.string.menu_debug)); | ||||
|                 return true; | ||||
|             default : | ||||
|                 return super.onOptionsItemSelected(item); | ||||
|         } | ||||
| @@ -287,14 +358,9 @@ public class IITC_Mobile extends Activity { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // vp=f enables desktop mode...vp=m is the defaul mobile view | ||||
|     // Force mobile view. | ||||
|     // New actions are not compatible with desktop mode | ||||
|     private String addUrlParam(String url) { | ||||
|         SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); | ||||
|         this.desktop = sharedPref.getBoolean("pref_force_desktop", false); | ||||
|  | ||||
|         if (desktop) | ||||
|             return (url + "?vp=f"); | ||||
|         else | ||||
|         return (url + "?vp=m"); | ||||
|     } | ||||
|  | ||||
| @@ -313,9 +379,9 @@ public class IITC_Mobile extends Activity { | ||||
|         // should avoid gps glitches | ||||
|         if (loc.getAccuracy() < 100) { | ||||
|             if (keyboad_open == false) { | ||||
|                 iitc_view.loadUrl("javascript: " + | ||||
|                         "window.plugin.userLocation.updateLocation( " + | ||||
|                         loc.getLatitude() + ", " + loc.getLongitude() + ");"); | ||||
|                 iitc_view.loadUrl("javascript: " | ||||
|                         + "window.plugin.userLocation.updateLocation( " | ||||
|                         + loc.getLatitude() + ", " + loc.getLongitude() + ");"); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -33,13 +33,16 @@ public class IITC_Settings extends Activity { | ||||
|             Scanner s = null; | ||||
|             String src = ""; | ||||
|             try { | ||||
|                 s = new Scanner(am.open("plugins/" + asset_array[i])).useDelimiter("\\A"); | ||||
|                 s = new Scanner(am.open("plugins/" + asset_array[i])) | ||||
|                         .useDelimiter("\\A"); | ||||
|             } catch (IOException e2) { | ||||
|                 // TODO Auto-generated catch block | ||||
|                 e2.printStackTrace(); | ||||
|             } | ||||
|             if (s != null) src = s.hasNext() ? s.next() : ""; | ||||
|             String header = src.substring(src.indexOf("==UserScript=="), src.indexOf("==/UserScript==")); | ||||
|             if (s != null) | ||||
|                 src = s.hasNext() ? s.next() : ""; | ||||
|             String header = src.substring(src.indexOf("==UserScript=="), | ||||
|                     src.indexOf("==/UserScript==")); | ||||
|             // remove new line comments and replace with space | ||||
|             // this way we get double spaces instead of newline + double slash | ||||
|             header = header.replace("\n//", " "); | ||||
| @@ -48,7 +51,8 @@ public class IITC_Settings extends Activity { | ||||
|             String plugin_name = "not found"; | ||||
|             for (int j = 0; j < attributes.length; j++) { | ||||
|                 // search for name and use the value | ||||
|                 if (attributes[j].equals("@name")) plugin_name = attributes[j+1]; | ||||
|                 if (attributes[j].equals("@name")) | ||||
|                     plugin_name = attributes[j + 1]; | ||||
|             } | ||||
|             asset_list.add(plugin_name); | ||||
|             // real value | ||||
| @@ -56,13 +60,14 @@ public class IITC_Settings extends Activity { | ||||
|         } | ||||
|  | ||||
|         Bundle bundle = getIntent().getExtras(); | ||||
|         bundle.putStringArray("ASSETS", (String[]) asset_list.toArray(new String[0])); | ||||
|         bundle.putStringArray("ASSETS_VAL", (String[]) asset_values.toArray(new String[0])); | ||||
|         bundle.putStringArray("ASSETS", | ||||
|                 (String[]) asset_list.toArray(new String[0])); | ||||
|         bundle.putStringArray("ASSETS_VAL", | ||||
|                 (String[]) asset_values.toArray(new String[0])); | ||||
|         settings.setArguments(bundle); | ||||
|  | ||||
|         // Display the fragment as the main content. | ||||
|         getFragmentManager().beginTransaction() | ||||
|                 .replace(android.R.id.content, settings) | ||||
|                 .commit(); | ||||
|                 .replace(android.R.id.content, settings).commit(); | ||||
|     } | ||||
| } | ||||
| @@ -26,17 +26,18 @@ public class IITC_SettingsFragment extends PreferenceFragment { | ||||
|         // plugins | ||||
|         MultiSelectListPreference pref_plugins = (MultiSelectListPreference) findPreference("pref_plugins"); | ||||
|         pref_plugins.setEntries(getArguments().getStringArray("ASSETS")); | ||||
|         pref_plugins.setEntryValues(getArguments().getStringArray("ASSETS_VAL")); | ||||
|         pref_plugins | ||||
|                 .setEntryValues(getArguments().getStringArray("ASSETS_VAL")); | ||||
|  | ||||
|         // set build version | ||||
|         ListPreference pref_build_version = (ListPreference) findPreference("pref_build_version"); | ||||
|         PackageManager pm = getActivity().getPackageManager(); | ||||
|         String version = "unknown"; | ||||
|         try { | ||||
|             PackageInfo info = pm.getPackageInfo(getActivity().getPackageName(), 0); | ||||
|             PackageInfo info = pm.getPackageInfo( | ||||
|                     getActivity().getPackageName(), 0); | ||||
|             version = info.versionName; | ||||
|         } | ||||
|         catch (NameNotFoundException e) { | ||||
|         } catch (NameNotFoundException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         pref_build_version.setSummary(version); | ||||
| @@ -47,16 +48,20 @@ public class IITC_SettingsFragment extends PreferenceFragment { | ||||
|  | ||||
|         // set iitc source | ||||
|         EditTextPreference pref_iitc_source = (EditTextPreference) findPreference("pref_iitc_source"); | ||||
|         pref_iitc_source.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { | ||||
|         pref_iitc_source | ||||
|                 .setOnPreferenceChangeListener(new OnPreferenceChangeListener() { | ||||
|                     @Override | ||||
|             public boolean onPreferenceChange(Preference preference, Object newValue) { | ||||
|                     public boolean onPreferenceChange(Preference preference, | ||||
|                             Object newValue) { | ||||
|                         preference.setSummary((CharSequence) newValue); | ||||
|                 // TODO: update iitc_version when iitc source has changed | ||||
|                         // TODO: update iitc_version when iitc source has | ||||
|                         // changed | ||||
|                         return true; | ||||
|                     } | ||||
|                 }); | ||||
|         // first init of summary | ||||
|         String pref_iitc_source_sum = (String) pref_iitc_source.getSummary() + pref_iitc_source.getText(); | ||||
|         String pref_iitc_source_sum = (String) pref_iitc_source.getSummary() | ||||
|                 + pref_iitc_source.getText(); | ||||
|         pref_iitc_source.setSummary(pref_iitc_source_sum); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -28,8 +28,10 @@ public class IITC_WebView extends WebView { | ||||
|         settings.setAllowFileAccess(true); | ||||
|         settings.setGeolocationEnabled(true); | ||||
|         settings.setAppCacheEnabled(true); | ||||
|         settings.setDatabasePath(this.getContext().getApplicationInfo().dataDir + "/databases/"); | ||||
|         settings.setAppCachePath(this.getContext().getCacheDir().getAbsolutePath()); | ||||
|         settings.setDatabasePath(this.getContext().getApplicationInfo().dataDir | ||||
|                 + "/databases/"); | ||||
|         settings.setAppCachePath(this.getContext().getCacheDir() | ||||
|                 .getAbsolutePath()); | ||||
|         // use cache if on mobile network...saves traffic | ||||
|         this.js_interface = new IITC_JSInterface(c); | ||||
|         this.addJavascriptInterface(js_interface, "android"); | ||||
| @@ -38,7 +40,8 @@ public class IITC_WebView extends WebView { | ||||
|         // allow access by default | ||||
|         this.setWebChromeClient(new WebChromeClient() { | ||||
|             @Override | ||||
|             public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { | ||||
|             public void onGeolocationPermissionsShowPrompt(String origin, | ||||
|                     GeolocationPermissions.Callback callback) { | ||||
|                 callback.invoke(origin, true, false); | ||||
|             } | ||||
|         }); | ||||
| @@ -65,13 +68,15 @@ public class IITC_WebView extends WebView { | ||||
|  | ||||
|         iitc_init(context); | ||||
|     } | ||||
|  | ||||
|     // ---------------------------------------------------------------- | ||||
|  | ||||
|     @Override | ||||
|     public void loadUrl(String url) { | ||||
|         if (!url.startsWith("javascript:")) { | ||||
|             // force https if enabled in settings | ||||
|             SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getContext()); | ||||
|             SharedPreferences sharedPref = PreferenceManager | ||||
|                     .getDefaultSharedPreferences(getContext()); | ||||
|             if (sharedPref.getBoolean("pref_force_https", true)) | ||||
|                 url = url.replace("http://", "https://"); | ||||
|             else | ||||
| @@ -90,8 +95,7 @@ public class IITC_WebView extends WebView { | ||||
|     } | ||||
|  | ||||
|     public void updateCaching() { | ||||
|         if (!this.isConnectedToWifi()) | ||||
|         { | ||||
|         if (!this.isConnectedToWifi()) { | ||||
|             Log.d("iitcm", "not connected to wifi...load tiles from cache"); | ||||
|             settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); | ||||
|         } else { | ||||
| @@ -101,7 +105,8 @@ public class IITC_WebView extends WebView { | ||||
|     } | ||||
|  | ||||
|     private boolean isConnectedToWifi() { | ||||
|         ConnectivityManager conMan = (ConnectivityManager) getContext().getSystemService( Context.CONNECTIVITY_SERVICE ); | ||||
|         ConnectivityManager conMan = (ConnectivityManager) getContext() | ||||
|                 .getSystemService(Context.CONNECTIVITY_SERVICE); | ||||
|         NetworkInfo wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI); | ||||
|         return wifi.getState() == NetworkInfo.State.CONNECTED; | ||||
|     } | ||||
|   | ||||
| @@ -3,6 +3,7 @@ package com.cradle.iitc_mobile; | ||||
| import android.content.Context; | ||||
| import android.content.Intent; | ||||
| import android.content.SharedPreferences; | ||||
| import android.content.pm.PackageManager; | ||||
| import android.content.res.AssetManager; | ||||
| import android.net.Uri; | ||||
| import android.net.http.SslError; | ||||
| @@ -25,8 +26,10 @@ import java.util.Set; | ||||
|  | ||||
| public class IITC_WebViewClient extends WebViewClient { | ||||
|     private static final ByteArrayInputStream style = new ByteArrayInputStream( | ||||
|         "body, #dashboard_container, #map_canvas { background: #000 !important; }".getBytes()); | ||||
|     private static final ByteArrayInputStream empty = new ByteArrayInputStream("".getBytes()); | ||||
|             "body, #dashboard_container, #map_canvas { background: #000 !important; }" | ||||
|                     .getBytes()); | ||||
|     private static final ByteArrayInputStream empty = new ByteArrayInputStream( | ||||
|             "".getBytes()); | ||||
|  | ||||
|     private WebResourceResponse iitcjs; | ||||
|     private String js = null; | ||||
| @@ -35,7 +38,8 @@ public class IITC_WebViewClient extends WebViewClient { | ||||
|  | ||||
|     public IITC_WebViewClient(Context c) { | ||||
|         this.context = c; | ||||
|         this.iitc_path = Environment.getExternalStorageDirectory().getPath() + "/IITC_Mobile/"; | ||||
|         this.iitc_path = Environment.getExternalStorageDirectory().getPath() | ||||
|                 + "/IITC_Mobile/"; | ||||
|         try { | ||||
|             loadIITC_JS(c); | ||||
|         } catch (IOException e) { | ||||
| @@ -46,7 +50,8 @@ public class IITC_WebViewClient extends WebViewClient { | ||||
|     public String getIITCVersion() { | ||||
|         String header = ""; | ||||
|         if (js != null) | ||||
|             header = js.substring(js.indexOf("==UserScript=="), js.indexOf("==/UserScript==")); | ||||
|             header = js.substring(js.indexOf("==UserScript=="), | ||||
|                     js.indexOf("==/UserScript==")); | ||||
|         // remove new line comments | ||||
|         header = header.replace("\n//", ""); | ||||
|         // get a list of key-value | ||||
| @@ -54,35 +59,46 @@ public class IITC_WebViewClient extends WebViewClient { | ||||
|         String iitc_version = "not found"; | ||||
|         for (int i = 0; i < attributes.length; i++) { | ||||
|             // search for version and use the value | ||||
|             if (attributes[i].equals("@version")) iitc_version = attributes[i+1]; | ||||
|             if (attributes[i].equals("@version")) | ||||
|                 iitc_version = attributes[i + 1]; | ||||
|         } | ||||
|         return iitc_version; | ||||
|     } | ||||
|  | ||||
|     public void loadIITC_JS(Context c) throws java.io.IOException { | ||||
|         // You are able to load the script from external source | ||||
|         // if a http address is given, use script from this address. else use the local script | ||||
|         SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(c); | ||||
|         // if a http address is given, use script from this address. else use | ||||
|         // the local script | ||||
|         SharedPreferences sharedPref = PreferenceManager | ||||
|                 .getDefaultSharedPreferences(c); | ||||
|         String iitc_source = sharedPref.getString("pref_iitc_source", "local"); | ||||
|         String js = ""; | ||||
|  | ||||
|         // if developer mode are enabled, load all iitc script from external storage | ||||
|         // if developer mode are enabled, load all iitc script from external | ||||
|         // storage | ||||
|         if (sharedPref.getBoolean("pref_dev_checkbox", false)) { | ||||
|             js = this.fileToString(iitc_path + "dev/total-conversion-build.user.js", false); | ||||
|             js = this.fileToString(iitc_path | ||||
|                     + "dev/total-conversion-build.user.js", false); | ||||
|             if (js.equals("false")) { | ||||
|                 Toast.makeText(context, "File " + iitc_path + | ||||
|                         "dev/total-conversion-build.user.js not found. " + | ||||
|                         "Disable developer mode or add iitc files " + | ||||
|                         "to the dev folder.", Toast.LENGTH_LONG).show(); | ||||
|                 Toast.makeText( | ||||
|                         context, | ||||
|                         "File " | ||||
|                                 + iitc_path | ||||
|                                 + "dev/total-conversion-build.user.js not found. " | ||||
|                                 + "Disable developer mode or add iitc files " | ||||
|                                 + "to the dev folder.", Toast.LENGTH_LONG) | ||||
|                         .show(); | ||||
|                 return; | ||||
|             } else { | ||||
|                 Toast.makeText(context, "Developer mode enabled", Toast.LENGTH_SHORT).show(); | ||||
|                 Toast.makeText(context, "Developer mode enabled", | ||||
|                         Toast.LENGTH_SHORT).show(); | ||||
|             } | ||||
|         } else { | ||||
|             // load iitc script from web or asset folder | ||||
|             if (iitc_source.contains("http")) { | ||||
|                 URL url = new URL(iitc_source); | ||||
|                 js = new Scanner(url.openStream(), "UTF-8").useDelimiter("\\A").next(); | ||||
|                 js = new Scanner(url.openStream(), "UTF-8").useDelimiter("\\A") | ||||
|                         .next(); | ||||
|             } else { | ||||
|                 js = this.fileToString("total-conversion-build.user.js", true); | ||||
|             } | ||||
| @@ -90,6 +106,15 @@ public class IITC_WebViewClient extends WebViewClient { | ||||
|  | ||||
|         this.js = js; | ||||
|  | ||||
|         PackageManager pm = context.getPackageManager(); | ||||
|         boolean hasMultitouch = pm | ||||
|                 .hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH); | ||||
|         boolean forcedZoom = sharedPref.getBoolean("pref_user_zoom", false); | ||||
|         if (hasMultitouch && !forcedZoom) { | ||||
|             js = js.replace("window.showZoom = true;", | ||||
|                     "window.showZoom = false;"); | ||||
|         } | ||||
|  | ||||
|         // need to wrap the mobile iitc.js version in a document ready. IITC | ||||
|         // expects to be injected after the DOM has been loaded completely. | ||||
|         // Since the mobile client injects IITC by replacing the gen_dashboard | ||||
| @@ -97,16 +122,14 @@ public class IITC_WebViewClient extends WebViewClient { | ||||
|         // so it boots correctly. | ||||
|         js = "$(document).ready(function(){" + js + "});"; | ||||
|  | ||||
|         iitcjs = new WebResourceResponse( | ||||
|             "text/javascript", | ||||
|             "UTF-8", | ||||
|             new ByteArrayInputStream(js.getBytes()) | ||||
|         ); | ||||
|         iitcjs = new WebResourceResponse("text/javascript", "UTF-8", | ||||
|                 new ByteArrayInputStream(js.getBytes())); | ||||
|     }; | ||||
|  | ||||
|     // enable https | ||||
|     @Override | ||||
|     public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { | ||||
|     public void onReceivedSslError(WebView view, SslErrorHandler handler, | ||||
|             SslError error) { | ||||
|         handler.proceed(); | ||||
|     }; | ||||
|  | ||||
| @@ -116,7 +139,8 @@ public class IITC_WebViewClient extends WebViewClient { | ||||
|         super.onPageFinished(view, url); | ||||
|  | ||||
|         // get the plugin preferences | ||||
|         SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); | ||||
|         SharedPreferences sharedPref = PreferenceManager | ||||
|                 .getDefaultSharedPreferences(context); | ||||
|         Set<String> plugin_list = sharedPref.getStringSet("pref_plugins", null); | ||||
|         boolean dev_enabled = sharedPref.getBoolean("pref_dev_checkbox", true); | ||||
|  | ||||
| @@ -127,7 +151,8 @@ public class IITC_WebViewClient extends WebViewClient { | ||||
|             for (int i = 0; i < plugin_list.size(); i++) { | ||||
|                 Log.d("iitcm", "adding plugin " + plugin_array[i]); | ||||
|                 if (dev_enabled) | ||||
|                     this.loadJS(iitc_path + "dev/plugins/" + plugin_array[i], false, view); | ||||
|                     this.loadJS(iitc_path + "dev/plugins/" + plugin_array[i], | ||||
|                             false, view); | ||||
|                 else | ||||
|                     this.loadJS("plugins/" + plugin_array[i], true, view); | ||||
|             } | ||||
| @@ -143,7 +168,8 @@ public class IITC_WebViewClient extends WebViewClient { | ||||
|         if (files != null) { | ||||
|             for (int i = 0; i < files.length; ++i) { | ||||
|                 if (this.loadJS(files[i].toString(), false, view)) | ||||
|                     Log.d("iitcm", "loading additional plugin " + files[i].toString()); | ||||
|                     Log.d("iitcm", | ||||
|                             "loading additional plugin " + files[i].toString()); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -185,7 +211,8 @@ public class IITC_WebViewClient extends WebViewClient { | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (s != null) src = s.hasNext() ? s.next() : ""; | ||||
|         if (s != null) | ||||
|             src = s.hasNext() ? s.next() : ""; | ||||
|         return src; | ||||
|     } | ||||
|  | ||||
| @@ -197,16 +224,19 @@ public class IITC_WebViewClient extends WebViewClient { | ||||
|         String js = fileToString(file, asset); | ||||
|         if (js.equals("false")) | ||||
|             return false; | ||||
|         else view.loadUrl("javascript:" + js); | ||||
|         else | ||||
|             view.loadUrl("javascript:" + js); | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     // Check every external resource if it’s okay to load it and maybe replace it | ||||
|     // Check every external resource if it’s okay to load it and maybe replace | ||||
|     // it | ||||
|     // with our own content. This is used to block loading Niantic resources | ||||
|     // which aren’t required and to inject IITC early into the site. | ||||
|     // via http://stackoverflow.com/a/8274881/1684530 | ||||
|     @Override | ||||
|     public WebResourceResponse shouldInterceptRequest (final WebView view, String url) { | ||||
|     public WebResourceResponse shouldInterceptRequest(final WebView view, | ||||
|             String url) { | ||||
|         if (url.contains("/css/common.css")) { | ||||
|             return new WebResourceResponse("text/css", "UTF-8", style); | ||||
|         } else if (url.contains("gen_dashboard.js")) { | ||||
| @@ -230,13 +260,18 @@ public class IITC_WebViewClient extends WebViewClient { | ||||
|     public boolean shouldOverrideUrlLoading(WebView view, String url) { | ||||
|         if (url.contains("ingress.com") || url.contains("appengine.google.com")) { | ||||
|             // reload iitc if a poslink is clicked inside the app | ||||
|             if (url.contains("intel?ll=") || (url.contains("latE6") && url.contains("lngE6"))) { | ||||
|                 Log.d("iitcm", "should be an internal clicked position link...reload script for: " + url); | ||||
|             if (url.contains("intel?ll=") | ||||
|                     || (url.contains("latE6") && url.contains("lngE6"))) { | ||||
|                 Log.d("iitcm", | ||||
|                         "should be an internal clicked position link...reload script for: " | ||||
|                                 + url); | ||||
|                 ((IITC_Mobile) context).loadUrl(url); | ||||
|             } | ||||
|             return false; | ||||
|         } else { | ||||
|             Log.d("iitcm", "no ingress intel link, start external app to load url: " + url); | ||||
|             Log.d("iitcm", | ||||
|                     "no ingress intel link, start external app to load url: " | ||||
|                             + url); | ||||
|             Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); | ||||
|             context.startActivity(intent); | ||||
|             return true; | ||||
|   | ||||