Keep selected application on screen rotation

This commit is contained in:
Sternagfonkel
2022-01-30 10:02:28 +01:00
committed by GitHub
parent 8d36edc75e
commit 09ccd4d2e2
4 changed files with 185 additions and 84 deletions

View File

@@ -28,6 +28,7 @@ import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat; import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.view.GravityCompat; import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout; import androidx.drawerlayout.widget.DrawerLayout;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
@@ -61,7 +62,6 @@ import com.github.gotify.messages.provider.MessageDeletion;
import com.github.gotify.messages.provider.MessageFacade; import com.github.gotify.messages.provider.MessageFacade;
import com.github.gotify.messages.provider.MessageState; import com.github.gotify.messages.provider.MessageState;
import com.github.gotify.messages.provider.MessageWithImage; import com.github.gotify.messages.provider.MessageWithImage;
import com.github.gotify.picasso.PicassoHandler;
import com.github.gotify.service.WebSocketService; import com.github.gotify.service.WebSocketService;
import com.github.gotify.settings.SettingsActivity; import com.github.gotify.settings.SettingsActivity;
import com.github.gotify.sharing.ShareActivity; import com.github.gotify.sharing.ShareActivity;
@@ -70,7 +70,6 @@ import com.google.android.material.snackbar.BaseTransientBottomBar;
import com.google.android.material.snackbar.Snackbar; import com.google.android.material.snackbar.Snackbar;
import com.squareup.picasso.Target; import com.squareup.picasso.Target;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@@ -80,7 +79,7 @@ import static java.util.Collections.emptyList;
public class MessagesActivity extends AppCompatActivity public class MessagesActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener { implements NavigationView.OnNavigationItemSelectedListener {
private BroadcastReceiver receiver = private final BroadcastReceiver receiver =
new BroadcastReceiver() { new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
@@ -90,7 +89,7 @@ public class MessagesActivity extends AppCompatActivity
} }
}; };
private int APPLICATION_ORDER = 1; private static final int APPLICATION_ORDER = 1;
@BindView(R.id.toolbar) @BindView(R.id.toolbar)
Toolbar toolbar; Toolbar toolbar;
@@ -110,51 +109,36 @@ public class MessagesActivity extends AppCompatActivity
@BindView(R.id.flipper) @BindView(R.id.flipper)
ViewFlipper flipper; ViewFlipper flipper;
private MessageFacade messages; private MessagesModel viewModel;
private ApiClient client;
private Settings settings;
protected ApplicationHolder appsHolder;
private long appId = MessageState.ALL_MESSAGES;
private boolean isLoadMore = false; private boolean isLoadMore = false;
private Long selectAppIdOnDrawerClose = null; private Long updateAppOnDrawerClose = null;
private PicassoHandler picassoHandler;
private ListMessageAdapter listMessageAdapter; private ListMessageAdapter listMessageAdapter;
// we need to keep the target references otherwise they get gc'ed before they can be called.
@SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
private final List<Target> targetReferences = new ArrayList<>();
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_messages); setContentView(R.layout.activity_messages);
ButterKnife.bind(this); ButterKnife.bind(this);
viewModel =
new ViewModelProvider(this, new MessagesModelFactory(this))
.get(MessagesModel.class);
Log.i("Entering " + getClass().getSimpleName()); Log.i("Entering " + getClass().getSimpleName());
settings = new Settings(this);
picassoHandler = new PicassoHandler(this, settings);
client =
ClientFactory.clientToken(settings.url(), settings.sslSettings(), settings.token());
appsHolder = new ApplicationHolder(this, client);
appsHolder.onUpdate(() -> onUpdateApps(appsHolder.get()));
appsHolder.request();
initDrawer(); initDrawer();
messages = new MessageFacade(client.createService(MessageApi.class), appsHolder);
LinearLayoutManager layoutManager = new LinearLayoutManager(this); LinearLayoutManager layoutManager = new LinearLayoutManager(this);
DividerItemDecoration dividerItemDecoration = DividerItemDecoration dividerItemDecoration =
new DividerItemDecoration( new DividerItemDecoration(
messagesView.getContext(), layoutManager.getOrientation()); messagesView.getContext(), layoutManager.getOrientation());
listMessageAdapter = listMessageAdapter =
new ListMessageAdapter( new ListMessageAdapter(
this, settings, picassoHandler.get(), emptyList(), this::scheduleDeletion); this,
viewModel.getSettings(),
viewModel.getPicassoHandler().get(),
emptyList(),
this::scheduleDeletion);
messagesView.addItemDecoration(dividerItemDecoration); messagesView.addItemDecoration(dividerItemDecoration);
messagesView.setHasFixedSize(true); messagesView.setHasFixedSize(true);
@@ -162,6 +146,11 @@ public class MessagesActivity extends AppCompatActivity
messagesView.addOnScrollListener(new MessageListOnScrollListener()); messagesView.addOnScrollListener(new MessageListOnScrollListener());
messagesView.setAdapter(listMessageAdapter); messagesView.setAdapter(listMessageAdapter);
ApplicationHolder appsHolder = viewModel.getAppsHolder();
appsHolder.onUpdate(() -> onUpdateApps(appsHolder.get()));
if (appsHolder.wasRequested()) onUpdateApps(appsHolder.get());
else appsHolder.request();
ItemTouchHelper itemTouchHelper = ItemTouchHelper itemTouchHelper =
new ItemTouchHelper(new SwipeToDeleteCallback(listMessageAdapter)); new ItemTouchHelper(new SwipeToDeleteCallback(listMessageAdapter));
itemTouchHelper.attachToRecyclerView(messagesView); itemTouchHelper.attachToRecyclerView(messagesView);
@@ -171,11 +160,10 @@ public class MessagesActivity extends AppCompatActivity
new DrawerLayout.SimpleDrawerListener() { new DrawerLayout.SimpleDrawerListener() {
@Override @Override
public void onDrawerClosed(View drawerView) { public void onDrawerClosed(View drawerView) {
if (selectAppIdOnDrawerClose != null) { if (updateAppOnDrawerClose != null) {
appId = selectAppIdOnDrawerClose; viewModel.setAppId(updateAppOnDrawerClose);
new SelectApplicationAndUpdateMessages(true) new UpdateMessagesForApplication(true).execute(updateAppOnDrawerClose);
.execute(selectAppIdOnDrawerClose); updateAppOnDrawerClose = null;
selectAppIdOnDrawerClose = null;
invalidateOptionsMenu(); invalidateOptionsMenu();
} }
} }
@@ -194,7 +182,7 @@ public class MessagesActivity extends AppCompatActivity
} }
}); });
new SelectApplicationAndUpdateMessages(true).execute(appId); new UpdateMessagesForApplication(true).execute(viewModel.getAppId());
} }
public void onRefreshAll(View view) { public void onRefreshAll(View view) {
@@ -203,7 +191,7 @@ public class MessagesActivity extends AppCompatActivity
public void refreshAll() { public void refreshAll() {
try { try {
picassoHandler.evict(); viewModel.getPicassoHandler().evict();
} catch (IOException e) { } catch (IOException e) {
Log.e("Problem evicting Picasso cache", e); Log.e("Problem evicting Picasso cache", e);
} }
@@ -212,8 +200,8 @@ public class MessagesActivity extends AppCompatActivity
} }
private void onRefresh() { private void onRefresh() {
messages.clear(); viewModel.getMessages().clear();
new LoadMore().execute(appId); new LoadMore().execute(viewModel.getAppId());
} }
@OnClick(R.id.learn_gotify) @OnClick(R.id.learn_gotify)
@@ -230,22 +218,29 @@ public class MessagesActivity extends AppCompatActivity
protected void onUpdateApps(List<Application> applications) { protected void onUpdateApps(List<Application> applications) {
Menu menu = navigationView.getMenu(); Menu menu = navigationView.getMenu();
menu.removeGroup(R.id.apps); menu.removeGroup(R.id.apps);
targetReferences.clear(); viewModel.getTargetReferences().clear();
updateMessagesAndStopLoading(messages.get(appId)); updateMessagesAndStopLoading(viewModel.getMessages().get(viewModel.getAppId()));
MenuItem selectedItem = menu.findItem(R.id.nav_all_messages);
for (int i = 0; i < applications.size(); i++) { for (int i = 0; i < applications.size(); i++) {
Application app = applications.get(i); Application app = applications.get(i);
MenuItem item = menu.add(R.id.apps, i, APPLICATION_ORDER, app.getName()); MenuItem item = menu.add(R.id.apps, i, APPLICATION_ORDER, app.getName());
item.setCheckable(true); item.setCheckable(true);
if (app.getId() == viewModel.getAppId()) selectedItem = item;
Target t = Utils.toDrawable(getResources(), item::setIcon); Target t = Utils.toDrawable(getResources(), item::setIcon);
targetReferences.add(t); viewModel.getTargetReferences().add(t);
picassoHandler viewModel
.getPicassoHandler()
.get() .get()
.load(Utils.resolveAbsoluteUrl(settings.url() + "/", app.getImage())) .load(
Utils.resolveAbsoluteUrl(
viewModel.getSettings().url() + "/", app.getImage()))
.error(R.drawable.ic_alarm) .error(R.drawable.ic_alarm)
.placeholder(R.drawable.ic_placeholder) .placeholder(R.drawable.ic_placeholder)
.resize(100, 100) .resize(100, 100)
.into(t); .into(t);
} }
selectAppInMenu(selectedItem);
} }
private void initDrawer() { private void initDrawer() {
@@ -264,6 +259,8 @@ public class MessagesActivity extends AppCompatActivity
navigationView.setNavigationItemSelectedListener(this); navigationView.setNavigationItemSelectedListener(this);
View headerView = navigationView.getHeaderView(0); View headerView = navigationView.getHeaderView(0);
Settings settings = viewModel.getSettings();
TextView user = headerView.findViewById(R.id.header_user); TextView user = headerView.findViewById(R.id.header_user);
user.setText(settings.user().getName()); user.setText(settings.user().getName());
@@ -288,19 +285,18 @@ public class MessagesActivity extends AppCompatActivity
} }
} }
@SuppressWarnings("StatementWithEmptyBody")
@Override @Override
public boolean onNavigationItemSelected(MenuItem item) { public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here. // Handle navigation view item clicks here.
int id = item.getItemId(); int id = item.getItemId();
if (item.getGroupId() == R.id.apps) { if (item.getGroupId() == R.id.apps) {
Application app = appsHolder.get().get(id); Application app = viewModel.getAppsHolder().get().get(id);
selectAppIdOnDrawerClose = app != null ? app.getId() : MessageState.ALL_MESSAGES; updateAppOnDrawerClose = app != null ? app.getId() : MessageState.ALL_MESSAGES;
startLoading(); startLoading();
toolbar.setSubtitle(item.getTitle()); toolbar.setSubtitle(item.getTitle());
} else if (id == R.id.nav_all_messages) { } else if (id == R.id.nav_all_messages) {
selectAppIdOnDrawerClose = MessageState.ALL_MESSAGES; updateAppOnDrawerClose = MessageState.ALL_MESSAGES;
startLoading(); startLoading();
toolbar.setSubtitle(""); toolbar.setSubtitle("");
} else if (id == R.id.logout) { } else if (id == R.id.logout) {
@@ -349,20 +345,21 @@ public class MessagesActivity extends AppCompatActivity
IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter();
filter.addAction(WebSocketService.NEW_MESSAGE_BROADCAST); filter.addAction(WebSocketService.NEW_MESSAGE_BROADCAST);
registerReceiver(receiver, filter); registerReceiver(receiver, filter);
new UpdateMissedMessages().execute(messages.getLastReceivedMessage()); new UpdateMissedMessages().execute(viewModel.getMessages().getLastReceivedMessage());
int selectedIndex = R.id.nav_all_messages; int selectedIndex = R.id.nav_all_messages;
long appId = viewModel.getAppId();
if (appId != MessageState.ALL_MESSAGES) { if (appId != MessageState.ALL_MESSAGES) {
for (int i = 0; i < appsHolder.get().size(); i++) { List<Application> apps = viewModel.getAppsHolder().get();
if (appsHolder.get().get(i).getId() == appId) { for (int i = 0; i < apps.size(); i++) {
if (apps.get(i).getId() == appId) {
selectedIndex = i; selectedIndex = i;
} }
} }
} }
listMessageAdapter.notifyDataSetChanged(); listMessageAdapter.notifyDataSetChanged();
selectAppInMenu(navigationView.getMenu().findItem(selectedIndex));
navigationView.getMenu().findItem(selectedIndex).setChecked(true);
super.onResume(); super.onResume();
} }
@@ -372,17 +369,20 @@ public class MessagesActivity extends AppCompatActivity
super.onPause(); super.onPause();
} }
@Override private void selectAppInMenu(MenuItem appItem) {
protected void onDestroy() { if (appItem != null) {
super.onDestroy(); appItem.setChecked(true);
picassoHandler.get().shutdown(); if (appItem.getItemId() != R.id.nav_all_messages)
toolbar.setSubtitle(appItem.getTitle());
}
} }
private void scheduleDeletion(int position, Message message, boolean listAnimation) { private void scheduleDeletion(int position, Message message, boolean listAnimation) {
ListMessageAdapter adapter = (ListMessageAdapter) messagesView.getAdapter(); ListMessageAdapter adapter = (ListMessageAdapter) messagesView.getAdapter();
MessageFacade messages = viewModel.getMessages();
messages.deleteLocal(message); messages.deleteLocal(message);
adapter.setItems(messages.get(appId)); adapter.setItems(messages.get(viewModel.getAppId()));
if (listAnimation) adapter.notifyItemRemoved(position); if (listAnimation) adapter.notifyItemRemoved(position);
else adapter.notifyDataSetChanged(); else adapter.notifyDataSetChanged();
@@ -391,10 +391,11 @@ public class MessagesActivity extends AppCompatActivity
} }
private void undoDelete() { private void undoDelete() {
MessageFacade messages = viewModel.getMessages();
MessageDeletion deletion = messages.undoDeleteLocal(); MessageDeletion deletion = messages.undoDeleteLocal();
if (deletion != null) { if (deletion != null) {
ListMessageAdapter adapter = (ListMessageAdapter) messagesView.getAdapter(); ListMessageAdapter adapter = (ListMessageAdapter) messagesView.getAdapter();
long appId = viewModel.getAppId();
adapter.setItems(messages.get(appId)); adapter.setItems(messages.get(appId));
int insertPosition = int insertPosition =
appId == MessageState.ALL_MESSAGES appId == MessageState.ALL_MESSAGES
@@ -428,7 +429,7 @@ public class MessagesActivity extends AppCompatActivity
} }
private class SwipeToDeleteCallback extends ItemTouchHelper.SimpleCallback { private class SwipeToDeleteCallback extends ItemTouchHelper.SimpleCallback {
private ListMessageAdapter adapter; private final ListMessageAdapter adapter;
private Drawable icon; private Drawable icon;
private final ColorDrawable background; private final ColorDrawable background;
@@ -525,7 +526,7 @@ public class MessagesActivity extends AppCompatActivity
private class MessageListOnScrollListener extends RecyclerView.OnScrollListener { private class MessageListOnScrollListener extends RecyclerView.OnScrollListener {
@Override @Override
public void onScrollStateChanged(RecyclerView view, int scrollState) {} public void onScrollStateChanged(@NonNull RecyclerView view, int scrollState) {}
@Override @Override
public void onScrolled(RecyclerView view, int dx, int dy) { public void onScrolled(RecyclerView view, int dx, int dy) {
@@ -536,10 +537,10 @@ public class MessagesActivity extends AppCompatActivity
if (lastVisibleItem > totalItemCount - 15 if (lastVisibleItem > totalItemCount - 15
&& totalItemCount != 0 && totalItemCount != 0
&& messages.canLoadMore(appId)) { && viewModel.getMessages().canLoadMore(viewModel.getAppId())) {
if (!isLoadMore) { if (!isLoadMore) {
isLoadMore = true; isLoadMore = true;
new LoadMore().execute(appId); new LoadMore().execute(viewModel.getAppId());
} }
} }
} }
@@ -555,16 +556,16 @@ public class MessagesActivity extends AppCompatActivity
} }
List<Message> newMessages = List<Message> newMessages =
new MissedMessageUtil(client.createService(MessageApi.class)) new MissedMessageUtil(viewModel.getClient().createService(MessageApi.class))
.missingMessages(id); .missingMessages(id);
messages.addMessages(newMessages); viewModel.getMessages().addMessages(newMessages);
return !newMessages.isEmpty(); return !newMessages.isEmpty();
} }
@Override @Override
protected void onPostExecute(Boolean update) { protected void onPostExecute(Boolean update) {
if (update) { if (update) {
new SelectApplicationAndUpdateMessages(true).execute(appId); new UpdateMessagesForApplication(true).execute(viewModel.getAppId());
} }
} }
} }
@@ -572,20 +573,22 @@ public class MessagesActivity extends AppCompatActivity
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.messages_action, menu); getMenuInflater().inflate(R.menu.messages_action, menu);
menu.findItem(R.id.action_delete_app).setVisible(appId != MessageState.ALL_MESSAGES); menu.findItem(R.id.action_delete_app)
.setVisible(viewModel.getAppId() != MessageState.ALL_MESSAGES);
return super.onCreateOptionsMenu(menu); return super.onCreateOptionsMenu(menu);
} }
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_delete_all) { if (item.getItemId() == R.id.action_delete_all) {
new DeleteMessages().execute(appId); new DeleteMessages().execute(viewModel.getAppId());
} }
if (item.getItemId() == R.id.action_delete_app) { if (item.getItemId() == R.id.action_delete_app) {
android.app.AlertDialog.Builder alert = new android.app.AlertDialog.Builder(this); android.app.AlertDialog.Builder alert = new android.app.AlertDialog.Builder(this);
alert.setTitle(R.string.delete_app); alert.setTitle(R.string.delete_app);
alert.setMessage(R.string.ack); alert.setMessage(R.string.ack);
alert.setPositiveButton(R.string.yes, (dialog, which) -> deleteApp(appId)); alert.setPositiveButton(
R.string.yes, (dialog, which) -> deleteApp(viewModel.getAppId()));
alert.setNegativeButton(R.string.no, (dialog, which) -> dialog.dismiss()); alert.setNegativeButton(R.string.no, (dialog, which) -> dialog.dismiss());
alert.show(); alert.show();
} }
@@ -593,6 +596,7 @@ public class MessagesActivity extends AppCompatActivity
} }
private void deleteApp(Long appId) { private void deleteApp(Long appId) {
Settings settings = viewModel.getSettings();
ApiClient client = ApiClient client =
ClientFactory.clientToken(settings.url(), settings.sslSettings(), settings.token()); ClientFactory.clientToken(settings.url(), settings.sslSettings(), settings.token());
@@ -611,7 +615,7 @@ public class MessagesActivity extends AppCompatActivity
@Override @Override
protected List<MessageWithImage> doInBackground(Long... appId) { protected List<MessageWithImage> doInBackground(Long... appId) {
return messages.loadMore(first(appId)); return viewModel.getMessages().loadMore(first(appId));
} }
@Override @Override
@@ -620,9 +624,9 @@ public class MessagesActivity extends AppCompatActivity
} }
} }
private class SelectApplicationAndUpdateMessages extends AsyncTask<Long, Void, Long> { private class UpdateMessagesForApplication extends AsyncTask<Long, Void, Long> {
private SelectApplicationAndUpdateMessages(boolean withLoadingSpinner) { private UpdateMessagesForApplication(boolean withLoadingSpinner) {
if (withLoadingSpinner) { if (withLoadingSpinner) {
startLoading(); startLoading();
} }
@@ -631,13 +635,13 @@ public class MessagesActivity extends AppCompatActivity
@Override @Override
protected Long doInBackground(Long... appIds) { protected Long doInBackground(Long... appIds) {
Long appId = first(appIds); Long appId = first(appIds);
messages.loadMoreIfNotPresent(appId); viewModel.getMessages().loadMoreIfNotPresent(appId);
return appId; return appId;
} }
@Override @Override
protected void onPostExecute(Long appId) { protected void onPostExecute(Long appId) {
updateMessagesAndStopLoading(messages.get(appId)); updateMessagesAndStopLoading(viewModel.getMessages().get(appId));
} }
} }
@@ -645,13 +649,13 @@ public class MessagesActivity extends AppCompatActivity
@Override @Override
protected Void doInBackground(Message... newMessages) { protected Void doInBackground(Message... newMessages) {
messages.addMessages(Arrays.asList(newMessages)); viewModel.getMessages().addMessages(Arrays.asList(newMessages));
return null; return null;
} }
@Override @Override
protected void onPostExecute(Void data) { protected void onPostExecute(Void data) {
new SelectApplicationAndUpdateMessages(false).execute(appId); new UpdateMessagesForApplication(false).execute(viewModel.getAppId());
} }
} }
@@ -659,13 +663,13 @@ public class MessagesActivity extends AppCompatActivity
@Override @Override
protected Void doInBackground(Void... messages) { protected Void doInBackground(Void... messages) {
MessagesActivity.this.messages.commitDelete(); viewModel.getMessages().commitDelete();
return null; return null;
} }
@Override @Override
protected void onPostExecute(Void data) { protected void onPostExecute(Void data) {
new SelectApplicationAndUpdateMessages(false).execute(appId); new UpdateMessagesForApplication(false).execute(viewModel.getAppId());
} }
} }
@@ -677,7 +681,7 @@ public class MessagesActivity extends AppCompatActivity
@Override @Override
protected Boolean doInBackground(Long... appId) { protected Boolean doInBackground(Long... appId) {
return messages.deleteAll(first(appId)); return viewModel.getMessages().deleteAll(first(appId));
} }
@Override @Override
@@ -685,7 +689,7 @@ public class MessagesActivity extends AppCompatActivity
if (!success) { if (!success) {
Utils.showSnackBar(MessagesActivity.this, "Delete failed :("); Utils.showSnackBar(MessagesActivity.this, "Delete failed :(");
} }
new SelectApplicationAndUpdateMessages(false).execute(appId); new UpdateMessagesForApplication(false).execute(viewModel.getAppId());
} }
} }
@@ -693,6 +697,7 @@ public class MessagesActivity extends AppCompatActivity
@Override @Override
protected Void doInBackground(Void... ignore) { protected Void doInBackground(Void... ignore) {
Settings settings = viewModel.getSettings();
ClientApi api = ClientApi api =
ClientFactory.clientToken( ClientFactory.clientToken(
settings.url(), settings.sslSettings(), settings.token()) settings.url(), settings.sslSettings(), settings.token())
@@ -724,7 +729,7 @@ public class MessagesActivity extends AppCompatActivity
@Override @Override
protected void onPostExecute(Void aVoid) { protected void onPostExecute(Void aVoid) {
settings.clear(); viewModel.getSettings().clear();
startActivity(new Intent(MessagesActivity.this, LoginActivity.class)); startActivity(new Intent(MessagesActivity.this, LoginActivity.class));
finish(); finish();
super.onPostExecute(aVoid); super.onPostExecute(aVoid);

View File

@@ -0,0 +1,70 @@
package com.github.gotify.messages;
import android.app.Activity;
import androidx.lifecycle.ViewModel;
import com.github.gotify.Settings;
import com.github.gotify.api.ClientFactory;
import com.github.gotify.client.ApiClient;
import com.github.gotify.client.api.MessageApi;
import com.github.gotify.messages.provider.ApplicationHolder;
import com.github.gotify.messages.provider.MessageFacade;
import com.github.gotify.messages.provider.MessageState;
import com.github.gotify.picasso.PicassoHandler;
import com.squareup.picasso.Target;
import java.util.ArrayList;
import java.util.List;
public class MessagesModel extends ViewModel {
private final Settings settings;
private final PicassoHandler picassoHandler;
private final ApiClient client;
private final ApplicationHolder appsHolder;
private final MessageFacade messages;
// we need to keep the target references otherwise they get gc'ed before they can be called.
@SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
private final List<Target> targetReferences = new ArrayList<>();
private long appId = MessageState.ALL_MESSAGES;
public MessagesModel(Activity parentView) {
settings = new Settings(parentView);
picassoHandler = new PicassoHandler(parentView, settings);
client =
ClientFactory.clientToken(settings.url(), settings.sslSettings(), settings.token());
appsHolder = new ApplicationHolder(parentView, client);
messages = new MessageFacade(client.createService(MessageApi.class), appsHolder);
}
public Settings getSettings() {
return settings;
}
public PicassoHandler getPicassoHandler() {
return picassoHandler;
}
public ApiClient getClient() {
return client;
}
public ApplicationHolder getAppsHolder() {
return appsHolder;
}
public MessageFacade getMessages() {
return messages;
}
public List<Target> getTargetReferences() {
return targetReferences;
}
public long getAppId() {
return appId;
}
public void setAppId(long appId) {
this.appId = appId;
}
}

View File

@@ -0,0 +1,28 @@
package com.github.gotify.messages;
import android.app.Activity;
import androidx.annotation.NonNull;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import java.util.Objects;
public class MessagesModelFactory implements ViewModelProvider.Factory {
Activity modelParameterActivity;
public MessagesModelFactory(Activity activity) {
modelParameterActivity = activity;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
if (modelClass == MessagesModel.class) {
return Objects.requireNonNull(
modelClass.cast(new MessagesModel(modelParameterActivity)));
}
throw new IllegalArgumentException(
String.format(
"modelClass parameter must be of type %s", MessagesModel.class.getName()));
}
}

View File

@@ -22,10 +22,8 @@ public class ApplicationHolder {
this.client = client; this.client = client;
} }
public void requestIfMissing() { public boolean wasRequested() {
if (state == null) { return state != null;
request();
}
} }
public void request() { public void request() {