Improve lists caching and consistency

This commit is contained in:
Grishka 2023-10-22 05:07:28 +03:00
parent 572901ec9d
commit 5580308968
6 changed files with 81 additions and 9 deletions

View File

@ -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(){

View File

@ -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;
}
}

View File

@ -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);
} }

View File

@ -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

View File

@ -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));
} }

View File

@ -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);