From 24a22902cc6afde2ebf6b4fa0ee88ddae50df1e9 Mon Sep 17 00:00:00 2001 From: Dar9586 Date: Thu, 18 Oct 2018 21:55:26 +0200 Subject: [PATCH] NClientV2 1.5.8 Tags fully migrated to DB Added sort by name and count in tags --- app/build.gradle | 5 +- .../java/com/dar/nclientv2/TagFilter.java | 35 +++-- .../adapters/{ => paged}/TagsAdapter.java | 135 +++++++----------- .../com/dar/nclientv2/async/ScrapeTags.java | 6 +- .../async/database/DatabaseHelper.java | 5 +- .../dar/nclientv2/async/database/Queries.java | 83 +++++++++-- .../com/dar/nclientv2/loginapi/LoadTags.java | 4 +- .../com/dar/nclientv2/settings/Login.java | 25 ++-- .../com/dar/nclientv2/settings/TagV2.java | 35 +++-- .../java/com/dar/nclientv2/settings/Tags.java | 2 +- app/src/main/res/menu/menu_tag_filter.xml | 5 + app/src/main/res/values/strings.xml | 2 + 12 files changed, 205 insertions(+), 137 deletions(-) rename app/src/main/java/com/dar/nclientv2/adapters/{ => paged}/TagsAdapter.java (66%) diff --git a/app/build.gradle b/app/build.gradle index f454d27f..15c7284a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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" } @@ -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" diff --git a/app/src/main/java/com/dar/nclientv2/TagFilter.java b/app/src/main/java/com/dar/nclientv2/TagFilter.java index 831de769..5e054e15 100644 --- a/app/src/main/java/com/dar/nclientv2/TagFilter.java +++ b/app/src/main/java/com/dar/nclientv2/TagFilter.java @@ -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; @@ -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; @@ -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); @@ -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(); } } @@ -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 @@ -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(); @@ -185,6 +195,7 @@ public void negative(){ } }); + DefaultDialogs.pageChangerDialog(builder); } @@ -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; @@ -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); } @@ -299,9 +310,7 @@ public void addItems(List 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(); } } } diff --git a/app/src/main/java/com/dar/nclientv2/adapters/TagsAdapter.java b/app/src/main/java/com/dar/nclientv2/adapters/paged/TagsAdapter.java similarity index 66% rename from app/src/main/java/com/dar/nclientv2/adapters/TagsAdapter.java rename to app/src/main/java/com/dar/nclientv2/adapters/paged/TagsAdapter.java index aa9fc6f3..ded3064b 100644 --- a/app/src/main/java/com/dar/nclientv2/adapters/TagsAdapter.java +++ b/app/src/main/java/com/dar/nclientv2/adapters/paged/TagsAdapter.java @@ -1,4 +1,4 @@ -package com.dar.nclientv2.adapters; +package com.dar.nclientv2.adapters.paged; import android.graphics.Color; import android.util.JsonWriter; @@ -17,8 +17,8 @@ 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; @@ -26,14 +26,15 @@ 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; @@ -42,15 +43,19 @@ import okhttp3.RequestBody; import okhttp3.Response; -public class TagsAdapter extends RecyclerView.Adapter implements Filterable{ +public class TagsAdapter extends ListAdapter implements Filterable{ private final TagFilter context; - private final List tags; - private List 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 @@ -58,28 +63,26 @@ 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; - ListfilterTags=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) results.values; - if(filterTags.size()>results.count)notifyItemRangeInserted(results.count,filterTags.size()-results.count); - else if(filterTags.size()results.count)notifyItemRangeInserted(results.count,filterTags.size()-results.count); + //else if(filterTags.size())results.values); } }; } @@ -97,28 +100,17 @@ static class ViewHolder extends RecyclerView.ViewHolder { master=v.findViewById(R.id.master_layout); } } - public TagsAdapter(TagFilter cont, List 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 CALLBACK=new DiffUtil.ItemCallback(){ + @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 @@ -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 -> { @@ -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; }); @@ -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 getDataset() { - return filterTags; - } - public List 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); - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/dar/nclientv2/async/ScrapeTags.java b/app/src/main/java/com/dar/nclientv2/async/ScrapeTags.java index eb76e52f..4d65ed31 100644 --- a/app/src/main/java/com/dar/nclientv2/async/ScrapeTags.java +++ b/app/src/main/java/com/dar/nclientv2/async/ScrapeTags.java @@ -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; @@ -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; @@ -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); } diff --git a/app/src/main/java/com/dar/nclientv2/async/database/DatabaseHelper.java b/app/src/main/java/com/dar/nclientv2/async/database/DatabaseHelper.java index 9083e482..6f515afa 100644 --- a/app/src/main/java/com/dar/nclientv2/async/database/DatabaseHelper.java +++ b/app/src/main/java/com/dar/nclientv2/async/database/DatabaseHelper.java @@ -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); diff --git a/app/src/main/java/com/dar/nclientv2/async/database/Queries.java b/app/src/main/java/com/dar/nclientv2/async/database/Queries.java index ece854ca..30c47ce3 100644 --- a/app/src/main/java/com/dar/nclientv2/async/database/Queries.java +++ b/app/src/main/java/com/dar/nclientv2/async/database/Queries.java @@ -21,6 +21,8 @@ import java.util.Arrays; import java.util.List; +import androidx.annotation.Nullable; + public class Queries{ public static int getColumnFromName(Cursor cursor,String name){ return cursor.getColumnIndex(name); @@ -203,13 +205,14 @@ public static int countFavorite(SQLiteDatabase db){ public static class TagTable{ static final String TABLE_NAME="Tags"; public static final String DROP_TABLE="DROP TABLE IF EXISTS "+normalizeName(TABLE_NAME); - static final String CREATE_TABLE="CREATE TABLE IF NOT EXISTS `Tags` ( `idTag` INT NOT NULL PRIMARY KEY, `name` TEXT NOT NULL , `type` TINYINT(1) NOT NULL , `count` INT NOT NULL,`status` TINYINT(1) NOT NULL );"; + static final String CREATE_TABLE="CREATE TABLE IF NOT EXISTS `Tags` ( `idTag` INT NOT NULL PRIMARY KEY, `name` TEXT NOT NULL , `type` TINYINT(1) NOT NULL , `count` INT NOT NULL,`status` TINYINT(1) NOT NULL,`online` TINYINT(1) NOT NULL DEFAULT 0);"; static final String IDTAG="idTag"; static final String NAME="name"; static final String TYPE="type"; static final String COUNT="count"; static final String STATUS="status"; + static final String ONLINE="online"; public static Tag cursorToTag(Cursor cursor){ return new Tag( cursor.getString(cursor.getColumnIndex(NAME)), @@ -230,6 +233,27 @@ private static Tag[] retrieveAll(Cursor cursor){ cursor.close(); return tags; } + public static Tag[]filterTags(SQLiteDatabase db, String query, @Nullable TagType type, boolean online,boolean sortByName){ + return retrieveAll(getFilterCursor(db, query, type, online, sortByName)); + } + public static Cursor getFilterCursor(SQLiteDatabase db,String query, TagType type, boolean online,boolean sortByName){ + StringBuilder sql=new StringBuilder("SELECT * FROM ").append(normalizeName(TABLE_NAME)); + sql.append(" WHERE "); + sql.append(normalizeName(COUNT)).append(">=? "); + if(query.length()>0)sql.append("AND ").append(normalizeName(NAME)).append(" LIKE ?"); + if(type!=null)sql.append("AND ").append(normalizeName(TYPE)).append("=? "); + if(online)sql.append("AND ").append(normalizeName(ONLINE)).append("=1 ");//2 e 3 per online ed entrambi + if(!online&&type==null)sql.append("AND ").append(normalizeName(STATUS)).append("!=0 ");//DEFAULT STATUS + sql.append("ORDER BY "); + if(sortByName)sql.append(normalizeName(NAME)).append(" ASC"); + else sql.append(normalizeName(COUNT)).append(" DESC,").append(normalizeName(NAME)).append(" ASC"); + ArrayListlist=new ArrayList<>(); + list.add(""+TagV2.getMinCount()); + if(query.length()>0)list.add('%'+query+'%'); + if(type!=null)list.add(""+type.ordinal()); + Log.d(Global.LOGTAG,"FILTER QUERY: "+sql+", ARGS: "+list); + return db.rawQuery(sql.toString(),list.toArray(new String[0])); + } public static Tag[] getAllType(SQLiteDatabase db,TagType type){ String query="SELECT * FROM "+normalizeName(TABLE_NAME)+" WHERE "+normalizeName(TYPE)+" = ? AND "+normalizeName(COUNT)+" >= ?"; return retrieveAll(db.rawQuery(query,new String[]{""+type.ordinal(),""+TagV2.getMinCount()})); @@ -242,6 +266,17 @@ public static Tag[] getAllType(SQLiteDatabase db,TagType type){ String query="SELECT * FROM "+normalizeName(TABLE_NAME)+" WHERE "+normalizeName(STATUS)+" != ?"; return retrieveAll(db.rawQuery(query,new String[]{""+TagStatus.DEFAULT.ordinal()})); } + public static Tag[]getAllOnlineFavorite(SQLiteDatabase db){ + String query="SELECT * FROM "+normalizeName(TABLE_NAME)+" WHERE "+normalizeName(ONLINE)+" = 1"; + return retrieveAll(db.rawQuery(query,null)); + } + public static boolean isOnlineFavorite(SQLiteDatabase db,Tag tag){ + String query="SELECT "+normalizeName(IDTAG)+" FROM "+normalizeName(TABLE_NAME)+" WHERE "+normalizeName(IDTAG)+"=? AND "+normalizeName(ONLINE)+"=1"; + Cursor c=db.rawQuery(query,new String[]{""+tag.getId()}); + boolean x=c.moveToFirst(); + c.close(); + return x; + } public static Tag getTag(SQLiteDatabase db,int id){ String query="SELECT * FROM "+normalizeName(TABLE_NAME)+" WHERE "+normalizeName(IDTAG)+" = ?"; @@ -252,12 +287,12 @@ public static Tag getTag(SQLiteDatabase db,int id){ c.close(); return t; } - public static void updateStatus(SQLiteDatabase db,Tag tag){ + public static int updateStatus(SQLiteDatabase db,Tag tag){ ContentValues values=new ContentValues(1); values.put(STATUS,tag.getStatus().ordinal()); - db.updateWithOnConflict(TABLE_NAME,values,normalizeName(IDTAG)+"=?",new String[]{""+tag.getId()},SQLiteDatabase.CONFLICT_IGNORE); - } + return db.updateWithOnConflict(TABLE_NAME,values,normalizeName(IDTAG)+"=?",new String[]{""+tag.getId()},SQLiteDatabase.CONFLICT_IGNORE); + } public static void insert(SQLiteDatabase db,Tag tag){ ContentValues values=new ContentValues(5); values.put(IDTAG,tag.getId()); @@ -265,15 +300,19 @@ public static void insert(SQLiteDatabase db,Tag tag){ values.put(TYPE,tag.getType().ordinal()); values.put(COUNT,tag.getCount()); values.put(STATUS,tag.getStatus().ordinal()); - if(db!=null)db.insertWithOnConflict(TABLE_NAME,null,values,SQLiteDatabase.CONFLICT_REPLACE); + db.insertWithOnConflict(TABLE_NAME,null,values,SQLiteDatabase.CONFLICT_IGNORE); } - - public static void updateAllStatus(SQLiteDatabase db){ + public static void updateOnlineFavorite(SQLiteDatabase db,Tag tag,boolean online){ ContentValues values=new ContentValues(1); - values.put(STATUS,TagStatus.DEFAULT.ordinal()); - db.updateWithOnConflict(TABLE_NAME,values,null,null,SQLiteDatabase.CONFLICT_IGNORE); + values.put(ONLINE,online?1:0); + db.updateWithOnConflict(TABLE_NAME,values,normalizeName(IDTAG)+"=?",new String[]{""+tag.getId()},SQLiteDatabase.CONFLICT_IGNORE); } - + public static void resetOnlineFavorite(SQLiteDatabase db){ + ContentValues values=new ContentValues(1); + values.put(ONLINE,0); + db.updateWithOnConflict(TABLE_NAME,values,normalizeName(ONLINE)+"=1",null,SQLiteDatabase.CONFLICT_IGNORE); + } + @Deprecated public static void updateStatus(SQLiteDatabase db, int id, TagStatus status){ ContentValues values=new ContentValues(1); values.put(STATUS,status.ordinal()); @@ -285,6 +324,7 @@ public static void resetAllStatus(SQLiteDatabase db){ values.put(STATUS,TagStatus.DEFAULT.ordinal()); db.updateWithOnConflict(TABLE_NAME,values,null,null,SQLiteDatabase.CONFLICT_IGNORE); } + public static TagStatus getStatus(SQLiteDatabase db,Tag tag){ String query="SELECT "+normalizeName(STATUS)+" FROM "+normalizeName(TABLE_NAME)+ " WHERE "+normalizeName(IDTAG)+" =?"; @@ -297,11 +337,13 @@ public static TagStatus getStatus(SQLiteDatabase db,Tag tag){ c.close(); return null; } + + } static class BridgeTable{ static final String TABLE_NAME="GalleryTags"; public static final String DROP_TABLE="DROP TABLE IF EXISTS "+normalizeName(TABLE_NAME); - static final String CREATE_TABLE="CREATE TABLE IF NOT EXISTS `GalleryTags` ( `id` INTEGER PRIMARY KEY , `id_gallery` INT NOT NULL , `id_tag` INT NOT NULL , FOREIGN KEY(`id_gallery`) REFERENCES `Gallery`(`idGallery`) ON UPDATE CASCADE ON DELETE CASCADE , FOREIGN KEY(`id_tag`) REFERENCES `Tags`(`idTag`) ON UPDATE CASCADE ON DELETE CASCADE );"; + static final String CREATE_TABLE="CREATE TABLE IF NOT EXISTS `GalleryTags` ( `id` INTEGER PRIMARY KEY , `id_gallery` INT NOT NULL , `id_tag` INT NOT NULL , FOREIGN KEY(`id_gallery`) REFERENCES `Gallery`(`idGallery`) ON UPDATE CASCADE ON DELETE CASCADE , FOREIGN KEY(`id_tag`) REFERENCES `Tags`(`idTag`) ON UPDATE CASCADE ON DELETE RESTRICT );"; static final String ID="id"; static final String ID_GALLERY="id_gallery"; @@ -312,6 +354,25 @@ static void insert(SQLiteDatabase db,int galleryId,int tagId){ values.put(ID_TAG,tagId); db.insertWithOnConflict(TABLE_NAME,null,values,SQLiteDatabase.CONFLICT_ABORT); } + public static class Temp{ + public final int idTag,idGallery; + + public Temp(int idTag, int idGallery){ + this.idTag = idTag; + this.idGallery = idGallery; + } + } + public static Temp[] getAll(SQLiteDatabase db){ + Cursor c=db.rawQuery("SELECT * FROM "+normalizeName(TABLE_NAME),null); + Temp[]array=new Temp[c.getCount()]; + int i=0; + if(c.moveToFirst()){ + do{ + array[i++]=new Temp(c.getInt(getColumnFromName(c,ID_TAG)),c.getInt(getColumnFromName(c,ID_GALLERY))); + }while(c.moveToNext()); + } + return array; + } private static Tag[] getTagsForGallery(SQLiteDatabase db,int id,TagType type){ /*String query="SELECT "+normalizeName(ID_TAG)+" FROM "+normalizeName(TABLE_NAME)+","+normalizeName(TagTable.TABLE_NAME)+ " WHERE "+normalizeName(TABLE_NAME)+"."+normalizeName(ID_GALLERY)+"="+normalizeName(TagTable.TABLE_NAME)+"."+normalizeName(TagTable.IDTAG)+" AND "+ diff --git a/app/src/main/java/com/dar/nclientv2/loginapi/LoadTags.java b/app/src/main/java/com/dar/nclientv2/loginapi/LoadTags.java index 6ddbe0a1..cd5a2dcd 100644 --- a/app/src/main/java/com/dar/nclientv2/loginapi/LoadTags.java +++ b/app/src/main/java/com/dar/nclientv2/loginapi/LoadTags.java @@ -3,7 +3,7 @@ import android.util.JsonReader; 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.TagType; import com.dar.nclientv2.settings.Global; @@ -53,7 +53,7 @@ public void onResponse(@NonNull Call call, @NonNull Response response) throws IO Tag tt=new Tag(reader); if(tt.getType()!=TagType.LANGUAGE&&tt.getType()!=TagType.CATEGORY) { Login.addOnlineTag(tt); - if (adapter != null) adapter.addItem(tt); + if (adapter != null) adapter.addItem(); } } reader.close(); diff --git a/app/src/main/java/com/dar/nclientv2/settings/Login.java b/app/src/main/java/com/dar/nclientv2/settings/Login.java index 3cec309f..e6c514c2 100644 --- a/app/src/main/java/com/dar/nclientv2/settings/Login.java +++ b/app/src/main/java/com/dar/nclientv2/settings/Login.java @@ -5,12 +5,11 @@ import com.dar.nclientv2.R; import com.dar.nclientv2.api.components.Gallery; import com.dar.nclientv2.api.components.Tag; +import com.dar.nclientv2.async.database.Queries; import com.dar.nclientv2.loginapi.User; import com.franmontiel.persistentcookiejar.PersistentCookieJar; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -19,7 +18,6 @@ public class Login{ private static User user; - private static final List onlineTags=new ArrayList<>(); private static boolean accountTag; public static void initUseAccountTag(@NonNull Context context){accountTag=context.getSharedPreferences("Settings", 0).getBoolean(context.getString(R.string.key_use_account_tag),false);} @@ -31,12 +29,19 @@ public static boolean useAccountTag(){ public static void logout(Context context){ context.getSharedPreferences("OnlineFavorite",0).edit().clear().apply(); } - public static List getOnlineTags() { - return onlineTags; + public static Tag[] getOnlineTags() { + return Queries.TagTable.getAllOnlineFavorite(Database.getDatabase()); + } + public static void clearOnlineTags(){ + Queries.TagTable.resetOnlineFavorite(Database.getDatabase()); + } + public static void addOnlineTag(Tag tag){ + Queries.TagTable.insert(Database.getDatabase(),tag); + Queries.TagTable.updateOnlineFavorite(Database.getDatabase(),tag,true); + } + public static void removeOnlineTag(Tag tag){ + Queries.TagTable.updateOnlineFavorite(Database.getDatabase(),tag,false); } - public static void clearOnlineTags(){onlineTags.clear();} - public static void addOnlineTag(Tag tag){onlineTags.add(tag);} - public static void removeOnlineTag(Tag tag){onlineTags.remove(tag);} public static boolean isLogged(){ if(Global.client==null)return false; @@ -79,4 +84,8 @@ public static Gallery getOnlineFavorite(@NonNull Context context, int id){ } return null; } + + public static boolean isOnlineTags(Tag tag){ + return Queries.TagTable.isOnlineFavorite(Database.getDatabase(),tag); + } } diff --git a/app/src/main/java/com/dar/nclientv2/settings/TagV2.java b/app/src/main/java/com/dar/nclientv2/settings/TagV2.java index d6828efc..989fc83d 100644 --- a/app/src/main/java/com/dar/nclientv2/settings/TagV2.java +++ b/app/src/main/java/com/dar/nclientv2/settings/TagV2.java @@ -14,6 +14,7 @@ public class TagV2{ public static final int MAXTAGS=100; private static int minCount; + private static boolean sortByName; public static Tag[] getTagSet(TagType type){ return Queries.TagTable.getAllType(Database.getDatabase(),type); @@ -36,13 +37,15 @@ public static String getQueryString(String query){ } public static TagStatus updateStatus(Tag t){ + TagStatus old=t.getStatus(); switch(t.getStatus()){ case ACCEPTED:t.setStatus(TagStatus.AVOIDED);break; case AVOIDED:t.setStatus(TagStatus.DEFAULT);break; case DEFAULT:t.setStatus(TagStatus.ACCEPTED);break; } - Queries.TagTable.updateStatus(Database.getDatabase(),t); - return t.getStatus(); + if(Queries.TagTable.updateStatus(Database.getDatabase(),t)==1)return t.getStatus(); + throw new RuntimeException("Unable to update: "+t); + } public static void resetAllStatus(){ Queries.TagTable.resetAllStatus(Database.getDatabase()); @@ -51,12 +54,7 @@ public static boolean containTag(Tag[]tags,Tag t){ for(Tag t1:tags)if(t.equals(t1))return true; return false; } - public static void setPageReachedForType(@NonNull Context context , TagType type, int page){ - context.getSharedPreferences("ScrapedTags",0).edit().putInt(type+"_page",page).apply(); - } - public static int pageReachedForType(@NonNull Context context ,TagType type){ - return context.getSharedPreferences("ScrapedTags",0).getInt(type+"_page",0); - } + public static TagStatus getStatus(Tag tag){ return Queries.TagTable.getStatus(Database.getDatabase(),tag); @@ -75,8 +73,29 @@ public static void updateMinCount(Context context,int min){ public static void initMinCount(Context context){ minCount=context.getSharedPreferences("ScrapedTags",0).getInt("min_count",25); } + public static void initSortByName(Context context){ + sortByName=context.getSharedPreferences("ScrapedTags",0).getBoolean("sort_by_name",false); + } + public static boolean updateSortByName(Context context){ + context.getSharedPreferences("ScrapedTags",0).edit().putBoolean("sort_by_name",sortByName=!sortByName).apply(); + return sortByName; + } + public static boolean isSortedByName(){ + return sortByName; + } public static int getMinCount(){ return minCount; } + + + + @Deprecated + public static void setPageReachedForType(@NonNull Context context , TagType type, int page){ + context.getSharedPreferences("ScrapedTags",0).edit().putInt(type+"_page",page).apply(); + } + @Deprecated + public static int pageReachedForType(@NonNull Context context ,TagType type){ + return context.getSharedPreferences("ScrapedTags",0).getInt(type+"_page",0); + } } diff --git a/app/src/main/java/com/dar/nclientv2/settings/Tags.java b/app/src/main/java/com/dar/nclientv2/settings/Tags.java index 975fe882..d508dc79 100644 --- a/app/src/main/java/com/dar/nclientv2/settings/Tags.java +++ b/app/src/main/java/com/dar/nclientv2/settings/Tags.java @@ -19,7 +19,7 @@ import androidx.annotation.StringRes; import static com.dar.nclientv2.settings.Global.LOGTAG; - +@Deprecated public class Tags{ public static final int MAXTAGS=100; private static List accepted=new ArrayList<>(),avoided=new ArrayList<>(); diff --git a/app/src/main/res/menu/menu_tag_filter.xml b/app/src/main/res/menu/menu_tag_filter.xml index 065457a2..746afe45 100644 --- a/app/src/main/res/menu/menu_tag_filter.xml +++ b/app/src/main/res/menu/menu_tag_filter.xml @@ -8,6 +8,11 @@ android:title="@string/search" app:actionViewClass="androidx.appcompat.widget.SearchView" app:showAsAction="ifRoom|collapseActionView" /> + Update from version %s to version %s? Clear this list? Set minimum count + Sort by title + Sort by popular