From 4e1faa6a67792c415539b8265a9fcc463c5fce4b Mon Sep 17 00:00:00 2001 From: tom79 Date: Sat, 30 Sep 2017 08:48:44 +0200 Subject: [PATCH] Prepares service for local timeline --- app/src/main/AndroidManifest.xml | 9 + .../gouv/etalab/mastodon/helper/Helper.java | 2 + .../services/RestartLocalServiceReceiver.java | 33 ++++ .../StreamingFederatedTimelineService.java | 2 +- .../StreamingLocalTimelineService.java | 169 ++++++++++++++++++ 5 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/fr/gouv/etalab/mastodon/services/RestartLocalServiceReceiver.java create mode 100644 app/src/main/java/fr/gouv/etalab/mastodon/services/StreamingLocalTimelineService.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4ee4ccc16..30e6ab865 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -52,6 +52,15 @@ + + + + + + . */ +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +/** + * Created by Thomas on 29/09/2017. + * BroadcastReceiver for restarting the service for listening local timeline + */ + +public class RestartLocalServiceReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + Intent streamingServiceIntent = new Intent(context.getApplicationContext(), StreamingLocalTimelineService.class); + context.startService(streamingServiceIntent); + } + +} \ No newline at end of file diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/services/StreamingFederatedTimelineService.java b/app/src/main/java/fr/gouv/etalab/mastodon/services/StreamingFederatedTimelineService.java index a934776a7..d6423f3d2 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/services/StreamingFederatedTimelineService.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/services/StreamingFederatedTimelineService.java @@ -66,7 +66,7 @@ public class StreamingFederatedTimelineService extends IntentService { super(name); } public StreamingFederatedTimelineService() { - super("StreamingService"); + super("StreamingFederatedTimelineService"); } private static HttpsURLConnection httpsURLConnection; diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/services/StreamingLocalTimelineService.java b/app/src/main/java/fr/gouv/etalab/mastodon/services/StreamingLocalTimelineService.java new file mode 100644 index 000000000..2d63b909d --- /dev/null +++ b/app/src/main/java/fr/gouv/etalab/mastodon/services/StreamingLocalTimelineService.java @@ -0,0 +1,169 @@ +package fr.gouv.etalab.mastodon.services; +/* Copyright 2017 Thomas Schneider + * + * This file is a part of Mastalab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Mastalab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Mastalab; if not, + * see . */ + +import android.app.IntentService; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.database.sqlite.SQLiteDatabase; +import android.os.Bundle; +import android.os.SystemClock; +import android.support.annotation.Nullable; +import android.support.v4.content.LocalBroadcastManager; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.ArrayList; + +import javax.net.ssl.HttpsURLConnection; + +import fr.gouv.etalab.mastodon.client.API; +import fr.gouv.etalab.mastodon.client.Entities.Account; +import fr.gouv.etalab.mastodon.client.Entities.Status; +import fr.gouv.etalab.mastodon.client.TLSSocketFactory; +import fr.gouv.etalab.mastodon.helper.Helper; +import fr.gouv.etalab.mastodon.sqlite.AccountDAO; +import fr.gouv.etalab.mastodon.sqlite.Sqlite; + + +/** + * Created by Thomas on 29/09/2017. + * Manage service for streaming api for local timeline + */ + +public class StreamingLocalTimelineService extends IntentService { + + + /** + * Creates an IntentService. Invoked by your subclass's constructor. + * + * @param name Used to name the worker thread, important only for debugging. + */ + public StreamingLocalTimelineService(String name) { + super(name); + } + public StreamingLocalTimelineService() { + super("StreamingLocalTimelineService"); + } + + private static HttpsURLConnection httpsURLConnection; + protected Account account; + + public void onCreate() { + super.onCreate(); + SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + boolean display_global = sharedpreferences.getBoolean(Helper.SET_DISPLAY_GLOBAL, true); + if( !display_global){ + stopSelf(); + } + SharedPreferences.Editor editor = sharedpreferences.edit(); + String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); + editor.putBoolean(Helper.SHOULD_CONTINUE_STREAMING_LOCAL+userId, true); + editor.apply(); + } + + + @Override + protected void onHandleIntent(@Nullable Intent intent) { + SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); + InputStream inputStream; + BufferedReader reader = null; + Account accountStream = null; + if( httpsURLConnection != null) + httpsURLConnection.disconnect(); + if( userId != null) { + SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + accountStream = new AccountDAO(getApplicationContext(), db).getAccountByID(userId); + } + if( accountStream != null){ + try { + + URL url = new URL("https://" + accountStream.getInstance() + "/api/v1/streaming/public?local=true"); + httpsURLConnection = (HttpsURLConnection) url.openConnection(); + httpsURLConnection.setRequestProperty("Content-Type", "application/json"); + httpsURLConnection.setRequestProperty("Authorization", "Bearer " + accountStream.getToken()); + httpsURLConnection.setRequestProperty("Connection", "Keep-Alive"); + httpsURLConnection.setRequestProperty("Keep-Alive", "header"); + httpsURLConnection.setRequestProperty("Connection", "close"); + httpsURLConnection.setSSLSocketFactory(new TLSSocketFactory()); + httpsURLConnection.setRequestMethod("GET"); + httpsURLConnection.setConnectTimeout(70000); + httpsURLConnection.setReadTimeout(70000); + inputStream = new BufferedInputStream(httpsURLConnection.getInputStream()); + reader = new BufferedReader(new InputStreamReader(inputStream)); + String event; + while((event = reader.readLine()) != null) { + if (!event.startsWith("data: ")) { + continue; + } + + if (!sharedpreferences.getBoolean(Helper.SHOULD_CONTINUE_STREAMING_LOCAL + accountStream.getId(), true)) { + stopSelf(); + return; + } + event = event.substring(6); + if( event.matches("^[0-9]{1,}$")) + continue; + try { + JSONObject eventJson = new JSONObject(event); + onRetrieveStreaming(accountStream, eventJson); + } catch (JSONException e) { + e.printStackTrace(); + } + } + } catch (Exception e) { + e.printStackTrace(); + }finally { + if(reader != null){ + try{ + reader.close(); + }catch (IOException e){ + e.printStackTrace(); + } + } + if( sharedpreferences.getBoolean(Helper.SHOULD_CONTINUE_STREAMING_LOCAL + accountStream.getId(), true)) { + SystemClock.sleep(1000); + sendBroadcast(new Intent("RestartStreamingLocalService")); + } + } + } + } + + public void onRetrieveStreaming(Account account, JSONObject response) { + if( response == null ) + return; + Status status ; + Bundle b = new Bundle(); + status = API.parseStatuses(getApplicationContext(), response); + status.setReplies(new ArrayList()); + status.setNew(true); + b.putParcelable("data", status); + if( account != null) + b.putString("userIdService",account.getId()); + Intent intentBC = new Intent(Helper.RECEIVE_LOCAL_DATA); + intentBC.putExtras(b); + LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intentBC); + } + +}