Notifications as service

This commit is contained in:
massimiliano 2019-05-22 16:45:27 +02:00
parent 017594555c
commit bf26676ec9
6 changed files with 200 additions and 175 deletions

View File

@ -6,8 +6,8 @@ android {
applicationId "org.disroot.disrootapp"
minSdkVersion 15
targetSdkVersion 28
versionCode 18
versionName "1.1.5"
versionCode 19
versionName "1.1.6"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {

View File

@ -15,6 +15,11 @@
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/DisTheme">
<service
android:name=".StatusService"
android:enabled="true"
android:exported="true"></service>
<activity
android:name=".ui.SplashScreenActivity"
android:configChanges="orientation|screenSize"
@ -32,8 +37,10 @@
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="*.disroot.org"
android:scheme="https" />

View File

@ -0,0 +1,184 @@
package org.disroot.disrootapp;
import android.annotation.SuppressLint;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;
import org.disroot.disrootapp.ui.StateMessagesActivity;
import org.disroot.disrootapp.utils.HttpHandler;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;
import static android.support.constraint.motion.MotionScene.TAG;
public class StatusService extends Service {
//status report
public SharedPreferences checkDate;
// URL to get data JSON
static String incidenturl0 ="https://state.disroot.org/api/v1/incidents?sort=id&order=desc";
ArrayList<HashMap<String, String>> messageList;
ArrayList<HashMap<String, String>> getDate;
public StatusService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException( "Not yet implemented" );
}
@Override
public void onCreate() {
super.onCreate();
//Status report
messageList = new ArrayList<>();
getDate = new ArrayList<>();
checkDate = getSharedPreferences("storeDate", Context.MODE_PRIVATE);
//Check json for updates
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
new StatusService.GetList().execute();
}
}, 100, 100000);//100000=100sec
}
//status report
@SuppressLint("StaticFieldLeak")
class GetList extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
HttpHandler sh = new HttpHandler();
String jsonStrincidents0 = sh.makeServiceCall(incidenturl0);
Log.e(TAG, "Response from url(Service): " + incidenturl0);
if (jsonStrincidents0 != null) {//Incidaetnts page
try {
JSONObject jsonObj = new JSONObject(jsonStrincidents0);
JSONArray data = jsonObj.getJSONArray("data");
int a=0;
JSONObject o = data.getJSONObject(a);
String callid = o.getString("id");
String updated = o.getString("updated_at");
HashMap<String, String> date = new HashMap<>();
date.put("id", callid);
date.put("updated", updated);
getDate.add(date);
String stateDate = date.put( "updated", updated );
String dateStored= checkDate.getString( "storeDate","" );
if (dateStored.equals( "" ))
{
checkDate.edit().putString( "storeDate", stateDate).apply();
//return null;
}
else if (!stateDate.equals( dateStored )&& !stateDate.equals( "" ))//dateStored
{
checkDate.edit().putString( "storeDate", stateDate).apply();
Log.e(TAG, "date: " + dateStored);
Log.e(TAG, "date2: " + stateDate);
sendNotification();//Call notification
return null;
}
else
Log.e(TAG, "updated json(service)");
return null;
} catch (final JSONException e) {
Log.e(TAG, "Json parsing error: " + e.getMessage());
Toast.makeText(getApplicationContext(),
"Json parsing error: " + e.getMessage(),
Toast.LENGTH_LONG)
.show();
}
}else {
Log.e(TAG, "Couldn't get json from server.");
}
return null;
}
}
//Notification
private void sendNotification() throws JSONException {
String CHANNEL_ID = "3168654312";
String CHANNEL_NAME = "StateNotification";
HttpHandler sh = new HttpHandler();
String jsonStrincidents0 = sh.makeServiceCall(incidenturl0);
JSONObject jsonObj = new JSONObject(jsonStrincidents0);
JSONArray data = jsonObj.getJSONArray("data");
int a=0;
JSONObject o = data.getJSONObject(a);
String name = o.getString( "name" );
String message = o.getString( "message" );
HashMap<String, String> date = new HashMap<>();
date.put("name", name);
date.put("message", message);
Log.e(TAG, "message: " + name);
Intent goState = new Intent( StatusService.this, StateMessagesActivity.class);
PendingIntent launchStateMessages = PendingIntent.getActivity(StatusService.this,0, goState, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationManager notificationManager = (NotificationManager) this.getSystemService( Context.NOTIFICATION_SERVICE);
NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
inboxStyle.addLine(message);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// I would suggest that you use IMPORTANCE_DEFAULT instead of IMPORTANCE_HIGH
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
channel.enableVibration(true);
channel.setLightColor( Color.rgb( 80,22,45 ));
channel.enableLights(true);
channel.setVibrationPattern(new long[]{50,500,100,300,50,300});
notificationManager.createNotificationChannel(channel);
}
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ID)
.setAutoCancel( true )
.setOngoing(true)
.setSmallIcon(R.drawable.ic_state)
.setContentTitle( getString( R.string.NotificationTitle ) )
.setContentText(name)//get text Title from json :-)
.setContentInfo(message)//get text message from json :-)
.setContentIntent(launchStateMessages);
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
notificationBuilder.setSound(alarmSound)
.setVibrate(new long[]{50,500,100,300,50,300})
.setLights(Color.BLUE, 3000, 3000);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
notificationBuilder.setChannelId(CHANNEL_ID);
}
notificationManager.notify(CHANNEL_ID, 1, notificationBuilder.build());
}
}

View File

@ -1,24 +1,16 @@
package org.disroot.disrootapp.ui;
import android.Manifest;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.app.DownloadManager;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
@ -30,7 +22,6 @@ import android.support.annotation.RequiresApi;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.NotificationCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
@ -60,20 +51,15 @@ import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.Toast;
import org.disroot.disrootapp.R;
//import org.disroot.disrootapp.service.CachetService;
import org.disroot.disrootapp.StatusService;
import org.disroot.disrootapp.utils.Constants;
import org.disroot.disrootapp.utils.HttpHandler;
import org.disroot.disrootapp.webviews.DisWebChromeClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.IOException;
@ -84,9 +70,6 @@ import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import de.cketti.library.changelog.ChangeLog;
@SuppressWarnings("ALL")
@ -121,15 +104,6 @@ public class MainActivity extends AppCompatActivity implements View.OnLongClickL
private CookieManager cookieManager;
//status report
private ProgressDialog pDialog;
private ListView lv;
public SharedPreferences checkDate;
// URL to get data JSON
static String incidenturl0 ="https://state.disroot.org/api/v1/incidents?sort=id&order=desc";
ArrayList<HashMap<String, String>> messageList;
ArrayList<HashMap<String, String>> getDate;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -668,34 +642,9 @@ public class MainActivity extends AppCompatActivity implements View.OnLongClickL
}
});
//Status report
messageList = new ArrayList<>();
getDate = new ArrayList<>();
lv = findViewById(R.id.list);
checkDate = getSharedPreferences("storeDate", Context.MODE_PRIVATE);
//Check json for updates
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
new MainActivity.GetList().execute();
}
});
}
}, 100, 100000);//100000=100sec
// start CachetService
//Intent intent = new Intent(this, CachetService.class);
// Put some data for use by the IntentService
//intent.putExtra("foo", "bar");
//startService(intent);
//Status service
Intent intent = new Intent( MainActivity.this, StatusService.class);
startService(intent);
}
@ -1881,124 +1830,6 @@ public class MainActivity extends AppCompatActivity implements View.OnLongClickL
startActivity(intent);
}
//status report
@SuppressLint("StaticFieldLeak")
class GetList extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
HttpHandler sh = new HttpHandler();
String jsonStrincidents0 = sh.makeServiceCall(incidenturl0);
Log.e(TAG, "Response from url: " + incidenturl0);
if (jsonStrincidents0 != null) {//Incidaetnts page
try {
JSONObject jsonObj = new JSONObject(jsonStrincidents0);
JSONArray data = jsonObj.getJSONArray("data");
int a=0;
JSONObject o = data.getJSONObject(a);
String callid = o.getString("id");
String updated = o.getString("updated_at");
HashMap<String, String> date = new HashMap<>();
date.put("id", callid);
date.put("updated", updated);
getDate.add(date);
String stateDate = date.put( "updated", updated );
String dateStored= checkDate.getString( "storeDate","" );
if (dateStored.equals( "" ))
{
checkDate.edit().putString( "storeDate", stateDate).apply();
//return null;
}
else if (!stateDate.equals( dateStored )&& !stateDate.equals( "" ))//dateStored
{
checkDate.edit().putString( "storeDate", stateDate).apply();
Log.e(TAG, "date: " + dateStored);
Log.e(TAG, "date2: " + stateDate);
sendNotification();//Call notification
return null;
}
else
Log.e(TAG, "updated json");
return null;
} catch (final JSONException e) {
Log.e(TAG, "Json parsing error: " + e.getMessage());
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),
"Json parsing error: " + e.getMessage(),
Toast.LENGTH_LONG)
.show();
}
});
}
}else {
Log.e(TAG, "Couldn't get json from server.");
}
return null;
}
}
//Notification
private void sendNotification() throws JSONException {
String CHANNEL_ID = "3168654312";
String CHANNEL_NAME = "StateNotification";
HttpHandler sh = new HttpHandler();
String jsonStrincidents0 = sh.makeServiceCall(incidenturl0);
JSONObject jsonObj = new JSONObject(jsonStrincidents0);
JSONArray data = jsonObj.getJSONArray("data");
int a=0;
JSONObject o = data.getJSONObject(a);
String name = o.getString( "name" );
String message = o.getString( "message" );
HashMap<String, String> date = new HashMap<>();
date.put("name", name);
date.put("message", message);
Log.e(TAG, "message: " + name);
Intent goState = new Intent(MainActivity.this, StateMessagesActivity.class);
PendingIntent launchStateMessages = PendingIntent.getActivity(MainActivity.this,0, goState, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
inboxStyle.addLine(message);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// I would suggest that you use IMPORTANCE_DEFAULT instead of IMPORTANCE_HIGH
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
channel.enableVibration(true);
channel.setLightColor(Color.rgb( 80,22,45 ));
channel.enableLights(true);
channel.setVibrationPattern(new long[]{50,500,100,300,50,300});
notificationManager.createNotificationChannel(channel);
}
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ID)
.setAutoCancel( true )
.setOngoing(true)
.setSmallIcon(R.drawable.ic_state)
.setContentTitle( getString( R.string.NotificationTitle ) )
.setContentText(name)//get text Title from json :-)
.setContentInfo(message)//get text message from json :-)
.setContentIntent(launchStateMessages);
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
notificationBuilder.setSound(alarmSound)
.setVibrate(new long[]{50,500,100,300,50,300})
.setLights(Color.BLUE, 3000, 3000);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
notificationBuilder.setChannelId(CHANNEL_ID);
}
notificationManager.notify(CHANNEL_ID, 1, notificationBuilder.build());
}
//show snackbar to avoid exit on backpress
@Override
public void onBackPressed() {

View File

@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<changelog>
<release version="1.1.6" versioncode="19" >
<change>Notifications works as a service now</change>
</release>
<release version="1.1.5" versioncode="18" >
<change>Notifications works on Android 8 and higher now</change>
<change>Added Disroot purple light notification</change>