添加修改下载文件夹为 gid-title 入口

This commit is contained in:
seven332 committed 2014-10-12 22:43:53 +08:00
1 parent a7a3d56c91
commit 0ed34f2eca
16 files changed
+409 -266

No files matched your search

+3
View File
@@ -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>
+9
View File
@@ -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>
+2 -12
View File
@@ -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));
+146 -214
View File
@@ -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://"
+16 -14
View File
@@ -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)
+115 -1
View File
@@ -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
+8
View File
@@ -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";
+71 -2
View File
@@ -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));
}
/**
+12
View File
@@ -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);
}
}