diff --git a/app/src/main/java/com/hippo/ehviewer/EhDB.java b/app/src/main/java/com/hippo/ehviewer/EhDB.java
index a579f715c..ead59a0a8 100644
--- a/app/src/main/java/com/hippo/ehviewer/EhDB.java
+++ b/app/src/main/java/com/hippo/ehviewer/EhDB.java
@@ -89,10 +89,9 @@ public class EhDB {
private static void upgradeDB(SQLiteDatabase db, int oldVersion) {
switch (oldVersion) {
- case 1: // 1 to 2
+ case 1: // 1 to 2, add FILTER
FilterDao.createTable(db, true);
- break;
- case 2: // add ENABLE column to table FILTER
+ case 2: // 2 to 3, add ENABLE column to table FILTER
db.execSQL("CREATE TABLE " + "\"FILTER2\" (" +
"\"_id\" INTEGER PRIMARY KEY ," +
"\"MODE\" INTEGER NOT NULL ," +
@@ -102,8 +101,24 @@ public class EhDB {
"_id, MODE, TEXT, ENABLE)" +
"SELECT _id, MODE, TEXT, 1 FROM FILTER;");
db.execSQL("DROP TABLE FILTER");
- db.execSQL("ALTER TABLE FILTER2 RENAME TO FILTER");
- break;
+ db.execSQL("ALTER TABLE FILTER2 RENAME TO FILTER");
+ case 3: // 3 to 4, add PAGE_FROM and PAGE_TO column to QUICK_SEARCH
+ db.execSQL("CREATE TABLE " + "\"QUICK_SEARCH2\" (" +
+ "\"_id\" INTEGER PRIMARY KEY ," +
+ "\"NAME\" TEXT," +
+ "\"MODE\" INTEGER NOT NULL ," +
+ "\"CATEGORY\" INTEGER NOT NULL ," +
+ "\"KEYWORD\" TEXT," +
+ "\"ADVANCE_SEARCH\" INTEGER NOT NULL ," +
+ "\"MIN_RATING\" INTEGER NOT NULL ," +
+ "\"PAGE_FROM\" INTEGER NOT NULL ," +
+ "\"PAGE_TO\" INTEGER NOT NULL ," +
+ "\"TIME\" INTEGER NOT NULL );");
+ db.execSQL("INSERT INTO \"QUICK_SEARCH2\" (" +
+ "_id, NAME, MODE, CATEGORY, KEYWORD, ADVANCE_SEARCH, MIN_RATING, PAGE_FROM, PAGE_TO, TIME)" +
+ "SELECT _id, NAME, MODE, CATEGORY, KEYWORD, ADVANCE_SEARCH, MIN_RATING, -1, -1, TIME FROM QUICK_SEARCH;");
+ db.execSQL("DROP TABLE QUICK_SEARCH");
+ db.execSQL("ALTER TABLE QUICK_SEARCH2 RENAME TO QUICK_SEARCH");
}
}
diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/ListUrlBuilder.java b/app/src/main/java/com/hippo/ehviewer/client/data/ListUrlBuilder.java
index ac823646c..5e330372e 100644
--- a/app/src/main/java/com/hippo/ehviewer/client/data/ListUrlBuilder.java
+++ b/app/src/main/java/com/hippo/ehviewer/client/data/ListUrlBuilder.java
@@ -60,6 +60,8 @@ public class ListUrlBuilder implements Cloneable, Parcelable {
private int mAdvanceSearch = -1;
private int mMinRating = -1;
+ private int mPageFrom = -1;
+ private int mPageTo = -1;
private String mImagePath;
private boolean mUseSimilarityScan;
@@ -76,6 +78,8 @@ public class ListUrlBuilder implements Cloneable, Parcelable {
mKeyword = null;
mAdvanceSearch = -1;
mMinRating = -1;
+ mPageFrom = -1;
+ mPageTo = -1;
mImagePath = null;
mUseSimilarityScan = false;
mOnlySearchCovers = false;
@@ -140,6 +144,14 @@ public class ListUrlBuilder implements Cloneable, Parcelable {
mMinRating = minRating;
}
+ public void setPageFrom(int pageFrom) {
+ mPageFrom = pageFrom;
+ }
+
+ public void setPageTo(int pageTo) {
+ mPageTo = pageTo;
+ }
+
@Nullable
public String getImagePath() {
return mImagePath;
@@ -184,6 +196,8 @@ public class ListUrlBuilder implements Cloneable, Parcelable {
mKeyword = lub.mKeyword;
mAdvanceSearch = lub.mAdvanceSearch;
mMinRating = lub.mMinRating;
+ mPageFrom = lub.mPageFrom;
+ mPageTo = lub.mPageTo;
mImagePath = lub.mImagePath;
mUseSimilarityScan = lub.mUseSimilarityScan;
mOnlySearchCovers = lub.mOnlySearchCovers;
@@ -196,6 +210,8 @@ public class ListUrlBuilder implements Cloneable, Parcelable {
mKeyword = q.keyword;
mAdvanceSearch = q.advanceSearch;
mMinRating = q.minRating;
+ mPageFrom = q.pageFrom;
+ mPageTo = q.pageTo;
mImagePath = null;
mUseSimilarityScan = false;
mOnlySearchCovers = false;
@@ -209,6 +225,8 @@ public class ListUrlBuilder implements Cloneable, Parcelable {
q.keyword = mKeyword;
q.advanceSearch = mAdvanceSearch;
q.minRating = mMinRating;
+ q.pageFrom = mPageFrom;
+ q.pageTo = mPageTo;
return q;
}
@@ -232,6 +250,12 @@ public class ListUrlBuilder implements Cloneable, Parcelable {
if (q.minRating != mMinRating) {
return false;
}
+ if (q.pageFrom != mPageFrom) {
+ return false;
+ }
+ if (q.pageTo != mPageTo) {
+ return false;
+ }
return true;
}
@@ -419,6 +443,12 @@ public class ListUrlBuilder implements Cloneable, Parcelable {
ub.addQuery("f_sr", "on");
ub.addQuery("f_srdd", mMinRating);
}
+ // Pages
+ if (mPageFrom != -1 || mPageTo != -1) {
+ ub.addQuery("f_sp", "on");
+ ub.addQuery("f_spf", mPageFrom != -1 ? Integer.toString(mPageFrom) : "");
+ ub.addQuery("f_spt", mPageTo != -1 ? Integer.toString(mPageTo) : "");
+ }
}
return ub.build();
}
@@ -468,6 +498,8 @@ public class ListUrlBuilder implements Cloneable, Parcelable {
dest.writeString(this.mKeyword);
dest.writeInt(this.mAdvanceSearch);
dest.writeInt(this.mMinRating);
+ dest.writeInt(this.mPageFrom);
+ dest.writeInt(this.mPageTo);
dest.writeString(this.mImagePath);
dest.writeByte(mUseSimilarityScan ? (byte) 1 : (byte) 0);
dest.writeByte(mOnlySearchCovers ? (byte) 1 : (byte) 0);
@@ -485,6 +517,8 @@ public class ListUrlBuilder implements Cloneable, Parcelable {
this.mKeyword = in.readString();
this.mAdvanceSearch = in.readInt();
this.mMinRating = in.readInt();
+ this.mPageFrom = in.readInt();
+ this.mPageTo = in.readInt();
this.mImagePath = in.readString();
this.mUseSimilarityScan = in.readByte() != 0;
this.mOnlySearchCovers = in.readByte() != 0;
diff --git a/app/src/main/java/com/hippo/ehviewer/widget/AdvanceSearchTable.java b/app/src/main/java/com/hippo/ehviewer/widget/AdvanceSearchTable.java
index aaea7ef06..8862106a9 100644
--- a/app/src/main/java/com/hippo/ehviewer/widget/AdvanceSearchTable.java
+++ b/app/src/main/java/com/hippo/ehviewer/widget/AdvanceSearchTable.java
@@ -21,11 +21,12 @@ import android.os.Bundle;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
+import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
+import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TableLayout;
-
import com.hippo.ehviewer.R;
import com.hippo.yorozuya.NumberUtils;
@@ -34,6 +35,8 @@ public class AdvanceSearchTable extends TableLayout {
private static final String STATE_KEY_SUPER = "super";
private static final String STATE_KEY_ADVANCE_SEARCH = "advance_search";
private static final String STATE_KEY_MIN_RATING = "min_rating";
+ private static final String STATE_KEY_PAGE_FROM = "page_from";
+ private static final String STATE_KEY_PAGE_TO = "page_to";
public static final int SNAME = 0x1;
public static final int STAGS = 0x2;
@@ -54,6 +57,9 @@ public class AdvanceSearchTable extends TableLayout {
private CheckBox mSh;
private CheckBox mSr;
private Spinner mMinRating;
+ private CheckBox mSp;
+ private EditText mSpf;
+ private EditText mSpt;
public AdvanceSearchTable(Context context) {
super(context);
@@ -88,6 +94,20 @@ public class AdvanceSearchTable extends TableLayout {
ViewGroup row4 = (ViewGroup) getChildAt(4);
mSr = (CheckBox) row4.getChildAt(0);
mMinRating = (Spinner) row4.getChildAt(1);
+
+ ViewGroup row5 = (ViewGroup) getChildAt(5);
+ mSp = (CheckBox) row5.getChildAt(0);
+ mSpf = (EditText) row5.getChildAt(1);
+ mSpt = (EditText) row5.getChildAt(3);
+
+ // Avoid java.lang.IllegalStateException: focus search returned a view that wasn't able to take focus!
+ mSpt.setOnEditorActionListener((v, actionId, event) -> {
+ View nextView = v.focusSearch(View.FOCUS_DOWN);
+ if (nextView != null) {
+ nextView.requestFocus(View.FOCUS_DOWN);
+ }
+ return true;
+ });
}
public int getAdvanceSearch() {
@@ -112,6 +132,20 @@ public class AdvanceSearchTable extends TableLayout {
}
}
+ public int getPageFrom() {
+ if (mSp.isChecked()) {
+ return NumberUtils.parseIntSafely(mSpf.getText().toString(), -1);
+ }
+ return -1;
+ }
+
+ public int getPageTo() {
+ if (mSp.isChecked()) {
+ return NumberUtils.parseIntSafely(mSpt.getText().toString(), -1);
+ }
+ return -1;
+ }
+
public void setAdvanceSearch(int advanceSearch) {
mSname.setChecked(NumberUtils.int2boolean(advanceSearch & SNAME));
mStags.setChecked(NumberUtils.int2boolean(advanceSearch & STAGS));
@@ -132,12 +166,34 @@ public class AdvanceSearchTable extends TableLayout {
}
}
+ public void setPageFrom(int pageFrom) {
+ if (pageFrom > 0) {
+ mSpf.setText(Integer.toString(pageFrom));
+ mSp.setChecked(true);
+ } else {
+ mSp.setChecked(false);
+ mSpf.setText(null);
+ }
+ }
+
+ public void setPageTo(int pageTo) {
+ if (pageTo > 0) {
+ mSpt.setText(Integer.toString(pageTo));
+ mSp.setChecked(true);
+ } else {
+ mSp.setChecked(false);
+ mSpt.setText(null);
+ }
+ }
+
@Override
public Parcelable onSaveInstanceState() {
final Bundle state = new Bundle();
state.putParcelable(STATE_KEY_SUPER, super.onSaveInstanceState());
state.putInt(STATE_KEY_ADVANCE_SEARCH, getAdvanceSearch());
state.putInt(STATE_KEY_MIN_RATING, getMinRating());
+ state.putInt(STATE_KEY_PAGE_FROM, getPageFrom());
+ state.putInt(STATE_KEY_PAGE_TO, getPageTo());
return state;
}
@@ -148,6 +204,8 @@ public class AdvanceSearchTable extends TableLayout {
super.onRestoreInstanceState(savedState.getParcelable(STATE_KEY_SUPER));
setAdvanceSearch(savedState.getInt(STATE_KEY_ADVANCE_SEARCH));
setMinRating(savedState.getInt(STATE_KEY_MIN_RATING));
+ setPageFrom(savedState.getInt(STATE_KEY_PAGE_FROM));
+ setPageTo(savedState.getInt(STATE_KEY_PAGE_TO));
}
}
}
diff --git a/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.java b/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.java
index d132a32b0..bfd302996 100644
--- a/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.java
+++ b/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.java
@@ -255,6 +255,8 @@ public class SearchLayout extends EasyRecyclerView implements CompoundButton.OnC
if (mEnableAdvance) {
urlBuilder.setAdvanceSearch(mTableAdvanceSearch.getAdvanceSearch());
urlBuilder.setMinRating(mTableAdvanceSearch.getMinRating());
+ urlBuilder.setPageFrom(mTableAdvanceSearch.getPageFrom());
+ urlBuilder.setPageTo(mTableAdvanceSearch.getPageTo());
}
break;
case SEARCH_MODE_IMAGE:
diff --git a/app/src/main/res/layout/widget_advance_search_table.xml b/app/src/main/res/layout/widget_advance_search_table.xml
index 4c42c8152..40b999891 100644
--- a/app/src/main/res/layout/widget_advance_search_table.xml
+++ b/app/src/main/res/layout/widget_advance_search_table.xml
@@ -114,4 +114,38 @@
android:entries="@array/search_min_rating"/>
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 52473bd1a..1c7f29c1e 100755
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -148,6 +148,8 @@
搜索差评标签
显示被删除的画廊
最低评分:
+ 页数:
+ 到
选择图片
使用相似搜索
diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml
index 3d850db91..048715f84 100755
--- a/app/src/main/res/values-zh-rHK/strings.xml
+++ b/app/src/main/res/values-zh-rHK/strings.xml
@@ -148,6 +148,8 @@
搜索差評標籤
顯示被刪除的畫廊
最低評分:
+ 頁數:
+ 到
選擇圖片
使用相似搜索
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index a813ccf6f..d635af3ac 100755
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -148,6 +148,8 @@
搜尋標籤:被噓爆的
顯示已被移除的的圖庫
最低評分:
+ 頁數:
+ 到
選擇圖片
使用相似性搜尋
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 0c8c9b216..dd1d48268 100755
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -190,6 +190,8 @@
Search Downvoted Tags
Show Expunged Galleries
Minimum Rating:
+ Pages:
+ to
Select image
Use similarity scan
diff --git a/daogenerator/src/main/java/com/hippo/ehviewer/daogenerator/EhDaoGenerator.java b/daogenerator/src/main/java/com/hippo/ehviewer/daogenerator/EhDaoGenerator.java
index b7e057503..bbee9db8b 100644
--- a/daogenerator/src/main/java/com/hippo/ehviewer/daogenerator/EhDaoGenerator.java
+++ b/daogenerator/src/main/java/com/hippo/ehviewer/daogenerator/EhDaoGenerator.java
@@ -32,7 +32,7 @@ public class EhDaoGenerator {
private static final String OUT_DIR = "../app/src/main/java-gen";
private static final String DELETE_DIR = "../app/src/main/java-gen/com/hippo/ehviewer/dao";
- private static final int VERSION = 3;
+ private static final int VERSION = 4;
private static final String DOWNLOAD_INFO_PATH = "../app/src/main/java-gen/com/hippo/ehviewer/dao/DownloadInfo.java";
private static final String HISTORY_INFO_PATH = "../app/src/main/java-gen/com/hippo/ehviewer/dao/HistoryInfo.java";
@@ -138,6 +138,10 @@ public class EhDaoGenerator {
entity.addStringProperty("keyword");
entity.addIntProperty("advanceSearch").notNull();
entity.addIntProperty("minRating").notNull();
+ // Since 4
+ entity.addIntProperty("pageFrom").notNull();
+ // Since 4
+ entity.addIntProperty("pageTo").notNull();
entity.addLongProperty("time").notNull();
}
@@ -190,6 +194,7 @@ public class EhDaoGenerator {
entity.addIdProperty();
entity.addIntProperty("mode").notNull();
entity.addStringProperty("text");
+ // Since 3
entity.addBooleanProperty("enable");
}
@@ -352,6 +357,8 @@ public class EhDaoGenerator {
javaClass.getField("keyword").setPublic();
javaClass.getField("advanceSearch").setPublic();
javaClass.getField("minRating").setPublic();
+ javaClass.getField("pageFrom").setPublic();
+ javaClass.getField("pageTo").setPublic();
javaClass.getField("time").setPublic();
javaClass.addMethod("\t@Override\n" +