添加修改下载文件夹为 gid-title 入口
This commit is contained in:
1 parent
a7a3d56c91
commit
0ed34f2eca
16 files changed
+409
-266
No files matched your search
@@ -231,6 +231,9 @@
|
||||
<string name="http_read_timeout_title">读取超时 (ms)</string>
|
||||
<string name="eh_advanced_settings_title">EH</string>
|
||||
<string name="eh_min_interval_title">EH 站点最小连接间隔 (ms)</string>
|
||||
<string name="eh_others_settings_title">其他</string>
|
||||
<string name="fix_dirname_title">修正下载文件夹名</string>
|
||||
<string name="fix_dirname_title_summary">将下载文件夹名由 gid 改为 gid-title,不进行修正不会影响使用</string>
|
||||
|
||||
<string name="about_settings_title">关于</string>
|
||||
<string name="author_title">作者</string>
|
||||
|
||||
@@ -59,5 +59,14 @@
|
||||
android:defaultValue="0" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory
|
||||
android:title="@string/eh_others_settings_title">
|
||||
|
||||
<Preference
|
||||
android:key="fix_dirname"
|
||||
android:title="@string/fix_dirname_title"
|
||||
android:summary="@string/fix_dirname_title_summary" />
|
||||
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
||||
@@ -107,23 +107,14 @@ public class AppContext extends Application implements UncaughtExceptionHandler
|
||||
String[] list = downloadDir.list();
|
||||
if (list != null && list.length != 0) {
|
||||
for (String str : list) {
|
||||
// Change download dir name from gid-title to gid
|
||||
File oldDir = new File(downloadDir, str);
|
||||
if (!new File(oldDir, EhUtils.EH_DOWNLOAD_FILENAME).exists())
|
||||
continue;
|
||||
int index = str.indexOf('-');
|
||||
if (index == -1)
|
||||
continue;
|
||||
String gid = str.substring(0, index);
|
||||
File newDir = new File(downloadDir, gid);
|
||||
if (!oldDir.renameTo(newDir)) {
|
||||
// if delete error, might same gid and different title
|
||||
Utils.deleteDirInThread(oldDir);
|
||||
continue;
|
||||
}
|
||||
File gDir = new File(downloadDir, str);
|
||||
// Move download info file
|
||||
File oldInfoFile = new File(oldEdInfoDir, gid);
|
||||
File newInfoFile = new File(newDir, EhUtils.EH_DOWNLOAD_FILENAME);
|
||||
File newInfoFile = new File(gDir, EhUtils.EH_DOWNLOAD_FILENAME);
|
||||
try {
|
||||
FileOutputStream fos = new FileOutputStream(newInfoFile);
|
||||
// Add last page
|
||||
@@ -139,7 +130,6 @@ public class AppContext extends Application implements UncaughtExceptionHandler
|
||||
Utils.deleteDirInThread(oldEdInfoDir);
|
||||
}
|
||||
|
||||
|
||||
// Update version code
|
||||
try {
|
||||
PackageInfo pi= getPackageManager().getPackageInfo(getPackageName(), 0);
|
||||
|
||||
@@ -27,6 +27,7 @@ import com.hippo.ehviewer.data.Comment;
|
||||
import com.hippo.ehviewer.data.LargePreviewList;
|
||||
import com.hippo.ehviewer.data.NormalPreviewList;
|
||||
import com.hippo.ehviewer.data.PreviewList;
|
||||
import com.hippo.ehviewer.util.EhUtils;
|
||||
import com.hippo.ehviewer.util.Utils;
|
||||
|
||||
public class DetailParser {
|
||||
@@ -153,7 +154,7 @@ public class DetailParser {
|
||||
thumb = Utils.unescapeXml(m.group(1));
|
||||
title = Utils.unescapeXml(m.group(2));
|
||||
title_jpn = Utils.unescapeXml(m.group(3));
|
||||
category = EhClient.getType(m.group(4));
|
||||
category = EhUtils.getCategory(m.group(4));
|
||||
uploader = m.group(5);
|
||||
posted = m.group(6);
|
||||
pages = Integer.parseInt(m.group(7));
|
||||
|
||||
@@ -36,15 +36,17 @@ import android.os.Process;
|
||||
import com.hippo.ehviewer.Analytics;
|
||||
import com.hippo.ehviewer.AppHandler;
|
||||
import com.hippo.ehviewer.R;
|
||||
import com.hippo.ehviewer.data.ApiGalleryInfo;
|
||||
import com.hippo.ehviewer.data.Comment;
|
||||
import com.hippo.ehviewer.data.GalleryDetail;
|
||||
import com.hippo.ehviewer.data.GalleryInfo;
|
||||
import com.hippo.ehviewer.data.GalleryPopular;
|
||||
import com.hippo.ehviewer.data.ListUrls;
|
||||
import com.hippo.ehviewer.data.LofiGalleryDetail;
|
||||
import com.hippo.ehviewer.data.PreviewList;
|
||||
import com.hippo.ehviewer.network.HttpHelper;
|
||||
import com.hippo.ehviewer.util.BgThread;
|
||||
import com.hippo.ehviewer.util.Config;
|
||||
import com.hippo.ehviewer.util.EhUtils;
|
||||
import com.hippo.ehviewer.util.Utils;
|
||||
|
||||
public class EhClient {
|
||||
@@ -885,7 +887,7 @@ public class EhClient {
|
||||
|
||||
public void comment(final String detailUrl, final String comment,
|
||||
final OnCommentListener listener) {
|
||||
new Thread(new Runnable() {
|
||||
new BgThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
HttpHelper hp = new HttpHelper(mContext);
|
||||
@@ -1090,56 +1092,6 @@ public class EhClient {
|
||||
}).start();
|
||||
}
|
||||
|
||||
private static final int[] CATEGORY_VALUES = {
|
||||
ListUrls.MISC,
|
||||
ListUrls.DOUJINSHI,
|
||||
ListUrls.MANGA,
|
||||
ListUrls.ARTIST_CG,
|
||||
ListUrls.GAME_CG,
|
||||
ListUrls.IMAGE_SET,
|
||||
ListUrls.COSPLAY,
|
||||
ListUrls.ASIAN_PORN,
|
||||
ListUrls.NON_H,
|
||||
ListUrls.WESTERN,
|
||||
ListUrls.UNKNOWN
|
||||
};
|
||||
|
||||
// TODO How about "Private"
|
||||
private static final String[][] CATEGORY_STRINGS = {
|
||||
new String[]{"misc"},
|
||||
new String[]{"doujinshi"},
|
||||
new String[]{"manga"},
|
||||
new String[]{"artistcg", "Artist CG Sets"},
|
||||
new String[]{"gamecg", "Game CG Sets"},
|
||||
new String[]{"imageset", "Image Sets"},
|
||||
new String[]{"cosplay"},
|
||||
new String[]{"asianporn", "Asian Porn"},
|
||||
new String[]{"non-h"},
|
||||
new String[]{"western"},
|
||||
new String[]{"unknown"}
|
||||
};
|
||||
|
||||
public static int getType(String type) {
|
||||
int i;
|
||||
for (i = 0; i < CATEGORY_STRINGS.length - 1; i++) {
|
||||
for (String str : CATEGORY_STRINGS[i])
|
||||
if (str.equalsIgnoreCase(type))
|
||||
return CATEGORY_VALUES[i];
|
||||
}
|
||||
|
||||
return CATEGORY_VALUES[i];
|
||||
}
|
||||
|
||||
public static String getType(int type) {
|
||||
int i;
|
||||
for (i = 0; i < CATEGORY_VALUES.length - 1; i++) {
|
||||
if (CATEGORY_VALUES[i] == type)
|
||||
break;
|
||||
}
|
||||
return CATEGORY_STRINGS[i][0];
|
||||
}
|
||||
|
||||
|
||||
// modifyFavorite
|
||||
public interface OnModifyFavoriteListener {
|
||||
void onSuccess(List<GalleryInfo> gis, int pageNum);
|
||||
@@ -1173,7 +1125,7 @@ public class EhClient {
|
||||
*/
|
||||
public void modifyFavorite(final int[] gids, final int dstCat, final int srcCat,
|
||||
final OnModifyFavoriteListener listener) {
|
||||
new Thread(new Runnable() {
|
||||
new BgThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
int i;
|
||||
@@ -1231,7 +1183,7 @@ public class EhClient {
|
||||
listener.onFailure(e.getMessage());
|
||||
return;
|
||||
}
|
||||
new Thread(new Runnable() {
|
||||
new BgThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
HttpHelper hp = new HttpHelper(mContext);
|
||||
@@ -1262,7 +1214,7 @@ public class EhClient {
|
||||
gi.title = Utils.unescapeXml(j.getString("title"));
|
||||
gi.posted = Utils.sDate.format(Long.parseLong(j.getString("posted")) * 1000);
|
||||
gi.thumb = j.getString("thumb");
|
||||
gi.category = getType(j.getString("category"));
|
||||
gi.category = EhUtils.getCategory(j.getString("category"));
|
||||
gi.uploader = j.getString("uploader");
|
||||
gi.rating = Float.parseFloat(j.getString("rating"));
|
||||
gi.generateSLang();
|
||||
@@ -1290,183 +1242,163 @@ public class EhClient {
|
||||
}).start();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
private static class GetGalleryMetadataPackage {
|
||||
public Map<String, ListMangaDetail> lmds;
|
||||
public OnGetGalleryMetadataListener listener;
|
||||
|
||||
public GetGalleryMetadataPackage(Map<String, ListMangaDetail> lmds,
|
||||
OnGetGalleryMetadataListener listener) {
|
||||
this.lmds = lmds;
|
||||
this.listener = listener;
|
||||
}
|
||||
public interface OnGetApiGalleryInfoListener {
|
||||
public void onSuccess(Object checkFlag, ApiGalleryInfo[] agiArray);
|
||||
public void onFailure(Object checkFlag, String eMsg);
|
||||
}
|
||||
|
||||
private static Handler getGalleryMetadataHandler = new Handler() {
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
OnGetGalleryMetadataListener listener =
|
||||
((GetGalleryMetadataPackage) msg.obj).listener;
|
||||
Map<String, ListMangaDetail> lmds =
|
||||
((GetGalleryMetadataPackage) msg.obj).lmds;
|
||||
if (lmds == null || lmds.size() == 0)
|
||||
listener.onFailure(msg.what);
|
||||
else
|
||||
listener.onSuccess(lmds);
|
||||
};
|
||||
};
|
||||
private class GetApiGalleryInfoResponder implements Runnable {
|
||||
private final boolean isOk;
|
||||
private final OnGetApiGalleryInfoListener listener;
|
||||
private final Object checkFlag;
|
||||
private final ApiGalleryInfo[] agiArray;
|
||||
private final String eMesg;
|
||||
|
||||
private static class GetGalleryMetadataRunnable implements Runnable {
|
||||
private String[][] gidTokens;
|
||||
private OnGetGalleryMetadataListener listener;
|
||||
|
||||
public GetGalleryMetadataRunnable(String[][] gidTokens,
|
||||
OnGetGalleryMetadataListener listener) {
|
||||
this.gidTokens = gidTokens;
|
||||
public GetApiGalleryInfoResponder(OnGetApiGalleryInfoListener listener,
|
||||
Object checkFlag, ApiGalleryInfo[] agiArray) {
|
||||
this.isOk = true;
|
||||
this.listener = listener;
|
||||
this.checkFlag = checkFlag;
|
||||
this.agiArray = agiArray;
|
||||
this.eMesg = null;
|
||||
}
|
||||
|
||||
public GetApiGalleryInfoResponder(OnGetApiGalleryInfoListener listener,
|
||||
Object checkFlag, String eMsg) {
|
||||
this.isOk = false;
|
||||
this.listener = listener;
|
||||
this.checkFlag = checkFlag;
|
||||
this.agiArray = null;
|
||||
this.eMesg = eMsg;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
int errorMessageId = R.string.em_unknown_error;
|
||||
Map<String, ListMangaDetail> lmds = new HashMap<String, ListMangaDetail>();
|
||||
if (isOk)
|
||||
listener.onSuccess(checkFlag, agiArray);
|
||||
else
|
||||
listener.onFailure(checkFlag, eMesg);
|
||||
}
|
||||
}
|
||||
|
||||
// Create post string
|
||||
StringBuffer strBuf = new StringBuffer();
|
||||
strBuf.append("{\"method\": \"gdata\",\"gidlist\": [");
|
||||
for (String[] item: gidTokens)
|
||||
strBuf.append("[" + item[0] + ",\"" + item[1] + "\"],");
|
||||
strBuf.delete(strBuf.length()-1, strBuf.length());
|
||||
strBuf.append("]}");
|
||||
StringBuffer sb = new StringBuffer();
|
||||
errorMessageId = postJson(API_URL, strBuf.toString(),sb);
|
||||
if (sb.length() != 0) {
|
||||
String pageContent = sb.toString();
|
||||
private ApiGalleryInfo Json2Agi(JSONObject js) throws JSONException {
|
||||
ApiGalleryInfo agi = new ApiGalleryInfo();
|
||||
agi.gid = js.getInt("gid");
|
||||
agi.token = js.getString("token");
|
||||
agi.archiver_key = js.getString("archiver_key");
|
||||
agi.title = js.getString("title");
|
||||
agi.title_jpn = js.getString("title_jpn");
|
||||
agi.category = EhUtils.getCategory(js.getString("category"));
|
||||
agi.thumb = js.getString("thumb");
|
||||
agi.uploader = js.getString("uploader");
|
||||
agi.posted = Utils.sDate.format(Long.parseLong(js.getString("posted")) * 1000);
|
||||
agi.filecount = js.getString("filecount");
|
||||
agi.filesize = js.getLong("filesize");
|
||||
agi.expunged = js.getBoolean("expunged");
|
||||
agi.rating = Float.parseFloat(js.getString("rating"));
|
||||
agi.torrentcount = js.getString("torrentcount");
|
||||
JSONArray tags = js.getJSONArray("tags");
|
||||
agi.apiTags = new String[tags.length()];
|
||||
for (int j = 0; j < tags.length(); j++)
|
||||
agi.apiTags[j] = tags.getString(j);
|
||||
return agi;
|
||||
}
|
||||
|
||||
public void getApiGalleryInfo(final Object checkFlag, final int[] gids, final String[] tokens, final OnGetApiGalleryInfoListener l) {
|
||||
new BgThread() {
|
||||
@Override
|
||||
public void run() {
|
||||
GetApiGalleryInfoResponder responder;
|
||||
ApiGalleryInfo[] agiArray;
|
||||
int requstLen;
|
||||
// Create json
|
||||
JSONObject json = new JSONObject();
|
||||
try {
|
||||
SimpleDateFormat fm = new SimpleDateFormat("yyyy-MM-dd hh:mm");
|
||||
JSONObject jsonObject = new JSONObject(pageContent);
|
||||
JSONArray jsonArray = jsonObject.getJSONArray("gmetadata");
|
||||
for (int i = 0; i < jsonArray.length(); i++) {
|
||||
JSONObject jo = jsonArray.getJSONObject(i);
|
||||
if (jo.getString("error") != null)
|
||||
continue;
|
||||
ListMangaDetail lmd = new ListMangaDetail();
|
||||
lmd.gid = Long.toString(jo.getLong("gid"));
|
||||
lmd.token = jo.getString("token");
|
||||
lmd.archiver_key = jo.getString("archiver_key");
|
||||
lmd.title = jo.getString("title");
|
||||
lmd.title_jpn = jo.getString("title_jpn");
|
||||
lmd.category = getType(jo.getString("category"));
|
||||
lmd.thumb = jo.getString("thumb");
|
||||
lmd.uploader = jo.getString("uploader");
|
||||
lmd.posted = fm.format(Long.parseLong(jo.getString("posted")) * 1000);
|
||||
lmd.filecount = jo.getString("filecount");
|
||||
lmd.filesize = jo.getLong("filesize");
|
||||
lmd.expunged = jo.getBoolean("expunged");
|
||||
lmd.rating = jo.getString("rating");
|
||||
lmd.torrentcount = jo.getString("torrentcount");
|
||||
JSONArray ja = jo.getJSONArray("tags");
|
||||
int length = ja.length();
|
||||
lmd.tags = new String[1][length+1];
|
||||
lmd.tags[0][0] = "all";
|
||||
for (int j = 1; j < length+1; j++)
|
||||
lmd.tags[0][j] = ja.getString(j);
|
||||
|
||||
lmds.put(lmd.gid, lmd);
|
||||
json.put("method", "gdata");
|
||||
JSONArray jsonA = new JSONArray();
|
||||
requstLen = Math.min(gids.length, tokens.length);
|
||||
agiArray = new ApiGalleryInfo[requstLen];
|
||||
for (int i = 0; i < requstLen; i++) {
|
||||
JSONArray ja = new JSONArray();
|
||||
ja.put(gids[i]);
|
||||
ja.put(tokens[i]);
|
||||
jsonA.put(ja);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
errorMessageId = R.string.em_parser_error;
|
||||
json.put("gidlist", jsonA);
|
||||
} catch (Throwable e) {
|
||||
responder = new GetApiGalleryInfoResponder(l, null, "Create json error");
|
||||
mHandler.post(responder);
|
||||
return;
|
||||
}
|
||||
// Post
|
||||
HttpHelper hh = new HttpHelper(mContext);
|
||||
String body = hh.postJson(getApiUrl(), json);
|
||||
if (body != null) {
|
||||
try {
|
||||
json = new JSONObject(body);
|
||||
JSONArray jsonA = (JSONArray) json.get("gmetadata");
|
||||
for (int i = 0; i < jsonA.length(); i++) {
|
||||
ApiGalleryInfo agi = Json2Agi(jsonA.getJSONObject(i));
|
||||
// Add to agiArray
|
||||
for (int j = 0; j < requstLen; j++) {
|
||||
if (agi.gid == gids[j])
|
||||
agiArray[j] = agi;
|
||||
}
|
||||
}
|
||||
responder = new GetApiGalleryInfoResponder(l, checkFlag, agiArray);
|
||||
} catch (Throwable e) {
|
||||
responder = new GetApiGalleryInfoResponder(l, checkFlag, "Json error");
|
||||
}
|
||||
} else {
|
||||
responder = new GetApiGalleryInfoResponder(l, checkFlag, hh.getEMsg());
|
||||
}
|
||||
mHandler.post(responder);
|
||||
}
|
||||
Message msg = new Message();
|
||||
msg.what = errorMessageId;
|
||||
msg.obj = new GetGalleryMetadataPackage(lmds, listener);
|
||||
getGalleryMetadataHandler.sendMessage(msg);
|
||||
}
|
||||
}.start();
|
||||
}
|
||||
|
||||
public static void getGalleryMetadata(String[][] gidTokens,
|
||||
OnGetGalleryMetadataListener listener) {
|
||||
new Thread(new GetGalleryMetadataRunnable(gidTokens,
|
||||
listener)).start();
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static class GetGalleryTokensPackage {
|
||||
public Map<String, String> tokens;
|
||||
public OnGetGalleryTokensListener listener;
|
||||
|
||||
public GetGalleryTokensPackage(Map<String, String> tokens,
|
||||
OnGetGalleryTokensListener listener) {
|
||||
this.tokens = tokens;
|
||||
this.listener = listener;
|
||||
public ApiGalleryInfo[] getApiGalleryInfo(int[] gids, String[] tokens) {
|
||||
ApiGalleryInfo[] agiArray;
|
||||
int requstLen;
|
||||
// Create json
|
||||
JSONObject json = new JSONObject();
|
||||
try {
|
||||
json.put("method", "gdata");
|
||||
JSONArray jsonA = new JSONArray();
|
||||
requstLen = Math.min(gids.length, tokens.length);
|
||||
agiArray = new ApiGalleryInfo[requstLen];
|
||||
for (int i = 0; i < requstLen; i++) {
|
||||
JSONArray ja = new JSONArray();
|
||||
ja.put(gids[i]);
|
||||
ja.put(tokens[i]);
|
||||
jsonA.put(ja);
|
||||
}
|
||||
json.put("gidlist", jsonA);
|
||||
} catch (Throwable e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static Handler getGalleryTokensHandler = new Handler() {
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
OnGetGalleryTokensListener listener =
|
||||
((GetGalleryTokensPackage) msg.obj).listener;
|
||||
Map<String, String> tokens =
|
||||
((GetGalleryTokensPackage) msg.obj).tokens;
|
||||
if (tokens == null || tokens.size() == 0)
|
||||
listener.onFailure(msg.what);
|
||||
else
|
||||
listener.onSuccess(tokens);
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
private static class GetGalleryTokensRunnable implements Runnable {
|
||||
private String gid;
|
||||
private String token;
|
||||
private String[] pages;
|
||||
private OnGetGalleryMetadataListener listener;
|
||||
|
||||
public GetGalleryTokensRunnable(String gid, String token, String[] pages,
|
||||
OnGetGalleryMetadataListener listener) {
|
||||
this.gid = gid;
|
||||
this.token = token;
|
||||
this.pages = pages;
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
int errorMessageId = R.string.em_unknown_error;
|
||||
Map<String, String> tokens = new HashMap<String, String>();
|
||||
|
||||
// Create post string
|
||||
StringBuffer strBuf = new StringBuffer();
|
||||
strBuf.append("{\"method\": \"gtoken\",\"pagelist\": [");
|
||||
for (String item: pages)
|
||||
strBuf.append("[" + gid + ",\"" + token + "\"," + item + "],");
|
||||
strBuf.delete(strBuf.length()-1, strBuf.length());
|
||||
strBuf.append("]}");
|
||||
|
||||
Log.i(TAG, strBuf.toString());
|
||||
|
||||
StringBuffer sb = new StringBuffer();
|
||||
errorMessageId = postJson(API_URL, strBuf.toString(),sb);
|
||||
if (sb.length() != 0) {
|
||||
String pageContent = sb.toString();
|
||||
Log.d(TAG, pageContent);
|
||||
// Post api
|
||||
HttpHelper hh = new HttpHelper(mContext);
|
||||
String body = hh.postJson(getApiUrl(), json);
|
||||
if (body == null) {
|
||||
return null;
|
||||
} else {
|
||||
try {
|
||||
json = new JSONObject(body);
|
||||
JSONArray jsonA = (JSONArray) json.get("gmetadata");
|
||||
for (int i = 0; i < jsonA.length(); i++) {
|
||||
ApiGalleryInfo agi = Json2Agi(jsonA.getJSONObject(i));
|
||||
// Add to agiArray
|
||||
for (int j = 0; j < requstLen; j++) {
|
||||
if (agi.gid == gids[j])
|
||||
agiArray[j] = agi;
|
||||
}
|
||||
}
|
||||
return agiArray;
|
||||
} catch (Throwable e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
private static void getGalleryTokens(String gid, String token, String[] pages,
|
||||
OnGetGalleryMetadataListener listener) {
|
||||
new Thread(new GetGalleryTokensRunnable(gid, token, pages,
|
||||
listener)).start();
|
||||
}*/
|
||||
|
||||
}
|
||||
@@ -135,7 +135,7 @@ public class ExDownloader implements Runnable {
|
||||
mControlorArray = new HttpHelper.DownloadControlor[mWorkerNum];
|
||||
|
||||
// Make sure dir
|
||||
mDir = EhUtils.getGalleryDir(mGid);
|
||||
mDir = EhUtils.getGalleryDir(mGid, mTitle);
|
||||
Utils.ensureDir(mDir, true);
|
||||
}
|
||||
|
||||
@@ -427,9 +427,9 @@ public class ExDownloader implements Runnable {
|
||||
} catch (Throwable e) {}
|
||||
}
|
||||
|
||||
public static int readCurReadIndex(int gid) {
|
||||
public static int readCurReadIndex(int gid, String title) {
|
||||
try {
|
||||
RandomAccessFile raf = new RandomAccessFile(new File(EhUtils.getGalleryDir(gid),
|
||||
RandomAccessFile raf = new RandomAccessFile(new File(EhUtils.getGalleryDir(gid, title),
|
||||
EhUtils.EH_DOWNLOAD_FILENAME), "r");
|
||||
int index = Integer.parseInt(raf.readLine(), 16);
|
||||
raf.close();
|
||||
|
||||
@@ -22,6 +22,7 @@ import java.util.regex.Pattern;
|
||||
|
||||
import com.hippo.ehviewer.data.GalleryInfo;
|
||||
import com.hippo.ehviewer.data.LofiGalleryInfo;
|
||||
import com.hippo.ehviewer.util.EhUtils;
|
||||
import com.hippo.ehviewer.util.Utils;
|
||||
|
||||
public class ListParser {
|
||||
@@ -84,7 +85,7 @@ public class ListParser {
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
lgi.category = EhClient.getType(m.group(5));
|
||||
lgi.category = EhUtils.getCategory(m.group(5));
|
||||
String tags = m.group(6);
|
||||
if (tags.equals("-"))
|
||||
lgi.lofiTags = null;
|
||||
@@ -147,7 +148,7 @@ public class ListParser {
|
||||
while (m.find()) {
|
||||
GalleryInfo gi = new GalleryInfo();
|
||||
|
||||
gi.category = EhClient.getType(m.group(1));
|
||||
gi.category = EhUtils.getCategory(m.group(1));
|
||||
gi.posted = m.group(2);
|
||||
if (m.group(3) == null) {
|
||||
gi.thumb = Utils.unescapeXml("http://"
|
||||
|
||||
@@ -1158,38 +1158,40 @@ public class GalleryView extends GLView
|
||||
case SCROLL_ANIME_RIGHT:
|
||||
return false;
|
||||
case SCROLL_NONE:
|
||||
boolean changePage = false;
|
||||
// If it is true, page will move
|
||||
boolean movePage = false;
|
||||
Rect rect = curShowItem.mRect;
|
||||
|
||||
// Check change page or not
|
||||
if (curShowItem == null || !(curShowItem instanceof BasicItem))
|
||||
changePage = true;
|
||||
else{
|
||||
if ( Math.abs(totalX/totalY) > 1 && ((totalX > SLIDE_SENSITIVITY && dx < 0 && rect.left >= 0)
|
||||
|| (totalX < -SLIDE_SENSITIVITY && dx > 0 && rect.right <= mScreenWidth)))
|
||||
changePage = true;
|
||||
// If show item is null or TextItem, just move
|
||||
// Check finger move left or right
|
||||
// Check min sensitivity
|
||||
if (curShowItem == null || !(curShowItem instanceof BasicItem) ||
|
||||
(Math.abs(totalX/totalY) > 1 && ((totalX > SLIDE_SENSITIVITY && dx < 0 && rect.left >= 0)
|
||||
|| (totalX < -SLIDE_SENSITIVITY && dx > 0 && rect.right <= mScreenWidth)))) {
|
||||
movePage = true;
|
||||
}
|
||||
if (changePage) { // If change page
|
||||
if (movePage) { // If change page
|
||||
if (dx < 0) { // Go to left
|
||||
if (!isFirstPage()) { // Not first page
|
||||
scrollXOffset = 0;
|
||||
mScrollState = SCROLL_LEFT;
|
||||
// Prepare previous show item
|
||||
resetSizePosition(PRE_TARGET_INDEX);
|
||||
} else {
|
||||
changePage = false;
|
||||
movePage = false;
|
||||
}
|
||||
}
|
||||
else { // Go to righ
|
||||
} else { // Go to righ
|
||||
if (!isLastPage()) { // Not last page
|
||||
scrollXOffset = 0;
|
||||
mScrollState = SCROLL_RIGHT;
|
||||
// Prepare next show item
|
||||
resetSizePosition(NEXT_TARGET_INDEX);
|
||||
} else {
|
||||
changePage = false;
|
||||
movePage = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!changePage){ // Move cur image
|
||||
if (!movePage) { // Move cur image
|
||||
int actDx = -(int)dx;
|
||||
int actDy = -(int)dy;
|
||||
if (rect.width() <= mScreenWidth)
|
||||
|
||||
@@ -88,7 +88,7 @@ public class ImageSet implements ExDownloader.ListenerForImageSet {
|
||||
|
||||
public ImageSet(int gid, String token, String title, int startIndex) {
|
||||
|
||||
mDir = EhUtils.getGalleryDir(gid);
|
||||
mDir = EhUtils.getGalleryDir(gid, title);
|
||||
Utils.ensureDir(mDir, true);
|
||||
|
||||
// Init ExDownloader
|
||||
|
||||
@@ -360,7 +360,7 @@ public class DownloadActivity extends AbsActivity {
|
||||
mServiceConn.getService().delete(mDownloadInfo);
|
||||
// Delete dir
|
||||
GalleryInfo gi = mDownloadInfo.galleryInfo;
|
||||
Utils.deleteDirInThread(EhUtils.getGalleryDir(gi.gid));
|
||||
Utils.deleteDirInThread(EhUtils.getGalleryDir(gi.gid, gi.title));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -201,7 +201,7 @@ public class GalleryActivity extends AbsActivity
|
||||
mTitle = intent.getStringExtra(KEY_TITLE);
|
||||
int startIndex = intent.getIntExtra(KEY_START_INDEX, 0);
|
||||
if (startIndex == -1)
|
||||
startIndex = ExDownloader.readCurReadIndex(mGid);
|
||||
startIndex = ExDownloader.readCurReadIndex(mGid, mTitle);
|
||||
|
||||
if (mGid == -1 || token == null || mTitle == null) {
|
||||
new MaterialAlertDialog.Builder(this).setTitle(R.string.error)
|
||||
|
||||
@@ -16,7 +16,9 @@
|
||||
|
||||
package com.hippo.ehviewer.ui;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
@@ -56,8 +58,10 @@ import com.hippo.ehviewer.R;
|
||||
import com.hippo.ehviewer.SimpleSuggestionProvider;
|
||||
import com.hippo.ehviewer.UpdateHelper;
|
||||
import com.hippo.ehviewer.app.MaterialAlertDialog;
|
||||
import com.hippo.ehviewer.data.ApiGalleryInfo;
|
||||
import com.hippo.ehviewer.data.Data;
|
||||
import com.hippo.ehviewer.data.DownloadInfo;
|
||||
import com.hippo.ehviewer.ehclient.EhClient;
|
||||
import com.hippo.ehviewer.ehclient.EhInfo;
|
||||
import com.hippo.ehviewer.network.HttpHelper;
|
||||
import com.hippo.ehviewer.preference.ListPreference;
|
||||
@@ -65,6 +69,7 @@ import com.hippo.ehviewer.util.BgThread;
|
||||
import com.hippo.ehviewer.util.Config;
|
||||
import com.hippo.ehviewer.util.EhUtils;
|
||||
import com.hippo.ehviewer.util.Favorite;
|
||||
import com.hippo.ehviewer.util.Log;
|
||||
import com.hippo.ehviewer.util.Theme;
|
||||
import com.hippo.ehviewer.util.Ui;
|
||||
import com.hippo.ehviewer.util.Utils;
|
||||
@@ -772,17 +777,20 @@ public class SettingsActivity extends AbsPreferenceActivity {
|
||||
}
|
||||
|
||||
public static class AdvancedFragment extends TranslucentPreferenceFragment
|
||||
implements Preference.OnPreferenceChangeListener {
|
||||
implements Preference.OnPreferenceChangeListener,
|
||||
Preference.OnPreferenceClickListener {
|
||||
|
||||
private static final String KEY_HTTP_RETRY = "http_retry";
|
||||
private static final String KEY_HTTP_CONNECT_TIMEOUT = "http_connect_timeout";
|
||||
private static final String KEY_HTTP_READ_TIMEOUT = "http_read_timeout";
|
||||
private static final String KEY_EH_MIN_INTERVAL = "eh_min_interval";
|
||||
private static final String KEY_FIX_DIRNAME = "fix_dirname";
|
||||
|
||||
private Preference mHttpRetry;
|
||||
private Preference mHttpConnectTimeout;
|
||||
private Preference mHttpReadTimeout;
|
||||
private Preference mEhMinInterval;
|
||||
private Preference mFixDirname;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
@@ -797,6 +805,8 @@ public class SettingsActivity extends AbsPreferenceActivity {
|
||||
mHttpReadTimeout.setOnPreferenceChangeListener(this);
|
||||
mEhMinInterval = findPreference(KEY_EH_MIN_INTERVAL);
|
||||
mEhMinInterval.setOnPreferenceChangeListener(this);
|
||||
mFixDirname = findPreference(KEY_FIX_DIRNAME);
|
||||
mFixDirname.setOnPreferenceClickListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -846,6 +856,110 @@ public class SettingsActivity extends AbsPreferenceActivity {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPreferenceClick(Preference preference) {
|
||||
final String key = preference.getKey();
|
||||
if (KEY_FIX_DIRNAME.equals(key)) {
|
||||
mFixDirname.setEnabled(false);
|
||||
new BgThread() {
|
||||
@Override
|
||||
public void run() {
|
||||
File downloadDir = new File(Config.getDownloadPath());
|
||||
List<File> targetDirList = new ArrayList<File>();
|
||||
|
||||
String[] list = downloadDir.list();
|
||||
if (list != null) {
|
||||
for (String str: list) {
|
||||
if (str.contains("-")) continue;
|
||||
File dir = new File(downloadDir, str);
|
||||
if (new File(dir, EhUtils.EH_DOWNLOAD_FILENAME).exists())
|
||||
targetDirList.add(dir);
|
||||
}
|
||||
}
|
||||
|
||||
if (targetDirList.size() == 0) {
|
||||
AppHandler.getInstance().post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
mFixDirname.setEnabled(true);
|
||||
MaterialToast.showToast("未发现可修正项"); // TODO
|
||||
}
|
||||
});
|
||||
return;
|
||||
} else {
|
||||
AppHandler.getInstance().post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
MaterialToast.showToast("开始修正"); // TODO
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
int handleNum = 0;
|
||||
List<File> dirs = new ArrayList<File>();
|
||||
List<Integer> gids = new ArrayList<Integer>();
|
||||
List<String> tokens = new ArrayList<String>();
|
||||
// Do get title from api
|
||||
for (int i = 0; i < targetDirList.size(); i++) {
|
||||
File dir = targetDirList.get(i);
|
||||
File info = new File(dir, EhUtils.EH_DOWNLOAD_FILENAME);
|
||||
InputStream is = null;
|
||||
int gid;
|
||||
String token;
|
||||
try {
|
||||
is = new BufferedInputStream(new FileInputStream(info),
|
||||
128);
|
||||
// skip read index
|
||||
Utils.readAsciiLine(is);
|
||||
gid = Integer.parseInt(Utils.readAsciiLine(is));
|
||||
token = Utils.readAsciiLine(is);
|
||||
Utils.closeQuietly(is);
|
||||
dirs.add(dir);
|
||||
gids.add(gid);
|
||||
tokens.add(token);
|
||||
// Post api when to 25 or the end
|
||||
if (gids.size() == 25 || i == targetDirList.size() - 1) {
|
||||
ApiGalleryInfo[] agiArray = EhClient.getInstance().getApiGalleryInfo(
|
||||
Utils.toIntArray(gids), tokens.toArray(new String[tokens.size()]));
|
||||
// Change dirname
|
||||
if (agiArray != null) {
|
||||
for (int j = 0; j < agiArray.length; j++) {
|
||||
ApiGalleryInfo agi = agiArray[j];
|
||||
if (agi != null) {
|
||||
handleNum++;
|
||||
|
||||
Log.d(TAG, dirs.get(j).getName());
|
||||
Log.d(TAG, EhUtils.generateGalleryDir(agi.gid, agi.title).getName());
|
||||
|
||||
dirs.get(j).renameTo(EhUtils.generateGalleryDir(agi.gid, agi.title));
|
||||
}
|
||||
}
|
||||
}
|
||||
dirs.clear();
|
||||
gids.clear();
|
||||
tokens.clear();
|
||||
// Wait for CD, if not last
|
||||
if (i != targetDirList.size() - 1)
|
||||
Thread.sleep(3000);
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
final int _handleNum = handleNum;
|
||||
AppHandler.getInstance().post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
mFixDirname.setEnabled(true);
|
||||
MaterialToast.showToast("共修正 " + _handleNum + " 项");
|
||||
}
|
||||
});
|
||||
}
|
||||
}.start();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public static class AboutFragment extends TranslucentPreferenceFragment
|
||||
|
||||
@@ -111,6 +111,14 @@ public class Config {
|
||||
mConfigPre.edit().putInt(key, value).apply();
|
||||
}
|
||||
|
||||
public static boolean getBoolean(String key, boolean defValue) {
|
||||
return mConfigPre.getBoolean(key, defValue);
|
||||
}
|
||||
|
||||
public static void setBoolean(String key, boolean value) {
|
||||
mConfigPre.edit().putBoolean(key, value).apply();
|
||||
}
|
||||
|
||||
|
||||
/****** For Normal Config ******/
|
||||
private static final String KEY_ALLOWED = "allowed";
|
||||
|
||||
@@ -18,19 +18,88 @@ package com.hippo.ehviewer.util;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import com.hippo.ehviewer.data.ListUrls;
|
||||
|
||||
public final class EhUtils {
|
||||
|
||||
public static final String EH_DOWNLOAD_FILENAME = ".ehviewer";
|
||||
|
||||
private static final int[] CATEGORY_VALUES = {
|
||||
ListUrls.MISC,
|
||||
ListUrls.DOUJINSHI,
|
||||
ListUrls.MANGA,
|
||||
ListUrls.ARTIST_CG,
|
||||
ListUrls.GAME_CG,
|
||||
ListUrls.IMAGE_SET,
|
||||
ListUrls.COSPLAY,
|
||||
ListUrls.ASIAN_PORN,
|
||||
ListUrls.NON_H,
|
||||
ListUrls.WESTERN,
|
||||
ListUrls.UNKNOWN
|
||||
};
|
||||
|
||||
// TODO How about "Private"
|
||||
private static final String[][] CATEGORY_STRINGS = {
|
||||
new String[]{"misc"},
|
||||
new String[]{"doujinshi"},
|
||||
new String[]{"manga"},
|
||||
new String[]{"artistcg", "Artist CG Sets"},
|
||||
new String[]{"gamecg", "Game CG Sets"},
|
||||
new String[]{"imageset", "Image Sets"},
|
||||
new String[]{"cosplay"},
|
||||
new String[]{"asianporn", "Asian Porn"},
|
||||
new String[]{"non-h"},
|
||||
new String[]{"western"},
|
||||
new String[]{"unknown"}
|
||||
};
|
||||
|
||||
public static int getCategory(String type) {
|
||||
int i;
|
||||
for (i = 0; i < CATEGORY_STRINGS.length - 1; i++) {
|
||||
for (String str : CATEGORY_STRINGS[i])
|
||||
if (str.equalsIgnoreCase(type))
|
||||
return CATEGORY_VALUES[i];
|
||||
}
|
||||
|
||||
return CATEGORY_VALUES[i];
|
||||
}
|
||||
|
||||
public static String getCategory(int type) {
|
||||
int i;
|
||||
for (i = 0; i < CATEGORY_VALUES.length - 1; i++) {
|
||||
if (CATEGORY_VALUES[i] == type)
|
||||
break;
|
||||
}
|
||||
return CATEGORY_STRINGS[i][0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get gallery for read and download
|
||||
* Gid is constant, but title may be changed
|
||||
* 非要标题,记一下 gid 不行么
|
||||
*
|
||||
* @param gid
|
||||
* @param title
|
||||
* @return
|
||||
*/
|
||||
public static File getGalleryDir(int gid) {
|
||||
return new File(Config.getDownloadPath(),
|
||||
public static File getGalleryDir(int gid, String title) {
|
||||
|
||||
File downloadDir = new File(Config.getDownloadPath());
|
||||
File gDir = new File(downloadDir,
|
||||
Utils.standardizeFilename(Integer.toString(gid)));
|
||||
|
||||
if (gDir.exists())
|
||||
return gDir;
|
||||
else
|
||||
return generateGalleryDir(gid, title);
|
||||
|
||||
// TODO check a dir start with the gid, but it may take a long time
|
||||
// Create a map to record all ?
|
||||
}
|
||||
|
||||
public static File generateGalleryDir(int gid, String title) {
|
||||
return new File(Config.getDownloadPath(),
|
||||
Utils.standardizeFilename(gid + "-" + title));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -26,6 +26,7 @@ import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
@@ -634,4 +635,15 @@ public final class Utils {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
public static int[] toIntArray(Collection<? extends Number> collection) {
|
||||
Object[] boxedArray = collection.toArray();
|
||||
int len = boxedArray.length;
|
||||
int[] array = new int[len];
|
||||
for (int i = 0; i < len; i++) {
|
||||
// checkNotNull for GWT (do not optimize)
|
||||
array[i] = ((Number) (boxedArray[i])).intValue();
|
||||
}
|
||||
return array;
|
||||
}
|
||||
}
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package com.hippo.ehviewer.widget;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.text.Layout;
|
||||
import android.text.Spannable;
|
||||
@@ -27,43 +28,44 @@ import android.view.MotionEvent;
|
||||
import android.widget.TextView;
|
||||
|
||||
public class LinkifyTextView extends TextView {
|
||||
|
||||
|
||||
private String mUrl;
|
||||
|
||||
|
||||
public LinkifyTextView(Context context) {
|
||||
super(context);
|
||||
init();
|
||||
}
|
||||
|
||||
|
||||
public LinkifyTextView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
init();
|
||||
}
|
||||
|
||||
|
||||
public LinkifyTextView(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
init();
|
||||
}
|
||||
|
||||
|
||||
public void init() {
|
||||
// Just make urls striking
|
||||
// LinkifyTextView itself should not handle touch url event
|
||||
setAutoLinkMask(Linkify.WEB_URLS);
|
||||
setLinksClickable(false);
|
||||
}
|
||||
|
||||
|
||||
public String getTouchedUrl() {
|
||||
return mUrl;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Call it when you do not need the url any more
|
||||
*/
|
||||
public void clearTouchedUrl() {
|
||||
mUrl = null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
public boolean onTouchEvent(MotionEvent event) {
|
||||
if (getText() instanceof Spannable) {
|
||||
// Get this code from android.text.method.LinkMovementMethod.
|
||||
@@ -71,19 +73,19 @@ public class LinkifyTextView extends TextView {
|
||||
int x = (int) event.getX();
|
||||
int y = (int) event.getY();
|
||||
boolean isGetUrl = false;
|
||||
|
||||
|
||||
x -= getTotalPaddingLeft();
|
||||
y -= getTotalPaddingTop();
|
||||
|
||||
|
||||
x += getScrollX();
|
||||
y += getScrollY();
|
||||
|
||||
|
||||
Layout layout = getLayout();
|
||||
int line = layout.getLineForVertical(y);
|
||||
int off = layout.getOffsetForHorizontal(line, x);
|
||||
|
||||
|
||||
ClickableSpan[] links = ((Spannable)getText()).getSpans(off, off, ClickableSpan.class);
|
||||
|
||||
|
||||
for (ClickableSpan link : links) {
|
||||
if (link instanceof URLSpan) {
|
||||
mUrl = ((URLSpan)link).getURL();
|
||||
@@ -96,7 +98,7 @@ public class LinkifyTextView extends TextView {
|
||||
} else {
|
||||
mUrl = null;
|
||||
}
|
||||
|
||||
|
||||
return super.onTouchEvent(event);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user