diff --git a/AndroidManifest.xml b/AndroidManifest.xml index c323126..48b2e58 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,33 +1,39 @@ + - - - - - + + android:targetSdkVersion="28" /> + + + + android:theme="@style/AppTheme"> + android:name=".MainActivity" + android:label="@string/app_name"> - - + + diff --git a/assets/LICENSE b/assets/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/assets/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/build.gradle b/build.gradle index 369f8eb..a143264 100644 --- a/build.gradle +++ b/build.gradle @@ -4,22 +4,22 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.3' + classpath 'com.android.tools.build:gradle:3.1.4' } } apply plugin: 'com.android.application' android { - compileSdkVersion 26 - buildToolsVersion "27.0.3" + compileSdkVersion 28 + buildToolsVersion "28.0.2" defaultConfig { applicationId "dk.network42.osmfocus" minSdkVersion 14 - targetSdkVersion 19 - versionName "0.1.1rc1" - versionCode 3 + targetSdkVersion 28 + versionName "0.1.1rc2" + versionCode 4 } signingConfigs { @@ -61,13 +61,14 @@ android { manifest.srcFile "AndroidManifest.xml" java.srcDirs = ['src'] res.srcDirs = ['res'] + assets.srcDirs = ['assets', 'src/main/assets', 'assets/'] } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.android.support:support-v4:26.0.+' //compileSdkVersion + implementation 'com.android.support:support-v4:28.0.+' //compileSdkVersion } repositories { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b6517bb..933b647 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-bin.zip diff --git a/res/layout/activity_license.xml b/res/layout/activity_license.xml new file mode 100644 index 0000000..1646177 --- /dev/null +++ b/res/layout/activity_license.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/res/menu/main_activity_actions.xml b/res/menu/main_activity_actions.xml index d8d3bb5..649d860 100644 --- a/res/menu/main_activity_actions.xml +++ b/res/menu/main_activity_actions.xml @@ -1,3 +1,4 @@ + + diff --git a/res/values/dimens.xml b/res/values/dimens.xml index bccadf7..5472617 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -1,7 +1,9 @@ + 16dp 16dp - + 16dp + diff --git a/res/values/strings.xml b/res/values/strings.xml index 25abde1..74db5bf 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1,4 +1,5 @@ + OSMfocus @@ -19,21 +20,22 @@ Could not download area! POIs not shown at high zoom levels Vector data not shown at high zoom levels - + Auto Download Enable automatic download of map data - + Wireframe Map Show POI lines - + Number of POIs on screen Number of POIs on screen - + POI Label Size Size of font used for element labels Background Map Type Type of background map to show - - © OpenStreetMap contributors + + © OpenStreetMap contributors, ODbL + LicenseActivity diff --git a/src/dk/network42/osmfocus/LicenseActivity.java b/src/dk/network42/osmfocus/LicenseActivity.java new file mode 100644 index 0000000..dd997e1 --- /dev/null +++ b/src/dk/network42/osmfocus/LicenseActivity.java @@ -0,0 +1,62 @@ +/* + * Copyright 2018 whb + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package dk.network42.osmfocus; + +import android.app.Activity; +import android.os.Bundle; +import android.widget.TextView; +import android.widget.Toast; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class LicenseActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_license); + + BufferedReader reader = null; + + StringBuilder text = new StringBuilder(); + + try { + reader = new BufferedReader(new InputStreamReader(getAssets().open("LICENSE"))); + + String mLine; + while ((mLine = reader.readLine()) != null) { + text.append(mLine); + text.append('\n'); + } + } catch (IOException e) { + Toast.makeText(getApplicationContext(), "Error reading file!", Toast.LENGTH_LONG).show(); + e.printStackTrace(); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + } + } + + TextView textView = (TextView) findViewById(R.id.license_text_view); + textView.setText((CharSequence) text); + } + } +} diff --git a/src/dk/network42/osmfocus/MainActivity.java b/src/dk/network42/osmfocus/MainActivity.java index 85809f5..0b55671 100644 --- a/src/dk/network42/osmfocus/MainActivity.java +++ b/src/dk/network42/osmfocus/MainActivity.java @@ -1,32 +1,17 @@ +//This file has been modified by whb. + package dk.network42.osmfocus; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.Calendar; -import java.util.Iterator; -import java.util.List; - -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; - -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; - +import android.Manifest; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.Dialog; import android.app.NotificationManager; -import android.app.PendingIntent; import android.content.ComponentCallbacks2; import android.content.Context; import android.content.Intent; -import android.content.IntentSender; +import android.content.pm.PackageManager; import android.content.res.Configuration; import android.hardware.Sensor; import android.hardware.SensorEvent; @@ -37,16 +22,15 @@ import android.location.GpsStatus; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; -import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; -import android.os.Environment; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.preference.PreferenceManager; import android.support.v4.app.DialogFragment; import android.support.v4.app.NotificationCompat; +import android.support.v4.content.ContextCompat; import android.support.v4.view.GestureDetectorCompat; import android.util.Log; import android.view.GestureDetector; @@ -57,189 +41,266 @@ import android.view.ScaleGestureDetector; import android.view.WindowManager; import android.widget.Toast; +import java.util.Iterator; +import java.util.List; + public class MainActivity extends Activity implements - LocationListener, GpsStatus.Listener, - SensorEventListener { - - static final int PREFERENCE_REQUEST = 9001; - static final int INVALIDATE_VIEW = 1000; - static final int POLL_NOTIFICATIONS = 1001; + LocationListener, GpsStatus.Listener, + SensorEventListener { - private static final int LOCATION_INTERVAL = 1000; //ms - private static final float LOCATION_DISTANCE = 1f; //meters - - public static final String userAgent = "OSMfocus"; - - private static final String TAG = "OsmFocusActivity"; - public static final String PREFS_NAME = "OSMFocusPrefsFile"; - - LocationManager mLocationManager; - - SensorManager sensorManager; - private Sensor sensorAccelerometer; - private Sensor sensorMagneticField; - private float[] valuesAccelerometer; - private float[] valuesMagneticField; - private float[] matrixR; - private float[] matrixI; - private float[] matrixValues; - private MapView mapView; + public static final String userAgent = "OSMfocus"; + public static final String PREFS_NAME = "OSMFocusPrefsFile"; + static final int PREFERENCE_REQUEST = 9001; + static final int INVALIDATE_VIEW = 1000; + static final int POLL_NOTIFICATIONS = 1001; + private static final int LOCATION_INTERVAL = 1000; //ms + private static final float LOCATION_DISTANCE = 1f; //meters + private static final String TAG = "OsmFocusActivity"; + public double mLonLastUpd = 0, mLatLastUpd = 0; // Where mapview was last updated + LocationManager mLocationManager; + SensorManager sensorManager; double mPanLon, mPanLat; - private OsmServer mOsmServer = new OsmServer(null, userAgent); - private GestureDetectorCompat mGestureDetector; - private ScaleGestureDetector mScaleGestureDetector; - private boolean mScaleInProgress = false; SharedData mG = null; - public double mLonLastUpd=0, mLatLastUpd=0; // Where mapview was last updated - NotificationManager mNotificationManager; - Handler mHandler; - + Handler mHandler; + private Sensor sensorAccelerometer; + private Sensor sensorMagneticField; + private float[] valuesAccelerometer; + private float[] valuesMagneticField; + private float[] matrixR; + private float[] matrixI; + private float[] matrixValues; + private MapView mapView; + private OsmServer mOsmServer = new OsmServer(null, userAgent); + private GestureDetectorCompat mGestureDetector; + private ScaleGestureDetector mScaleGestureDetector; + private boolean mScaleInProgress = false; + private final ScaleGestureDetector.OnScaleGestureListener mScaleGestureListener + = new ScaleGestureDetector.SimpleOnScaleGestureListener() { + @Override + public boolean onScaleBegin(ScaleGestureDetector scaleGestureDetector) { + float focusX = scaleGestureDetector.getFocusX(); + float focusY = scaleGestureDetector.getFocusY(); + Log.d(TAG, "ScaleBegin, focus=" + focusX + "," + focusY); + return true; + } + + @Override + public boolean onScale(ScaleGestureDetector scaleGestureDetector) { + float focusX = scaleGestureDetector.getFocusX(); + float focusY = scaleGestureDetector.getFocusY(); + float scale = scaleGestureDetector.getScaleFactor(); + Log.d(TAG, "Scale, scale=" + scale + ", focus=" + focusX + "," + focusY); + mG.mPcfg.setScale(mG.mPcfg.getScale() * scale, mG.mCtx); + mScaleInProgress = true; + mapView.postInvalidate(); + return true; + } + + @Override + public void onScaleEnd(ScaleGestureDetector scaleGestureDetector) { + Log.d(TAG, "ScaleEnd"); + } + }; + private final GestureDetector.SimpleOnGestureListener mGestureListener + = new GestureDetector.SimpleOnGestureListener() { + @Override + public boolean onDown(MotionEvent event) { + //Log.d(TAG,"onDown: " + event.toString()); + mPanLon = mG.mLon; + mPanLat = mG.mLat; + mScaleInProgress = false; + return true; + } + + @Override + public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, + float distanceY) { + if (mScaleInProgress) { + Log.d(TAG, "Scroll skipped"); + return false; + } + //Log.d(TAG, "onScroll: " + e1.toString()+e2.toString()); + float dx, dy; + dx = e2.getX() - e1.getX(); + dy = e2.getY() - e1.getY(); + Log.d(TAG, "Scroll pixels: x=" + dx + " y=" + dy); + mG.mLon = mPanLon - dx / (mG.mPcfg.mScale * MapView.prescale); + double panMercLat = dy / (mG.mPcfg.mScale * MapView.prescale); + mG.mLat = GeoMath.mercatorToLat((GeoMath.latToMercator(mPanLat) + panMercLat)); + Log.d(TAG, "Scroll to lon=" + mG.mLon + " lat=" + mG.mLat + " (" + GeoMath.latToMercator(mPanLat) + "+" + panMercLat + ")"); + mG.mFollowGPS = false; + mapView.postInvalidate(); + return true; + } + + @Override + public boolean onFling(MotionEvent event1, MotionEvent event2, + float velocityX, float velocityY) { + Log.d(TAG, "onFling: " + event1.toString() + event2.toString()); + return true; + } + +// @Override +// public void onLongPress(MotionEvent event) { +// Log.d(TAG, "onLongPress: " + event.toString()); +// openOptionsMenu(); +// } + //@Override + //public void onShowPress(MotionEvent event) { + // Log.d(TAG, "onShowPress: " + event.toString()); + //} + + //@Override + //public boolean onSingleTapUp(MotionEvent event) { + // Log.d(TAG, "onSingleTapUp: " + event.toString()); + // return true; + // } + }; + + public static void showOkDialog(Context context, String txt) { + Builder builder = new AlertDialog.Builder(context); + builder.setMessage(txt); + builder.setCancelable(true); + builder.setPositiveButton("OK", null); + AlertDialog dialog = builder.create(); + dialog.show(); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedData.checkAppUpdate(getApplicationContext()); PreferenceManager.setDefaultValues(this, R.xml.preferences, true); - + //setContentView(R.layout.activity_main); - //getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + //getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, // WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, - WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); //requestWindowFeature(Window.FEATURE_NO_TITLE); getActionBar().setDisplayShowTitleEnabled(false); - Log.i(TAG, "API level "+Build.VERSION.SDK_INT); + Log.i(TAG, "API level " + Build.VERSION.SDK_INT); - mHandler = new Handler(Looper.getMainLooper()) { - int mNotifId; - boolean mNotifActive; - @Override - public void handleMessage(Message inputMessage) { - switch (inputMessage.what) { - case INVALIDATE_VIEW: - //Log.d(TAG, "Invalidate view"); - mapView.invalidate(); - // Fall-through - case POLL_NOTIFICATIONS: - int dlsb = mG.mTileLayerProvider.getActiveDownloads(); - int dlsv = mG.mVectorLayerProvider.getActiveDownloads(); - Log.d(TAG, "Downloads active="+dlsb+"+"+dlsv); - if (dlsb>0 || dlsv>0) { - if (! mNotifActive) { - String st = "Downloading..."; - mNotifId = setOsmLoadNotif(st); - mNotifActive = true; - } else { - Log.d(TAG, "Notification already active"); - mHandler.sendMessageDelayed(mHandler.obtainMessage(POLL_NOTIFICATIONS, this), 1000); - } - } else if (mNotifActive) { - cancelOsmLoadNotif(mNotifId); - mNotifActive = false; - } - break; - } - } - }; + mHandler = new Handler(Looper.getMainLooper()) { + int mNotifId; + boolean mNotifActive; + + @Override + public void handleMessage(Message inputMessage) { + switch (inputMessage.what) { + case INVALIDATE_VIEW: + //Log.d(TAG, "Invalidate view"); + mapView.invalidate(); + // Fall-through + case POLL_NOTIFICATIONS: + int dlsb = mG.mTileLayerProvider.getActiveDownloads(); + int dlsv = mG.mVectorLayerProvider.getActiveDownloads(); + Log.d(TAG, "Downloads active=" + dlsb + "+" + dlsv); + if (dlsb > 0 || dlsv > 0) { + if (!mNotifActive) { + String st = "Downloading..."; + mNotifId = setOsmLoadNotif(st); + mNotifActive = true; + } else { + Log.d(TAG, "Notification already active"); + mHandler.sendMessageDelayed(mHandler.obtainMessage(POLL_NOTIFICATIONS, this), 1000); + } + } else if (mNotifActive) { + cancelOsmLoadNotif(mNotifId); + mNotifActive = false; + } + break; + } + } + }; mapView = new MapView(this); //mG.mPcfg.update(getBaseContext()); setContentView(mapView); mapView.requestFocus(); if (getLastNonConfigurationInstance() != null) { - Log.d(TAG, "getLastNonConfigurationInstance() != null"); - mG = (SharedData) getLastNonConfigurationInstance(); + Log.d(TAG, "getLastNonConfigurationInstance() != null"); + mG = (SharedData) getLastNonConfigurationInstance(); mapView.setSharedData(mG); mG.mTileLayer.setMainHandler(mHandler); mG.mVectorLayer.setMainHandler(mHandler); mG.update(getApplicationContext()); } else { - long maxMemL = Runtime.getRuntime().maxMemory(); - int maxMem = (int) Math.min(maxMemL, Integer.MAX_VALUE); - Log.i(TAG, "maxMemory="+maxMem); - mG = new SharedData(); + long maxMemL = Runtime.getRuntime().maxMemory(); + int maxMem = (int) Math.min(maxMemL, Integer.MAX_VALUE); + Log.i(TAG, "maxMemory=" + maxMem); + mG = new SharedData(); mapView.setSharedData(mG); - mG.mTileLayerProvider = new OsmTileProvider(mG.mOsmServerAgentName, OsmTile.MAX_DOWNLOAD_THREADS); - mG.mTileLayer = new OsmTileLayerBm(mG.mTileLayerProvider, maxMem/4); - mG.mTileLayer.setAttrib(getApplicationContext().getString(R.string.info_osm_copyright)); + mG.mTileLayerProvider = new OsmTileProvider(mG.mOsmServerAgentName, OsmTile.MAX_DOWNLOAD_THREADS); + mG.mTileLayer = new OsmTileLayerBm(mG.mTileLayerProvider, maxMem / 4); + mG.mTileLayer.setAttrib(getApplicationContext().getString(R.string.info_osm_copyright)); mG.mTileLayer.setMainHandler(mHandler); mG.mTileLayer.setProviderUrl(OsmTileLayer.urlFromType(mG.mPcfg.mBackMapType)); - mG.mVectorLayerProvider = new OsmTileProvider(mG.mOsmServerAgentName); - mG.mVectorLayer = new OsmTileLayerVector(mG.mVectorLayerProvider, maxMem/8); - mG.mVectorLayer.setSharedData(mG); + mG.mVectorLayerProvider = new OsmTileProvider(mG.mOsmServerAgentName); + mG.mVectorLayer = new OsmTileLayerVector(mG.mVectorLayerProvider, maxMem / 8); + mG.mVectorLayer.setSharedData(mG); mG.mVectorLayer.setMainHandler(mHandler); - mG.update(getApplicationContext()); + mG.update(getApplicationContext()); } if (mG.mDeveloperMode) { - if(!(Thread.getDefaultUncaughtExceptionHandler() instanceof CustomExceptionHandler)) { - Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(mG, "")); - } + if (!(Thread.getDefaultUncaughtExceptionHandler() instanceof CustomExceptionHandler)) { + Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(mG, "")); + } } mGestureDetector = new GestureDetectorCompat(this, mGestureListener); mScaleGestureDetector = new ScaleGestureDetector(this, mScaleGestureListener); /*mDetector.setOnDoubleTapListener(this);*/ - + mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); - mLocationManager.addGpsStatusListener(this); - Location loc = getMostRecentKnownLocation(); - if (loc != null) - this.onLocationChanged(loc); - - if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { - mLocationManager.requestLocationUpdates( - LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, this); - } else if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { - mLocationManager.requestLocationUpdates( - LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, this); - } - if (mG.mUseCompass) { - sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); - sensorAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); - sensorMagneticField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); - valuesAccelerometer = new float[3]; - valuesMagneticField = new float[3]; - matrixR = new float[9]; - matrixI = new float[9]; - matrixValues = new float[3]; + sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); + sensorAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); + sensorMagneticField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); + valuesAccelerometer = new float[3]; + valuesMagneticField = new float[3]; + matrixR = new float[9]; + matrixI = new float[9]; + matrixValues = new float[3]; } - + //registerForContextMenu(mapView); - + registerComponentCallbacks(new ComponentCallbacks2() { - @ Override - public void onTrimMemory(int level) { - appTrimMemory(level); - } - public void onLowMemory() { + @Override + public void onTrimMemory(int level) { + appTrimMemory(level); + } + + public void onLowMemory() { appTrimMemory(TRIM_MEMORY_COMPLETE); - } - public void onConfigurationChanged(Configuration newConfig) { - // - } + } + + public void onConfigurationChanged(Configuration newConfig) { + // + } }); } public void appTrimMemory(int level) { - Log.d(TAG, "appTrimMemory("+level+")"); + Log.d(TAG, "appTrimMemory(" + level + ")"); if (mG.mTileLayer != null) - mG.mTileLayer.onTrimMemory(level); + mG.mTileLayer.onTrimMemory(level); if (mG.mVectorLayer != null) - mG.mVectorLayer.onTrimMemory(level); + mG.mVectorLayer.onTrimMemory(level); } public Object onRetainNonConfigurationInstance() { - if (mG != null) - return mG; - return super.onRetainNonConfigurationInstance(); + if (mG != null) + return mG; + return super.onRetainNonConfigurationInstance(); } - + /* * Called when the Activity becomes visible. */ @@ -255,167 +316,52 @@ public class MainActivity extends Activity implements protected void onStop() { super.onStop(); } - - // Define a DialogFragment that displays the error dialog - public static class ErrorDialogFragment extends DialogFragment { - // Global field to contain the error dialog - private Dialog mDialog; - // Default constructor. Sets the dialog field to null - public ErrorDialogFragment() { - super(); - mDialog = null; - } - // Set the dialog to display - public void setDialog(Dialog dialog) { - mDialog = dialog; - } - // Return a Dialog to the DialogFragment. - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - return mDialog; - } - } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case PREFERENCE_REQUEST: - mG.update(getBaseContext()); - mapView.postInvalidate(); - break; + mG.update(getBaseContext()); + mapView.postInvalidate(); + break; } } - - public static void showOkDialog(Context context, String txt) - { - Builder builder = new AlertDialog.Builder(context); - builder.setMessage(txt); - builder.setCancelable(true); - builder.setPositiveButton("OK", null); - AlertDialog dialog = builder.create(); - dialog.show(); - } - @Override - public boolean onTouchEvent(MotionEvent event){ + @Override + public boolean onTouchEvent(MotionEvent event) { boolean h = mScaleGestureDetector.onTouchEvent(event); h |= mGestureDetector.onTouchEvent(event); h |= super.onTouchEvent(event); return h; } - private final ScaleGestureDetector.OnScaleGestureListener mScaleGestureListener - = new ScaleGestureDetector.SimpleOnScaleGestureListener() { - @Override - public boolean onScaleBegin(ScaleGestureDetector scaleGestureDetector) { - float focusX = scaleGestureDetector.getFocusX(); - float focusY = scaleGestureDetector.getFocusY(); - Log.d(TAG, "ScaleBegin, focus="+focusX+","+focusY); - return true; - } - @Override - public boolean onScale(ScaleGestureDetector scaleGestureDetector) { - float focusX = scaleGestureDetector.getFocusX(); - float focusY = scaleGestureDetector.getFocusY(); - float scale = scaleGestureDetector.getScaleFactor(); - Log.d(TAG, "Scale, scale="+scale+", focus="+focusX+","+focusY); - mG.mPcfg.setScale(mG.mPcfg.getScale()*scale, mG.mCtx); - mScaleInProgress = true; - mapView.postInvalidate(); - return true; - } - @Override - public void onScaleEnd(ScaleGestureDetector scaleGestureDetector) { - Log.d(TAG, "ScaleEnd"); - } - }; - - private final GestureDetector.SimpleOnGestureListener mGestureListener - = new GestureDetector.SimpleOnGestureListener() { - @Override - public boolean onDown(MotionEvent event) { - //Log.d(TAG,"onDown: " + event.toString()); - mPanLon = mG.mLon; mPanLat = mG.mLat; - mScaleInProgress = false; - return true; - } - @Override - public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, - float distanceY) { - if (mScaleInProgress) { - Log.d(TAG, "Scroll skipped"); - return false; - } - //Log.d(TAG, "onScroll: " + e1.toString()+e2.toString()); - float dx, dy; - dx = e2.getX()-e1.getX(); - dy = e2.getY()-e1.getY(); - Log.d(TAG, "Scroll pixels: x="+dx+" y="+dy); - mG.mLon = mPanLon - dx/(mG.mPcfg.mScale*MapView.prescale); - double panMercLat = dy/(mG.mPcfg.mScale*MapView.prescale); - mG.mLat = GeoMath.mercatorToLat((GeoMath.latToMercator(mPanLat)+panMercLat)); - Log.d(TAG, "Scroll to lon="+mG.mLon+" lat="+mG.mLat+" ("+GeoMath.latToMercator(mPanLat)+"+"+panMercLat+")"); - mG.mFollowGPS = false; - mapView.postInvalidate(); - return true; - } - @Override - public boolean onFling(MotionEvent event1, MotionEvent event2, - float velocityX, float velocityY) { - Log.d(TAG, "onFling: " + event1.toString()+event2.toString()); - return true; - } - -// @Override -// public void onLongPress(MotionEvent event) { -// Log.d(TAG, "onLongPress: " + event.toString()); -// openOptionsMenu(); -// } - //@Override - //public void onShowPress(MotionEvent event) { - // Log.d(TAG, "onShowPress: " + event.toString()); - //} - - //@Override - //public boolean onSingleTapUp(MotionEvent event) { - // Log.d(TAG, "onSingleTapUp: " + event.toString()); - // return true; - // } - }; - @Override public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.main_activity_actions, menu); - if (mG.mDeveloperMode) { - menu.add(0, R.id.action_testdownload, Menu.NONE, R.string.action_testdownload); - menu.add(0, R.id.action_togglehud, Menu.NONE, R.string.action_togglehud); - } + getMenuInflater().inflate(R.menu.main_activity_actions, menu); + if (mG.mDeveloperMode) { + menu.add(0, R.id.action_testdownload, Menu.NONE, R.string.action_testdownload); + menu.add(0, R.id.action_togglehud, Menu.NONE, R.string.action_togglehud); + } return super.onCreateOptionsMenu(menu); } - //@Override - //public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { - // super.onCreateContextMenu(menu, v, menuInfo); - // getMenuInflater().inflate(R.menu.main, menu); - //} - @Override public boolean onOptionsItemSelected(MenuItem item) { - int itemId = item.getItemId(); - if (itemId == R.id.action_download) { - if (mG.mPhyLocation != null) { - Log.d(TAG, "Download"); - //float horizon = 250f; //meters - //GeoBBox bbox = OsmServer.getBoxForPoint(mG.mLat, mG.mLon, horizon); - //GeoBBox bbox = OsmTile.pos2BBox(mG.mLon, mG.mLat, 16); - //downloadBox(bbox); - // FIXME - mG.mVectorLayer.download(mG.mLon, mG.mLat); - } else { - Toast toast = Toast.makeText(getApplicationContext(), getBaseContext().getString(R.string.info_locationunknown), Toast.LENGTH_SHORT); - toast.show(); - } - return true; + int itemId = item.getItemId(); + if (itemId == R.id.action_download) { + if (mG.mPhyLocation != null) { + Log.d(TAG, "Download"); + //float horizon = 250f; //meters + //GeoBBox bbox = OsmServer.getBoxForPoint(mG.mLat, mG.mLon, horizon); + //GeoBBox bbox = OsmTile.pos2BBox(mG.mLon, mG.mLat, 16); + //downloadBox(bbox); + // FIXME + mG.mVectorLayer.download(mG.mLon, mG.mLat); + } else { + Toast toast = Toast.makeText(getApplicationContext(), getBaseContext().getString(R.string.info_locationunknown), Toast.LENGTH_SHORT); + toast.show(); + } + return true; // } else if (itemId == R.id.action_testdownload) { // Log.d(TAG, "Test Download"); // float horizon = 250f; //meters @@ -426,175 +372,226 @@ public class MainActivity extends Activity implements // Log.d(TAG, "Load Cache"); // readOSMFile("cache.osm"); // return true; - } else if (itemId == R.id.action_whereami) { - Log.d(TAG, "Where am I?"); - mG.mFollowGPS = true; - mG.mPcfg.setScale(PaintConfig.DEFAULT_ZOOM, mG.mCtx); - if (mG.mPhyLocation != null) { - mG.mLat = mG.mPhyLocation.getLatitude(); - mG.mLon = mG.mPhyLocation.getLongitude(); - mapView.postInvalidate(); - } else { - Toast toast = Toast.makeText(getApplicationContext(), getBaseContext().getString(R.string.info_locationunknown), Toast.LENGTH_SHORT); - toast.show(); - } - return true; - } else if (itemId == R.id.action_togglehud) { - mG.mDebugHUD = !mG.mDebugHUD; - mapView.invalidate(); - return true; - } else if (itemId == R.id.action_settings) { - startActivityForResult(new Intent(this, SettingsActivity.class), PREFERENCE_REQUEST); - mG.update(getApplicationContext()); - return true; - } else { - return super.onOptionsItemSelected(item); - } + } else if (itemId == R.id.action_whereami) { + Log.d(TAG, "Where am I?"); + mG.mFollowGPS = true; + mG.mPcfg.setScale(PaintConfig.DEFAULT_ZOOM, mG.mCtx); + if (mG.mPhyLocation != null) { + mG.mLat = mG.mPhyLocation.getLatitude(); + mG.mLon = mG.mPhyLocation.getLongitude(); + mapView.postInvalidate(); + } else { + Toast toast = Toast.makeText(getApplicationContext(), getBaseContext().getString(R.string.info_locationunknown), Toast.LENGTH_SHORT); + toast.show(); + } + return true; + } else if (itemId == R.id.action_togglehud) { + mG.mDebugHUD = !mG.mDebugHUD; + mapView.invalidate(); + return true; + } else if (itemId == R.id.action_settings) { + startActivityForResult(new Intent(this, SettingsActivity.class), PREFERENCE_REQUEST); + mG.update(getApplicationContext()); + return true; + } else if (itemId == R.id.action_license) { + startActivity(new Intent(this, LicenseActivity.class)); + mG.update(getApplicationContext()); + return true; + } else { + return super.onOptionsItemSelected(item); + } } - + + //@Override + //public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { + // super.onCreateContextMenu(menu, v, menuInfo); + // getMenuInflater().inflate(R.menu.main, menu); + //} + @Override protected void onResume() { - super.onResume(); - //locationManager.requestLocationUpdates(mG.mLocProvider, 1000/*ms*/, 1/*meters*/, this); - if (mG.mUseCompass) { - sensorManager.registerListener(this, - sensorAccelerometer, - SensorManager.SENSOR_DELAY_NORMAL); - sensorManager.registerListener(this, - sensorMagneticField, - SensorManager.SENSOR_DELAY_NORMAL); - } + super.onResume(); + //locationManager.requestLocationUpdates(mG.mLocProvider, 1000/*ms*/, 1/*meters*/, this); + mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); + if (mLocationManager != null) { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) + == PackageManager.PERMISSION_GRANTED) { + mLocationManager.addGpsStatusListener(this); + } + + Location loc = getMostRecentKnownLocation(); + if (loc != null) + this.onLocationChanged(loc); + + if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) + == PackageManager.PERMISSION_GRANTED) { + mLocationManager.requestLocationUpdates( + LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, this); + } + } else if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) + == PackageManager.PERMISSION_GRANTED) { + mLocationManager.requestLocationUpdates( + LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, this); + } + } + } + + if (mG.mUseCompass) { + sensorManager.registerListener(this, + sensorAccelerometer, + SensorManager.SENSOR_DELAY_NORMAL); + sensorManager.registerListener(this, + sensorMagneticField, + SensorManager.SENSOR_DELAY_NORMAL); + } } @Override protected void onPause() { - super.onPause(); - if (mG.mUseCompass) { - sensorManager.unregisterListener(this, - sensorAccelerometer); - sensorManager.unregisterListener(this, - sensorMagneticField); - } + super.onPause(); + + if (mLocationManager != null) { + try { + mLocationManager.removeUpdates(this); + } catch (Exception e) { + Log.e(TAG, "removeUpdates failed", e); + } + } + + if (mG.mUseCompass) { + sensorManager.unregisterListener(this, + sensorAccelerometer); + sensorManager.unregisterListener(this, + sensorMagneticField); + } } protected Location getMostRecentKnownLocation() { - Location loc = null; - long besttime = 0; - List allp = mLocationManager.getAllProviders(); - for (String p: allp) { - Location l = mLocationManager.getLastKnownLocation(p); - if (l != null) { - long time = l.getTime(); - if (time>besttime) { - loc = l; - besttime = time; - } - } - } - return loc; + Location loc = null; + long besttime = 0; + List allp = mLocationManager.getAllProviders(); + for (String p : allp) { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) + == PackageManager.PERMISSION_GRANTED) { + Location l = mLocationManager.getLastKnownLocation(p); + if (l != null) { + long time = l.getTime(); + if (time > besttime) { + loc = l; + besttime = time; + } + } + } + } + return loc; } @Override public void onLocationChanged(Location location) { - mG.mPhyLocation = location; - mG.mLocationUpdates++; - double curr_lon = mG.mPhyLocation.getLongitude(); - double curr_lat = mG.mPhyLocation.getLatitude(); - if (mG.mFollowGPS) { - mG.mLon = curr_lon; - mG.mLat = curr_lat; - } + mG.mPhyLocation = location; + mG.mLocationUpdates++; + double curr_lon = mG.mPhyLocation.getLongitude(); + double curr_lat = mG.mPhyLocation.getLatitude(); + if (mG.mFollowGPS) { + mG.mLon = curr_lon; + mG.mLat = curr_lat; + } //Log.d(TAG, "onLocationChanged, Loc="+mG.mPhyLocation); final double noise = 0.00002; - if (Math.abs(mLonLastUpd-curr_lon)>noise || Math.abs(mLatLastUpd-curr_lat)>noise) { - mLonLastUpd = curr_lon; - mLatLastUpd = curr_lat; - mapView.postInvalidate(); + if (Math.abs(mLonLastUpd - curr_lon) > noise || Math.abs(mLatLastUpd - curr_lat) > noise) { + mLonLastUpd = curr_lon; + mLatLastUpd = curr_lat; + mapView.postInvalidate(); } } - @Override - public void onProviderDisabled(String provider) { - //Log.e(TAG, "onProviderDisabled: " + provider); - } + @Override + public void onProviderDisabled(String provider) { + //Log.e(TAG, "onProviderDisabled: " + provider); + } - @Override - public void onProviderEnabled(String provider) { - //Log.e(TAG, "onProviderEnabled: " + provider); - } + @Override + public void onProviderEnabled(String provider) { + //Log.e(TAG, "onProviderEnabled: " + provider); + } - @Override - public void onStatusChanged(String provider, int status, Bundle extras) { - //Log.e(TAG, "onStatusChanged: " + provider); - } + @Override + public void onStatusChanged(String provider, int status, Bundle extras) { + //Log.e(TAG, "onStatusChanged: " + provider); + } public void onGpsStatusChanged(int event) { - boolean statchg = false; - switch (event) { - case GpsStatus.GPS_EVENT_SATELLITE_STATUS: - GpsStatus gstat = mLocationManager.getGpsStatus(null); - if (gstat != null) { - Iterable satellites = gstat.getSatellites(); - Iterator sat = satellites.iterator(); - int num = 0, used = 0; - while (sat.hasNext()) { - num++; - GpsSatellite satellite = sat.next(); - if (satellite.usedInFix()) { - used++; - } - } - if (mG.mSatelitesVisible != num || mG.mSatelitesUsed != used) - statchg = true; - mG.mSatelitesVisible = num; - mG.mSatelitesUsed = used; - } - break; - } - if (statchg) - mapView.postInvalidate(); + boolean statchg = false; + switch (event) { + case GpsStatus.GPS_EVENT_SATELLITE_STATUS: + if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) + == PackageManager.PERMISSION_GRANTED) { + GpsStatus gstat = mLocationManager.getGpsStatus(null); + if (gstat != null) { + Iterable satellites = gstat.getSatellites(); + Iterator sat = satellites.iterator(); + int num = 0, used = 0; + while (sat.hasNext()) { + num++; + GpsSatellite satellite = sat.next(); + if (satellite.usedInFix()) { + used++; + } + } + if (mG.mSatelitesVisible != num || mG.mSatelitesUsed != used) + statchg = true; + mG.mSatelitesVisible = num; + mG.mSatelitesUsed = used; + } + } + break; + } + if (statchg) + mapView.postInvalidate(); } @Override public void onSensorChanged(SensorEvent event) { - switch(event.sensor.getType()){ - case Sensor.TYPE_ACCELEROMETER: - for(int i =0; i < 3; i++){ - valuesAccelerometer[i] = event.values[i]; - } - break; - case Sensor.TYPE_MAGNETIC_FIELD: - for(int i =0; i < 3; i++){ - valuesMagneticField[i] = event.values[i]; - } - break; - } - - boolean success = SensorManager.getRotationMatrix( - matrixR, - matrixI, - valuesAccelerometer, - valuesMagneticField); - - if(success){ - SensorManager.getOrientation(matrixR, matrixValues); - - mG.mAzimuth = Math.toDegrees(matrixValues[0]); - mG.mPitch = Math.toDegrees(matrixValues[1]); - mG.mRoll = Math.toDegrees(matrixValues[2]); - //Log.d(TAG, "Orientation: Azimuth " + azimuth + ", Pitch " + pitch + ", Roll " + roll); - mapView.postInvalidate(); + switch (event.sensor.getType()) { + case Sensor.TYPE_ACCELEROMETER: + for (int i = 0; i < 3; i++) { + valuesAccelerometer[i] = event.values[i]; + } + break; + case Sensor.TYPE_MAGNETIC_FIELD: + for (int i = 0; i < 3; i++) { + valuesMagneticField[i] = event.values[i]; + } + break; + } - } + boolean success = SensorManager.getRotationMatrix( + matrixR, + matrixI, + valuesAccelerometer, + valuesMagneticField); + + if (success) { + SensorManager.getOrientation(matrixR, matrixValues); + + mG.mAzimuth = Math.toDegrees(matrixValues[0]); + mG.mPitch = Math.toDegrees(matrixValues[1]); + mG.mRoll = Math.toDegrees(matrixValues[2]); + //Log.d(TAG, "Orientation: Azimuth " + azimuth + ", Pitch " + pitch + ", Roll " + roll); + mapView.postInvalidate(); + + } } int setOsmLoadNotif(String info) { - int notifyID = 1; - NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(/*this*/getApplicationContext()) - .setContentTitle("Downloading OSM Data") - .setContentText(info) - .setSmallIcon(R.drawable.ic_downloadosm); + int notifyID = 1; + NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(/*this*/getApplicationContext()) + .setContentTitle("Downloading OSM Data") + .setContentText(info) + .setSmallIcon(R.drawable.ic_downloadosm); // Intent resultIntent = new Intent(/*this*/getApplicationContext(), MainActivity.class); //FIXME // PendingIntent resultPendingIntent = // PendingIntent.getActivity( @@ -604,19 +601,42 @@ public class MainActivity extends Activity implements // PendingIntent.FLAG_UPDATE_CURRENT // ); // mBuilder.setContentIntent(resultPendingIntent); - mNotificationManager.notify( - notifyID, - mBuilder.build()); - Log.d(TAG, "Set OSM notif, id="+notifyID); - return notifyID; - } - - void cancelOsmLoadNotif(int notifyID) { - Log.d(TAG, "Clear OSM notif, id="+notifyID); - mNotificationManager.cancel(notifyID); + mNotificationManager.notify( + notifyID, + mBuilder.build()); + Log.d(TAG, "Set OSM notif, id=" + notifyID); + return notifyID; } - @Override - public void onAccuracyChanged(Sensor sensor, int accuracy) { - } + void cancelOsmLoadNotif(int notifyID) { + Log.d(TAG, "Clear OSM notif, id=" + notifyID); + mNotificationManager.cancel(notifyID); + } + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + } + + // Define a DialogFragment that displays the error dialog + public static class ErrorDialogFragment extends DialogFragment { + // Global field to contain the error dialog + private Dialog mDialog; + + // Default constructor. Sets the dialog field to null + public ErrorDialogFragment() { + super(); + mDialog = null; + } + + // Set the dialog to display + public void setDialog(Dialog dialog) { + mDialog = dialog; + } + + // Return a Dialog to the DialogFragment. + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + return mDialog; + } + } } diff --git a/src/dk/network42/osmfocus/OsmServer.java b/src/dk/network42/osmfocus/OsmServer.java index a26f7e4..d8e9fd3 100644 --- a/src/dk/network42/osmfocus/OsmServer.java +++ b/src/dk/network42/osmfocus/OsmServer.java @@ -1,3 +1,4 @@ +//This file has been modified by whb. package dk.network42.osmfocus; diff --git a/src/dk/network42/osmfocus/OsmTile.java b/src/dk/network42/osmfocus/OsmTile.java index 730ef26..8f62ee5 100644 --- a/src/dk/network42/osmfocus/OsmTile.java +++ b/src/dk/network42/osmfocus/OsmTile.java @@ -1,3 +1,5 @@ +//This file has been modified by whb. + package dk.network42.osmfocus; import java.io.IOException; diff --git a/src/dk/network42/osmfocus/OsmTileLayer.java b/src/dk/network42/osmfocus/OsmTileLayer.java index 8694ab9..4d42fc1 100644 --- a/src/dk/network42/osmfocus/OsmTileLayer.java +++ b/src/dk/network42/osmfocus/OsmTileLayer.java @@ -1,3 +1,5 @@ +//This file has been modified by whb. + package dk.network42.osmfocus; import android.content.ComponentCallbacks2;