From b7fb6445ef27231c9d8c6d9a3766db46737283fb Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 30 Jan 2016 10:17:30 +1300 Subject: [PATCH] Implement application shortcuts (fix #161) --- app/src/main/AndroidManifest.xml | 8 +++ .../java/org/traccar/client/MainActivity.java | 31 ++++++---- .../org/traccar/client/ShortcutActivity.java | 56 +++++++++++++++++++ app/src/main/res/menu/main.xml | 7 ++- app/src/main/res/values/strings.xml | 3 + 5 files changed, 94 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/org/traccar/client/ShortcutActivity.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b3b5d46..b81643c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + + + + + + + diff --git a/app/src/main/java/org/traccar/client/MainActivity.java b/app/src/main/java/org/traccar/client/MainActivity.java index cf18546..85b1e45 100644 --- a/app/src/main/java/org/traccar/client/MainActivity.java +++ b/app/src/main/java/org/traccar/client/MainActivity.java @@ -1,5 +1,5 @@ /* - * Copyright 2012 - 2015 Anton Tananaev (anton.tananaev@gmail.com) + * Copyright 2012 - 2016 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. @@ -17,16 +17,11 @@ package org.traccar.client; import android.Manifest; import android.app.AlertDialog; -import android.app.Dialog; import android.content.ComponentName; -import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; -import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; -import android.location.LocationManager; import android.os.Build; import android.os.Bundle; import android.preference.CheckBoxPreference; @@ -34,9 +29,7 @@ import android.preference.EditTextPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceManager; -import android.preference.PreferenceScreen; import android.preference.TwoStatePreference; -import android.telephony.TelephonyManager; import android.util.Patterns; import android.view.Menu; import android.view.MenuItem; @@ -74,7 +67,7 @@ public class MainActivity extends PreferenceActivity implements OnSharedPreferen findPreference(KEY_DEVICE).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { - return newValue != null && !((String) newValue).isEmpty(); + return newValue != null && !newValue.equals(""); } }); findPreference(KEY_ADDRESS).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @@ -137,6 +130,20 @@ public class MainActivity extends PreferenceActivity implements OnSharedPreferen } } + private void addShortcuts(boolean start, int name) { + Intent shortcutIntent = new Intent(Intent.ACTION_MAIN); + shortcutIntent.setComponent(new ComponentName(getPackageName(), ".ShortcutActivity")); + shortcutIntent.putExtra(ShortcutActivity.EXTRA_ACTION, start); + + 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)); + + sendBroadcast(installShortCutIntent); + } + private boolean hasPermission(String permission) { if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) { return true; @@ -188,6 +195,10 @@ public class MainActivity extends PreferenceActivity implements OnSharedPreferen if (item.getItemId() == R.id.status) { startActivity(new Intent(this, StatusActivity.class)); return true; + } else if (item.getItemId() == R.id.shortcuts) { + addShortcuts(true, R.string.shortcut_start); + addShortcuts(false, R.string.shortcut_stop); + return true; } else if (item.getItemId() == R.id.about) { startActivity(new Intent(this, AboutActivity.class)); return true; @@ -208,7 +219,7 @@ public class MainActivity extends PreferenceActivity implements OnSharedPreferen private void startTrackingService(boolean checkPermission, boolean permission) { if (checkPermission) { - Set missingPermissions = new HashSet(); + Set missingPermissions = new HashSet<>(); if (!hasPermission(Manifest.permission.ACCESS_FINE_LOCATION)) { missingPermissions.add(Manifest.permission.ACCESS_FINE_LOCATION); } diff --git a/app/src/main/java/org/traccar/client/ShortcutActivity.java b/app/src/main/java/org/traccar/client/ShortcutActivity.java new file mode 100644 index 0000000..ff7f698 --- /dev/null +++ b/app/src/main/java/org/traccar/client/ShortcutActivity.java @@ -0,0 +1,56 @@ +/* + * Copyright 2016 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. + * 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 org.traccar.client; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.widget.Toast; + +public class ShortcutActivity extends Activity { + + public static final String EXTRA_ACTION = "shortcutAction"; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + checkShortcutAction(getIntent()); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + checkShortcutAction(intent); + } + + private void checkShortcutAction(Intent intent) { + if (intent.hasExtra(EXTRA_ACTION)) { + boolean start = intent.getBooleanExtra(EXTRA_ACTION, false); + PreferenceManager.getDefaultSharedPreferences(this) + .edit().putBoolean(MainActivity.KEY_STATUS, start).commit(); + if (start) { + startService(new Intent(this, TrackingService.class)); + Toast.makeText(this, R.string.status_service_create, Toast.LENGTH_SHORT).show(); + } else { + stopService(new Intent(this, TrackingService.class)); + Toast.makeText(this, R.string.status_service_destroy, Toast.LENGTH_SHORT).show(); + } + finish(); + } + } + +} diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml index 4cfe5b2..ecd52c1 100644 --- a/app/src/main/res/menu/main.xml +++ b/app/src/main/res/menu/main.xml @@ -6,9 +6,14 @@ android:title="@string/menu_status" android:showAsAction="always" /> + + + android:showAsAction="never" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 060453b..395806c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,6 +3,8 @@ Traccar Client Traccar + Traccar - Start + Traccar - Stop Device identifier Server address @@ -28,6 +30,7 @@ Status About + Add shortcuts Clear Real time GPS tracker for Android devices. Compatible with Traccar Server and other tracking systems.