#915 comment - Click on the indicator for forcing a refresh.
This commit is contained in:
parent
e701d4e203
commit
4514592eb2
|
@ -0,0 +1,63 @@
|
|||
/* Copyright 2019 Thomas Schneider
|
||||
*
|
||||
* This file is a part of Fedilab
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Fedilab 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 Fedilab; if not,
|
||||
* see <http://www.gnu.org/licenses>. */
|
||||
package fr.gouv.etalab.mastodon.asynctasks;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.AsyncTask;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
|
||||
import fr.gouv.etalab.mastodon.client.API;
|
||||
import fr.gouv.etalab.mastodon.client.APIResponse;
|
||||
import fr.gouv.etalab.mastodon.interfaces.OnRefreshCachedStatusInterface;
|
||||
|
||||
/**
|
||||
* Created by Thomas on 12/05/2019.
|
||||
* Manage refresh for statuses
|
||||
*/
|
||||
|
||||
public class ManageCachedStatusAsyncTask extends AsyncTask<Void, Void, Void> {
|
||||
|
||||
private OnRefreshCachedStatusInterface listener;
|
||||
private String statusId;
|
||||
private fr.gouv.etalab.mastodon.client.Entities.Status refreshedStatus;
|
||||
private WeakReference<Context> contextReference;
|
||||
|
||||
|
||||
|
||||
|
||||
public ManageCachedStatusAsyncTask(Context context, String statusId, OnRefreshCachedStatusInterface onRefreshCachedStatusInterface){
|
||||
this.contextReference = new WeakReference<>(context);
|
||||
this.listener = onRefreshCachedStatusInterface;
|
||||
this.statusId = statusId;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Void doInBackground(Void... params) {
|
||||
APIResponse apiResponse = new API(contextReference.get()).getStatusbyIdAndCache(statusId);
|
||||
refreshedStatus = apiResponse.getStatuses().get(0);
|
||||
if( refreshedStatus != null){
|
||||
refreshedStatus.setcached(true);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(Void result) {
|
||||
listener.onRefresh(refreshedStatus);
|
||||
}
|
||||
|
||||
}
|
|
@ -786,6 +786,36 @@ public class API {
|
|||
return apiResponse;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves one status *synchronously*
|
||||
*
|
||||
* @param statusId String Id of the status
|
||||
* @return APIResponse
|
||||
*/
|
||||
public APIResponse getStatusbyIdAndCache(String statusId) {
|
||||
statuses = new ArrayList<>();
|
||||
try {
|
||||
HttpsConnection httpsConnection = new HttpsConnection(context);
|
||||
String response = httpsConnection.get(getAbsoluteUrl(String.format("/statuses/%s", statusId)), 60, null, prefKeyOauthTokenT);
|
||||
Status status = parseStatuses(context, new JSONObject(response));
|
||||
SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
|
||||
new TimelineCacheDAO(context, db).update(status.getId(), response);
|
||||
statuses.add(status);
|
||||
} catch (HttpsConnection.HttpsConnectionException e) {
|
||||
setError(e.getStatusCode(), e);
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (KeyManagementException e) {
|
||||
e.printStackTrace();
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
apiResponse.setStatuses(statuses);
|
||||
return apiResponse;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the context of status with replies *synchronously*
|
||||
*
|
||||
|
@ -2270,6 +2300,11 @@ public class API {
|
|||
b.putParcelable("status", status);
|
||||
Intent intentBC = new Intent(Helper.RECEIVE_ACTION);
|
||||
intentBC.putExtras(b);
|
||||
SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
|
||||
Status alreadyCached = new TimelineCacheDAO(context, db).getSingle(status.getId());
|
||||
if (alreadyCached != null) {
|
||||
new TimelineCacheDAO(context, db).update(status.getId(), response);
|
||||
}
|
||||
LocalBroadcastManager.getInstance(context).sendBroadcast(intentBC);
|
||||
return parsePoll(context, new JSONObject(response));
|
||||
} catch (HttpsConnection.HttpsConnectionException e) {
|
||||
|
|
|
@ -50,7 +50,6 @@ import android.text.method.LinkMovementMethod;
|
|||
import android.text.style.ClickableSpan;
|
||||
import android.text.style.ForegroundColorSpan;
|
||||
import android.text.style.URLSpan;
|
||||
import android.util.Log;
|
||||
import android.util.TypedValue;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MenuItem;
|
||||
|
@ -113,6 +112,7 @@ import fr.gouv.etalab.mastodon.activities.ShowAccountActivity;
|
|||
import fr.gouv.etalab.mastodon.activities.ShowConversationActivity;
|
||||
import fr.gouv.etalab.mastodon.activities.TootActivity;
|
||||
import fr.gouv.etalab.mastodon.activities.TootInfoActivity;
|
||||
import fr.gouv.etalab.mastodon.asynctasks.ManageCachedStatusAsyncTask;
|
||||
import fr.gouv.etalab.mastodon.asynctasks.ManagePollAsyncTask;
|
||||
import fr.gouv.etalab.mastodon.asynctasks.PostActionAsyncTask;
|
||||
import fr.gouv.etalab.mastodon.asynctasks.RetrieveFeedsAsyncTask;
|
||||
|
@ -137,6 +137,7 @@ import fr.gouv.etalab.mastodon.helper.CustomTextView;
|
|||
import fr.gouv.etalab.mastodon.helper.Helper;
|
||||
import fr.gouv.etalab.mastodon.interfaces.OnPollInterface;
|
||||
import fr.gouv.etalab.mastodon.interfaces.OnPostActionInterface;
|
||||
import fr.gouv.etalab.mastodon.interfaces.OnRefreshCachedStatusInterface;
|
||||
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveCardInterface;
|
||||
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveEmojiInterface;
|
||||
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveFeedsInterface;
|
||||
|
@ -165,7 +166,7 @@ import static fr.gouv.etalab.mastodon.sqlite.Sqlite.DB_NAME;
|
|||
* Created by Thomas on 24/04/2017.
|
||||
* Adapter for Status
|
||||
*/
|
||||
public class StatusListAdapter extends RecyclerView.Adapter implements OnPostActionInterface, OnRetrieveFeedsInterface, OnRetrieveEmojiInterface, OnRetrieveRepliesInterface, OnRetrieveCardInterface, OnPollInterface {
|
||||
public class StatusListAdapter extends RecyclerView.Adapter implements OnPostActionInterface, OnRetrieveFeedsInterface, OnRetrieveEmojiInterface, OnRetrieveRepliesInterface, OnRetrieveCardInterface, OnPollInterface, OnRefreshCachedStatusInterface {
|
||||
|
||||
private Context context;
|
||||
private List<Status> statuses;
|
||||
|
@ -264,6 +265,11 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
|
|||
notifyStatusChanged(status);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRefresh(Status refreshedStatus) {
|
||||
statusListAdapter.notifyStatusWithActionChanged(refreshedStatus);
|
||||
}
|
||||
|
||||
|
||||
private class ViewHolderEmpty extends RecyclerView.ViewHolder{
|
||||
ViewHolderEmpty(View itemView) {
|
||||
|
@ -942,6 +948,13 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
|
|||
}else{
|
||||
holder.cached_status.setVisibility(View.GONE);
|
||||
}
|
||||
holder.cached_status.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
new ManageCachedStatusAsyncTask(context, status.getId(), StatusListAdapter.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||
}
|
||||
});
|
||||
|
||||
//Redraws top icons (boost/reply)
|
||||
final float scale = context.getResources().getDisplayMetrics().density;
|
||||
holder.spark_button_fav.pressOnTouch(false);
|
||||
|
@ -3080,6 +3093,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
|
|||
public void onRetrieveFeeds(APIResponse apiResponse) {
|
||||
|
||||
if( apiResponse.getStatuses() != null && apiResponse.getStatuses().size() > 0){
|
||||
|
||||
SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
|
||||
long id = new StatusStoredDAO(context, db).insertStatus(toot, apiResponse.getStatuses().get(0));
|
||||
Intent intentToot = new Intent(context, TootActivity.class);
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
/* Copyright 2019 Thomas Schneider
|
||||
*
|
||||
* This file is a part of Fedilab
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Fedilab 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 Fedilab; if not,
|
||||
* see <http://www.gnu.org/licenses>. */
|
||||
package fr.gouv.etalab.mastodon.interfaces;
|
||||
|
||||
import fr.gouv.etalab.mastodon.client.Entities.Status;
|
||||
|
||||
/**
|
||||
* Created by Thomas on 12/05/2019.
|
||||
* Interface when refreshing status cache
|
||||
*/
|
||||
public interface OnRefreshCachedStatusInterface {
|
||||
void onRefresh(Status refreshedStatus);
|
||||
}
|
|
@ -73,6 +73,23 @@ public class TimelineCacheDAO {
|
|||
}
|
||||
return last_id;
|
||||
}
|
||||
|
||||
//------- UPDATE -------
|
||||
/**
|
||||
* Update a status in database
|
||||
*/
|
||||
public void update(String statusId, String jsonString) {
|
||||
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
|
||||
String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null);
|
||||
String instance = Helper.getLiveInstance(context);
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(Sqlite.COL_DATE, Helper.dateToString(new Date()));
|
||||
values.put(Sqlite.COL_CACHE, jsonString);
|
||||
try{
|
||||
db.update(Sqlite.TABLE_TIMELINE_CACHE, values, Sqlite.COL_INSTANCE + " = ? AND " + Sqlite.COL_STATUS_ID + " = ? AND " + Sqlite.COL_USER_ID + " = ?", new String[]{instance, statusId, userId});
|
||||
}catch (Exception ignored) {}
|
||||
}
|
||||
|
||||
//------- REMOVE -------
|
||||
|
||||
/***
|
||||
|
|
|
@ -181,6 +181,7 @@
|
|||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content">
|
||||
<TextView
|
||||
android:layout_marginBottom="3dp"
|
||||
android:id="@+id/status_account_displayname"
|
||||
android:maxLines="1"
|
||||
android:drawablePadding="2dp"
|
||||
|
|
Loading…
Reference in New Issue