Improve lists caching and consistency
This commit is contained in:
parent
572901ec9d
commit
5580308968
|
@ -321,13 +321,7 @@ public class CacheController{
|
||||||
lists=result;
|
lists=result;
|
||||||
if(callback!=null)
|
if(callback!=null)
|
||||||
callback.onSuccess(result);
|
callback.onSuccess(result);
|
||||||
databaseThread.postRunnable(()->{
|
writeListsToFile();
|
||||||
try(OutputStreamWriter out=new OutputStreamWriter(new FileOutputStream(getListsFile()))){
|
|
||||||
MastodonAPIController.gson.toJson(result, out);
|
|
||||||
}catch(IOException x){
|
|
||||||
Log.w(TAG, "failed to write lists to cache file", x);
|
|
||||||
}
|
|
||||||
}, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -351,6 +345,16 @@ public class CacheController{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void writeListsToFile(){
|
||||||
|
databaseThread.postRunnable(()->{
|
||||||
|
try(OutputStreamWriter out=new OutputStreamWriter(new FileOutputStream(getListsFile()))){
|
||||||
|
MastodonAPIController.gson.toJson(lists, out);
|
||||||
|
}catch(IOException x){
|
||||||
|
Log.w(TAG, "failed to write lists to cache file", x);
|
||||||
|
}
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
|
||||||
public void getLists(Callback<List<FollowList>> callback){
|
public void getLists(Callback<List<FollowList>> callback){
|
||||||
if(lists!=null){
|
if(lists!=null){
|
||||||
if(callback!=null)
|
if(callback!=null)
|
||||||
|
@ -373,6 +377,34 @@ public class CacheController{
|
||||||
return new File(MastodonApp.context.getFilesDir(), "lists_"+accountID+".json");
|
return new File(MastodonApp.context.getFilesDir(), "lists_"+accountID+".json");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addList(FollowList list){
|
||||||
|
if(lists==null)
|
||||||
|
return;
|
||||||
|
lists.add(list);
|
||||||
|
lists.sort(Comparator.comparing(l->l.title));
|
||||||
|
writeListsToFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteList(String id){
|
||||||
|
if(lists==null)
|
||||||
|
return;
|
||||||
|
lists.removeIf(l->l.id.equals(id));
|
||||||
|
writeListsToFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateList(FollowList list){
|
||||||
|
if(lists==null)
|
||||||
|
return;
|
||||||
|
for(int i=0;i<lists.size();i++){
|
||||||
|
if(lists.get(i).id.equals(list.id)){
|
||||||
|
lists.set(i, list);
|
||||||
|
lists.sort(Comparator.comparing(l->l.title));
|
||||||
|
writeListsToFile();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class DatabaseHelper extends SQLiteOpenHelper{
|
private class DatabaseHelper extends SQLiteOpenHelper{
|
||||||
|
|
||||||
public DatabaseHelper(){
|
public DatabaseHelper(){
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
package org.joinmastodon.android.events;
|
||||||
|
|
||||||
|
import org.joinmastodon.android.model.FollowList;
|
||||||
|
|
||||||
|
public class ListCreatedEvent{
|
||||||
|
public final String accountID;
|
||||||
|
public final FollowList list;
|
||||||
|
|
||||||
|
public ListCreatedEvent(String accountID, FollowList list){
|
||||||
|
this.accountID=accountID;
|
||||||
|
this.list=list;
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,6 +12,7 @@ import org.joinmastodon.android.E;
|
||||||
import org.joinmastodon.android.R;
|
import org.joinmastodon.android.R;
|
||||||
import org.joinmastodon.android.api.requests.lists.DeleteList;
|
import org.joinmastodon.android.api.requests.lists.DeleteList;
|
||||||
import org.joinmastodon.android.api.requests.lists.GetListAccounts;
|
import org.joinmastodon.android.api.requests.lists.GetListAccounts;
|
||||||
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||||
import org.joinmastodon.android.events.ListDeletedEvent;
|
import org.joinmastodon.android.events.ListDeletedEvent;
|
||||||
import org.joinmastodon.android.fragments.settings.BaseSettingsFragment;
|
import org.joinmastodon.android.fragments.settings.BaseSettingsFragment;
|
||||||
import org.joinmastodon.android.model.Account;
|
import org.joinmastodon.android.model.Account;
|
||||||
|
@ -117,6 +118,7 @@ public abstract class BaseEditListFragment extends BaseSettingsFragment<Void>{
|
||||||
.setCallback(new Callback<>(){
|
.setCallback(new Callback<>(){
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(Void result){
|
public void onSuccess(Void result){
|
||||||
|
AccountSessionManager.get(accountID).getCacheController().deleteList(followList.id);
|
||||||
E.post(new ListDeletedEvent(accountID, followList.id));
|
E.post(new ListDeletedEvent(accountID, followList.id));
|
||||||
Nav.finish(BaseEditListFragment.this);
|
Nav.finish(BaseEditListFragment.this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,10 @@ import org.joinmastodon.android.E;
|
||||||
import org.joinmastodon.android.R;
|
import org.joinmastodon.android.R;
|
||||||
import org.joinmastodon.android.api.requests.lists.CreateList;
|
import org.joinmastodon.android.api.requests.lists.CreateList;
|
||||||
import org.joinmastodon.android.api.requests.lists.UpdateList;
|
import org.joinmastodon.android.api.requests.lists.UpdateList;
|
||||||
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||||
import org.joinmastodon.android.events.FinishListCreationFragmentEvent;
|
import org.joinmastodon.android.events.FinishListCreationFragmentEvent;
|
||||||
|
import org.joinmastodon.android.events.ListCreatedEvent;
|
||||||
|
import org.joinmastodon.android.events.ListUpdatedEvent;
|
||||||
import org.joinmastodon.android.model.FollowList;
|
import org.joinmastodon.android.model.FollowList;
|
||||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||||
import org.parceler.Parcels;
|
import org.parceler.Parcels;
|
||||||
|
@ -94,6 +97,8 @@ public class CreateListFragment extends BaseEditListFragment{
|
||||||
public void onSuccess(FollowList result){
|
public void onSuccess(FollowList result){
|
||||||
followList=result;
|
followList=result;
|
||||||
proceed(false);
|
proceed(false);
|
||||||
|
E.post(new ListCreatedEvent(accountID, result));
|
||||||
|
AccountSessionManager.get(accountID).getCacheController().addList(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -110,6 +115,8 @@ public class CreateListFragment extends BaseEditListFragment{
|
||||||
public void onSuccess(FollowList result){
|
public void onSuccess(FollowList result){
|
||||||
followList=result;
|
followList=result;
|
||||||
proceed(true);
|
proceed(true);
|
||||||
|
E.post(new ListUpdatedEvent(accountID, result));
|
||||||
|
AccountSessionManager.get(accountID).getCacheController().updateList(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -8,6 +8,7 @@ import android.view.MenuItem;
|
||||||
import org.joinmastodon.android.E;
|
import org.joinmastodon.android.E;
|
||||||
import org.joinmastodon.android.R;
|
import org.joinmastodon.android.R;
|
||||||
import org.joinmastodon.android.api.requests.lists.UpdateList;
|
import org.joinmastodon.android.api.requests.lists.UpdateList;
|
||||||
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||||
import org.joinmastodon.android.events.ListUpdatedEvent;
|
import org.joinmastodon.android.events.ListUpdatedEvent;
|
||||||
import org.joinmastodon.android.model.FollowList;
|
import org.joinmastodon.android.model.FollowList;
|
||||||
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
|
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
|
||||||
|
@ -51,6 +52,7 @@ public class EditListFragment extends BaseEditListFragment{
|
||||||
.setCallback(new Callback<>(){
|
.setCallback(new Callback<>(){
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(FollowList result){
|
public void onSuccess(FollowList result){
|
||||||
|
AccountSessionManager.get(accountID).getCacheController().updateList(result);
|
||||||
E.post(new ListUpdatedEvent(accountID, result));
|
E.post(new ListUpdatedEvent(accountID, result));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ import org.joinmastodon.android.E;
|
||||||
import org.joinmastodon.android.R;
|
import org.joinmastodon.android.R;
|
||||||
import org.joinmastodon.android.api.requests.lists.DeleteList;
|
import org.joinmastodon.android.api.requests.lists.DeleteList;
|
||||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||||
|
import org.joinmastodon.android.events.ListCreatedEvent;
|
||||||
import org.joinmastodon.android.events.ListDeletedEvent;
|
import org.joinmastodon.android.events.ListDeletedEvent;
|
||||||
import org.joinmastodon.android.events.ListUpdatedEvent;
|
import org.joinmastodon.android.events.ListUpdatedEvent;
|
||||||
import org.joinmastodon.android.fragments.settings.BaseSettingsFragment;
|
import org.joinmastodon.android.fragments.settings.BaseSettingsFragment;
|
||||||
|
@ -24,6 +25,7 @@ import org.joinmastodon.android.ui.M3AlertDialogBuilder;
|
||||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||||
import org.parceler.Parcels;
|
import org.parceler.Parcels;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@ -59,7 +61,7 @@ public class ManageListsFragment extends BaseSettingsFragment<FollowList> implem
|
||||||
Callback<List<FollowList>> callback=new SimpleCallback<>(this){
|
Callback<List<FollowList>> callback=new SimpleCallback<>(this){
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(List<FollowList> result){
|
public void onSuccess(List<FollowList> result){
|
||||||
onDataLoaded(result.stream().map(l->new ListItemWithOptionsMenu<>(l.title, null, ManageListsFragment.this, R.drawable.ic_list_alt_24px, ManageListsFragment.this::onListClick, l, false)).collect(Collectors.toList()), false);
|
onDataLoaded(result.stream().map(ManageListsFragment.this::makeItem).collect(Collectors.toList()), false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if(refreshing){
|
if(refreshing){
|
||||||
|
@ -73,6 +75,10 @@ public class ManageListsFragment extends BaseSettingsFragment<FollowList> implem
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ListItem<FollowList> makeItem(FollowList l){
|
||||||
|
return new ListItemWithOptionsMenu<>(l.title, null, ManageListsFragment.this, R.drawable.ic_list_alt_24px, ManageListsFragment.this::onListClick, l, false);
|
||||||
|
}
|
||||||
|
|
||||||
private void onListClick(ListItemWithOptionsMenu<FollowList> item){
|
private void onListClick(ListItemWithOptionsMenu<FollowList> item){
|
||||||
Bundle args=new Bundle();
|
Bundle args=new Bundle();
|
||||||
args.putString("account", accountID);
|
args.putString("account", accountID);
|
||||||
|
@ -128,7 +134,7 @@ public class ManageListsFragment extends BaseSettingsFragment<FollowList> implem
|
||||||
if(data.get(i).parentObject==list){
|
if(data.get(i).parentObject==list){
|
||||||
data.remove(i);
|
data.remove(i);
|
||||||
itemsAdapter.notifyItemRemoved(i);
|
itemsAdapter.notifyItemRemoved(i);
|
||||||
AccountSessionManager.get(accountID).getCacheController().reloadLists(null);
|
AccountSessionManager.get(accountID).getCacheController().deleteList(list.id);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -175,6 +181,16 @@ public class ManageListsFragment extends BaseSettingsFragment<FollowList> implem
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onListCreated(ListCreatedEvent ev){
|
||||||
|
if(!ev.accountID.equals(accountID))
|
||||||
|
return;
|
||||||
|
ListItem<FollowList> item=makeItem(ev.list);
|
||||||
|
data.add(item);
|
||||||
|
((List<ListItem<FollowList>>)data).sort(Comparator.comparing(l->l.parentObject.title));
|
||||||
|
itemsAdapter.notifyItemInserted(data.indexOf(item));
|
||||||
|
}
|
||||||
|
|
||||||
private void onFabClick(){
|
private void onFabClick(){
|
||||||
Bundle args=new Bundle();
|
Bundle args=new Bundle();
|
||||||
args.putString("account", accountID);
|
args.putString("account", accountID);
|
||||||
|
|
Loading…
Reference in New Issue