diff --git a/app/build.gradle b/app/build.gradle index 70b48eda..0bd0d9bb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,15 +1,15 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 28 + compileSdkVersion 29 defaultConfig { applicationId "org.traccar.client" buildConfigField "boolean", "HIDDEN_APP", "false" - minSdkVersion 15 - targetSdkVersion 28 - versionCode 56 - versionName '5.19' + minSdkVersion 16 + targetSdkVersion 29 + versionCode 57 + versionName '5.20' } lintOptions { @@ -34,12 +34,13 @@ android { } dependencies { - implementation 'com.google.android.material:material:1.1.0-alpha06' + implementation 'com.google.android.material:material:1.1.0-alpha10' + implementation 'androidx.preference:preference:1.1.0' testImplementation 'junit:junit:4.12' testImplementation 'org.robolectric:robolectric:4.1' - googleImplementation 'com.google.firebase:firebase-core:16.0.8' - googleImplementation 'com.crashlytics.sdk.android:crashlytics:2.10.0' - googleImplementation "com.google.android.gms:play-services-location:16.0.0" + googleImplementation 'com.google.firebase:firebase-core:17.2.0' + googleImplementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' + googleImplementation "com.google.android.gms:play-services-location:17.0.0" } if (getGradle().getStartParameter().getTaskRequests().toString().contains("Google")) { diff --git a/app/src/google/AndroidManifest.xml b/app/src/google/AndroidManifest.xml index d5b452b4..684c9991 100644 --- a/app/src/google/AndroidManifest.xml +++ b/app/src/google/AndroidManifest.xml @@ -5,7 +5,8 @@ + tools:replace="android:name" + tools:ignore="GoogleAppIndexingWarning"> diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0753e267..98e43af0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,10 +1,12 @@ + @@ -21,7 +23,8 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" - android:name=".MainApplication"> + android:name=".MainApplication" + tools:ignore="GoogleAppIndexingWarning"> - + - + diff --git a/app/src/main/java/org/traccar/client/MainActivity.java b/app/src/main/java/org/traccar/client/MainActivity.java index a96936e2..ed58d4a6 100644 --- a/app/src/main/java/org/traccar/client/MainActivity.java +++ b/app/src/main/java/org/traccar/client/MainActivity.java @@ -25,7 +25,7 @@ public class MainActivity extends AppCompatActivity { protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { - getFragmentManager().beginTransaction().replace(android.R.id.content, new MainFragment()).commit(); + getSupportFragmentManager().beginTransaction().replace(android.R.id.content, new MainFragment()).commit(); } } diff --git a/app/src/main/java/org/traccar/client/MainFragment.java b/app/src/main/java/org/traccar/client/MainFragment.java index dafba95f..b7b899f8 100644 --- a/app/src/main/java/org/traccar/client/MainFragment.java +++ b/app/src/main/java/org/traccar/client/MainFragment.java @@ -1,5 +1,5 @@ /* - * Copyright 2012 - 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2012 - 2019 Anton Tananaev (anton@traccar.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,14 +27,15 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; -import android.preference.EditTextPreference; -import android.preference.Preference; -import android.preference.PreferenceFragment; -import android.preference.PreferenceManager; -import android.preference.TwoStatePreference; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.appcompat.app.AlertDialog; +import androidx.preference.EditTextPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceFragmentCompat; +import androidx.preference.PreferenceManager; +import androidx.preference.TwoStatePreference; + import android.util.Log; import android.view.Menu; import android.view.MenuInflater; @@ -42,9 +43,11 @@ import android.webkit.URLUtil; import android.widget.Toast; +import java.util.HashSet; import java.util.Random; +import java.util.Set; -public class MainFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener { +public class MainFragment extends PreferenceFragmentCompat implements OnSharedPreferenceChangeListener { private static final String TAG = MainFragment.class.getSimpleName(); @@ -66,15 +69,14 @@ public class MainFragment extends PreferenceFragment implements OnSharedPreferen private PendingIntent alarmIntent; @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (BuildConfig.HIDDEN_APP) { + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + if (BuildConfig.HIDDEN_APP && Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { removeLauncherIcon(); } setHasOptionsMenu(true); - sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext()); addPreferencesFromResource(R.xml.preferences); initPreferences(); @@ -129,6 +131,7 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { if (sharedPreferences.getBoolean(KEY_STATUS, false)) { startTrackingService(true, false); } + } private void removeLauncherIcon() { @@ -212,11 +215,18 @@ private void initPreferences() { private void startTrackingService(boolean checkPermission, boolean permission) { if (checkPermission) { - if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { - permission = true; - } else { + Set requiredPermissions = new HashSet<>(); + if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + requiredPermissions.add(Manifest.permission.ACCESS_FINE_LOCATION); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q + && ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_BACKGROUND_LOCATION) != PackageManager.PERMISSION_GRANTED) { + requiredPermissions.add(Manifest.permission.ACCESS_BACKGROUND_LOCATION); + } + permission = requiredPermissions.isEmpty(); + if (!permission) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_REQUEST_LOCATION); + requestPermissions(requiredPermissions.toArray(new String[requiredPermissions.size()]), PERMISSIONS_REQUEST_LOCATION); } return; } @@ -224,12 +234,12 @@ private void startTrackingService(boolean checkPermission, boolean permission) { if (permission) { setPreferencesEnabled(false); - ContextCompat.startForegroundService(getActivity(), new Intent(getActivity(), TrackingService.class)); + ContextCompat.startForegroundService(getContext(), new Intent(getActivity(), TrackingService.class)); alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, ALARM_MANAGER_INTERVAL, ALARM_MANAGER_INTERVAL, alarmIntent); } else { sharedPreferences.edit().putBoolean(KEY_STATUS, false).apply(); - TwoStatePreference preference = (TwoStatePreference) findPreference(KEY_STATUS); + TwoStatePreference preference = findPreference(KEY_STATUS); preference.setChecked(false); } } diff --git a/build.gradle b/build.gradle index 2e5dd2e4..4a3a6df4 100644 --- a/build.gradle +++ b/build.gradle @@ -5,8 +5,8 @@ buildscript { maven { url 'https://maven.fabric.io/public' } } dependencies { - classpath 'com.android.tools.build:gradle:3.4.0' - classpath 'com.google.gms:google-services:4.2.0' + classpath 'com.android.tools.build:gradle:3.5.0' + classpath 'com.google.gms:google-services:4.3.2' classpath 'io.fabric.tools:gradle:1.26.1' } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d757f3d3..01a286e9 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-5.4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip