This commit is contained in:
Thomas 2020-09-07 11:15:43 +02:00
parent 43e6d0baeb
commit 4c83a14786
9 changed files with 226 additions and 192 deletions

View File

@ -41,7 +41,6 @@ import org.jetbrains.annotations.NotNull;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import app.fedilab.fedilabtube.asynctasks.RetrieveFeedsAsyncTask;
import app.fedilab.fedilabtube.asynctasks.RetrievePeertubeInformationAsyncTask; import app.fedilab.fedilabtube.asynctasks.RetrievePeertubeInformationAsyncTask;
import app.fedilab.fedilabtube.client.PeertubeAPI; import app.fedilab.fedilabtube.client.PeertubeAPI;
import app.fedilab.fedilabtube.client.entities.Account; import app.fedilab.fedilabtube.client.entities.Account;
@ -49,6 +48,7 @@ import app.fedilab.fedilabtube.client.entities.PeertubeInformation;
import app.fedilab.fedilabtube.helper.Helper; import app.fedilab.fedilabtube.helper.Helper;
import app.fedilab.fedilabtube.sqlite.AccountDAO; import app.fedilab.fedilabtube.sqlite.AccountDAO;
import app.fedilab.fedilabtube.sqlite.Sqlite; import app.fedilab.fedilabtube.sqlite.Sqlite;
import app.fedilab.fedilabtube.viewmodel.FeedsVM;
import static app.fedilab.fedilabtube.asynctasks.RetrievePeertubeInformationAsyncTask.peertubeInformation; import static app.fedilab.fedilabtube.asynctasks.RetrievePeertubeInformationAsyncTask.peertubeInformation;
import static app.fedilab.fedilabtube.helper.Helper.academies; import static app.fedilab.fedilabtube.helper.Helper.academies;
@ -188,14 +188,14 @@ public class MainActivity extends AppCompatActivity {
} else if (item.getItemId() == R.id.action_myvideos) { } else if (item.getItemId() == R.id.action_myvideos) {
Intent intent = new Intent(MainActivity.this, MyVideosActivity.class); Intent intent = new Intent(MainActivity.this, MyVideosActivity.class);
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.MYVIDEOS); bundle.putSerializable("type", FeedsVM.Type.MYVIDEOS);
intent.putExtras(bundle); intent.putExtras(bundle);
startActivity(intent); startActivity(intent);
return true; return true;
} else if (item.getItemId() == R.id.action_history) { } else if (item.getItemId() == R.id.action_history) {
Intent intent = new Intent(MainActivity.this, MyVideosActivity.class); Intent intent = new Intent(MainActivity.this, MyVideosActivity.class);
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.PEERTUBE_HISTORY); bundle.putSerializable("type", FeedsVM.Type.PEERTUBE_HISTORY);
intent.putExtras(bundle); intent.putExtras(bundle);
startActivity(intent); startActivity(intent);
return true; return true;

View File

@ -20,15 +20,15 @@ import android.view.MenuItem;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentTransaction; import androidx.fragment.app.FragmentTransaction;
import app.fedilab.fedilabtube.asynctasks.RetrieveFeedsAsyncTask;
import app.fedilab.fedilabtube.client.APIResponse; import app.fedilab.fedilabtube.client.APIResponse;
import app.fedilab.fedilabtube.fragment.DisplayStatusFragment; import app.fedilab.fedilabtube.fragment.DisplayStatusFragment;
import app.fedilab.fedilabtube.interfaces.OnRetrieveFeedsInterface; import app.fedilab.fedilabtube.interfaces.OnRetrieveFeedsInterface;
import app.fedilab.fedilabtube.viewmodel.FeedsVM;
public class MyVideosActivity extends AppCompatActivity implements OnRetrieveFeedsInterface { public class MyVideosActivity extends AppCompatActivity implements OnRetrieveFeedsInterface {
private RetrieveFeedsAsyncTask.Type type; private FeedsVM.Type type;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -41,13 +41,13 @@ public class MyVideosActivity extends AppCompatActivity implements OnRetrieveFee
Bundle b = getIntent().getExtras(); Bundle b = getIntent().getExtras();
if (b != null) if (b != null)
type = (RetrieveFeedsAsyncTask.Type) b.get("type"); type = (FeedsVM.Type) b.get("type");
if (type == RetrieveFeedsAsyncTask.Type.MYVIDEOS) { if (type == FeedsVM.Type.MYVIDEOS) {
setTitle(R.string.my_videos); setTitle(R.string.my_videos);
} else if (type == RetrieveFeedsAsyncTask.Type.PSUBSCRIPTIONS) { } else if (type == FeedsVM.Type.PSUBSCRIPTIONS) {
setTitle(R.string.subscriptions); setTitle(R.string.subscriptions);
} else if (type == RetrieveFeedsAsyncTask.Type.PEERTUBE_HISTORY) { } else if (type == FeedsVM.Type.PEERTUBE_HISTORY) {
setTitle(R.string.my_history); setTitle(R.string.my_history);
} }

View File

@ -52,7 +52,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import app.fedilab.fedilabtube.asynctasks.PostActionAsyncTask; import app.fedilab.fedilabtube.asynctasks.PostActionAsyncTask;
import app.fedilab.fedilabtube.asynctasks.RetrieveFeedsAsyncTask;
import app.fedilab.fedilabtube.asynctasks.RetrieveRelationshipAsyncTask; import app.fedilab.fedilabtube.asynctasks.RetrieveRelationshipAsyncTask;
import app.fedilab.fedilabtube.asynctasks.RetrieveSingleAccountAsyncTask; import app.fedilab.fedilabtube.asynctasks.RetrieveSingleAccountAsyncTask;
import app.fedilab.fedilabtube.client.APIResponse; import app.fedilab.fedilabtube.client.APIResponse;
@ -71,6 +70,7 @@ import app.fedilab.fedilabtube.interfaces.OnRetrieveAccountsInterface;
import app.fedilab.fedilabtube.interfaces.OnRetrieveFeedsAccountInterface; import app.fedilab.fedilabtube.interfaces.OnRetrieveFeedsAccountInterface;
import app.fedilab.fedilabtube.interfaces.OnRetrieveFeedsInterface; import app.fedilab.fedilabtube.interfaces.OnRetrieveFeedsInterface;
import app.fedilab.fedilabtube.interfaces.OnRetrieveRelationshipInterface; import app.fedilab.fedilabtube.interfaces.OnRetrieveRelationshipInterface;
import app.fedilab.fedilabtube.viewmodel.FeedsVM;
import es.dmoral.toasty.Toasty; import es.dmoral.toasty.Toasty;
import static androidx.core.text.HtmlCompat.FROM_HTML_MODE_LEGACY; import static androidx.core.text.HtmlCompat.FROM_HTML_MODE_LEGACY;
@ -121,7 +121,7 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi
} }
statuses = new ArrayList<>(); statuses = new ArrayList<>();
StatusDrawerParams statusDrawerParams = new StatusDrawerParams(); StatusDrawerParams statusDrawerParams = new StatusDrawerParams();
statusDrawerParams.setType(RetrieveFeedsAsyncTask.Type.USER); statusDrawerParams.setType(FeedsVM.Type.USER);
statusDrawerParams.setTargetedId(accountId); statusDrawerParams.setTargetedId(accountId);
statusDrawerParams.setStatuses(statuses); statusDrawerParams.setStatuses(statuses);
statusListAdapter = new StatusListAdapter(statusDrawerParams); statusListAdapter = new StatusListAdapter(statusDrawerParams);
@ -465,7 +465,7 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi
if (position == 0) { if (position == 0) {
DisplayStatusFragment displayStatusFragment = new DisplayStatusFragment(); DisplayStatusFragment displayStatusFragment = new DisplayStatusFragment();
bundle = new Bundle(); bundle = new Bundle();
bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.USER); bundle.putSerializable("type", FeedsVM.Type.USER);
bundle.putString("targetedid", account.getAcct()); bundle.putString("targetedid", account.getAcct());
bundle.putBoolean("ischannel", ischannel); bundle.putBoolean("ischannel", ischannel);
displayStatusFragment.setArguments(bundle); displayStatusFragment.setArguments(bundle);

View File

@ -1,158 +0,0 @@
package app.fedilab.fedilabtube.asynctasks;
/* Copyright 2020 Thomas Schneider
*
* This file is a part of TubeLab
*
* 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.
*
* TubeLab 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 TubeLab; if not,
* see <http://www.gnu.org/licenses>. */
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import java.lang.ref.WeakReference;
import java.util.List;
import app.fedilab.fedilabtube.client.APIResponse;
import app.fedilab.fedilabtube.client.PeertubeAPI;
import app.fedilab.fedilabtube.client.entities.Peertube;
import app.fedilab.fedilabtube.interfaces.OnRetrieveFeedsInterface;
import app.fedilab.fedilabtube.sqlite.PeertubeFavoritesDAO;
import app.fedilab.fedilabtube.sqlite.Sqlite;
public class RetrieveFeedsAsyncTask extends AsyncTask<Void, Void, Void> {
private Type action;
private APIResponse apiResponse;
private String max_id;
private OnRetrieveFeedsInterface listener;
private WeakReference<Context> contextReference;
private String target;
private String forAccount;
public RetrieveFeedsAsyncTask(Context context, Type action, String max_id, OnRetrieveFeedsInterface onRetrieveFeedsInterface) {
this.contextReference = new WeakReference<>(context);
this.action = action;
this.max_id = max_id;
this.listener = onRetrieveFeedsInterface;
this.target = null;
}
public RetrieveFeedsAsyncTask(Context context, Type action, String max_id, String target, OnRetrieveFeedsInterface onRetrieveFeedsInterface) {
this.contextReference = new WeakReference<>(context);
this.action = action;
this.max_id = max_id;
this.listener = onRetrieveFeedsInterface;
this.target = target;
}
public RetrieveFeedsAsyncTask(Context context, Type action, String max_id, String target, String forAccount, OnRetrieveFeedsInterface onRetrieveFeedsInterface) {
this.contextReference = new WeakReference<>(context);
this.action = action;
this.max_id = max_id;
this.listener = onRetrieveFeedsInterface;
this.target = target;
this.forAccount = forAccount;
}
@Override
protected Void doInBackground(Void... params) {
PeertubeAPI peertubeAPI = new PeertubeAPI(this.contextReference.get());
if (action == null)
return null;
switch (action) {
case USER:
apiResponse = peertubeAPI.getVideos(target, max_id);
break;
case MYVIDEOS:
peertubeAPI = new PeertubeAPI(this.contextReference.get());
apiResponse = peertubeAPI.getMyVideos(max_id);
break;
case PEERTUBE_HISTORY:
peertubeAPI = new PeertubeAPI(this.contextReference.get());
apiResponse = peertubeAPI.getMyHistory(max_id);
break;
case CHANNEL:
peertubeAPI = new PeertubeAPI(this.contextReference.get());
apiResponse = peertubeAPI.getVideosChannel(target, max_id);
break;
case CACHE_BOOKMARKS_PEERTUBE:
apiResponse = new APIResponse();
SQLiteDatabase db = Sqlite.getInstance(contextReference.get().getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
List<Peertube> peertubes = new PeertubeFavoritesDAO(contextReference.get(), db).getAllPeertube();
apiResponse.setPeertubes(peertubes);
break;
case PSUBSCRIPTIONS:
peertubeAPI = new PeertubeAPI(this.contextReference.get());
if (forAccount == null) {
apiResponse = peertubeAPI.getSubscriptionsTL(max_id);
} else {
apiResponse = peertubeAPI.getVideosChannel(forAccount, max_id);
}
break;
case POVERVIEW:
peertubeAPI = new PeertubeAPI(this.contextReference.get());
apiResponse = peertubeAPI.getOverviewTL(max_id);
break;
case PTRENDING:
peertubeAPI = new PeertubeAPI(this.contextReference.get());
apiResponse = peertubeAPI.getTrendingTL(max_id);
break;
case PRECENTLYADDED:
peertubeAPI = new PeertubeAPI(this.contextReference.get());
apiResponse = peertubeAPI.getRecentlyAddedTL(max_id);
break;
case PLOCAL:
peertubeAPI = new PeertubeAPI(this.contextReference.get());
apiResponse = peertubeAPI.getLocalTL(max_id);
break;
case PPUBLIC:
peertubeAPI = new PeertubeAPI(this.contextReference.get());
apiResponse = peertubeAPI.getPublicTL(max_id);
break;
case PMOSTLIKED:
peertubeAPI = new PeertubeAPI(this.contextReference.get());
apiResponse = peertubeAPI.getLikedTL(max_id);
break;
}
return null;
}
@Override
protected void onPostExecute(Void result) {
listener.onRetrieveFeeds(apiResponse);
}
public enum Type {
USER,
PPUBLIC,
PSUBSCRIPTIONS,
POVERVIEW,
PTRENDING,
PRECENTLYADDED,
PMOSTLIKED,
PLOCAL,
CHANNEL,
MYVIDEOS,
PEERTUBE_HISTORY,
CACHE_BOOKMARKS_PEERTUBE,
}
}

View File

@ -49,9 +49,9 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import app.fedilab.fedilabtube.R; import app.fedilab.fedilabtube.R;
import app.fedilab.fedilabtube.asynctasks.RetrieveFeedsAsyncTask;
import app.fedilab.fedilabtube.helper.CustomQuoteSpan; import app.fedilab.fedilabtube.helper.CustomQuoteSpan;
import app.fedilab.fedilabtube.helper.Helper; import app.fedilab.fedilabtube.helper.Helper;
import app.fedilab.fedilabtube.viewmodel.FeedsVM;
@SuppressWarnings("unused") @SuppressWarnings("unused")
@ -88,7 +88,7 @@ public class Status implements Parcelable {
private String language; private String language;
private String content; private String content;
private SpannableString contentSpan; private SpannableString contentSpan;
private transient RetrieveFeedsAsyncTask.Type type; private transient FeedsVM.Type type;
private String conversationId; private String conversationId;
private String contentType; private String contentType;
@ -118,7 +118,7 @@ public class Status implements Parcelable {
this.content = in.readString(); this.content = in.readString();
this.contentSpan = (SpannableString) TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); this.contentSpan = (SpannableString) TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
int tmpType = in.readInt(); int tmpType = in.readInt();
this.type = tmpType == -1 ? null : RetrieveFeedsAsyncTask.Type.values()[tmpType]; this.type = tmpType == -1 ? null : FeedsVM.Type.values()[tmpType];
this.conversationId = in.readString(); this.conversationId = in.readString();
this.contentType = in.readString(); this.contentType = in.readString();
} }
@ -620,11 +620,11 @@ public class Status implements Parcelable {
this.replies_count = replies_count; this.replies_count = replies_count;
} }
public RetrieveFeedsAsyncTask.Type getType() { public FeedsVM.Type getType() {
return type; return type;
} }
public void setType(RetrieveFeedsAsyncTask.Type type) { public void setType(FeedsVM.Type type) {
this.type = type; this.type = type;
} }

View File

@ -16,12 +16,12 @@ package app.fedilab.fedilabtube.client.entities;
import java.util.List; import java.util.List;
import app.fedilab.fedilabtube.asynctasks.RetrieveFeedsAsyncTask; import app.fedilab.fedilabtube.viewmodel.FeedsVM;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class StatusDrawerParams { public class StatusDrawerParams {
private List<Status> statuses; private List<Status> statuses;
private RetrieveFeedsAsyncTask.Type type; private FeedsVM.Type type;
private String targetedId; private String targetedId;
private int position; private int position;
@ -34,11 +34,11 @@ public class StatusDrawerParams {
this.statuses = statuses; this.statuses = statuses;
} }
public RetrieveFeedsAsyncTask.Type getType() { public FeedsVM.Type getType() {
return type; return type;
} }
public void setType(RetrieveFeedsAsyncTask.Type type) { public void setType(FeedsVM.Type type) {
this.type = type; this.type = type;
} }

View File

@ -33,6 +33,7 @@ import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -45,7 +46,6 @@ import java.util.List;
import app.fedilab.fedilabtube.R; import app.fedilab.fedilabtube.R;
import app.fedilab.fedilabtube.asynctasks.RetrieveAccountsAsyncTask; import app.fedilab.fedilabtube.asynctasks.RetrieveAccountsAsyncTask;
import app.fedilab.fedilabtube.asynctasks.RetrieveFeedsAsyncTask;
import app.fedilab.fedilabtube.asynctasks.RetrievePeertubeSearchAsyncTask; import app.fedilab.fedilabtube.asynctasks.RetrievePeertubeSearchAsyncTask;
import app.fedilab.fedilabtube.client.APIResponse; import app.fedilab.fedilabtube.client.APIResponse;
import app.fedilab.fedilabtube.client.PeertubeAPI; import app.fedilab.fedilabtube.client.PeertubeAPI;
@ -58,10 +58,11 @@ import app.fedilab.fedilabtube.helper.Helper;
import app.fedilab.fedilabtube.interfaces.OnPostActionInterface; import app.fedilab.fedilabtube.interfaces.OnPostActionInterface;
import app.fedilab.fedilabtube.interfaces.OnRetrieveAccountsInterface; import app.fedilab.fedilabtube.interfaces.OnRetrieveAccountsInterface;
import app.fedilab.fedilabtube.interfaces.OnRetrieveFeedsInterface; import app.fedilab.fedilabtube.interfaces.OnRetrieveFeedsInterface;
import app.fedilab.fedilabtube.viewmodel.FeedsVM;
import es.dmoral.toasty.Toasty; import es.dmoral.toasty.Toasty;
import static app.fedilab.fedilabtube.asynctasks.RetrieveFeedsAsyncTask.Type.POVERVIEW; import static app.fedilab.fedilabtube.viewmodel.FeedsVM.Type.POVERVIEW;
import static app.fedilab.fedilabtube.asynctasks.RetrieveFeedsAsyncTask.Type.PSUBSCRIPTIONS; import static app.fedilab.fedilabtube.viewmodel.FeedsVM.Type.PSUBSCRIPTIONS;
public class DisplayStatusFragment extends Fragment implements OnPostActionInterface, OnRetrieveFeedsInterface, OnRetrieveAccountsInterface, AccountsHorizontalListAdapter.EventListener { public class DisplayStatusFragment extends Fragment implements OnPostActionInterface, OnRetrieveFeedsInterface, OnRetrieveAccountsInterface, AccountsHorizontalListAdapter.EventListener {
@ -77,7 +78,7 @@ public class DisplayStatusFragment extends Fragment implements OnPostActionInter
private String max_id, max_id_accounts; private String max_id, max_id_accounts;
private List<Peertube> peertubes; private List<Peertube> peertubes;
private List<Account> accounts; private List<Account> accounts;
private RetrieveFeedsAsyncTask.Type type; private FeedsVM.Type type;
private RelativeLayout mainLoader, nextElementLoader, textviewNoAction; private RelativeLayout mainLoader, nextElementLoader, textviewNoAction;
private boolean firstLoad; private boolean firstLoad;
private SwipeRefreshLayout swipeRefreshLayout; private SwipeRefreshLayout swipeRefreshLayout;
@ -110,7 +111,7 @@ public class DisplayStatusFragment extends Fragment implements OnPostActionInter
search_peertube = bundle.getString("search_peertube", null); search_peertube = bundle.getString("search_peertube", null);
targetedId = bundle.getString("targetedid", null); targetedId = bundle.getString("targetedid", null);
ischannel = bundle.getBoolean("ischannel", false); ischannel = bundle.getBoolean("ischannel", false);
type = (RetrieveFeedsAsyncTask.Type) bundle.get("type"); type = (FeedsVM.Type) bundle.get("type");
} }
if (getArguments() != null && type == null) { if (getArguments() != null && type == null) {
@ -119,7 +120,7 @@ public class DisplayStatusFragment extends Fragment implements OnPostActionInter
if (ischannel) { if (ischannel) {
type = RetrieveFeedsAsyncTask.Type.CHANNEL; type = FeedsVM.Type.CHANNEL;
} }
forAccount = null; forAccount = null;
@ -169,7 +170,8 @@ public class DisplayStatusFragment extends Fragment implements OnPostActionInter
if (context != null) { if (context != null) {
//Load data depending of the value //Load data depending of the value
if (search_peertube == null) { //Not a Peertube search if (search_peertube == null) { //Not a Peertube search
asyncTask = new RetrieveFeedsAsyncTask(context, type, "0", targetedId, DisplayStatusFragment.this).execute(); FeedsVM viewModel = new ViewModelProvider(DisplayStatusFragment.this.requireActivity()).get(FeedsVM.class);
viewModel.getVideos(type, "0", targetedId, null).observe(DisplayStatusFragment.this.requireActivity(), this::manageVIew);
} else { } else {
asyncTask = new RetrievePeertubeSearchAsyncTask(context, "0", search_peertube, DisplayStatusFragment.this).execute(); asyncTask = new RetrievePeertubeSearchAsyncTask(context, "0", search_peertube, DisplayStatusFragment.this).execute();
} }
@ -177,7 +179,10 @@ public class DisplayStatusFragment extends Fragment implements OnPostActionInter
new Handler(Looper.getMainLooper()).postDelayed(() -> { new Handler(Looper.getMainLooper()).postDelayed(() -> {
if (context != null) { if (context != null) {
if (search_peertube == null) { //Not a Peertube search if (search_peertube == null) { //Not a Peertube search
asyncTask = new RetrieveFeedsAsyncTask(context, type, "0", targetedId, DisplayStatusFragment.this).execute(); if (getActivity() != null) {
FeedsVM viewModel = new ViewModelProvider(getActivity()).get(FeedsVM.class);
viewModel.getVideos(type, "0", targetedId, null).observe(getActivity(), this::manageVIew);
}
} else { } else {
asyncTask = new RetrievePeertubeSearchAsyncTask(context, "0", search_peertube, DisplayStatusFragment.this).execute(); asyncTask = new RetrievePeertubeSearchAsyncTask(context, "0", search_peertube, DisplayStatusFragment.this).execute();
} }
@ -227,7 +232,8 @@ public class DisplayStatusFragment extends Fragment implements OnPostActionInter
if (!flag_loading) { if (!flag_loading) {
flag_loading = true; flag_loading = true;
if (search_peertube == null) { //Not a Peertube search if (search_peertube == null) { //Not a Peertube search
asyncTask = new RetrieveFeedsAsyncTask(context, type, max_id, DisplayStatusFragment.this).execute(); FeedsVM viewModel = new ViewModelProvider(DisplayStatusFragment.this.requireActivity()).get(FeedsVM.class);
viewModel.getVideos(type, max_id, null, null).observe(DisplayStatusFragment.this.requireActivity(), apiResponse -> manageVIew(apiResponse));
} else { } else {
asyncTask = new RetrievePeertubeSearchAsyncTask(context, max_id, search_peertube, DisplayStatusFragment.this).execute(); asyncTask = new RetrievePeertubeSearchAsyncTask(context, max_id, search_peertube, DisplayStatusFragment.this).execute();
} }
@ -246,7 +252,8 @@ public class DisplayStatusFragment extends Fragment implements OnPostActionInter
if (!flag_loading) { if (!flag_loading) {
flag_loading = true; flag_loading = true;
if (search_peertube == null) { //Not a Peertube search if (search_peertube == null) { //Not a Peertube search
asyncTask = new RetrieveFeedsAsyncTask(context, type, max_id, DisplayStatusFragment.this).execute(); FeedsVM viewModel = new ViewModelProvider(DisplayStatusFragment.this.requireActivity()).get(FeedsVM.class);
viewModel.getVideos(type, max_id, null, null).observe(DisplayStatusFragment.this.requireActivity(), apiResponse -> manageVIew(apiResponse));
} else { } else {
asyncTask = new RetrievePeertubeSearchAsyncTask(context, max_id, search_peertube, DisplayStatusFragment.this).execute(); asyncTask = new RetrievePeertubeSearchAsyncTask(context, max_id, search_peertube, DisplayStatusFragment.this).execute();
} }
@ -332,6 +339,50 @@ public class DisplayStatusFragment extends Fragment implements OnPostActionInter
} }
} }
private void manageVIew(APIResponse apiResponse) {
//hide loaders
mainLoader.setVisibility(View.GONE);
nextElementLoader.setVisibility(View.GONE);
//handle other API error but discards 404 - error which can often happen due to toots which have been deleted
if (this.peertubes == null || apiResponse == null || (apiResponse.getError() != null && apiResponse.getError().getStatusCode() != 404 && apiResponse.getError().getStatusCode() != 501)) {
if (apiResponse == null)
Toasty.error(context, context.getString(R.string.toast_error), Toast.LENGTH_LONG).show();
else {
Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show();
}
swipeRefreshLayout.setRefreshing(false);
flag_loading = false;
return;
}
int previousPosition = this.peertubes.size();
if (max_id == null)
max_id = "0";
//max_id needs to work like an offset
int tootPerPage = sharedpreferences.getInt(Helper.SET_VIDEOS_PER_PAGE, Helper.VIDEOS_PER_PAGE);
max_id = String.valueOf(Integer.parseInt(max_id) + tootPerPage);
if (apiResponse.getPeertubes() == null) {
return;
}
this.peertubes.addAll(apiResponse.getPeertubes());
//If no item were inserted previously the adapter is created
if (previousPosition == 0) {
peertubeAdapater = new PeertubeAdapter(this.peertubes);
lv_status.setAdapter(peertubeAdapater);
} else
peertubeAdapater.notifyItemRangeInserted(previousPosition, apiResponse.getPeertubes().size());
//remove handlers
swipeRefreshLayout.setRefreshing(false);
textviewNoAction.setVisibility(View.GONE);
if (firstLoad && (apiResponse.getPeertubes() == null || apiResponse.getPeertubes().size() == 0)) {
textviewNoActionText.setText(R.string.no_video_to_display);
textviewNoAction.setVisibility(View.VISIBLE);
}
flag_loading = false;
firstLoad = false;
}
@Override @Override
public void onRetrieveFeeds(APIResponse apiResponse) { public void onRetrieveFeeds(APIResponse apiResponse) {
//hide loaders //hide loaders
@ -417,7 +468,8 @@ public class DisplayStatusFragment extends Fragment implements OnPostActionInter
accountsHorizontalListAdapter.notifyItemRangeRemoved(0, accounts.size()); accountsHorizontalListAdapter.notifyItemRangeRemoved(0, accounts.size());
} }
if (search_peertube == null) { //Not a Peertube search if (search_peertube == null) { //Not a Peertube search
asyncTask = new RetrieveFeedsAsyncTask(context, type, "0", targetedId, forAccount, DisplayStatusFragment.this).execute(); FeedsVM viewModel = new ViewModelProvider(DisplayStatusFragment.this.requireActivity()).get(FeedsVM.class);
viewModel.getVideos(type, "0", targetedId, null).observe(DisplayStatusFragment.this.requireActivity(), this::manageVIew);
} else { } else {
asyncTask = new RetrievePeertubeSearchAsyncTask(context, "0", search_peertube, DisplayStatusFragment.this).execute(); asyncTask = new RetrievePeertubeSearchAsyncTask(context, "0", search_peertube, DisplayStatusFragment.this).execute();
} }

View File

@ -0,0 +1,140 @@
package app.fedilab.fedilabtube.viewmodel;
/* Copyright 2020 Thomas Schneider
*
* This file is a part of TubeLab
*
* 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.
*
* TubeLab 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 TubeLab; if not,
* see <http://www.gnu.org/licenses>. */
import android.app.Application;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import java.util.List;
import app.fedilab.fedilabtube.client.APIResponse;
import app.fedilab.fedilabtube.client.PeertubeAPI;
import app.fedilab.fedilabtube.client.entities.Peertube;
import app.fedilab.fedilabtube.sqlite.PeertubeFavoritesDAO;
import app.fedilab.fedilabtube.sqlite.Sqlite;
public class FeedsVM extends AndroidViewModel {
private MutableLiveData<APIResponse> apiResponseMutableLiveData;
private Application application;
public FeedsVM(@NonNull Application application) {
super(application);
this.application = application;
}
public LiveData<APIResponse> getVideos(Type action, String max_id, String target, String forAccount) {
if (apiResponseMutableLiveData == null) {
apiResponseMutableLiveData = new MutableLiveData<>();
loadVideos(action, max_id, target, forAccount);
}
return apiResponseMutableLiveData;
}
private void loadVideos(Type action, String max_id, String target, String forAccount) {
Context _mContext = this.application.getApplicationContext();
new Thread(() -> {
try {
PeertubeAPI peertubeAPI = new PeertubeAPI(_mContext);
if (action == null)
return;
APIResponse apiResponse = null;
switch (action) {
case USER:
apiResponse = peertubeAPI.getVideos(target, max_id);
break;
case MYVIDEOS:
peertubeAPI = new PeertubeAPI(_mContext);
apiResponse = peertubeAPI.getMyVideos(max_id);
break;
case PEERTUBE_HISTORY:
peertubeAPI = new PeertubeAPI(_mContext);
apiResponse = peertubeAPI.getMyHistory(max_id);
break;
case CHANNEL:
peertubeAPI = new PeertubeAPI(_mContext);
apiResponse = peertubeAPI.getVideosChannel(target, max_id);
break;
case CACHE_BOOKMARKS_PEERTUBE:
apiResponse = new APIResponse();
SQLiteDatabase db = Sqlite.getInstance(_mContext, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
List<Peertube> peertubes = new PeertubeFavoritesDAO(_mContext, db).getAllPeertube();
apiResponse.setPeertubes(peertubes);
break;
case PSUBSCRIPTIONS:
peertubeAPI = new PeertubeAPI(_mContext);
if (forAccount == null) {
apiResponse = peertubeAPI.getSubscriptionsTL(max_id);
} else {
apiResponse = peertubeAPI.getVideosChannel(forAccount, max_id);
}
break;
case POVERVIEW:
peertubeAPI = new PeertubeAPI(_mContext);
apiResponse = peertubeAPI.getOverviewTL(max_id);
break;
case PTRENDING:
peertubeAPI = new PeertubeAPI(_mContext);
apiResponse = peertubeAPI.getTrendingTL(max_id);
break;
case PRECENTLYADDED:
peertubeAPI = new PeertubeAPI(_mContext);
apiResponse = peertubeAPI.getRecentlyAddedTL(max_id);
break;
case PLOCAL:
peertubeAPI = new PeertubeAPI(_mContext);
apiResponse = peertubeAPI.getLocalTL(max_id);
break;
case PPUBLIC:
peertubeAPI = new PeertubeAPI(_mContext);
apiResponse = peertubeAPI.getPublicTL(max_id);
break;
case PMOSTLIKED:
peertubeAPI = new PeertubeAPI(_mContext);
apiResponse = peertubeAPI.getLikedTL(max_id);
break;
}
apiResponseMutableLiveData.setValue(apiResponse);
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
public enum Type {
USER,
PPUBLIC,
PSUBSCRIPTIONS,
POVERVIEW,
PTRENDING,
PRECENTLYADDED,
PMOSTLIKED,
PLOCAL,
CHANNEL,
MYVIDEOS,
PEERTUBE_HISTORY,
CACHE_BOOKMARKS_PEERTUBE,
}
}