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 0000000..42b715d Binary files /dev/null and b/app/src/main/ic_launcher-web.png differ 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 @@ - -