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" +