@6.01.15 Dennis Thießen: NotificationService hinzugefügt. In der SettingsActivity die Notifications einstellbar gemacht. Die Location von der Map muss jedoch noch getestet werden.
This commit is contained in:
@@ -40,7 +40,6 @@ public class MainActivity extends BaseActivity{
|
|||||||
|
|
||||||
private final static String mActivityTitle = "RiskAhead";
|
private final static String mActivityTitle = "RiskAhead";
|
||||||
private final static String TAG = MainActivity.class.getSimpleName();
|
private final static String TAG = MainActivity.class.getSimpleName();
|
||||||
private final static String EXTRA_MESSAGE = "org.deke.risk.riskahead.MESSAGE";
|
|
||||||
public String msg_input;
|
public String msg_input;
|
||||||
|
|
||||||
public static FragmentManager fragmentManager;
|
public static FragmentManager fragmentManager;
|
||||||
@@ -96,133 +95,10 @@ public class MainActivity extends BaseActivity{
|
|||||||
|
|
||||||
map.setCompoundDrawables(null,null, mapIcon, null);
|
map.setCompoundDrawables(null,null, mapIcon, null);
|
||||||
|
|
||||||
startNotifyTask();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Runnable mNotifyTask = new Runnable()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
Log.d(this.toString(),"Run Notification Task");
|
|
||||||
|
|
||||||
myPosition = session.getLocation();
|
|
||||||
if((myPosition != null) && (myPosition.latitude != 0.0) && (myPosition.longitude != 0.0)){
|
|
||||||
|
|
||||||
String lastNotificationTime = "";
|
|
||||||
|
|
||||||
if(session.getLastNotification().equals("")){
|
|
||||||
lastNotificationTime = getUser().get(SessionManager.KEY_LASTLOGIN_AT);
|
|
||||||
}else{
|
|
||||||
lastNotificationTime = session.getLastNotification();
|
|
||||||
}
|
|
||||||
|
|
||||||
Log.d(this.toString(),"Lookup location with position: "+myPosition+" Radius: 15 lastNotifyTime: "+lastNotificationTime);
|
|
||||||
StringRequest strReq = getStringRequestIncidentsFromAreaAndTime(myPosition.latitude, myPosition.longitude, 15, lastNotificationTime);
|
|
||||||
String tag_string_req = "req_incidents";
|
|
||||||
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
|
|
||||||
}
|
|
||||||
|
|
||||||
mNotifyHandler.postDelayed(mNotifyTask, INTERVAL_NOTIFICATION);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
public void startNotifyTask()
|
|
||||||
{
|
|
||||||
mNotifyTask.run();
|
|
||||||
Log.d("BaseActivity","Start NotfiyTask");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void stopNotifyTask()
|
|
||||||
{
|
|
||||||
mNotifyHandler.removeCallbacks(mNotifyTask);
|
|
||||||
Log.d("BaseActivity", "Stop NotfiyTask");
|
|
||||||
}
|
|
||||||
|
|
||||||
private StringRequest getStringRequestIncidentsFromAreaAndTime(final Double latitude, final Double longitude, final int radius, final String time) {
|
|
||||||
return new StringRequest(Request.Method.POST, AppConfig.URL_REGISTER, new Response.Listener<String>() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResponse(String response) {
|
|
||||||
Log.d(TAG, "Incident notifications: " + response);
|
|
||||||
|
|
||||||
try {
|
|
||||||
JSONObject jObj = new JSONObject(response);
|
|
||||||
boolean error = jObj.getBoolean("error");
|
|
||||||
|
|
||||||
if (!error) {
|
|
||||||
JSONArray notification = jObj.getJSONArray("msg");
|
|
||||||
|
|
||||||
sentNotification(notification);
|
|
||||||
} else {
|
|
||||||
String errorMsg = jObj.getString("error_msg");
|
|
||||||
Log.e(TAG, "Error getting incident notification (server returned error): " + errorMsg);
|
|
||||||
}
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}, new Response.ErrorListener() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onErrorResponse(VolleyError error) {
|
|
||||||
Log.e(TAG, "Error getting incident notification: " + error.getMessage());
|
|
||||||
showMessage(getString(R.string.errormsg_couldnotretrieve));
|
|
||||||
stopNotifyTask();
|
|
||||||
}
|
|
||||||
}) {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, String> getParams() {
|
|
||||||
Map<String, String> params = new HashMap<>();
|
|
||||||
params.put("tag", "getincidentsinareaandtime");
|
|
||||||
params.put("uid", user.get(SessionManager.KEY_UID));
|
|
||||||
params.put("token", user.get(SessionManager.TOKEN));
|
|
||||||
params.put("latitude", Double.toString(latitude));
|
|
||||||
params.put("longitude", Double.toString(longitude));
|
|
||||||
params.put("radius", Integer.toString(radius));
|
|
||||||
params.put("time", "'"+time+"'");
|
|
||||||
return params;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sentNotification(JSONArray notification) {
|
|
||||||
NotificationCompat.Builder mBuilder =
|
|
||||||
new NotificationCompat.Builder(getApplicationContext())
|
|
||||||
.setSmallIcon(R.drawable.logo_riskahead_header)
|
|
||||||
.setContentTitle("New incidents reported in your area!")
|
|
||||||
.setContentText(notification.length() + " new incidents near your last location. Watch out!");
|
|
||||||
|
|
||||||
NotificationManager mNotificationManager =
|
|
||||||
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
|
||||||
|
|
||||||
|
|
||||||
Intent resultIntent = new Intent(this, MapsActivity.class);
|
|
||||||
try {
|
|
||||||
resultIntent.putExtra(EXTRA_MESSAGE, notification.getJSONObject(notification.length()-1).getDouble("latitude")+":"+notification.getJSONObject(notification.length()-1).getDouble("longitude"));
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
|
|
||||||
stackBuilder.addParentStack(MapsActivity.class);
|
|
||||||
|
|
||||||
stackBuilder.addNextIntent(resultIntent);
|
|
||||||
PendingIntent resultPendingIntent =
|
|
||||||
stackBuilder.getPendingIntent(
|
|
||||||
0,
|
|
||||||
PendingIntent.FLAG_UPDATE_CURRENT
|
|
||||||
);
|
|
||||||
mBuilder.setContentIntent(resultPendingIntent);
|
|
||||||
|
|
||||||
int mId = 1;
|
|
||||||
mNotificationManager.notify(mId, mBuilder.build());
|
|
||||||
|
|
||||||
session.setLastNotification(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime()));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected int getLayoutResourceId() {
|
protected int getLayoutResourceId() {
|
||||||
@@ -243,7 +119,6 @@ public class MainActivity extends BaseActivity{
|
|||||||
@Override
|
@Override
|
||||||
protected void onDestroy(){
|
protected void onDestroy(){
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
stopNotifyTask();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -127,6 +127,15 @@ public class MapsActivity extends BaseActivity implements LoaderManager.LoaderCa
|
|||||||
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(point, DEFAULT_ZOOM_LEVEL));
|
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(point, DEFAULT_ZOOM_LEVEL));
|
||||||
findViewById(R.id.fab_reportwf_map).setVisibility(View.VISIBLE);
|
findViewById(R.id.fab_reportwf_map).setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
|
if(getIntent().getStringExtra(EXTRA_MESSAGE).equals("NoIncident")){
|
||||||
|
findViewById(R.id.fab_reportwf_map).setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
session.setLocation((long)markedLocation.latitude,(long)markedLocation.longitude);
|
||||||
|
gotoSettingsActivity();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}else{
|
||||||
findViewById(R.id.fab_reportwf_map).setOnClickListener(new View.OnClickListener() {
|
findViewById(R.id.fab_reportwf_map).setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
@@ -134,6 +143,8 @@ public class MapsActivity extends BaseActivity implements LoaderManager.LoaderCa
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import org.json.JSONException;
|
|||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,31 +49,95 @@ public class SettingsFragment extends PreferenceFragment {
|
|||||||
private EditTextPreference prefSurname;
|
private EditTextPreference prefSurname;
|
||||||
private EditTextPreference prefName;
|
private EditTextPreference prefName;
|
||||||
private EditTextPreference prefEmail;
|
private EditTextPreference prefEmail;
|
||||||
|
private Preference btnRequestPW;
|
||||||
|
|
||||||
private SwitchPreference prefNotifications;
|
private SwitchPreference prefNotifications;
|
||||||
private ListPreference prefRadius;
|
private ListPreference prefRadius;
|
||||||
private ListPreference prefFrequency;
|
private ListPreference prefFrequency;
|
||||||
|
private SwitchPreference prefGPSENabled;
|
||||||
|
private Preference prefLocation;
|
||||||
|
|
||||||
private Preference btnRequestPW;
|
|
||||||
|
|
||||||
HashMap<String,String> user;
|
|
||||||
|
public SessionManager session;
|
||||||
|
public HashMap<String, String> user;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
session = new SessionManager(getActivity().getApplicationContext());
|
||||||
|
user = session.getUserDetails();
|
||||||
|
|
||||||
addPreferencesFromResource(R.xml.settings);
|
addPreferencesFromResource(R.xml.settings);
|
||||||
|
|
||||||
|
initAccountPrefs();
|
||||||
|
|
||||||
|
prefNotifications = (SwitchPreference) getPreferenceManager().findPreference("notifyEnable");
|
||||||
|
prefRadius = (ListPreference) getPreferenceManager().findPreference("notifyRadius");
|
||||||
|
prefFrequency = (ListPreference) getPreferenceManager().findPreference("notifyFrequency");
|
||||||
|
prefGPSENabled = (SwitchPreference) getPreferenceManager().findPreference("notifyEnableGPS");
|
||||||
|
prefLocation = (Preference) getPreferenceManager().findPreference("notifyChooseLocation");
|
||||||
|
|
||||||
|
prefNotifications.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
|
String newStringValue = newValue.toString();
|
||||||
|
session.setNotificationEnabled(Boolean.valueOf(newStringValue));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
prefRadius.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
|
String newStringValue = newValue.toString();
|
||||||
|
session.setNotificationRadius(Integer.valueOf(newStringValue));
|
||||||
|
((ListPreference)preference).setValue(newValue.toString());
|
||||||
|
((ListPreference)preference).setSummary(prefRadius.getEntry());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
prefFrequency.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
|
String newStringValue = newValue.toString();
|
||||||
|
session.setNotificationPollFreq(Integer.valueOf(newStringValue));
|
||||||
|
((ListPreference)preference).setValue(newValue.toString());
|
||||||
|
((ListPreference)preference).setSummary(prefFrequency.getEntry());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
prefGPSENabled.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener(){
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
|
String newStringValue = newValue.toString();
|
||||||
|
session.setGPSForNotificationsEnabled(Boolean.valueOf(newStringValue));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
prefLocation.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
((SettingsActivity)getActivity()).gotoMapActivity("NoIncident");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
updatePrefs();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initAccountPrefs() {
|
||||||
prefUsername = (EditTextPreference) getPreferenceManager().findPreference("usernamePref");
|
prefUsername = (EditTextPreference) getPreferenceManager().findPreference("usernamePref");
|
||||||
prefSurname = (EditTextPreference) getPreferenceManager().findPreference("surnamePref");
|
prefSurname = (EditTextPreference) getPreferenceManager().findPreference("surnamePref");
|
||||||
prefName = (EditTextPreference) getPreferenceManager().findPreference("namePref");
|
prefName = (EditTextPreference) getPreferenceManager().findPreference("namePref");
|
||||||
prefEmail = (EditTextPreference) getPreferenceManager().findPreference("emailPref");
|
prefEmail = (EditTextPreference) getPreferenceManager().findPreference("emailPref");
|
||||||
|
|
||||||
btnRequestPW = (Preference) getPreferenceManager().findPreference("resetPassword");
|
btnRequestPW = (Preference) getPreferenceManager().findPreference("resetPassword");
|
||||||
|
|
||||||
prefRadius = (ListPreference) getPreferenceManager().findPreference("notifyRadius");
|
|
||||||
prefNotifications = (SwitchPreference) getPreferenceManager().findPreference("notifyEnable");
|
|
||||||
prefFrequency = (ListPreference) getPreferenceManager().findPreference("notifyFrequency");
|
|
||||||
|
|
||||||
prefUsername.getEditText().addTextChangedListener(new TextValidator(prefUsername.getEditText(), getActivity().getApplicationContext()) {
|
prefUsername.getEditText().addTextChangedListener(new TextValidator(prefUsername.getEditText(), getActivity().getApplicationContext()) {
|
||||||
@Override
|
@Override
|
||||||
@@ -129,19 +194,15 @@ public class SettingsFragment extends PreferenceFragment {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
updatePrefs();
|
|
||||||
|
|
||||||
if(!user.get(SessionManager.PROVIDER_TYPE).equals("local")){
|
if(!user.get(SessionManager.PROVIDER_TYPE).equals("local")){
|
||||||
btnRequestPW.setEnabled(false);
|
btnRequestPW.setEnabled(false);
|
||||||
}else{
|
}else{
|
||||||
btnRequestPW.setEnabled(true);
|
btnRequestPW.setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updatePrefs() {
|
private void updatePrefs() {
|
||||||
user = ((SettingsActivity) getActivity()).getUser();
|
user = session.getUserDetails();
|
||||||
|
|
||||||
prefUsername.setText(user.get(SessionManager.KEY_USERNAME));
|
prefUsername.setText(user.get(SessionManager.KEY_USERNAME));
|
||||||
prefSurname.setText(user.get(SessionManager.KEY_SURNAME));
|
prefSurname.setText(user.get(SessionManager.KEY_SURNAME));
|
||||||
@@ -152,6 +213,20 @@ public class SettingsFragment extends PreferenceFragment {
|
|||||||
prefSurname.setSummary(user.get(SessionManager.KEY_SURNAME));
|
prefSurname.setSummary(user.get(SessionManager.KEY_SURNAME));
|
||||||
prefName.setSummary(user.get(SessionManager.KEY_NAME));
|
prefName.setSummary(user.get(SessionManager.KEY_NAME));
|
||||||
prefEmail.setSummary(user.get(SessionManager.KEY_EMAIL));
|
prefEmail.setSummary(user.get(SessionManager.KEY_EMAIL));
|
||||||
|
|
||||||
|
prefNotifications.setChecked(session.getNotificationEnabled());
|
||||||
|
prefFrequency.setValue(Integer.toString(session.getNotificationPollFreq()));
|
||||||
|
prefFrequency.setSummary(prefFrequency.getEntry());
|
||||||
|
prefRadius.setValue(Integer.toString(session.getNotificationRadius()));
|
||||||
|
prefRadius.setSummary(prefRadius.getEntry());
|
||||||
|
prefGPSENabled.setChecked(session.isGPSForNotificationsEnabled());
|
||||||
|
|
||||||
|
|
||||||
|
if(session.isGPSForNotificationsEnabled()){
|
||||||
|
btnRequestPW.setEnabled(false);
|
||||||
|
}else{
|
||||||
|
btnRequestPW.setEnabled(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void requestPasswordReset() {
|
private void requestPasswordReset() {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.deke.risk.riskahead.helper;
|
package org.deke.risk.riskahead.helper;
|
||||||
|
|
||||||
|
import android.app.ActivityManager;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.ProgressDialog;
|
import android.app.ProgressDialog;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -75,9 +76,6 @@ public abstract class BaseActivity extends AppCompatActivity {
|
|||||||
public Drawer navDrawer = null;
|
public Drawer navDrawer = null;
|
||||||
public Toolbar mToolbar;
|
public Toolbar mToolbar;
|
||||||
|
|
||||||
public Handler mNotifyHandler = new Handler();
|
|
||||||
public final static int INTERVAL_NOTIFICATION = 1000 * 60; //20 seconds
|
|
||||||
|
|
||||||
public LocationManager locationManager;
|
public LocationManager locationManager;
|
||||||
public LatLng myPosition;
|
public LatLng myPosition;
|
||||||
|
|
||||||
@@ -116,20 +114,30 @@ public abstract class BaseActivity extends AppCompatActivity {
|
|||||||
LocationManager.NETWORK_PROVIDER, 5000, 10, locationListener);
|
LocationManager.NETWORK_PROVIDER, 5000, 10, locationListener);
|
||||||
|
|
||||||
overridePendingTransition(R.anim.fade_in_anim, R.anim.fade_out_anim);
|
overridePendingTransition(R.anim.fade_in_anim, R.anim.fade_out_anim);
|
||||||
|
|
||||||
|
if(!isMyNotificationServiceRunning()){
|
||||||
|
Log.d(TAG,"onCreate: NotificationService not running. Starting service...");
|
||||||
|
startService(new Intent(this, NotificationService.class));
|
||||||
|
}else{
|
||||||
|
Log.d(TAG,"onCreate: NotificationService already running. Not starting more services.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class MyLocationListener implements LocationListener {
|
private class MyLocationListener implements LocationListener {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onLocationChanged(Location loc) {
|
public void onLocationChanged(Location loc) {
|
||||||
|
|
||||||
String longitude = "Longitude: " + loc.getLongitude();
|
String longitude = "Longitude: " + loc.getLongitude();
|
||||||
Log.v(TAG, longitude);
|
Log.v(TAG, longitude);
|
||||||
String latitude = "Latitude: " + loc.getLatitude();
|
String latitude = "Latitude: " + loc.getLatitude();
|
||||||
Log.v(TAG, latitude);
|
Log.v(TAG, latitude);
|
||||||
|
|
||||||
myPosition = new LatLng(loc.getLatitude(),loc.getLongitude());
|
if(session.isGPSForNotificationsEnabled()) {
|
||||||
session.setLocation(Double.doubleToRawLongBits(loc.getLatitude()),Double.doubleToRawLongBits(loc.getLongitude()));
|
Log.d(TAG,"Save GPS as new location...");
|
||||||
|
session.setLocation(Double.doubleToRawLongBits(loc.getLatitude()), Double.doubleToRawLongBits(loc.getLongitude()));
|
||||||
|
}else{
|
||||||
|
Log.d(TAG,"Don't Save GPS as new location because GPS for notifications is disabled...");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -426,4 +434,14 @@ public abstract class BaseActivity extends AppCompatActivity {
|
|||||||
if (pDialog.isShowing())
|
if (pDialog.isShowing())
|
||||||
pDialog.dismiss();
|
pDialog.dismiss();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isMyNotificationServiceRunning() {
|
||||||
|
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
|
||||||
|
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
|
||||||
|
if (NotificationService.class.getName().equals(service.service.getClassName())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,187 @@
|
|||||||
|
package org.deke.risk.riskahead.helper;
|
||||||
|
|
||||||
|
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
|
||||||
|
import android.app.Service;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.*;
|
||||||
|
import android.support.v4.app.NotificationCompat;
|
||||||
|
import android.support.v4.app.TaskStackBuilder;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.android.volley.Request;
|
||||||
|
import com.android.volley.Response;
|
||||||
|
import com.android.volley.VolleyError;
|
||||||
|
import com.android.volley.toolbox.StringRequest;
|
||||||
|
import com.google.android.gms.maps.model.LatLng;
|
||||||
|
|
||||||
|
import org.deke.risk.riskahead.MapsActivity;
|
||||||
|
import org.deke.risk.riskahead.R;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by denni on 06.01.2016.
|
||||||
|
*/
|
||||||
|
public class NotificationService extends Service {
|
||||||
|
|
||||||
|
private final static String TAG = NotificationService.class.getSimpleName();
|
||||||
|
private final static String EXTRA_MESSAGE = "org.deke.risk.riskahead.MESSAGE";
|
||||||
|
|
||||||
|
Handler mNotifyHandler = new Handler();
|
||||||
|
NotificationManager mNotificationManager;
|
||||||
|
|
||||||
|
private LatLng myPosition;
|
||||||
|
private boolean notifyEnabled = true;
|
||||||
|
private int radius = 15;
|
||||||
|
private int pollFrequency = 10;
|
||||||
|
|
||||||
|
public SessionManager session;
|
||||||
|
public HashMap<String, String> user;
|
||||||
|
|
||||||
|
public NotificationService() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(){
|
||||||
|
Log.d(TAG,"Service Created. Starting notification task...");
|
||||||
|
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
|
||||||
|
session = new SessionManager(getApplicationContext());
|
||||||
|
user = session.getUserDetails();
|
||||||
|
|
||||||
|
mNotifyTask.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBinder onBind(Intent intent) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Runnable mNotifyTask = new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
|
||||||
|
|
||||||
|
myPosition = session.getLocation();
|
||||||
|
radius = session.getNotificationRadius();
|
||||||
|
pollFrequency = session.getNotificationPollFreq() * 1000; //TODO add minutes
|
||||||
|
notifyEnabled = session.getNotificationEnabled();
|
||||||
|
|
||||||
|
Log.d(this.toString(), "Run Notification Task. Notifications enabled = "+notifyEnabled);
|
||||||
|
|
||||||
|
if ((myPosition != null) && (myPosition.latitude != 0.0) && (myPosition.longitude != 0.0)) {
|
||||||
|
|
||||||
|
String lastNotificationTime = "";
|
||||||
|
|
||||||
|
if (session.getLastNotification().equals("")) {
|
||||||
|
lastNotificationTime = user.get(SessionManager.KEY_LASTLOGIN_AT);
|
||||||
|
} else {
|
||||||
|
lastNotificationTime = session.getLastNotification();
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.d(this.toString(), "Lookup location with position: " + myPosition + " Radius: "+radius+" PollFrequency: "+pollFrequency+" lastNotifyTime: " + lastNotificationTime);
|
||||||
|
|
||||||
|
StringRequest strReq = getStringRequestIncidentsFromAreaAndTime(myPosition.latitude, myPosition.longitude, radius, lastNotificationTime);
|
||||||
|
String tag_string_req = "req_incidents";
|
||||||
|
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
|
||||||
|
}
|
||||||
|
|
||||||
|
mNotifyHandler.postDelayed(mNotifyTask, pollFrequency);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private StringRequest getStringRequestIncidentsFromAreaAndTime(final Double latitude, final Double longitude, final int radius, final String time) {
|
||||||
|
return new StringRequest(Request.Method.POST, AppConfig.URL_REGISTER, new Response.Listener<String>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResponse(String response) {
|
||||||
|
Log.d(TAG, "Incident notifications: " + response);
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSONObject jObj = new JSONObject(response);
|
||||||
|
boolean error = jObj.getBoolean("error");
|
||||||
|
|
||||||
|
if (!error) {
|
||||||
|
JSONArray notification = jObj.getJSONArray("msg");
|
||||||
|
|
||||||
|
sentNotification(notification);
|
||||||
|
} else {
|
||||||
|
String errorMsg = jObj.getString("error_msg");
|
||||||
|
Log.e(TAG, "Error getting incident notification (server returned error): " + errorMsg);
|
||||||
|
}
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}, new Response.ErrorListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onErrorResponse(VolleyError error) {
|
||||||
|
Log.e(TAG, "Error getting incident notification: " + error.getMessage());
|
||||||
|
}
|
||||||
|
}) {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Map<String, String> getParams() {
|
||||||
|
Map<String, String> params = new HashMap<>();
|
||||||
|
params.put("tag", "getincidentsinareaandtime");
|
||||||
|
params.put("uid", user.get(SessionManager.KEY_UID));
|
||||||
|
params.put("token", user.get(SessionManager.TOKEN));
|
||||||
|
params.put("latitude", Double.toString(latitude));
|
||||||
|
params.put("longitude", Double.toString(longitude));
|
||||||
|
params.put("radius", Integer.toString(radius));
|
||||||
|
params.put("time", "'"+time+"'");
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sentNotification(JSONArray notification) {
|
||||||
|
NotificationCompat.Builder mBuilder =
|
||||||
|
new NotificationCompat.Builder(getApplicationContext())
|
||||||
|
.setSmallIcon(R.drawable.logo_riskahead_header)
|
||||||
|
.setContentTitle("New incidents reported in your area!")
|
||||||
|
.setContentText(notification.length() + " new incidents near your last location. Watch out!");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Intent resultIntent = new Intent(this, MapsActivity.class);
|
||||||
|
|
||||||
|
try {
|
||||||
|
resultIntent.putExtra(EXTRA_MESSAGE, notification.getJSONObject(notification.length()-1).getDouble("latitude")+":"+notification.getJSONObject(notification.length()-1).getDouble("longitude"));
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
|
||||||
|
stackBuilder.addParentStack(MapsActivity.class);
|
||||||
|
|
||||||
|
stackBuilder.addNextIntent(resultIntent);
|
||||||
|
PendingIntent resultPendingIntent =
|
||||||
|
stackBuilder.getPendingIntent(
|
||||||
|
0,
|
||||||
|
PendingIntent.FLAG_UPDATE_CURRENT
|
||||||
|
);
|
||||||
|
mBuilder.setContentIntent(resultPendingIntent);
|
||||||
|
|
||||||
|
int mId = 1;
|
||||||
|
mNotificationManager.notify(mId, mBuilder.build());
|
||||||
|
|
||||||
|
session.setLastNotification(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime()));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -10,6 +10,8 @@ import com.google.android.gms.maps.model.LatLng;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
public class SessionManager {
|
public class SessionManager {
|
||||||
|
|
||||||
|
|
||||||
private static String TAG = SessionManager.class.getSimpleName();
|
private static String TAG = SessionManager.class.getSimpleName();
|
||||||
|
|
||||||
SharedPreferences status;
|
SharedPreferences status;
|
||||||
@@ -41,6 +43,10 @@ public class SessionManager {
|
|||||||
public static final String KEY_LOCATION_LNG = "location_longitude";
|
public static final String KEY_LOCATION_LNG = "location_longitude";
|
||||||
|
|
||||||
public static final String KEY_LAST_NOTIFICATION = "lastNotificationTime";
|
public static final String KEY_LAST_NOTIFICATION = "lastNotificationTime";
|
||||||
|
public static final String KEY_NOTIFY_ENABLED = "notifyEnabled" ;
|
||||||
|
public static final String KEY_NOTIFY_RADIUS = "notifyRadius";
|
||||||
|
public static final String KEY_NOTIFY_POLLINGFREQ = "notifyPollingfreq";
|
||||||
|
public static final String KEY_NOTIFY_GPS = "notifyGPSEnabled";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -71,6 +77,15 @@ public class SessionManager {
|
|||||||
return new LatLng(Double.longBitsToDouble(status.getLong(KEY_LOCATION_LAT, 0)), Double.longBitsToDouble(status.getLong(KEY_LOCATION_LNG, 0)));
|
return new LatLng(Double.longBitsToDouble(status.getLong(KEY_LOCATION_LAT, 0)), Double.longBitsToDouble(status.getLong(KEY_LOCATION_LNG, 0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setGPSForNotificationsEnabled(boolean isEnabled){
|
||||||
|
statusEditor.putBoolean(KEY_NOTIFY_GPS, isEnabled);
|
||||||
|
statusEditor.apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isGPSForNotificationsEnabled(){
|
||||||
|
return status.getBoolean(KEY_NOTIFY_GPS, false);
|
||||||
|
}
|
||||||
|
|
||||||
public void setLastNotification(String time){
|
public void setLastNotification(String time){
|
||||||
statusEditor.putString(KEY_LAST_NOTIFICATION, time);
|
statusEditor.putString(KEY_LAST_NOTIFICATION, time);
|
||||||
statusEditor.apply();
|
statusEditor.apply();
|
||||||
@@ -80,6 +95,34 @@ public class SessionManager {
|
|||||||
return status.getString(KEY_LAST_NOTIFICATION, "");
|
return status.getString(KEY_LAST_NOTIFICATION, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setNotificationEnabled(boolean isEnabled){
|
||||||
|
statusEditor.putBoolean(KEY_NOTIFY_ENABLED, isEnabled);
|
||||||
|
statusEditor.apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNotificationRadius(int radius){
|
||||||
|
statusEditor.putInt(KEY_NOTIFY_RADIUS, radius);
|
||||||
|
statusEditor.apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNotificationPollFreq(int pollingFreqInMinutes){
|
||||||
|
statusEditor.putInt(KEY_NOTIFY_POLLINGFREQ, pollingFreqInMinutes);
|
||||||
|
statusEditor.apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean getNotificationEnabled(){
|
||||||
|
return status.getBoolean(KEY_NOTIFY_ENABLED, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getNotificationRadius(){
|
||||||
|
return status.getInt(KEY_NOTIFY_RADIUS, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getNotificationPollFreq(){
|
||||||
|
return status.getInt(KEY_NOTIFY_POLLINGFREQ, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void addUser(String uid, String username, String name, String surname, String email, String status, String provider_type, String created_at, String updated_at, String lastlogin_at, String token) {
|
public void addUser(String uid, String username, String name, String surname, String email, String status, String provider_type, String created_at, String updated_at, String lastlogin_at, String token) {
|
||||||
|
|
||||||
userDataEditor.putString(KEY_UID, uid); //UID
|
userDataEditor.putString(KEY_UID, uid); //UID
|
||||||
@@ -99,9 +142,6 @@ public class SessionManager {
|
|||||||
Log.d(TAG, "New user written to sharedPreferences: " + uid);
|
Log.d(TAG, "New user written to sharedPreferences: " + uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Getting user data from database
|
|
||||||
* */
|
|
||||||
public HashMap<String, String> getUserDetails() {
|
public HashMap<String, String> getUserDetails() {
|
||||||
HashMap<String, String> user = new HashMap<>();
|
HashMap<String, String> user = new HashMap<>();
|
||||||
|
|
||||||
@@ -122,7 +162,6 @@ public class SessionManager {
|
|||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void removeUser(){
|
public void removeUser(){
|
||||||
userdata.edit().clear().apply();
|
userdata.edit().clear().apply();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
android:title="Notifications">
|
android:title="Notifications">
|
||||||
|
|
||||||
<SwitchPreference
|
<SwitchPreference
|
||||||
android:key="notfiyEnable"
|
android:key="notifyEnable"
|
||||||
android:title="Show Notifications"
|
android:title="Show Notifications"
|
||||||
android:summary="Enable notifications in your area" />
|
android:summary="Enable notifications in your area" />
|
||||||
|
|
||||||
@@ -62,6 +62,16 @@
|
|||||||
android:summary="Decide how often notification updates should be received from server"
|
android:summary="Decide how often notification updates should be received from server"
|
||||||
android:dialogTitle="Poll Frequency" />
|
android:dialogTitle="Poll Frequency" />
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:key="notifyEnableGPS"
|
||||||
|
android:title="Enable GPS"
|
||||||
|
android:summary="Get your last know location with GPS (GPS has to be activated in your device settings)" />
|
||||||
|
|
||||||
|
<Preference
|
||||||
|
android:key="notifyChooseLocation"
|
||||||
|
android:title="Choose your location"
|
||||||
|
android:summary="Your Location (Latitude/Longitude):" />
|
||||||
|
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
Reference in New Issue
Block a user