From 0bf5d642ee9d9489b2e4e4788a231adb04eb34b6 Mon Sep 17 00:00:00 2001 From: plusCubed Date: Tue, 12 Dec 2017 00:23:12 -0800 Subject: [PATCH] Bump 1.6.2 --- app/build.gradle | 44 +-- app/src/main/ic_launcher-web.png | Bin 0 -> 82620 bytes .../velociraptor/api/LimitFetcher.java | 8 +- .../velociraptor/api/LimitResponse.java | 4 +- .../api/osm/OsmLimitProvider.java | 23 +- .../api/raptor/RaptorLimitProvider.kt | 13 +- .../api/raptor/RaptorService.java | 4 +- .../velociraptor/cache/LimitCache.java | 31 ++- .../velociraptor/limit/FloatingView.java | 13 +- .../velociraptor/limit/LimitService.java | 35 ++- .../settings/SettingsActivity.java | 4 +- .../velociraptor/utils/NotificationUtils.java | 35 +++ .../pluscubed/velociraptor/utils/Utils.java | 8 + .../layout/activity_settings_permissions.xml | 11 - .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 4808 -> 5446 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 7504 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2882 -> 3227 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 4206 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 6852 -> 8053 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 11556 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 11768 -> 13600 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 21898 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 16470 -> 20346 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 34925 bytes app/src/main/res/raw/changelog.html | 8 + .../main/res/raw/third_party_license_metadata | 28 +- app/src/main/res/raw/third_party_licenses | 256 +++++++++--------- app/src/main/res/values-de/strings.xml | 68 +++-- app/src/main/res/values-it/strings.xml | 61 +++-- app/src/main/res/values-nl/strings.xml | 89 ++++-- .../res/values/ic_launcher_background.xml | 4 + app/src/main/res/values/strings.xml | 4 +- build.gradle | 2 +- 34 files changed, 444 insertions(+), 314 deletions(-) create mode 100644 app/src/main/ic_launcher-web.png create mode 100644 app/src/main/java/com/pluscubed/velociraptor/utils/NotificationUtils.java create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/values/ic_launcher_background.xml diff --git a/app/build.gradle b/app/build.gradle index f790b87..54abe83 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { - classpath 'io.fabric.tools:gradle:1.24.5' + classpath 'io.fabric.tools:gradle:1.25.1' classpath 'com.squareup.sqldelight:gradle-plugin:0.6.1' classpath 'com.google.gms:oss-licenses:0.9.1' } @@ -19,7 +19,7 @@ apply plugin: 'com.google.gms.oss.licenses.plugin' android { compileSdkVersion 27 - buildToolsVersion "27.0.1" + buildToolsVersion "27.0.2" if (project.hasProperty("RELEASE_STORE_FILE")) { signingConfigs { @@ -41,9 +41,9 @@ android { defaultConfig { applicationId "com.pluscubed.velociraptor" minSdkVersion 16 - targetSdkVersion 25 - versionCode 38 - versionName "1.6.1" + targetSdkVersion 27 + versionCode 39 + versionName "1.6.2" vectorDrawables.useSupportLibrary = true manifestPlaceholders = [appName: "@string/app_name"] multiDexEnabled true @@ -117,23 +117,23 @@ dependencies { compile 'com.squareup.sqlbrite:sqlbrite:1.1.2' - compile 'com.android.support:appcompat-v7:27.0.1' - compile 'com.android.support:support-v4:27.0.1' - compile 'com.android.support:support-v13:27.0.1' - compile 'com.android.support:support-annotations:27.0.1' - compile 'com.android.support:cardview-v7:27.0.1' - compile 'com.android.support:design:27.0.1' - compile 'com.android.support:customtabs:27.0.1' + compile 'com.android.support:appcompat-v7:27.0.2' + compile 'com.android.support:support-v4:27.0.2' + compile 'com.android.support:support-v13:27.0.2' + compile 'com.android.support:support-annotations:27.0.2' + compile 'com.android.support:cardview-v7:27.0.2' + compile 'com.android.support:design:27.0.2' + compile 'com.android.support:customtabs:27.0.2' - compile 'com.google.firebase:firebase-core:11.6.0' - compile 'com.google.firebase:firebase-messaging:11.6.0' - compile 'com.google.firebase:firebase-config:11.6.0' + compile 'com.google.firebase:firebase-core:11.6.2' + compile 'com.google.firebase:firebase-messaging:11.6.2' + compile 'com.google.firebase:firebase-config:11.6.2' compile 'com.android.billingclient:billing:1.0' - compile 'com.google.android.gms:play-services-location:11.6.0' - compile 'com.google.android.gms:play-services-oss-licenses:11.6.0' - compile 'com.google.android.gms:play-services-maps:11.6.0' + compile 'com.google.android.gms:play-services-location:11.6.2' + compile 'com.google.android.gms:play-services-oss-licenses:11.6.2' + compile 'com.google.android.gms:play-services-maps:11.6.2' compile 'com.google.maps.android:android-maps-utils:0.5' compile 'com.stepstone.stepper:material-stepper:4.3.1' @@ -151,9 +151,9 @@ dependencies { compile 'com.squareup.okhttp3:okhttp:3.9.1' compile 'com.squareup.okio:okio:1.13.0' - compile 'com.fasterxml.jackson.core:jackson-databind:2.9.2' - compile 'com.fasterxml.jackson.core:jackson-core:2.9.2' - compile 'com.fasterxml.jackson.core:jackson-annotations:2.9.2' + compile 'com.fasterxml.jackson.core:jackson-databind:2.9.3' + compile 'com.fasterxml.jackson.core:jackson-core:2.9.3' + compile 'com.fasterxml.jackson.core:jackson-annotations:2.9.3' compile 'com.github.gigamole.arcprogressstackview:library:1.0.3' compile 'com.github.pluscubed:recycler-fast-scroll:0.3.2' @@ -170,7 +170,7 @@ dependencies { testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1' - compile('com.crashlytics.sdk.android:crashlytics:2.7.1@aar') { + compile('com.crashlytics.sdk.android:crashlytics:2.8.0@aar') { transitive = true; } compile 'com.android.support.constraint:constraint-layout:1.0.2' diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..42b715d314e2eee017157fcc6a2870716abad8cc GIT binary patch literal 82620 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 Ef0|@#7XSbN literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/pluscubed/velociraptor/api/LimitFetcher.java b/app/src/main/java/com/pluscubed/velociraptor/api/LimitFetcher.java index 5e7f870..f208f74 100644 --- a/app/src/main/java/com/pluscubed/velociraptor/api/LimitFetcher.java +++ b/app/src/main/java/com/pluscubed/velociraptor/api/LimitFetcher.java @@ -35,8 +35,9 @@ public LimitFetcher(Context context) { OkHttpClient client = buildOkHttpClient(); - this.osmLimitProvider = new OsmLimitProvider(context, client); - this.raptorLimitProvider = new RaptorLimitProvider(context, client, LimitCache.getInstance(context)); + LimitCache cache = LimitCache.getInstance(context); + this.osmLimitProvider = new OsmLimitProvider(context, client, cache); + this.raptorLimitProvider = new RaptorLimitProvider(context, client, cache); } public static Retrofit buildRetrofit(OkHttpClient client, String baseUrl) { @@ -64,8 +65,6 @@ public void verifyRaptorService(Purchase purchase) { } public Single getSpeedLimit(Location location) { - //TODO: Restructure as stream of error/missing/completed responses - String lastRoadName = lastResponse == null ? null : lastResponse.roadName(); Observable cacheQuery = LimitCache.getInstance(context) .get(lastRoadName, new Coord(location)); @@ -91,6 +90,7 @@ public Single getSpeedLimit(Location location) { .defaultIfEmpty(LimitResponse.builder().build()); } + //If it's from OSM & there's no valid speed limit if (limitResponse.origin() == LimitResponse.ORIGIN_OSM && limitResponse.speedLimit() == -1) { return finalRaptorQuery diff --git a/app/src/main/java/com/pluscubed/velociraptor/api/LimitResponse.java b/app/src/main/java/com/pluscubed/velociraptor/api/LimitResponse.java index ed1913d..47f77a7 100644 --- a/app/src/main/java/com/pluscubed/velociraptor/api/LimitResponse.java +++ b/app/src/main/java/com/pluscubed/velociraptor/api/LimitResponse.java @@ -8,7 +8,6 @@ @AutoValue public abstract class LimitResponse { - // Higher origin = higher priority in cache public static final int ORIGIN_HERE = 2; public static final int ORIGIN_TOMTOM = 1; public static final int ORIGIN_OSM = 0; @@ -28,8 +27,7 @@ public static Builder builder() { public abstract int origin(); /** - * In mph or km/h depending on setting - * -1 if limit does not exist + * In km/h, -1 if limit does not exist */ public abstract int speedLimit(); diff --git a/app/src/main/java/com/pluscubed/velociraptor/api/osm/OsmLimitProvider.java b/app/src/main/java/com/pluscubed/velociraptor/api/osm/OsmLimitProvider.java index 62843b7..8703507 100644 --- a/app/src/main/java/com/pluscubed/velociraptor/api/osm/OsmLimitProvider.java +++ b/app/src/main/java/com/pluscubed/velociraptor/api/osm/OsmLimitProvider.java @@ -19,7 +19,7 @@ import com.pluscubed.velociraptor.api.osm.data.OsmResponse; import com.pluscubed.velociraptor.api.osm.data.Tags; import com.pluscubed.velociraptor.cache.LimitCache; -import com.pluscubed.velociraptor.utils.PrefUtils; +import com.pluscubed.velociraptor.utils.Utils; import java.io.IOException; import java.util.ArrayList; @@ -39,12 +39,14 @@ public class OsmLimitProvider implements LimitProvider { public static final int OSM_RADIUS = 15; private Context context; private OkHttpClient client; + private LimitCache cache; private List osmOverpassApis; - public OsmLimitProvider(Context context, OkHttpClient client) { + public OsmLimitProvider(Context context, OkHttpClient client, LimitCache osmCache) { this.context = context; this.client = client; + this.cache = osmCache; osmOverpassApis = new ArrayList<>(); @@ -138,8 +140,6 @@ public Observable getSpeedLimit(final Location location, LimitRes return Observable.error(new Exception("OSM null response")); } - boolean useMetric = PrefUtils.getUseMetric(context); - List elements = osmApi.getElements(); if (elements.isEmpty()) { @@ -172,13 +172,13 @@ public Observable getSpeedLimit(final Location location, LimitRes //Get speed limit String maxspeed = tags.getMaxspeed(); if (maxspeed != null) { - responseBuilder.setSpeedLimit(parseOsmSpeedLimit(useMetric, maxspeed)); + responseBuilder.setSpeedLimit(parseOsmSpeedLimit(maxspeed)); } LimitResponse response = responseBuilder.build(); //Cache - LimitCache.getInstance(context).put(response); + cache.put(response); if (element == bestMatch) { bestResponse = response; @@ -197,20 +197,15 @@ private String parseOsmRoadName(Tags tags) { return tags.getRef() + ":" + tags.getName(); } - private int parseOsmSpeedLimit(boolean useMetric, String maxspeed) { + private int parseOsmSpeedLimit(String maxspeed) { int speedLimit = -1; if (maxspeed.matches("^-?\\d+$")) { - //is integer -> km/h + //If it is an integer, it is in km/h speedLimit = Integer.valueOf(maxspeed); - if (!useMetric) { - speedLimit = (int) (speedLimit / 1.609344 + 0.5d); - } } else if (maxspeed.contains("mph")) { String[] split = maxspeed.split(" "); speedLimit = Integer.valueOf(split[0]); - if (useMetric) { - speedLimit = (int) (speedLimit * 1.609344 + 0.5d); - } + speedLimit = Utils.convertMphToKmh(speedLimit); } return speedLimit; diff --git a/app/src/main/java/com/pluscubed/velociraptor/api/raptor/RaptorLimitProvider.kt b/app/src/main/java/com/pluscubed/velociraptor/api/raptor/RaptorLimitProvider.kt index 95b38c0..594fa54 100644 --- a/app/src/main/java/com/pluscubed/velociraptor/api/raptor/RaptorLimitProvider.kt +++ b/app/src/main/java/com/pluscubed/velociraptor/api/raptor/RaptorLimitProvider.kt @@ -14,10 +14,9 @@ import rx.Observable import rx.schedulers.Schedulers import java.util.* -class RaptorLimitProvider(context: Context, client: OkHttpClient, limitCache: LimitCache) : LimitProvider { +class RaptorLimitProvider(context: Context, client: OkHttpClient, val limitCache: LimitCache) : LimitProvider { private val raptorService: RaptorService - private val limitCache: LimitCache private var id: String @@ -28,7 +27,7 @@ class RaptorLimitProvider(context: Context, client: OkHttpClient, limitCache: Li companion object { @JvmField - val USE_DEBUG_ID = BuildConfig.BUILD_TYPE.equals("debug") + val USE_DEBUG_ID = BuildConfig.BUILD_TYPE == "debug" } init { @@ -39,11 +38,9 @@ class RaptorLimitProvider(context: Context, client: OkHttpClient, limitCache: Li val raptorRest = LimitFetcher.buildRetrofit(raptorClient, SERVER_URL) raptorService = raptorRest.create(RaptorService::class.java) - this.limitCache = limitCache; - id = UUID.randomUUID().toString() if (USE_DEBUG_ID) { - val resId = context.getResources().getIdentifier("debug_id", "string", context.getPackageName()) + val resId = context.resources.getIdentifier("debug_id", "string", context.getPackageName()) if (resId != 0) { id = context.getString(resId); } @@ -89,9 +86,9 @@ class RaptorLimitProvider(context: Context, client: OkHttpClient, limitCache: Li private fun queryRaptorApi(here: Boolean, latitude: String, longitude: String, location: Location): Observable? { val raptorQuery = if (here) { - raptorService.getHere("Bearer " + hereToken, id, latitude, longitude, location.bearing.toInt()) + raptorService.getHere("Bearer " + hereToken, id, latitude, longitude, location.bearing.toInt(), "Metric") } else { - raptorService.getTomtom("Bearer " + tomtomToken, id, latitude, longitude, location.bearing.toInt()) + raptorService.getTomtom("Bearer " + tomtomToken, id, latitude, longitude, location.bearing.toInt(), "Metric") } return raptorQuery diff --git a/app/src/main/java/com/pluscubed/velociraptor/api/raptor/RaptorService.java b/app/src/main/java/com/pluscubed/velociraptor/api/raptor/RaptorService.java index e5bec86..736a1b7 100644 --- a/app/src/main/java/com/pluscubed/velociraptor/api/raptor/RaptorService.java +++ b/app/src/main/java/com/pluscubed/velociraptor/api/raptor/RaptorService.java @@ -16,9 +16,9 @@ public interface RaptorService { @GET("tomtom") Single getTomtom(@Header("Authorization") String authorization, @Query("id") String id, - @Query("lat") String lat, @Query("lng") String lng, @Query("vehicle_heading") int heading); + @Query("lat") String lat, @Query("lng") String lng, @Query("vehicle_heading") int heading, @Query("units") String units); @GET("here") Single getHere(@Header("Authorization") String authorization, @Query("id") String id, - @Query("lat") String lat, @Query("lng") String lng, @Query("vehicle_heading") int heading); + @Query("lat") String lat, @Query("lng") String lng, @Query("vehicle_heading") int heading, @Query("units") String units); } diff --git a/app/src/main/java/com/pluscubed/velociraptor/cache/LimitCache.java b/app/src/main/java/com/pluscubed/velociraptor/cache/LimitCache.java index 8d6eddc..65bacac 100644 --- a/app/src/main/java/com/pluscubed/velociraptor/cache/LimitCache.java +++ b/app/src/main/java/com/pluscubed/velociraptor/cache/LimitCache.java @@ -104,21 +104,24 @@ public Observable get(final String previousName, final Coord coor return Observable.empty(); } - Collections.sort(ways, (way1, way2) -> { - if (way1.maxspeed() == -1 && way2.maxspeed() != -1) { - return 1; - } else if (way1.maxspeed() != -1 && way2.maxspeed() == -1) { - return -1; - } else { - return 0; - } - }); - LimitResponse.Builder response = ways.get(0).toResponse(); - for (LimitCacheWay way : ways) { - if (way.road() != null && way.road().equals(previousName)) { - response = way.toResponse(); - break; + Collections.sort(ways, (way1, way2) -> Integer.compare((int) way2.origin(), (int) way1.origin())); + + List validWays = Observable.from(ways) + .filter(way -> way.maxspeed() != 0) + .toList() + .toBlocking().first(); + + LimitResponse.Builder response; + if (!validWays.isEmpty()) { + response = validWays.get(0).toResponse(); + for (LimitCacheWay way : validWays) { + if (way.road() != null && way.road().equals(previousName)) { + response = way.toResponse(); + break; + } } + } else { + response = ways.get(0).toResponse(); } response.setFromCache(true); diff --git a/app/src/main/java/com/pluscubed/velociraptor/limit/FloatingView.java b/app/src/main/java/com/pluscubed/velociraptor/limit/FloatingView.java index 6f29b89..912a521 100644 --- a/app/src/main/java/com/pluscubed/velociraptor/limit/FloatingView.java +++ b/app/src/main/java/com/pluscubed/velociraptor/limit/FloatingView.java @@ -6,6 +6,7 @@ import android.content.Context; import android.graphics.PixelFormat; import android.graphics.Point; +import android.os.Build; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.support.v4.view.animation.FastOutSlowInInterpolator; @@ -70,12 +71,14 @@ public FloatingView(LimitService service) { private void inflateDebugging() { mDebuggingText = (TextView) LayoutInflater.from(new ContextThemeWrapper(mService, R.style.Theme_Velociraptor)) .inflate(R.layout.floating_stats, null, false); + WindowManager.LayoutParams debuggingParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.TYPE_PHONE, + getWindowType(), WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, PixelFormat.TRANSLUCENT); + debuggingParams.gravity = Gravity.BOTTOM; try { mWindowManager.addView(mDebuggingText, debuggingParams); @@ -84,6 +87,12 @@ private void inflateDebugging() { } } + private int getWindowType() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? + WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : + WindowManager.LayoutParams.TYPE_PHONE; + } + private void inflateMonitor() { int layout; switch (mStyle = PrefUtils.getSignStyle(mService)) { @@ -104,7 +113,7 @@ private void inflateMonitor() { WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.TYPE_PHONE, + getWindowType(), WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); params.gravity = Gravity.TOP | Gravity.START; diff --git a/app/src/main/java/com/pluscubed/velociraptor/limit/LimitService.java b/app/src/main/java/com/pluscubed/velociraptor/limit/LimitService.java index 738d9e3..7380e26 100644 --- a/app/src/main/java/com/pluscubed/velociraptor/limit/LimitService.java +++ b/app/src/main/java/com/pluscubed/velociraptor/limit/LimitService.java @@ -32,6 +32,7 @@ import com.pluscubed.velociraptor.api.raptor.RaptorLimitProvider; import com.pluscubed.velociraptor.billing.BillingManager; import com.pluscubed.velociraptor.settings.SettingsActivity; +import com.pluscubed.velociraptor.utils.NotificationUtils; import com.pluscubed.velociraptor.utils.PrefUtils; import com.pluscubed.velociraptor.utils.Utils; @@ -70,7 +71,7 @@ public class LimitService extends Service { private Subscription speedLimitQuerySubscription; - private int lastSpeedLimit = -1; + private int currentSpeedLimit = -1; private Location lastLocationWithSpeed; private Location lastLocationWithFetchAttempt; @@ -115,7 +116,7 @@ public int onStartCommand(Intent intent, int flags, int startId) { isLimitHidden = intent.getBooleanExtra(EXTRA_HIDE_LIMIT, false); speedLimitView.hideLimit(isLimitHidden); if (isLimitHidden) { - lastSpeedLimit = -1; + currentSpeedLimit = -1; } } @@ -197,7 +198,8 @@ private void startNotification() { Intent notificationIntent = new Intent(this, SettingsActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, PENDING_SETTINGS, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT); - Notification notification = new NotificationCompat.Builder(this) + NotificationUtils.initChannels(this); + Notification notification = new NotificationCompat.Builder(this, NotificationUtils.CHANNEL_RUNNING) .setContentTitle(getString(R.string.notif_title)) .setContentText(getString(R.string.notif_content)) .setPriority(Notification.PRIORITY_MIN) @@ -245,7 +247,7 @@ private synchronized void onLocationChanged(final Location location) { @SuppressLint("SetTextI18n") @Override public void onNext(LimitResponse limitResponse) { - lastSpeedLimit = limitResponse.speedLimit(); + currentSpeedLimit = limitResponse.speedLimit(); updateLimitView(true); updateDebuggingText(location, limitResponse, null); @@ -314,8 +316,8 @@ private String getLimitProviderString(int origin) { private void updateLimitView(boolean success) { String text = "--"; - if (lastSpeedLimit != -1) { - text = String.valueOf(lastSpeedLimit); + if (currentSpeedLimit != -1) { + text = String.valueOf(convertToUiSpeed(currentSpeedLimit)); if (!success) { text = "(" + text + ")"; } @@ -334,23 +336,18 @@ private void updateSpeedometer(Location location) { int kmhSpeed = (int) Math.round((double) metersPerSeconds * 60 * 60 / 1000); int speedometerPercentage = Math.round((float) kmhSpeed / 240 * 100); - int speed = kmhSpeed; - if (!PrefUtils.getUseMetric(this)) { - speed = (int) Math.round((double) speed / 1.609344); - } - float percentToleranceFactor = 1 + (float) PrefUtils.getSpeedingPercent(this) / 100; int constantTolerance = PrefUtils.getSpeedingConstant(this); - int percentToleratedLimit = (int) (lastSpeedLimit * percentToleranceFactor); + int percentToleratedLimit = (int) (currentSpeedLimit * percentToleranceFactor); int warningLimit; if (PrefUtils.getToleranceMode(this)) { warningLimit = percentToleratedLimit + constantTolerance; } else { - warningLimit = Math.min(percentToleratedLimit, lastSpeedLimit + constantTolerance); + warningLimit = Math.min(percentToleratedLimit, currentSpeedLimit + constantTolerance); } - if (lastSpeedLimit != -1 && speed > warningLimit) { + if (currentSpeedLimit != -1 && kmhSpeed > warningLimit) { speedLimitView.setSpeeding(true); if (speedingStartTimestamp == -1) { speedingStartTimestamp = System.currentTimeMillis(); @@ -363,11 +360,21 @@ private void updateSpeedometer(Location location) { speedingStartTimestamp = -1; } + int speed = convertToUiSpeed(kmhSpeed); + speedLimitView.setSpeed(speed, speedometerPercentage); lastLocationWithSpeed = location; } + private int convertToUiSpeed(int kmhSpeed) { + int speed = kmhSpeed; + if (!PrefUtils.getUseMetric(this)) { + speed = Utils.convertKmhToMph(speed); + } + return speed; + } + void showToast(final String string) { Handler handler = new Handler(Looper.getMainLooper()); handler.post(() -> Toast.makeText(LimitService.this.getApplicationContext(), string, Toast.LENGTH_LONG).show()); diff --git a/app/src/main/java/com/pluscubed/velociraptor/settings/SettingsActivity.java b/app/src/main/java/com/pluscubed/velociraptor/settings/SettingsActivity.java index 9802f4e..b9d828c 100644 --- a/app/src/main/java/com/pluscubed/velociraptor/settings/SettingsActivity.java +++ b/app/src/main/java/com/pluscubed/velociraptor/settings/SettingsActivity.java @@ -46,6 +46,7 @@ import com.pluscubed.velociraptor.detection.AppDetectionService; import com.pluscubed.velociraptor.limit.LimitService; import com.pluscubed.velociraptor.settings.appselection.AppSelectionActivity; +import com.pluscubed.velociraptor.utils.NotificationUtils; import com.pluscubed.velociraptor.utils.PrefUtils; import com.pluscubed.velociraptor.utils.Utils; @@ -215,8 +216,9 @@ protected void onCreate(Bundle savedInstanceState) { PendingIntent settingsIntent = PendingIntent.getActivity(SettingsActivity.this, PENDING_SETTINGS, settings, PendingIntent.FLAG_CANCEL_CURRENT); + NotificationUtils.initChannels(this); NotificationCompat.Builder builder = - new NotificationCompat.Builder(SettingsActivity.this) + new NotificationCompat.Builder(SettingsActivity.this, NotificationUtils.CHANNEL_TOGGLES) .setSmallIcon(R.drawable.ic_speedometer_notif) .setContentTitle(getString(R.string.controls_notif_title)) .setContentText(getString(R.string.controls_notif_desc)) diff --git a/app/src/main/java/com/pluscubed/velociraptor/utils/NotificationUtils.java b/app/src/main/java/com/pluscubed/velociraptor/utils/NotificationUtils.java new file mode 100644 index 0000000..2c881aa --- /dev/null +++ b/app/src/main/java/com/pluscubed/velociraptor/utils/NotificationUtils.java @@ -0,0 +1,35 @@ +package com.pluscubed.velociraptor.utils; + +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.content.Context; +import android.os.Build; + +import com.pluscubed.velociraptor.R; + +public class NotificationUtils { + + public static final String CHANNEL_TOGGLES = "toggles"; + public static final String CHANNEL_RUNNING = "running"; + + public static void initChannels(Context context) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + return; + } + NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + + NotificationChannel channel = new NotificationChannel( + CHANNEL_TOGGLES, + context.getString(R.string.channel_toggles), + NotificationManager.IMPORTANCE_LOW + ); + notificationManager.createNotificationChannel(channel); + + channel = new NotificationChannel( + CHANNEL_RUNNING, + context.getString(R.string.notif_title), + NotificationManager.IMPORTANCE_LOW + ); + notificationManager.createNotificationChannel(channel); + } +} diff --git a/app/src/main/java/com/pluscubed/velociraptor/utils/Utils.java b/app/src/main/java/com/pluscubed/velociraptor/utils/Utils.java index a2cfdca..14c7a5e 100644 --- a/app/src/main/java/com/pluscubed/velociraptor/utils/Utils.java +++ b/app/src/main/java/com/pluscubed/velociraptor/utils/Utils.java @@ -61,6 +61,14 @@ public static int convertDpToPx(Context context, float dp) { return (int) (dp * context.getResources().getDisplayMetrics().density + 0.5f); } + public static int convertMphToKmh(int speed) { + return (int) (speed * 1.609344 + 0.5d); + } + + public static int convertKmhToMph(int speed) { + return (int) (speed / 1.609344 + 0.5d); + } + public static int compare(int lhs, int rhs) { return lhs < rhs ? -1 : (lhs == rhs ? 0 : 1); } diff --git a/app/src/main/res/layout/activity_settings_permissions.xml b/app/src/main/res/layout/activity_settings_permissions.xml index 6ea78c3..08c79ac 100644 --- a/app/src/main/res/layout/activity_settings_permissions.xml +++ b/app/src/main/res/layout/activity_settings_permissions.xml @@ -125,17 +125,6 @@ - -