TubeLab-App-Android/app/src/main/java/app/fedilab/fedilabtube/SepiaSearchActivity.java

400 lines
16 KiB
Java

package app.fedilab.fedilabtube;
/* 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.content.SharedPreferences;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.RadioGroup;
import android.widget.Spinner;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import com.mancj.materialsearchbar.MaterialSearchBar;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import app.fedilab.fedilabtube.client.entities.SepiaSearch;
import app.fedilab.fedilabtube.fragment.DisplaySepiaSearchFragment;
import app.fedilab.fedilabtube.helper.Helper;
import mabbas007.tagsedittext.TagsEditText;
import static app.fedilab.fedilabtube.MainActivity.peertubeInformation;
import static app.fedilab.fedilabtube.PeertubeActivity.hideKeyboard;
public class SepiaSearchActivity extends AppCompatActivity {
private SepiaSearch sepiaSearchVideo, sepiaSearchChannel;
private TagsEditText sepia_element_all_of_tags, sepia_element_one_of_tags;
private MaterialSearchBar searchBar;
private ConstraintLayout filter_elements;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sepia_search);
sepiaSearchVideo = new SepiaSearch();
sepiaSearchChannel = new SepiaSearch();
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
sepiaSearchVideo.setCount(String.valueOf(sharedpreferences.getInt(Helper.SET_VIDEOS_PER_PAGE, Helper.VIDEOS_PER_PAGE)));
sepiaSearchVideo.setDurationMin(0);
sepiaSearchVideo.setDurationMax(9999999);
sepiaSearchVideo.setStart("0");
sepiaSearchVideo.setSort("-match");
if (getSupportActionBar() != null)
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Button filter = findViewById(R.id.filter);
filter_elements = findViewById(R.id.filter_elements);
filter.setOnClickListener(view -> {
if( filter_elements.getVisibility() == View.VISIBLE) {
filter_elements.setVisibility(View.GONE);
}else{
filter_elements.setVisibility(View.VISIBLE);
}
});
RadioGroup sepia_element_nsfw = findViewById(R.id.sepia_element_nsfw);
sepia_element_nsfw.setOnCheckedChangeListener((group, checkedId) -> sepiaSearchVideo.setNsfw(checkedId != R.id.sepia_element_nsfw_no));
RadioGroup radio_date = findViewById(R.id.radio_date);
radio_date.setOnCheckedChangeListener((group, checkedId) -> {
if (checkedId == R.id.sepia_element_published_date_today) {
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);
sepiaSearchVideo.setStartDate(cal.getTime());
} else if (checkedId == R.id.sepia_element_published_date_last_7_days) {
Calendar cal;
cal = GregorianCalendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.DAY_OF_YEAR, -7);
sepiaSearchVideo.setStartDate(cal.getTime());
} else if (checkedId == R.id.sepia_element_published_date_last_30_days) {
Calendar cal;
cal = GregorianCalendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.DAY_OF_YEAR, -30);
sepiaSearchVideo.setStartDate(cal.getTime());
} else if (checkedId == R.id.sepia_element_published_date_last_365_days) {
Calendar cal;
cal = GregorianCalendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.DAY_OF_YEAR, -365);
sepiaSearchVideo.setStartDate(cal.getTime());
} else {
sepiaSearchVideo.setStartDate(null);
}
});
RadioGroup duration = findViewById(R.id.duration);
duration.setOnCheckedChangeListener((group, checkedId) -> {
if (checkedId == R.id.sepia_element_duration_short) {
sepiaSearchVideo.setDurationMin(0);
sepiaSearchVideo.setDurationMax(240);
} else if (checkedId == R.id.sepia_element_duration_medium) {
sepiaSearchVideo.setDurationMin(240);
sepiaSearchVideo.setDurationMax(600);
} else if (checkedId == R.id.sepia_element_duration_long) {
sepiaSearchVideo.setDurationMin(600);
sepiaSearchVideo.setDurationMax(999999999);
} else {
sepiaSearchVideo.setDurationMin(0);
sepiaSearchVideo.setDurationMax(999999999);
}
});
Spinner sort_by = findViewById(R.id.sort_by);
ArrayAdapter<String> adapterSortBy = new ArrayAdapter<>(SepiaSearchActivity.this,
android.R.layout.simple_spinner_dropdown_item, getResources().getStringArray(R.array.sort_by_array));
sort_by.setAdapter(adapterSortBy);
sort_by.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String orderby, channelOrderBy;
switch (position){
case 1:
orderby = "-publishedAt";
channelOrderBy = "-createdAt";
break;
case 2:
orderby = "publishedAt";
channelOrderBy = "createdAt";
break;
default:
orderby = "-match";
channelOrderBy = null;
}
sepiaSearchVideo.setSort(orderby);
sepiaSearchChannel.setSort(channelOrderBy);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
Spinner sepia_element_category = findViewById(R.id.sepia_element_category);
Spinner sepia_element_license = findViewById(R.id.sepia_element_license);
Spinner sepia_element_language = findViewById(R.id.sepia_element_language);
sepia_element_all_of_tags = findViewById(R.id.sepia_element_all_of_tags);
sepia_element_one_of_tags = findViewById(R.id.sepia_element_one_of_tags);
LinkedHashMap<Integer, String> categories = new LinkedHashMap<>(peertubeInformation.getCategories());
LinkedHashMap<Integer, String> licences = new LinkedHashMap<>(peertubeInformation.getLicences());
LinkedHashMap<String, String> languages = new LinkedHashMap<>(peertubeInformation.getLanguages());
LinkedHashMap<String, String> translations = new LinkedHashMap<>(peertubeInformation.getTranslations());
//Populate catgories
String[] categoriesA = new String[categories.size()+1];
categoriesA[0] = getString(R.string.display_all_categories);
Iterator<Map.Entry<Integer, String>> it = categories.entrySet().iterator();
int i = 1;
while (it.hasNext()) {
Map.Entry<Integer, String> pair = it.next();
if (translations.size() == 0 || !translations.containsKey(pair.getValue()))
categoriesA[i] = pair.getValue();
else
categoriesA[i] = translations.get(pair.getValue());
it.remove();
i++;
}
ArrayAdapter<String> adapterCatgories = new ArrayAdapter<>(SepiaSearchActivity.this,
android.R.layout.simple_spinner_dropdown_item, categoriesA);
sepia_element_category.setAdapter(adapterCatgories);
//Populate licenses
String[] licensesA = new String[licences.size()+1];
licensesA[0] = getString(R.string.display_all_licenses);
it = licences.entrySet().iterator();
i = 1;
while (it.hasNext()) {
Map.Entry<Integer, String> pair = it.next();
if (translations.size() == 0 || !translations.containsKey(pair.getValue()))
licensesA[i] = pair.getValue();
else
licensesA[i] = translations.get(pair.getValue());
it.remove();
i++;
}
ArrayAdapter<String> adapterLicenses = new ArrayAdapter<>(SepiaSearchActivity.this,
android.R.layout.simple_spinner_dropdown_item, licensesA);
sepia_element_license.setAdapter(adapterLicenses);
//Populate languages
String[] languagesA = new String[languages.size()+1];
languagesA[0] = getString(R.string.display_all_languages);
Iterator<Map.Entry<String, String>> itl = languages.entrySet().iterator();
i = 1;
while (itl.hasNext()) {
Map.Entry<String, String> pair = itl.next();
if (translations.size() == 0 || !translations.containsKey(pair.getValue()))
languagesA[i] = pair.getValue();
else
languagesA[i] = translations.get(pair.getValue());
itl.remove();
i++;
}
ArrayAdapter<String> adapterLanguages = new ArrayAdapter<>(SepiaSearchActivity.this,
android.R.layout.simple_spinner_dropdown_item, languagesA);
sepia_element_language.setAdapter(adapterLanguages);
sepia_element_license.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
updateLicensePosition(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
//Manage categories
sepia_element_category.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
updateCategoryPosition(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
//Manage languages
sepia_element_language.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
updateLanguagesPosition(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
searchBar = findViewById(R.id.searchBar);
searchBar.setOnSearchActionListener(new MaterialSearchBar.OnSearchActionListener() {
@Override
public void onSearchStateChanged(boolean enabled) {
}
@Override
public void onSearchConfirmed(CharSequence text) {
makeSearch();
}
@Override
public void onButtonClicked(int buttonCode) {
makeSearch();
}
});
Button apply_filter = findViewById(R.id.apply_filter);
apply_filter.setOnClickListener(v-> makeSearch());
searchBar.openSearch();
}
private void makeSearch(){
hideKeyboard(SepiaSearchActivity.this);
sepiaSearchVideo.setStart("0");
if( sepia_element_one_of_tags.getTags().size() > 0 ) {
sepiaSearchVideo.setTagsOneOf(sepia_element_one_of_tags.getTags());
}else{
sepiaSearchVideo.setTagsOneOf(null);
}
if( sepia_element_all_of_tags.getTags().size() > 0 ) {
sepiaSearchVideo.setTagsAllOf(sepia_element_all_of_tags.getTags());
}else{
sepiaSearchVideo.setTagsAllOf(null);
}
Fragment fragment = getSupportFragmentManager().findFragmentByTag("SEPIA_SEARCH");
if(fragment != null)
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
filter_elements.setVisibility(View.GONE);
sepiaSearchVideo.setSearch(searchBar.getText());
DisplaySepiaSearchFragment displaySepiaSearchFragment = new DisplaySepiaSearchFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("sepiaSearchVideo", sepiaSearchVideo);
displaySepiaSearchFragment.setArguments(bundle);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.container, displaySepiaSearchFragment,"SEPIA_SEARCH").commit();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
private void updateLanguagesPosition(int position) {
LinkedHashMap<String, String> languagesCheck = new LinkedHashMap<>(peertubeInformation.getLanguages());
Iterator<Map.Entry<String, String>> it = languagesCheck.entrySet().iterator();
int i = 0;
while (it.hasNext()) {
Map.Entry<String, String> pair = it.next();
if (i == position && position > 0) {
List<String> languages = new ArrayList<>();
languages.add(pair.getKey());
sepiaSearchVideo.setBoostLanguages(languages);
break;
}else {
sepiaSearchVideo.setBoostLanguages(null);
}
it.remove();
i++;
}
}
private void updateCategoryPosition(int position) {
LinkedHashMap<Integer, String> categoriesCheck = new LinkedHashMap<>(peertubeInformation.getCategories());
Iterator<Map.Entry<Integer, String>> it = categoriesCheck.entrySet().iterator();
int i = 0;
while (it.hasNext()) {
Map.Entry<Integer, String> pair = it.next();
if (i == position && position > 0 ) {
List<Integer> categories = new ArrayList<>();
categories.add(pair.getKey());
sepiaSearchVideo.setCategoryOneOf(categories);
break;
}else {
sepiaSearchVideo.setCategoryOneOf(null);
}
it.remove();
i++;
}
}
private void updateLicensePosition(int position) {
LinkedHashMap<Integer, String> licensesCheck = new LinkedHashMap<>(peertubeInformation.getLicences());
Iterator<Map.Entry<Integer, String>> it = licensesCheck.entrySet().iterator();
int i = 0;
while (it.hasNext()) {
Map.Entry<Integer, String> pair = it.next();
if (i == position && position > 0) {
List<Integer> licenses = new ArrayList<>();
licenses.add(pair.getKey());
sepiaSearchVideo.setLicenceOneOf(licenses);
break;
}else {
sepiaSearchVideo.setLicenceOneOf(null);
}
it.remove();
i++;
}
}
}