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;