diff --git a/app/build.gradle b/app/build.gradle index e54f3cd..54bc665 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -35,6 +35,7 @@ android { } dependencies { + compile 'com.android.support:design:26.0.1' testCompile 'junit:junit:4.12' testCompile 'org.robolectric:robolectric:3.4.2' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 69a0dfb..35911e1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,11 +17,11 @@ android:theme="@style/TraccarTheme" android:name=".MainApplication"> - + + android:targetActivity=".MainFragment"> diff --git a/app/src/main/java/android/support/v4/content/WakefulBroadcastReceiver.java b/app/src/main/java/android/support/v4/content/WakefulBroadcastReceiver.java deleted file mode 100644 index 137e5fa..0000000 --- a/app/src/main/java/android/support/v4/content/WakefulBroadcastReceiver.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * 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 android.support.v4.content; - -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.os.PowerManager; -import android.util.Log; -import android.util.SparseArray; - -/** - * Helper for the common pattern of implementing a {@link BroadcastReceiver} - * that receives a device wakeup event and then passes the work off - * to a {@link android.app.Service}, while ensuring that the - * device does not go back to sleep during the transition. - * - *

This class takes care of creating and managing a partial wake lock - * for you; you must request the {@link android.Manifest.permission#WAKE_LOCK} - * permission to use it.

- * - *

Example

- * - *

A {@link WakefulBroadcastReceiver} uses the method - * {@link WakefulBroadcastReceiver#startWakefulService startWakefulService()} - * to start the service that does the work. This method is comparable to - * {@link android.content.Context#startService startService()}, except that - * the {@link WakefulBroadcastReceiver} is holding a wake lock when the service - * starts. The intent that is passed with - * {@link WakefulBroadcastReceiver#startWakefulService startWakefulService()} - * holds an extra identifying the wake lock.

- * - * {@sample development/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulReceiver.java complete} - * - *

The service (in this example, an {@link android.app.IntentService}) does - * some work. When it is finished, it releases the wake lock by calling - * {@link WakefulBroadcastReceiver#completeWakefulIntent - * completeWakefulIntent(intent)}. The intent it passes as a parameter - * is the same intent that the {@link WakefulBroadcastReceiver} originally - * passed in.

- * - * {@sample development/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulService.java complete} - */ -public abstract class WakefulBroadcastReceiver extends BroadcastReceiver { - private static final String EXTRA_WAKE_LOCK_ID = "android.support.content.wakelockid"; - - private static final SparseArray mActiveWakeLocks - = new SparseArray(); - private static int mNextId = 1; - - /** - * Do a {@link android.content.Context#startService(android.content.Intent) - * Context.startService}, but holding a wake lock while the service starts. - * This will modify the Intent to hold an extra identifying the wake lock; - * when the service receives it in {@link android.app.Service#onStartCommand - * Service.onStartCommand}, it should pass back the Intent it receives there to - * {@link #completeWakefulIntent(android.content.Intent)} in order to release - * the wake lock. - * - * @param context The Context in which it operate. - * @param intent The Intent with which to start the service, as per - * {@link android.content.Context#startService(android.content.Intent) - * Context.startService}. - */ - public static ComponentName startWakefulService(Context context, Intent intent) { - synchronized (mActiveWakeLocks) { - int id = mNextId; - mNextId++; - if (mNextId <= 0) { - mNextId = 1; - } - - intent.putExtra(EXTRA_WAKE_LOCK_ID, id); - ComponentName comp = context.startService(intent); - if (comp == null) { - return null; - } - - PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); - PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, - "wake:" + comp.flattenToShortString()); - wl.setReferenceCounted(false); - wl.acquire(60*1000); - mActiveWakeLocks.put(id, wl); - return comp; - } - } - - /** - * Finish the execution from a previous {@link #startWakefulService}. Any wake lock - * that was being held will now be released. - * - * @param intent The Intent as originally generated by {@link #startWakefulService}. - * @return Returns true if the intent is associated with a wake lock that is - * now released; returns false if there was no wake lock specified for it. - */ - public static boolean completeWakefulIntent(Intent intent) { - final int id = intent.getIntExtra(EXTRA_WAKE_LOCK_ID, 0); - if (id == 0) { - return false; - } - synchronized (mActiveWakeLocks) { - PowerManager.WakeLock wl = mActiveWakeLocks.get(id); - if (wl != null) { - wl.release(); - mActiveWakeLocks.remove(id); - return true; - } - // We return true whether or not we actually found the wake lock - // the return code is defined to indicate whether the Intent contained - // an identifier for a wake lock that it was supposed to match. - // We just log a warning here if there is no wake lock found, which could - // happen for example if this function is called twice on the same - // intent or the process is killed and restarted before processing the intent. - Log.w("WakefulBroadcastReceive", "No active wake lock id #" + id); - return true; - } - } -} diff --git a/app/src/main/java/org/traccar/client/AboutActivity.java b/app/src/main/java/org/traccar/client/AboutActivity.java index 69ad13d..b563f21 100644 --- a/app/src/main/java/org/traccar/client/AboutActivity.java +++ b/app/src/main/java/org/traccar/client/AboutActivity.java @@ -1,5 +1,5 @@ /* - * Copyright 2012 Anton Tananaev (anton.tananaev@gmail.com) + * Copyright 2012 - 2017 Anton Tananaev (anton.tananaev@gmail.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,22 +15,24 @@ */ package org.traccar.client; -import android.app.Activity; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; import android.widget.TextView; -public class AboutActivity extends Activity { +public class AboutActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.about); - TextView title = (TextView) findViewById(R.id.title); + TextView title = findViewById(R.id.title); try { title.setText(title.getText() + " " + getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName); } catch (NameNotFoundException e) { + Log.w(AboutActivity.class.getSimpleName(), e); } } diff --git a/app/src/main/java/org/traccar/client/AutostartReceiver.java b/app/src/main/java/org/traccar/client/AutostartReceiver.java index 3cd4db0..af57fad 100644 --- a/app/src/main/java/org/traccar/client/AutostartReceiver.java +++ b/app/src/main/java/org/traccar/client/AutostartReceiver.java @@ -26,7 +26,7 @@ public class AutostartReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); - if (sharedPreferences.getBoolean(MainActivity.KEY_STATUS, false)) { + if (sharedPreferences.getBoolean(MainFragment.KEY_STATUS, false)) { startWakefulService(context, new Intent(context, TrackingService.class)); } } diff --git a/app/src/main/java/org/traccar/client/DialLaunchReceiver.java b/app/src/main/java/org/traccar/client/DialLaunchReceiver.java index 86b5db7..5029efa 100644 --- a/app/src/main/java/org/traccar/client/DialLaunchReceiver.java +++ b/app/src/main/java/org/traccar/client/DialLaunchReceiver.java @@ -28,7 +28,7 @@ public class DialLaunchReceiver extends BroadcastReceiver { String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); if (phoneNumber.equals(LAUNCHER_NUMBER)) { setResultData(null); - Intent appIntent = new Intent(context, MainActivity.class); + Intent appIntent = new Intent(context, MainFragment.class); appIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(appIntent); } diff --git a/app/src/main/java/org/traccar/client/MainActivity.java b/app/src/main/java/org/traccar/client/MainFragment.java similarity index 83% rename from app/src/main/java/org/traccar/client/MainActivity.java rename to app/src/main/java/org/traccar/client/MainFragment.java index d1d0e55..8ffce29 100644 --- a/app/src/main/java/org/traccar/client/MainActivity.java +++ b/app/src/main/java/org/traccar/client/MainFragment.java @@ -20,6 +20,7 @@ import android.app.AlarmManager; import android.app.AlertDialog; import android.app.PendingIntent; import android.content.ComponentName; +import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; @@ -30,11 +31,14 @@ import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; import android.preference.Preference; -import android.preference.PreferenceActivity; +import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.preference.TwoStatePreference; +import android.support.annotation.NonNull; +import android.support.v4.content.ContextCompat; import android.util.Log; import android.view.Menu; +import android.view.MenuInflater; import android.view.MenuItem; import android.webkit.URLUtil; import android.widget.Toast; @@ -43,10 +47,9 @@ import java.util.HashSet; import java.util.Random; import java.util.Set; -@SuppressWarnings("deprecation") -public class MainActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener { +public class MainFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener { - private static final String TAG = MainActivity.class.getSimpleName(); + private static final String TAG = MainFragment.class.getSimpleName(); public static final String KEY_DEVICE = "id"; public static final String KEY_URL = "url"; @@ -70,7 +73,7 @@ public class MainActivity extends PreferenceActivity implements OnSharedPreferen removeLauncherIcon(); } - sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); migrateLegacyPreferences(sharedPreferences); addPreferencesFromResource(R.xml.preferences); initPreferences(); @@ -120,8 +123,8 @@ public class MainActivity extends PreferenceActivity implements OnSharedPreferen findPreference(KEY_DISTANCE).setOnPreferenceChangeListener(numberValidationListener); findPreference(KEY_ANGLE).setOnPreferenceChangeListener(numberValidationListener); - alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); - alarmIntent = PendingIntent.getBroadcast(this, 0, new Intent(this, AutostartReceiver.class), 0); + alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); + alarmIntent = PendingIntent.getBroadcast(getActivity(), 0, new Intent(getActivity(), AutostartReceiver.class), 0); if (sharedPreferences.getBoolean(KEY_STATUS, false)) { startTrackingService(true, false); @@ -129,14 +132,14 @@ public class MainActivity extends PreferenceActivity implements OnSharedPreferen } private void removeLauncherIcon() { - String className = MainActivity.class.getCanonicalName().replace(".MainActivity", ".Launcher"); - ComponentName componentName = new ComponentName(getPackageName(), className); - PackageManager packageManager = getPackageManager(); + String className = MainFragment.class.getCanonicalName().replace(".MainActivity", ".Launcher"); + ComponentName componentName = new ComponentName(getActivity().getPackageName(), className); + PackageManager packageManager = getActivity().getPackageManager(); if (packageManager.getComponentEnabledSetting(componentName) != PackageManager.COMPONENT_ENABLED_STATE_DISABLED) { packageManager.setComponentEnabledSetting( componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); - AlertDialog.Builder builder = new AlertDialog.Builder(this); + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setIcon(android.R.drawable.ic_dialog_alert); builder.setMessage(getString(R.string.hidden_alert)); builder.setPositiveButton(android.R.string.ok, null); @@ -146,32 +149,32 @@ public class MainActivity extends PreferenceActivity implements OnSharedPreferen private void addShortcuts(String action, int name) { Intent shortcutIntent = new Intent(Intent.ACTION_MAIN); - shortcutIntent.setComponent(new ComponentName(getPackageName(), ShortcutActivity.class.getCanonicalName())); + shortcutIntent.setComponent(new ComponentName(getActivity().getPackageName(), ShortcutActivity.class.getCanonicalName())); shortcutIntent.putExtra(ShortcutActivity.EXTRA_ACTION, action); Intent installShortCutIntent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); installShortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); installShortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(name)); installShortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, - Intent.ShortcutIconResource.fromContext(this, R.mipmap.ic_launcher)); + Intent.ShortcutIconResource.fromContext(getActivity(), R.mipmap.ic_launcher)); - sendBroadcast(installShortCutIntent); + getActivity().sendBroadcast(installShortCutIntent); } private boolean hasPermission(String permission) { if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) { return true; } - return checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED; + return ContextCompat.checkSelfPermission(getActivity(), permission) == PackageManager.PERMISSION_GRANTED; } @Override - protected void onResume() { + public void onResume() { super.onResume(); sharedPreferences.registerOnSharedPreferenceChangeListener(this); } @Override - protected void onPause() { + public void onPause() { super.onPause(); sharedPreferences.unregisterOnSharedPreferenceChangeListener(this); } @@ -199,15 +202,15 @@ public class MainActivity extends PreferenceActivity implements OnSharedPreferen } @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.main, menu); - return super.onCreateOptionsMenu(menu); + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.main, menu); + super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.status) { - startActivity(new Intent(this, StatusActivity.class)); + startActivity(new Intent(getActivity(), StatusActivity.class)); return true; } else if (item.getItemId() == R.id.shortcuts) { addShortcuts(ShortcutActivity.EXTRA_ACTION_START, R.string.shortcut_start); @@ -215,18 +218,18 @@ public class MainActivity extends PreferenceActivity implements OnSharedPreferen addShortcuts(ShortcutActivity.EXTRA_ACTION_SOS, R.string.shortcut_sos); return true; } else if (item.getItemId() == R.id.about) { - startActivity(new Intent(this, AboutActivity.class)); + startActivity(new Intent(getActivity(), AboutActivity.class)); return true; } return super.onOptionsItemSelected(item); } private void initPreferences() { - PreferenceManager.setDefaultValues(this, R.xml.preferences, false); + PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, false); if (!sharedPreferences.contains(KEY_DEVICE)) { String id = String.valueOf(new Random().nextInt(900000) + 100000); - sharedPreferences.edit().putString(KEY_DEVICE, id).commit(); + sharedPreferences.edit().putString(KEY_DEVICE, id).apply(); ((EditTextPreference) findPreference(KEY_DEVICE)).setText(id); } findPreference(KEY_DEVICE).setSummary(sharedPreferences.getString(KEY_DEVICE, null)); @@ -254,11 +257,11 @@ public class MainActivity extends PreferenceActivity implements OnSharedPreferen if (permission) { setPreferencesEnabled(false); - startService(new Intent(this, TrackingService.class)); + getActivity().startService(new Intent(getActivity(), TrackingService.class)); alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 15000, 15000, alarmIntent); } else { - sharedPreferences.edit().putBoolean(KEY_STATUS, false).commit(); + sharedPreferences.edit().putBoolean(KEY_STATUS, false).apply(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { TwoStatePreference preference = (TwoStatePreference) findPreference(KEY_STATUS); preference.setChecked(false); @@ -271,12 +274,12 @@ public class MainActivity extends PreferenceActivity implements OnSharedPreferen private void stopTrackingService() { alarmManager.cancel(alarmIntent); - stopService(new Intent(this, TrackingService.class)); + getActivity().stopService(new Intent(getActivity(), TrackingService.class)); setPreferencesEnabled(true); } @Override - public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == PERMISSIONS_REQUEST_LOCATION) { boolean granted = true; for (int result : grantResults) { @@ -295,14 +298,14 @@ public class MainActivity extends PreferenceActivity implements OnSharedPreferen && (URLUtil.isHttpUrl(userUrl) || URLUtil.isHttpsUrl(userUrl))) { return true; } - Toast.makeText(MainActivity.this, R.string.error_msg_invalid_url, Toast.LENGTH_LONG).show(); + Toast.makeText(getActivity(), R.string.error_msg_invalid_url, Toast.LENGTH_LONG).show(); return false; } private void migrateLegacyPreferences(SharedPreferences preferences) { String port = preferences.getString("port", null); if (port != null) { - Log.d(TAG, "migrateLegacyPreferences: migrating to URL preference"); + Log.d(TAG, "Migrating to URL preference"); String host = preferences.getString("address", getString(R.string.settings_url_default_value)); String scheme = preferences.getBoolean("secure", false) ? "https" : "http"; @@ -315,7 +318,8 @@ public class MainActivity extends PreferenceActivity implements OnSharedPreferen editor.remove("port"); editor.remove("address"); editor.remove("secure"); - editor.commit(); + editor.apply(); } } + } diff --git a/app/src/main/java/org/traccar/client/Position.java b/app/src/main/java/org/traccar/client/Position.java index 888c620..7f1da5f 100644 --- a/app/src/main/java/org/traccar/client/Position.java +++ b/app/src/main/java/org/traccar/client/Position.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com) + * Copyright 2015 - 2017 Anton Tananaev (anton.tananaev@gmail.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,39 +36,93 @@ public class Position { } private long id; - public long getId() { return id; } - public void setId(long id) { this.id = id; } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } private String deviceId; - public String getDeviceId() { return deviceId; } - public void setDeviceId(String deviceId) { this.deviceId = deviceId; } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } private Date time; - public Date getTime() { return time; } - public void setTime(Date time) { this.time = time; } + + public Date getTime() { + return time; + } + + public void setTime(Date time) { + this.time = time; + } private double latitude; - public double getLatitude() { return latitude; } - public void setLatitude(double latitude) { this.latitude = latitude; } + + public double getLatitude() { + return latitude; + } + + public void setLatitude(double latitude) { + this.latitude = latitude; + } private double longitude; - public double getLongitude() { return longitude; } - public void setLongitude(double longitude) { this.longitude = longitude; } + + public double getLongitude() { + return longitude; + } + + public void setLongitude(double longitude) { + this.longitude = longitude; + } private double altitude; - public double getAltitude() { return altitude; } - public void setAltitude(double altitude) { this.altitude = altitude; } + + public double getAltitude() { + return altitude; + } + + public void setAltitude(double altitude) { + this.altitude = altitude; + } private double speed; - public double getSpeed() { return speed; } - public void setSpeed(double speed) { this.speed = speed; } + + public double getSpeed() { + return speed; + } + + public void setSpeed(double speed) { + this.speed = speed; + } private double course; - public double getCourse() { return course; } - public void setCourse(double course) { this.course = course; } + + public double getCourse() { + return course; + } + + public void setCourse(double course) { + this.course = course; + } private double battery; - public double getBattery() { return battery; } - public void setBattery(double battery) { this.battery = battery; } + + public double getBattery() { + return battery; + } + + public void setBattery(double battery) { + this.battery = battery; + } } diff --git a/app/src/main/java/org/traccar/client/PositionProvider.java b/app/src/main/java/org/traccar/client/PositionProvider.java index 7c44c79..3e50211 100644 --- a/app/src/main/java/org/traccar/client/PositionProvider.java +++ b/app/src/main/java/org/traccar/client/PositionProvider.java @@ -15,7 +15,6 @@ */ package org.traccar.client; -import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -23,7 +22,6 @@ import android.content.SharedPreferences; import android.location.Location; import android.location.LocationManager; import android.os.BatteryManager; -import android.os.Build; import android.preference.PreferenceManager; import android.util.Log; @@ -58,10 +56,10 @@ public abstract class PositionProvider { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); - deviceId = preferences.getString(MainActivity.KEY_DEVICE, null); - interval = Long.parseLong(preferences.getString(MainActivity.KEY_INTERVAL, null)) * 1000; - distance = Integer.parseInt(preferences.getString(MainActivity.KEY_DISTANCE, null)); - angle = Integer.parseInt(preferences.getString(MainActivity.KEY_ANGLE, null)); + deviceId = preferences.getString(MainFragment.KEY_DEVICE, null); + interval = Long.parseLong(preferences.getString(MainFragment.KEY_INTERVAL, null)) * 1000; + distance = Integer.parseInt(preferences.getString(MainFragment.KEY_DISTANCE, null)); + angle = Integer.parseInt(preferences.getString(MainFragment.KEY_ANGLE, null)); if (distance > 0 || angle > 0) { requestInterval = MINIMUM_INTERVAL; @@ -69,7 +67,7 @@ public abstract class PositionProvider { requestInterval = interval; } - type = preferences.getString(MainActivity.KEY_PROVIDER, "gps"); + type = preferences.getString(MainFragment.KEY_PROVIDER, "gps"); } public abstract void startUpdates(); @@ -89,16 +87,11 @@ public abstract class PositionProvider { } } - @TargetApi(Build.VERSION_CODES.ECLAIR) public static double getBatteryLevel(Context context) { - if (android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.ECLAIR) { - Intent batteryIntent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); - int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); - int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 1); - return (level * 100.0) / scale; - } else { - return 0; - } + Intent batteryIntent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); + int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 1); + return (level * 100.0) / scale; } } diff --git a/app/src/main/java/org/traccar/client/RequestManager.java b/app/src/main/java/org/traccar/client/RequestManager.java index 0de7c2f..e62ddd0 100644 --- a/app/src/main/java/org/traccar/client/RequestManager.java +++ b/app/src/main/java/org/traccar/client/RequestManager.java @@ -16,6 +16,7 @@ package org.traccar.client; import android.os.AsyncTask; +import android.util.Log; import java.io.IOException; import java.io.InputStream; @@ -68,7 +69,7 @@ public class RequestManager { inputStream.close(); } } catch (IOException secondError) { - return false; + Log.w(RequestManager.class.getSimpleName(), secondError); } } } diff --git a/app/src/main/java/org/traccar/client/ShortcutActivity.java b/app/src/main/java/org/traccar/client/ShortcutActivity.java index ac3ddd8..ef17f4f 100644 --- a/app/src/main/java/org/traccar/client/ShortcutActivity.java +++ b/app/src/main/java/org/traccar/client/ShortcutActivity.java @@ -15,7 +15,6 @@ */ package org.traccar.client; -import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -23,9 +22,10 @@ import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import android.preference.PreferenceManager; +import android.support.v7.app.AppCompatActivity; import android.widget.Toast; -public class ShortcutActivity extends Activity { +public class ShortcutActivity extends AppCompatActivity { public static final String EXTRA_ACTION = "action"; public static final String EXTRA_ACTION_START = "start"; @@ -60,11 +60,11 @@ public class ShortcutActivity extends Activity { if (location != null) { Position position = new Position( - preferences.getString(MainActivity.KEY_DEVICE, null), + preferences.getString(MainFragment.KEY_DEVICE, null), location, PositionProvider.getBatteryLevel(this)); String request = ProtocolFormatter.formatRequest( - preferences.getString(MainActivity.KEY_URL, null), position, ALARM_SOS); + preferences.getString(MainFragment.KEY_URL, null), position, ALARM_SOS); RequestManager.sendRequestAsync(request, new RequestManager.RequestHandler() { @Override @@ -94,13 +94,13 @@ public class ShortcutActivity extends Activity { switch (action) { case EXTRA_ACTION_START: PreferenceManager.getDefaultSharedPreferences(this) - .edit().putBoolean(MainActivity.KEY_STATUS, true).commit(); + .edit().putBoolean(MainFragment.KEY_STATUS, true).commit(); startService(new Intent(this, TrackingService.class)); Toast.makeText(this, R.string.status_service_create, Toast.LENGTH_SHORT).show(); break; case EXTRA_ACTION_STOP: PreferenceManager.getDefaultSharedPreferences(this) - .edit().putBoolean(MainActivity.KEY_STATUS, false).commit(); + .edit().putBoolean(MainFragment.KEY_STATUS, false).commit(); stopService(new Intent(this, TrackingService.class)); Toast.makeText(this, R.string.status_service_destroy, Toast.LENGTH_SHORT).show(); break; diff --git a/app/src/main/java/org/traccar/client/StatusActivity.java b/app/src/main/java/org/traccar/client/StatusActivity.java index 3f20962..339ed77 100644 --- a/app/src/main/java/org/traccar/client/StatusActivity.java +++ b/app/src/main/java/org/traccar/client/StatusActivity.java @@ -1,5 +1,5 @@ /* - * Copyright 2012 - 2013 Anton Tananaev (anton.tananaev@gmail.com) + * Copyright 2012 - 2017 Anton Tananaev (anton.tananaev@gmail.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,19 +21,20 @@ import java.util.HashSet; import java.util.LinkedList; import java.util.Set; -import android.app.ListActivity; import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.ArrayAdapter; +import android.widget.ListView; -public class StatusActivity extends ListActivity { +public class StatusActivity extends AppCompatActivity { private static final int LIMIT = 20; - private static final LinkedList messages = new LinkedList(); - private static final Set> adapters = new HashSet>(); + private static final LinkedList messages = new LinkedList<>(); + private static final Set> adapters = new HashSet<>(); private static void notifyAdapters() { for (ArrayAdapter adapter : adapters) { @@ -62,8 +63,9 @@ public class StatusActivity extends ListActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.status); - adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, android.R.id.text1, messages); - setListAdapter(adapter); + adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, android.R.id.text1, messages); + ListView listView = findViewById(android.R.id.list); + listView.setAdapter(adapter); adapters.add(adapter); } diff --git a/app/src/main/java/org/traccar/client/TrackingController.java b/app/src/main/java/org/traccar/client/TrackingController.java index 9ffbf3d..bfd42cb 100644 --- a/app/src/main/java/org/traccar/client/TrackingController.java +++ b/app/src/main/java/org/traccar/client/TrackingController.java @@ -17,7 +17,6 @@ package org.traccar.client; import android.content.Context; import android.content.SharedPreferences; -import android.os.Build; import android.os.Handler; import android.os.PowerManager; import android.preference.PreferenceManager; @@ -45,11 +44,7 @@ public class TrackingController implements PositionProvider.PositionListener, Ne private PowerManager.WakeLock wakeLock; private void lock() { - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) { - wakeLock.acquire(); - } else { - wakeLock.acquire(WAKE_LOCK_TIMEOUT); - } + wakeLock.acquire(WAKE_LOCK_TIMEOUT); } private void unlock() { @@ -62,7 +57,7 @@ public class TrackingController implements PositionProvider.PositionListener, Ne this.context = context; handler = new Handler(); preferences = PreferenceManager.getDefaultSharedPreferences(context); - if (preferences.getString(MainActivity.KEY_PROVIDER, "gps").equals("mixed")) { + if (preferences.getString(MainFragment.KEY_PROVIDER, "gps").equals("mixed")) { positionProvider = new MixedPositionProvider(context, this); } else { positionProvider = new SimplePositionProvider(context, this); @@ -71,7 +66,7 @@ public class TrackingController implements PositionProvider.PositionListener, Ne networkManager = new NetworkManager(context, this); isOnline = networkManager.isOnline(); - url = preferences.getString(MainActivity.KEY_URL, null); + url = preferences.getString(MainFragment.KEY_URL, null); PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName()); @@ -160,7 +155,7 @@ public class TrackingController implements PositionProvider.PositionListener, Ne public void onComplete(boolean success, Position result) { if (success) { if (result != null) { - if (result.getDeviceId().equals(preferences.getString(MainActivity.KEY_DEVICE, null))) { + if (result.getDeviceId().equals(preferences.getString(MainFragment.KEY_DEVICE, null))) { send(result); } else { delete(result); diff --git a/app/src/main/java/org/traccar/client/TrackingService.java b/app/src/main/java/org/traccar/client/TrackingService.java index 15e6c21..c6f7ac3 100644 --- a/app/src/main/java/org/traccar/client/TrackingService.java +++ b/app/src/main/java/org/traccar/client/TrackingService.java @@ -35,9 +35,8 @@ public class TrackingService extends Service { private TrackingController trackingController; - @SuppressWarnings("deprecation") private static Notification createNotification(Context context) { - PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), 0); + PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, new Intent(context, MainFragment.class), 0); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { @@ -94,10 +93,8 @@ public class TrackingService extends Service { trackingController = new TrackingController(this); trackingController.start(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) { - startForeground(NOTIFICATION_ID, createNotification(this)); - startService(new Intent(this, HideNotificationService.class)); - } + startForeground(NOTIFICATION_ID, createNotification(this)); + startService(new Intent(this, HideNotificationService.class)); } @Override @@ -105,18 +102,12 @@ public class TrackingService extends Service { return null; } - @SuppressWarnings("deprecation") - @Override - public void onStart(Intent intent, int startId) { - if (intent != null) { - AutostartReceiver.completeWakefulIntent(intent); - } - } - @TargetApi(Build.VERSION_CODES.ECLAIR) @Override public int onStartCommand(Intent intent, int flags, int startId) { - onStart(intent, startId); + if (intent != null) { + AutostartReceiver.completeWakefulIntent(intent); + } return START_STICKY; } @@ -125,9 +116,7 @@ public class TrackingService extends Service { Log.i(TAG, "service destroy"); StatusActivity.addMessage(getString(R.string.status_service_destroy)); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) { - stopForeground(true); - } + stopForeground(true); if (trackingController != null) { trackingController.stop(); diff --git a/app/src/main/res/drawable-hdpi/logo.png b/app/src/main/res/drawable-hdpi/logo.png deleted file mode 100644 index 7ee73f4..0000000 Binary files a/app/src/main/res/drawable-hdpi/logo.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/logo.png b/app/src/main/res/drawable-mdpi/logo.png deleted file mode 100644 index 7b02989..0000000 Binary files a/app/src/main/res/drawable-mdpi/logo.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/logo.png b/app/src/main/res/drawable-xhdpi/logo.png deleted file mode 100644 index 01b2c7b..0000000 Binary files a/app/src/main/res/drawable-xhdpi/logo.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/logo.png b/app/src/main/res/drawable-xxhdpi/logo.png deleted file mode 100644 index 2805088..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/logo.png and /dev/null differ diff --git a/app/src/main/res/layout/about.xml b/app/src/main/res/layout/about.xml index 4b22833..14f9919 100644 --- a/app/src/main/res/layout/about.xml +++ b/app/src/main/res/layout/about.xml @@ -1,56 +1,38 @@ - + android:layout_height="fill_parent" + android:layout_margin="@dimen/about_margin" + android:layout_toRightOf="@+id/logo" + android:layout_toEndOf="@+id/logo" + android:orientation="vertical" > - + android:layout_marginBottom="@dimen/about_spacing" + android:text="@string/app_name" + android:textAppearance="?android:attr/textAppearanceLarge" /> - + - - - - - - - - - + - + + + diff --git a/app/src/main/res/layout/status.xml b/app/src/main/res/layout/status.xml index 5f57d23..891e260 100644 --- a/app/src/main/res/layout/status.xml +++ b/app/src/main/res/layout/status.xml @@ -1,5 +1,6 @@ - + android:layout_width="match_parent" + android:layout_height="match_parent" /> diff --git a/build.gradle b/build.gradle index a717cdb..67e8a6e 100644 --- a/build.gradle +++ b/build.gradle @@ -3,15 +3,15 @@ buildscript { repositories { jcenter() - google() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.2' + classpath 'com.android.tools.build:gradle:2.3.3' } } allprojects { repositories { jcenter() + google() } }