Skip to content

Commit

Permalink
NClientV2 1.5.8
Browse files Browse the repository at this point in the history
Tags fully migrated to DB
Added sort by name and count in tags
  • Loading branch information
Dar9586 committed Oct 18, 2018
1 parent bd5186c commit 24a2290
Show file tree
Hide file tree
Showing 12 changed files with 205 additions and 137 deletions.
5 changes: 2 additions & 3 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ android {
applicationId "com.dar.nclientv2"
minSdkVersion 21
targetSdkVersion 28
versionCode 153
versionName "1.5.3"
versionCode 158
versionName "1.5.8"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

}
Expand All @@ -31,7 +31,6 @@ android {
dependencies {
def supportVersion='1.0.0'
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "androidx.paging:paging-runtime:2.1.0-alpha01"
implementation "androidx.appcompat:appcompat:$supportVersion"
implementation "androidx.legacy:legacy-support-v4:$supportVersion"
implementation "com.google.android.material:material:$supportVersion"
Expand Down
35 changes: 22 additions & 13 deletions app/src/main/java/com/dar/nclientv2/TagFilter.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import android.view.View;
import android.view.ViewGroup;

import com.dar.nclientv2.adapters.TagsAdapter;
import com.dar.nclientv2.adapters.paged.TagsAdapter;
import com.dar.nclientv2.api.components.Tag;
import com.dar.nclientv2.api.enums.TagType;
import com.dar.nclientv2.async.scrape.BulkScraper;
Expand All @@ -20,8 +20,6 @@
import com.dar.nclientv2.settings.TagV2;
import com.google.android.material.tabs.TabLayout;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import androidx.annotation.NonNull;
Expand Down Expand Up @@ -52,6 +50,7 @@ protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Global.loadTheme(this);
TagV2.initMinCount(this);
TagV2.initSortByName(this);
Global.initHttpClient(this);
setContentView(R.layout.activity_tag_filter);
BulkScraper.setActivity(this);
Expand Down Expand Up @@ -79,9 +78,9 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse

@Override
public void onPageSelected(int position) {
Fragment page = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.container + ":" + position);
PlaceholderFragment page = (PlaceholderFragment)getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.container + ":" + position);
if (page != null) {
((PlaceholderFragment)page).refilter(searchView==null?"":searchView.getQuery().toString());
((TagsAdapter)page.recyclerView.getAdapter()).addItem();
}
}

Expand Down Expand Up @@ -111,10 +110,16 @@ private int getPage(){
return 0;
}
private androidx.appcompat.widget.SearchView searchView;
private void updateSortItem(MenuItem item){
item.setIcon(TagV2.isSortedByName()?R.drawable.ic_sort_by_alpha:R.drawable.ic_sort);
item.setTitle(TagV2.isSortedByName()?R.string.sort_by_title:R.string.sort_by_popular);
Global.setTint(item.getIcon());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_tag_filter, menu);
updateSortItem(menu.findItem(R.id.sort_by_name));
searchView=(androidx.appcompat.widget.SearchView)menu.findItem(R.id.search).getActionView();
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
@Override
Expand Down Expand Up @@ -157,10 +162,15 @@ public boolean onOptionsItemSelected(MenuItem item) {
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
PlaceholderFragment page = (PlaceholderFragment)getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.container + ":" + mViewPager.getCurrentItem());

switch (id){
case R.id.reset_tags:createDialog();break;
case R.id.set_min_count:minCountBuild(); break;
case R.id.sort_by_name:
TagV2.updateSortByName(this);
updateSortItem(item);
page.refilter(searchView.getQuery().toString());

break;
/*case R.id.load_next:
if(page.isNormalType())
new ScrapeTags(this,(TagsAdapter)page.recyclerView.getAdapter(),page.type).start();
Expand All @@ -185,6 +195,7 @@ public void negative(){

}
});
DefaultDialogs.pageChangerDialog(builder);
}


Expand Down Expand Up @@ -218,7 +229,7 @@ private void changeLayout(boolean landscape){

public static class PlaceholderFragment extends Fragment {
TagType type;
RecyclerView recyclerView;
public RecyclerView recyclerView;

public boolean isNormalType(){
return type!=TagType.UNKNOWN&&type!=TagType.CATEGORY;
Expand Down Expand Up @@ -277,9 +288,9 @@ public void loadTags(){
TagsAdapter adapter;
TagFilter cont=(TagFilter)getContext();
switch(type){
case UNKNOWN:adapter=new TagsAdapter(cont,new ArrayList<>(Arrays.asList(TagV2.getListPrefer())),query);break;
case CATEGORY:adapter=new TagsAdapter(cont,query);break;
default:adapter=new TagsAdapter(cont,new ArrayList<>(Arrays.asList(TagV2.getTagSet(type))),query);break;
case UNKNOWN:adapter=new TagsAdapter(cont,query,null,false);break;
case CATEGORY:adapter=new TagsAdapter(cont,query,null,true);break;
default:adapter=new TagsAdapter(cont,query,type,false);break;
}
recyclerView.setAdapter(adapter);
}
Expand All @@ -299,9 +310,7 @@ public void addItems(List<Tag> tags, TagType type){
Log.d(Global.LOGTAG,"REACHED: "+type+", "+this.type+", "+tags.toString());
if(this.type==type){
TagsAdapter adapter= (TagsAdapter)recyclerView.getAdapter();
for(Tag t:tags){
adapter.addItem(t);
}
adapter.addItem();
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.dar.nclientv2.adapters;
package com.dar.nclientv2.adapters.paged;

import android.graphics.Color;
import android.util.JsonWriter;
Expand All @@ -17,23 +17,24 @@
import com.dar.nclientv2.api.components.Tag;
import com.dar.nclientv2.api.enums.TagStatus;
import com.dar.nclientv2.api.enums.TagType;
import com.dar.nclientv2.async.scrape.BulkScraper;
import com.dar.nclientv2.loginapi.LoadTags;
import com.dar.nclientv2.async.database.Queries;
import com.dar.nclientv2.settings.Database;
import com.dar.nclientv2.settings.Global;
import com.dar.nclientv2.settings.Login;
import com.dar.nclientv2.settings.TagV2;
import com.google.android.material.snackbar.Snackbar;

import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView;
import okhttp3.Call;
import okhttp3.Callback;
Expand All @@ -42,44 +43,46 @@
import okhttp3.RequestBody;
import okhttp3.Response;

public class TagsAdapter extends RecyclerView.Adapter<TagsAdapter.ViewHolder> implements Filterable{
public class TagsAdapter extends ListAdapter<Tag,TagsAdapter.ViewHolder> implements Filterable{
private final TagFilter context;
private final List<Tag> tags;
private List<Tag> filterTags;
private final boolean logged,black;
private String lastQuery="nothing";
private final boolean logged=Login.isLogged(),black=Global.getTheme()==Global.ThemeScheme.BLACK,online;
private String lastQuery=null;
private final TagType type;
private boolean wasSortedByName;
public TagsAdapter(TagFilter cont, String query, TagType type, boolean online){
super(CALLBACK);
context=cont;
this.type=type;
this.online=online;
getFilter().filter(query);

public String getLastQuery(){
return lastQuery;
}

@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String x=constraint.toString().toLowerCase(Locale.US);
Log.d(Global.LOGTAG,"FILTER:\""+x+"\",\""+lastQuery+"\"="+(x.equals(lastQuery)));
FilterResults results=new FilterResults();
if(!x.equals(lastQuery)) {
results.count=filterTags.size();
lastQuery=x;
List<Tag>filterTags=new ArrayList<>();
for (Tag t : tags) if (t.getName().contains(x)) filterTags.add(t);
Log.d(Global.LOGTAG,"Size: "+filterTags.size()+filterTags);
results.values=filterTags;
}else{results.count=-1;}
if(!force&&constraint.toString().equals(lastQuery)&&TagV2.isSortedByName()==wasSortedByName){
results.count=-1;
}else{
force=false;
wasSortedByName=TagV2.isSortedByName();
lastQuery = constraint.toString();
Tag[] tags = Queries.TagTable.filterTags(Database.getDatabase(), lastQuery, type, online, TagV2.isSortedByName());
results.count = tags.length;
results.values = Arrays.asList(tags);
}
return results;
}

@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if(results.count!=-1) {
filterTags=(List<Tag>) results.values;
if(filterTags.size()>results.count)notifyItemRangeInserted(results.count,filterTags.size()-results.count);
else if(filterTags.size()<results.count)notifyItemRangeRemoved(filterTags.size(),results.count-filterTags.size());
sortDataset();
}
//if(filterTags.size()>results.count)notifyItemRangeInserted(results.count,filterTags.size()-results.count);
//else if(filterTags.size()<results.count)notifyItemRangeRemoved(filterTags.size(),results.count-filterTags.size());
//sortDataset();
if(results.count!=-1) submitList((List<Tag>)results.values);
}
};
}
Expand All @@ -97,28 +100,17 @@ static class ViewHolder extends RecyclerView.ViewHolder {
master=v.findViewById(R.id.master_layout);
}
}
public TagsAdapter(TagFilter cont, List<Tag> tags,String query) {
this.context=cont;
this.tags=tags;
online=false;
black=Global.getTheme()== Global.ThemeScheme.BLACK;
logged=Login.isLogged();
filterTags=new ArrayList<>();
getFilter().filter(query);
}
private final boolean online;
public TagsAdapter(TagFilter cont,String query){
this.context=cont;
online=true;
logged=Login.isLogged();
black=Global.getTheme()== Global.ThemeScheme.BLACK;
if(Login.getOnlineTags().size()==0){
this.tags=new ArrayList<>();
new LoadTags(this).start();
}else this.tags=new ArrayList<>(Login.getOnlineTags());
filterTags=new ArrayList<>();
getFilter().filter(query);
}
private static final DiffUtil.ItemCallback<Tag> CALLBACK=new DiffUtil.ItemCallback<Tag>(){
@Override
public boolean areItemsTheSame(@NonNull Tag oldItem, @NonNull Tag newItem){
return oldItem.getId()==newItem.getId();
}

@Override
public boolean areContentsTheSame(@NonNull Tag oldItem, @NonNull Tag newItem){
return oldItem.getStatus()==newItem.getStatus();
}
};

@NonNull
@Override
Expand All @@ -129,7 +121,7 @@ public TagsAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int
@Override
public void onBindViewHolder(@NonNull final TagsAdapter.ViewHolder holder, int position) {
if(black)holder.master.setBackgroundColor(Color.BLACK);
final Tag ent=filterTags.get(holder.getAdapterPosition());
final Tag ent=getItem(position);
holder.title.setText(ent.getName());
holder.count.setText(String.format(Locale.US,"%d",ent.getCount()));
holder.master.setOnClickListener(v -> {
Expand All @@ -138,14 +130,14 @@ public void onBindViewHolder(@NonNull final TagsAdapter.ViewHolder holder, int p
else Snackbar.make(context.getViewPager(), context.getString(R.string.tags_max_reached, TagV2.MAXTAGS), Snackbar.LENGTH_LONG).show();
}else{
try {
onlineTagUpdate(ent,!Login.getOnlineTags().contains(ent),holder.imgView);
onlineTagUpdate(ent,!Login.isOnlineTags(ent),holder.imgView);
} catch (IOException e) {
e.printStackTrace();
}
}
});
if(!online&&logged)holder.master.setOnLongClickListener(view -> {
if(!Login.getOnlineTags().contains(ent)) showBlacklistDialog(ent,holder.imgView);
if(!Login.isOnlineTags(ent)) showBlacklistDialog(ent,holder.imgView);
else Toast.makeText(context, R.string.tag_already_in_blacklist, Toast.LENGTH_SHORT).show();
return true;
});
Expand Down Expand Up @@ -215,41 +207,12 @@ private static void updateLogo(ImageView img, TagStatus s){
}
Global.setTint(img.getDrawable());
}
@Override
public int getItemCount() {
return filterTags.size();
}

public List<Tag> getDataset() {
return filterTags;
}
public List<Tag> getTrueDataset() {
return tags;
}
private void sortDataset(){
Collections.sort(filterTags, (o1, o2) -> o2.getCount()-o1.getCount());
notifyItemRangeChanged(0,filterTags.size());
private boolean force=false;
public void addItem(){
force=true;
getFilter().filter(lastQuery);
}

public void addItem(Tag tag){
tags.add(tag);
if(tag.getName().contains(lastQuery)){
filterTags.add(tag);
context.runOnUiThread(() -> {
notifyItemInserted(filterTags.size());
//notifyDataSetChanged();
});
}
}
public void resetDataset(TagType type){
tags.clear();
int s=filterTags.size();
filterTags=new ArrayList<>();
notifyItemRangeRemoved(0,s);
if(online) new LoadTags(this).start();
else{
BulkScraper.addScrape(context,type);
}
}

}
6 changes: 3 additions & 3 deletions app/src/main/java/com/dar/nclientv2/async/ScrapeTags.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import android.content.Context;
import android.util.Log;

import com.dar.nclientv2.adapters.TagsAdapter;
import com.dar.nclientv2.adapters.paged.TagsAdapter;
import com.dar.nclientv2.api.components.Tag;
import com.dar.nclientv2.api.enums.TagStatus;
import com.dar.nclientv2.api.enums.TagType;
Expand All @@ -24,7 +24,7 @@
import okhttp3.Callback;
import okhttp3.Request;
import okhttp3.Response;

@Deprecated
public class ScrapeTags extends Thread {
private final TagsAdapter adapter;
private final TagType tagType;
Expand Down Expand Up @@ -102,7 +102,7 @@ private void scrape(String text){
Integer.parseInt(x.attr("class").substring(x.attr("class").lastIndexOf('-')+1).trim()),
tagType,TagStatus.DEFAULT
);
adapter.addItem(t);
adapter.addItem();
loadedTags.add(t);
//tagsList.add(t);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@
import java.util.List;
import java.util.Set;

@SuppressWarnings("deprecation")
public class DatabaseHelper extends SQLiteOpenHelper{
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "Entries.db";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "Entries.db";
private final Context context;
public DatabaseHelper(Context context){
super(context,DATABASE_NAME,null,DATABASE_VERSION);
Expand Down
Loading

0 comments on commit 24a2290

Please sign in to comment.