Some fixes

This commit is contained in:
Thomas 2020-11-12 17:08:43 +01:00
parent a984607ee8
commit 150a81adc6
7 changed files with 196 additions and 13 deletions

View File

@ -16,24 +16,37 @@ package app.fedilab.fedilabtube;
import android.os.Bundle; import android.os.Bundle;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentTransaction; import androidx.fragment.app.FragmentTransaction;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import app.fedilab.fedilabtube.databinding.ActivitySearchResultBinding;
import app.fedilab.fedilabtube.fragment.DisplayVideosFragment; import app.fedilab.fedilabtube.fragment.DisplayVideosFragment;
import app.fedilab.fedilabtube.helper.Helper; import app.fedilab.fedilabtube.helper.Helper;
import app.fedilab.fedilabtube.viewmodel.TimelineVM; import app.fedilab.fedilabtube.viewmodel.TimelineVM;
import static app.fedilab.fedilabtube.viewmodel.TimelineVM.TimelineType.HISTORY;
public class VideosTimelineActivity extends AppCompatActivity { public class VideosTimelineActivity extends AppCompatActivity {
private TimelineVM.TimelineType type; private TimelineVM.TimelineType type;
private DisplayVideosFragment displayVideosFragment;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_result); ActivitySearchResultBinding binding = ActivitySearchResultBinding.inflate(getLayoutInflater());
View mainView = binding.getRoot();
setContentView(mainView);
if (getSupportActionBar() != null) if (getSupportActionBar() != null)
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true);
@ -41,22 +54,63 @@ public class VideosTimelineActivity extends AppCompatActivity {
Bundle b = getIntent().getExtras(); Bundle b = getIntent().getExtras();
if (b != null) if (b != null)
type = (TimelineVM.TimelineType) b.get("type"); type = (TimelineVM.TimelineType) b.get("type");
displayVideosFragment = null;
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (savedInstanceState == null) {
displayVideosFragment = new DisplayVideosFragment();
Bundle bundle = new Bundle();
bundle.putSerializable(Helper.TIMELINE_TYPE, type);
displayVideosFragment.setArguments(bundle);
ft.add(R.id.container, displayVideosFragment).addToBackStack(null).commit();
}
if (type == TimelineVM.TimelineType.MY_VIDEOS) { if (type == TimelineVM.TimelineType.MY_VIDEOS) {
setTitle(R.string.my_videos); setTitle(R.string.my_videos);
} else if (type == TimelineVM.TimelineType.HISTORY) { } else if (type == HISTORY) {
setTitle(R.string.my_history); setTitle(R.string.my_history);
//TODO: uncomment when available
// binding.historyFilter.setVisibility(View.VISIBLE);
binding.historyFilterAll.setOnClickListener(v -> historyFilter(null));
binding.historyFilterToday.setOnClickListener(v -> {
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal.getTime();
historyFilter(cal.getTime());
});
binding.historyFilterLast7Days.setOnClickListener(v -> {
Calendar cal = GregorianCalendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.DAY_OF_YEAR, -7);
cal.getTime();
historyFilter(cal.getTime());
});
} else if (type == TimelineVM.TimelineType.MOST_LIKED) { } else if (type == TimelineVM.TimelineType.MOST_LIKED) {
setTitle(R.string.title_most_liked); setTitle(R.string.title_most_liked);
} }
if (savedInstanceState == null) {
DisplayVideosFragment displayVideosFragment = new DisplayVideosFragment(); }
Bundle bundle = new Bundle();
bundle.putSerializable(Helper.TIMELINE_TYPE, type); private void historyFilter(Date date) {
displayVideosFragment.setArguments(bundle); String startDate = null;
if (date != null) {
SimpleDateFormat fmtOut = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH);
startDate = fmtOut.format(date);
}
if (displayVideosFragment != null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.container, displayVideosFragment).commit(); displayVideosFragment = new DisplayVideosFragment();
Bundle bundle = new Bundle();
bundle.putSerializable(Helper.TIMELINE_TYPE, HISTORY);
bundle.putSerializable("startDate", startDate);
displayVideosFragment.setArguments(bundle);
ft.replace(R.id.container, displayVideosFragment);
ft.addToBackStack(null);
ft.commit();
} }
} }

View File

@ -175,7 +175,13 @@ public interface PeertubeService {
//History //History
@GET("users/me/history/videos") @GET("users/me/history/videos")
Call<VideoData> getHistory(@Header("Authorization") String credentials, @Query("start") String maxId, @Query("count") String count); Call<VideoData> getHistory(
@Header("Authorization") String credentials,
@Query("start") String maxId,
@Query("count") String count,
@Query("startDate") String startDate,
@Query("endDate") String endDate
);
//Search //Search
@GET("search/videos") @GET("search/videos")

View File

@ -347,6 +347,28 @@ public class RetrofitPeertubeAPI {
return apiResponse; return apiResponse;
} }
public APIResponse getHistory(String max_id, String startDate, String endDate) {
APIResponse apiResponse = new APIResponse();
PeertubeService peertubeService = init();
Call<VideoData> videoCall = peertubeService.getHistory(getToken(), max_id, count, startDate, endDate);
if (videoCall != null) {
try {
Response<VideoData> response = videoCall.execute();
if (response.isSuccessful() && response.body() != null) {
apiResponse.setPeertubes(response.body().data);
} else {
setError(apiResponse, response.code(), response.errorBody());
}
} catch (IOException e) {
Error error = new Error();
error.setError(_context.getString(R.string.toast_error));
apiResponse.setError(error);
e.printStackTrace();
}
}
return apiResponse;
}
public APIResponse getTL(TimelineVM.TimelineType timelineType, String max_id, String forAccount) { public APIResponse getTL(TimelineVM.TimelineType timelineType, String max_id, String forAccount) {
APIResponse apiResponse = new APIResponse(); APIResponse apiResponse = new APIResponse();
PeertubeService peertubeService = init(); PeertubeService peertubeService = init();
@ -376,7 +398,7 @@ public class RetrofitPeertubeAPI {
videoCall = peertubeService.getTrendingVideos(getToken(), max_id, count, filter); videoCall = peertubeService.getTrendingVideos(getToken(), max_id, count, filter);
break; break;
case HISTORY: case HISTORY:
videoCall = peertubeService.getHistory(getToken(), max_id, count); videoCall = peertubeService.getHistory(getToken(), max_id, count, null, null);
break; break;
case RECENT: case RECENT:
videoCall = peertubeService.getRecentlyAddedVideos(getToken(), max_id, count, filter); videoCall = peertubeService.getRecentlyAddedVideos(getToken(), max_id, count, filter);

View File

@ -99,6 +99,7 @@ public class DisplayVideosFragment extends Fragment implements AccountsHorizonta
private String playlistId; private String playlistId;
private String remoteInstance; private String remoteInstance;
private boolean sepiaSearch; private boolean sepiaSearch;
private String startDate, endDate;
public DisplayVideosFragment() { public DisplayVideosFragment() {
} }
@ -112,6 +113,8 @@ public class DisplayVideosFragment extends Fragment implements AccountsHorizonta
peertubes = new ArrayList<>(); peertubes = new ArrayList<>();
channels = new ArrayList<>(); channels = new ArrayList<>();
context = getContext(); context = getContext();
startDate = null;
endDate = null;
Bundle bundle = this.getArguments(); Bundle bundle = this.getArguments();
if (bundle != null) { if (bundle != null) {
search_peertube = bundle.getString("search_peertube", null); search_peertube = bundle.getString("search_peertube", null);
@ -120,6 +123,8 @@ public class DisplayVideosFragment extends Fragment implements AccountsHorizonta
sepiaSearch = bundle.getBoolean("sepia_search", false); sepiaSearch = bundle.getBoolean("sepia_search", false);
type = (TimelineVM.TimelineType) bundle.get(Helper.TIMELINE_TYPE); type = (TimelineVM.TimelineType) bundle.get(Helper.TIMELINE_TYPE);
playlistId = bundle.getString("playlistId", null); playlistId = bundle.getString("playlistId", null);
startDate = bundle.getString("startDate", null);
endDate = bundle.getString("endDate", null);
} }
max_id = "0"; max_id = "0";
forAccount = type == TimelineVM.TimelineType.ACCOUNT_VIDEOS ? channelId : null; forAccount = type == TimelineVM.TimelineType.ACCOUNT_VIDEOS ? channelId : null;
@ -502,6 +507,8 @@ public class DisplayVideosFragment extends Fragment implements AccountsHorizonta
viewModelFeeds.getVideosInChannel(sepiaSearch ? remoteInstance : null, channelId, max_id).observe(this.requireActivity(), this::manageVIewVideos); viewModelFeeds.getVideosInChannel(sepiaSearch ? remoteInstance : null, channelId, max_id).observe(this.requireActivity(), this::manageVIewVideos);
} else if (type == TimelineVM.TimelineType.VIDEOS_IN_PLAYLIST) { } else if (type == TimelineVM.TimelineType.VIDEOS_IN_PLAYLIST) {
viewModelFeeds.loadVideosInPlaylist(playlistId, max_id).observe(this.requireActivity(), this::manageVIewVideos); viewModelFeeds.loadVideosInPlaylist(playlistId, max_id).observe(this.requireActivity(), this::manageVIewVideos);
} else if (type == TimelineVM.TimelineType.HISTORY) {
viewModelFeeds.getVideoHistory(max_id, startDate, endDate).observe(this.requireActivity(), this::manageVIewVideos);
} else { } else {
viewModelFeeds.getVideos(type, max_id, forAccount).observe(this.requireActivity(), this::manageVIewVideos); viewModelFeeds.getVideos(type, max_id, forAccount).observe(this.requireActivity(), this::manageVIewVideos);
} }

View File

@ -51,6 +51,12 @@ public class TimelineVM extends AndroidViewModel {
} }
public LiveData<APIResponse> getVideoHistory(String max_id, String startDate, String endDate) {
apiResponseMutableLiveData = new MutableLiveData<>();
loadHistory(max_id, startDate, endDate);
return apiResponseMutableLiveData;
}
public LiveData<APIResponse> getVideo(String instance, String videoId, boolean isMyVideo) { public LiveData<APIResponse> getVideo(String instance, String videoId, boolean isMyVideo) {
apiResponseMutableLiveData = new MutableLiveData<>(); apiResponseMutableLiveData = new MutableLiveData<>();
getSingle(instance, videoId, isMyVideo); getSingle(instance, videoId, isMyVideo);
@ -156,6 +162,22 @@ public class TimelineVM extends AndroidViewModel {
}).start(); }).start();
} }
private void loadHistory(String max_id, String startDate, String endDate) {
Context _mContext = getApplication().getApplicationContext();
new Thread(() -> {
try {
RetrofitPeertubeAPI retrofitPeertubeAPI = new RetrofitPeertubeAPI(_mContext);
APIResponse apiResponse = retrofitPeertubeAPI.getHistory(max_id, startDate, endDate);
Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = () -> apiResponseMutableLiveData.setValue(apiResponse);
mainHandler.post(myRunnable);
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
private void loadOverviewVideos(String page) { private void loadOverviewVideos(String page) {
Context _mContext = getApplication().getApplicationContext(); Context _mContext = getApplication().getApplicationContext();

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="1dp"
android:color="?attr/colorAccent" />
<corners android:radius="20dp" />
</shape>

View File

@ -14,7 +14,72 @@
You should have received a copy of the GNU General Public License along with TubeLab; if not, You should have received a copy of the GNU General Public License along with TubeLab; if not,
see <http://www.gnu.org/licenses>. see <http://www.gnu.org/licenses>.
--> -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent">
<HorizontalScrollView
android:id="@+id/history_filter"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/history_filter_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/background_rounded_item"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:text="@string/all"
android:textColor="?attr/colorAccent" />
<TextView
android:id="@+id/history_filter_today"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:background="@drawable/background_rounded_item"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:text="@string/today"
android:textColor="?attr/colorAccent" />
<TextView
android:id="@+id/history_filter_last_7_days"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:background="@drawable/background_rounded_item"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:text="@string/last_7_days"
android:textColor="?attr/colorAccent" />
</LinearLayout>
</HorizontalScrollView>
<RelativeLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/history_filter">
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>