使用数据库存储 local favourite
This commit is contained in:
1 parent
34181ce370
commit
d2e083922e
18 files changed
+377
-575
No files matched your search
+1
-1
@@ -2,7 +2,7 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.hippo.ehviewer"
|
||||
android:versionCode="15"
|
||||
android:versionName="0.4.0" >
|
||||
android:versionName="0.4.5" >
|
||||
|
||||
<uses-sdk
|
||||
android:minSdkVersion="14"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.hippo.ehviewer"
|
||||
android:versionCode="15"
|
||||
android:versionName="0.4.0" >
|
||||
android:versionName="0.4.5" >
|
||||
|
||||
<uses-sdk
|
||||
android:minSdkVersion="14"
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
-1
@@ -1,5 +1,5 @@
|
||||
# cache for current jar dependency. DO NOT EDIT.
|
||||
# format is <lastModified> <length> <SHA-1> <path>
|
||||
# Encoding is UTF-8
|
||||
1397228709198 627582 db0f122c99ef9f90dbab3fada6d191f2880cbb8e E:\code\SlidingMenu\library\libs\android-support-v4.jar
|
||||
1389885111965 627582 db0f122c99ef9f90dbab3fada6d191f2880cbb8e E:\code\SlidingMenu\library\libs\android-support-v4.jar
|
||||
1389885111965 627582 db0f122c99ef9f90dbab3fada6d191f2880cbb8e E:\Android\code\EhViewer\libs\android-support-v4.jar
|
||||
Binary file not shown.
@@ -10,8 +10,6 @@ import com.hippo.ehviewer.util.Config;
|
||||
import com.hippo.ehviewer.util.Crash;
|
||||
import com.hippo.ehviewer.util.Download;
|
||||
import com.hippo.ehviewer.util.EhClient;
|
||||
import com.hippo.ehviewer.util.Favourite;
|
||||
import com.hippo.ehviewer.util.Tag;
|
||||
import com.hippo.ehviewer.util.ThreadPool;
|
||||
import com.hippo.ehviewer.util.Ui;
|
||||
|
||||
@@ -39,9 +37,9 @@ public class AppContext extends Application implements UncaughtExceptionHandler
|
||||
Config.init(this);
|
||||
Ui.init(this);
|
||||
Cache.init(this);
|
||||
Favourite.init(this);
|
||||
//Favourite.init(this);
|
||||
Crash.init(this);
|
||||
Tag.init(this);
|
||||
//Tag.init(this);
|
||||
BeautifyScreen.init(this);
|
||||
mEhClient = new EhClient(this);
|
||||
Download.init(this);
|
||||
@@ -61,6 +59,10 @@ public class AppContext extends Application implements UncaughtExceptionHandler
|
||||
return mNetworkThreadPool;
|
||||
}
|
||||
|
||||
public Data getData() {
|
||||
return mData;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void uncaughtException(Thread thread, Throwable ex) {
|
||||
if (!handleException(ex) && mDefaultHandler != null) {
|
||||
|
||||
@@ -8,6 +8,11 @@ public class Tag extends ListUrls {
|
||||
mName = name;
|
||||
}
|
||||
|
||||
public Tag(String name, ListUrls lus) {
|
||||
this(name, lus.getType(), lus.getSearch());
|
||||
this.setAdvance(lus.getAdvanceType(), lus.getMinRating());
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
mName = name;
|
||||
}
|
||||
|
||||
@@ -15,7 +15,6 @@ import com.hippo.ehviewer.util.Cache;
|
||||
import com.hippo.ehviewer.util.Config;
|
||||
import com.hippo.ehviewer.util.Download;
|
||||
import com.hippo.ehviewer.util.EhClient;
|
||||
import com.hippo.ehviewer.util.Favourite;
|
||||
import com.hippo.ehviewer.util.Util;
|
||||
import com.hippo.ehviewer.view.AlertButton;
|
||||
import com.hippo.ehviewer.view.DownloadItemLayout;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.hippo.ehviewer.activity;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
@@ -25,16 +26,17 @@ import android.widget.AdapterView.OnItemClickListener;
|
||||
import android.widget.AdapterView.OnItemLongClickListener;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.hippo.ehviewer.AppContext;
|
||||
import com.hippo.ehviewer.BeautifyScreen;
|
||||
import com.hippo.ehviewer.GalleryInfo;
|
||||
import com.hippo.ehviewer.ImageLoadManager;
|
||||
import com.hippo.ehviewer.R;
|
||||
import com.hippo.ehviewer.data.Data;
|
||||
import com.hippo.ehviewer.service.DownloadService;
|
||||
import com.hippo.ehviewer.service.DownloadServiceConnection;
|
||||
import com.hippo.ehviewer.util.Cache;
|
||||
import com.hippo.ehviewer.util.Config;
|
||||
import com.hippo.ehviewer.util.EhClient;
|
||||
import com.hippo.ehviewer.util.Favourite;
|
||||
import com.hippo.ehviewer.util.Ui;
|
||||
import com.hippo.ehviewer.view.AlertButton;
|
||||
import com.hippo.ehviewer.view.OlImageView;
|
||||
@@ -44,8 +46,11 @@ import com.hippo.ehviewer.widget.LoadImageView;
|
||||
public class FavouriteActivity extends Activity{
|
||||
private static final String TAG = "FavouriteActivity";
|
||||
|
||||
private AppContext mAppContext;
|
||||
private Data mData;
|
||||
|
||||
private FlAdapter flAdapter;
|
||||
private ArrayList<GalleryInfo> mFavouriteLmd;
|
||||
private List<GalleryInfo> mFavouriteLmd;
|
||||
private int longClickItemIndex;
|
||||
|
||||
private ImageLoadManager mImageLoadManager;
|
||||
@@ -63,7 +68,7 @@ public class FavouriteActivity extends Activity{
|
||||
int position, long arg3) {
|
||||
switch (position) {
|
||||
case 0: // Remove favourite item
|
||||
Favourite.remove(longClickItemIndex);
|
||||
mData.deleteLocalFavourite(mFavouriteLmd.get(longClickItemIndex).gid);
|
||||
flAdapter.notifyDataSetChanged();
|
||||
break;
|
||||
case 1:
|
||||
@@ -163,6 +168,9 @@ public class FavouriteActivity extends Activity{
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.favourite);
|
||||
|
||||
mAppContext = (AppContext)getApplication();
|
||||
mData = mAppContext.getData();
|
||||
|
||||
int screenOri = Config.getScreenOriMode();
|
||||
if (screenOri != getRequestedOrientation())
|
||||
setRequestedOrientation(screenOri);
|
||||
@@ -182,7 +190,7 @@ public class FavouriteActivity extends Activity{
|
||||
BeautifyScreen.ColourfyScreen(this);
|
||||
}
|
||||
|
||||
mFavouriteLmd = Favourite.getFavouriteList();
|
||||
mFavouriteLmd = mData.getAllLocalFavourites();
|
||||
|
||||
ListView listView = (ListView)findViewById(R.id.favourite);
|
||||
flAdapter = new FlAdapter();
|
||||
|
||||
@@ -9,12 +9,12 @@ import com.hippo.ehviewer.GalleryInfo;
|
||||
import com.hippo.ehviewer.ListUrls;
|
||||
import com.hippo.ehviewer.PageList;
|
||||
import com.hippo.ehviewer.R;
|
||||
import com.hippo.ehviewer.data.Data;
|
||||
import com.hippo.ehviewer.service.DownloadService;
|
||||
import com.hippo.ehviewer.service.DownloadServiceConnection;
|
||||
import com.hippo.ehviewer.util.Cache;
|
||||
import com.hippo.ehviewer.util.Config;
|
||||
import com.hippo.ehviewer.util.EhClient;
|
||||
import com.hippo.ehviewer.util.Favourite;
|
||||
import com.hippo.ehviewer.util.Ui;
|
||||
import com.hippo.ehviewer.util.Util;
|
||||
import com.hippo.ehviewer.view.OlImageView;
|
||||
@@ -65,6 +65,7 @@ public class MangaDetailActivity extends Activity {
|
||||
public static final String KEY_G_INFO = "gallery_info";
|
||||
|
||||
private AppContext mAppContext;
|
||||
private Data mData;
|
||||
private EhClient mEhClient;
|
||||
|
||||
private String url;
|
||||
@@ -450,6 +451,7 @@ public class MangaDetailActivity extends Activity {
|
||||
|
||||
mAppContext = (AppContext)getApplication();
|
||||
mEhClient = mAppContext.getEhClient();
|
||||
mData = mAppContext.getData();
|
||||
|
||||
int screenOri = Config.getScreenOriMode();
|
||||
if (screenOri != getRequestedOrientation())
|
||||
@@ -645,7 +647,7 @@ public class MangaDetailActivity extends Activity {
|
||||
finish();
|
||||
return true;
|
||||
case R.id.action_favourite:
|
||||
Favourite.push(mangaDetail);
|
||||
mData.addLocalFavourite(mangaDetail);
|
||||
Toast.makeText(MangaDetailActivity.this,
|
||||
getString(R.string.toast_add_favourite),
|
||||
Toast.LENGTH_SHORT).show();
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.hippo.ehviewer.activity;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.hippo.ehviewer.AppContext;
|
||||
import com.hippo.ehviewer.BeautifyScreen;
|
||||
@@ -9,16 +10,16 @@ import com.hippo.ehviewer.GalleryInfo;
|
||||
import com.hippo.ehviewer.ImageLoadManager;
|
||||
import com.hippo.ehviewer.ListUrls;
|
||||
import com.hippo.ehviewer.R;
|
||||
import com.hippo.ehviewer.Tag;
|
||||
import com.hippo.ehviewer.UpdateHelper;
|
||||
import com.hippo.ehviewer.data.Data;
|
||||
import com.hippo.ehviewer.network.Downloader;
|
||||
import com.hippo.ehviewer.service.DownloadService;
|
||||
import com.hippo.ehviewer.service.DownloadServiceConnection;
|
||||
import com.hippo.ehviewer.util.Cache;
|
||||
import com.hippo.ehviewer.util.Config;
|
||||
import com.hippo.ehviewer.util.EhClient;
|
||||
import com.hippo.ehviewer.util.Favourite;
|
||||
import com.hippo.ehviewer.util.Log;
|
||||
import com.hippo.ehviewer.util.Tag;
|
||||
import com.hippo.ehviewer.util.Ui;
|
||||
import com.hippo.ehviewer.util.Util;
|
||||
import com.hippo.ehviewer.view.AlertButton;
|
||||
@@ -111,6 +112,7 @@ public class MangaListActivity extends SlidingActivity {
|
||||
|
||||
private ImageLoadManager mImageLoadManager;
|
||||
|
||||
private Data mData;
|
||||
|
||||
private int longClickItemIndex;
|
||||
|
||||
@@ -237,11 +239,10 @@ public class MangaListActivity extends SlidingActivity {
|
||||
@Override
|
||||
public void onSetVaildName(String newName) {
|
||||
((AlertButton)v).dialog.dismiss();
|
||||
if (Tag.add(newName, getLus(filterDialog))) {
|
||||
listMenuTitle.add(newName);
|
||||
tagsAdapter.addId(newName);
|
||||
tagsAdapter.notifyDataSetChanged();
|
||||
}
|
||||
mData.addTag(new Tag(newName, getLus(filterDialog)));
|
||||
listMenuTitle.add(newName);
|
||||
tagsAdapter.addId(newName);
|
||||
tagsAdapter.notifyDataSetChanged();
|
||||
}
|
||||
})
|
||||
.show();
|
||||
@@ -361,7 +362,7 @@ public class MangaListActivity extends SlidingActivity {
|
||||
switch (position) {
|
||||
case 0: // Add favourite item
|
||||
lmd = lmdArray.get(longClickItemIndex);
|
||||
Favourite.push(lmd);
|
||||
mData.addLocalFavourite(lmd);
|
||||
Toast.makeText(MangaListActivity.this,
|
||||
getString(R.string.toast_add_favourite),
|
||||
Toast.LENGTH_SHORT).show();
|
||||
@@ -502,7 +503,7 @@ public class MangaListActivity extends SlidingActivity {
|
||||
private AlertDialog createModifyTagDialog(final int position) {
|
||||
LayoutInflater inflater = this.getLayoutInflater();
|
||||
final View view = inflater.inflate(R.layout.filter, null);
|
||||
ListUrls listUrls = Tag.get(position - mStableItemCount);
|
||||
ListUrls listUrls = mData.getTag(position - mStableItemCount);
|
||||
setFilterView(view, listUrls);
|
||||
final View advance = view.findViewById(R.id.filter_advance);
|
||||
CheckBox cb = (CheckBox)view.findViewById(R.id.checkbox_advance);
|
||||
@@ -528,13 +529,13 @@ public class MangaListActivity extends SlidingActivity {
|
||||
ListUrls listUrls = getLus(view);
|
||||
if (newTagName != null) {
|
||||
tagsAdapter.set(listMenuTitle.get(position), newTagName);
|
||||
Tag.set(position - mStableItemCount, newTagName, listUrls);
|
||||
mData.setTag(position - mStableItemCount, new Tag(newTagName, listUrls));
|
||||
listMenuTitle.set(position, newTagName);
|
||||
tagsAdapter.notifyDataSetChanged();
|
||||
|
||||
newTagName = null;
|
||||
} else
|
||||
Tag.set(position - mStableItemCount, listUrls);
|
||||
mData.setTag(position - mStableItemCount, new Tag(listMenuTitle.get(position), listUrls));
|
||||
}
|
||||
}).setNegativeButton(android.R.string.cancel, new View.OnClickListener() {
|
||||
@Override
|
||||
@@ -1060,6 +1061,7 @@ public class MangaListActivity extends SlidingActivity {
|
||||
});
|
||||
|
||||
mAppContext = (AppContext)getApplication();
|
||||
mData = mAppContext.getData();
|
||||
mEhClient = mAppContext.getEhClient();
|
||||
|
||||
int screenOri = Config.getScreenOriMode();
|
||||
@@ -1123,14 +1125,15 @@ public class MangaListActivity extends SlidingActivity {
|
||||
mStableItemCount = menuTitles.length;
|
||||
for (int i = 0; i < menuTitles.length; i++)
|
||||
listMenuTitle.add(menuTitles[i]);
|
||||
ArrayList<String> keys = Tag.getKeyList();
|
||||
|
||||
List<String> keys = mData.getAllTagNames();
|
||||
|
||||
for (int i = 0; i < keys.size(); i++)
|
||||
listMenuTitle.add(keys.get(i));
|
||||
tagsAdapter = new TagsAdapter(this, R.layout.menu_item, listMenuTitle);
|
||||
listMenu.setAdapter(tagsAdapter);
|
||||
listMenu.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
|
||||
listMenu.setStableItemCount(mStableItemCount);
|
||||
listMenu.setItemList(listMenuTitle);
|
||||
listMenu.setOnItemClickListener(new OnItemClickListener() {
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> arg0, View arg1,
|
||||
@@ -1151,7 +1154,7 @@ public class MangaListActivity extends SlidingActivity {
|
||||
startActivity(intent);
|
||||
showContent();
|
||||
} else if (position >= mStableItemCount){
|
||||
ListUrls listUrls = Tag.get(listMenuTitle.get(position));
|
||||
ListUrls listUrls = mData.getTag(position - mStableItemCount);
|
||||
if (listUrls != null && refresh(listUrls, listMenuTitle.get(position)))
|
||||
showContent();
|
||||
}
|
||||
@@ -1163,6 +1166,28 @@ public class MangaListActivity extends SlidingActivity {
|
||||
createModifyTagDialog(position).show();
|
||||
}
|
||||
});
|
||||
listMenu.setOnSwapListener(new TagListView.OnSwapListener() {
|
||||
@Override
|
||||
public void onSwap(int positionOne, int positionTwo) {
|
||||
String temp = listMenuTitle.get(positionOne);
|
||||
listMenuTitle.set(positionOne, listMenuTitle.get(positionTwo));
|
||||
listMenuTitle.set(positionTwo, temp);
|
||||
tagsAdapter.notifyDataSetChanged();
|
||||
|
||||
mData.swapTag(positionOne - mStableItemCount, positionTwo - mStableItemCount);
|
||||
}
|
||||
});
|
||||
listMenu.setOnDeleteListener(new TagListView.OnDeleteListener() {
|
||||
@Override
|
||||
public void onDelete(int position) {
|
||||
String removeItem = listMenuTitle.remove(position);
|
||||
tagsAdapter.remove(removeItem);
|
||||
tagsAdapter.notifyDataSetChanged();
|
||||
|
||||
mData.deleteTag(position - mStableItemCount);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// is Exhentai
|
||||
final String[] isExhentaiListTitle = getResources().getStringArray(R.array.is_exhentai);
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
package com.hippo.ehviewer.data;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.hippo.ehviewer.GalleryInfo;
|
||||
import com.hippo.ehviewer.ListUrls;
|
||||
import com.hippo.ehviewer.Tag;
|
||||
import com.hippo.ehviewer.util.Util;
|
||||
@@ -13,6 +16,7 @@ import android.database.Cursor;
|
||||
import android.database.DatabaseUtils;
|
||||
import android.database.sqlite.SQLiteDatabase;
|
||||
import android.database.sqlite.SQLiteOpenHelper;
|
||||
import android.util.Log;
|
||||
|
||||
/**
|
||||
* @author Hippo
|
||||
@@ -20,6 +24,7 @@ import android.database.sqlite.SQLiteOpenHelper;
|
||||
*/
|
||||
|
||||
public class Data {
|
||||
private static final String TAG = "Data";
|
||||
|
||||
private static final int mVersion = 1;
|
||||
private static final String DB_NAME = "data";
|
||||
@@ -35,7 +40,7 @@ public class Data {
|
||||
private static final String COLUMN_POSTED = "posted";
|
||||
private static final String COLUMN_CATEGORY = "category";
|
||||
private static final String COLUMN_THUMB = "thumb";
|
||||
private static final String COLUMN_UPLODER = "uploder";
|
||||
private static final String COLUMN_UPLOADER = "uploader";
|
||||
private static final String COLUMN_RATING = "rating";
|
||||
private static final String COLUMN_REFERENCE = "reference";
|
||||
|
||||
@@ -45,8 +50,12 @@ public class Data {
|
||||
private static final String COLUMN_ADVANCE = "advance";
|
||||
private static final String COLUMN_MIN_RATING = "min_rating";
|
||||
|
||||
private Map<String, GalleryInfo> mGallerys;
|
||||
|
||||
private long tagRowNum;
|
||||
private List<Tag> mTags = new ArrayList<Tag>();
|
||||
private List<Tag> mTags;
|
||||
|
||||
private List<GalleryInfo> mLocalFavourites;
|
||||
|
||||
private Context mContext;
|
||||
|
||||
@@ -58,7 +67,10 @@ public class Data {
|
||||
mDBHelper = new DBHelper(mContext);
|
||||
mDatabase = mDBHelper.getWritableDatabase();
|
||||
|
||||
mGallerys = new HashMap<String, GalleryInfo>();
|
||||
|
||||
getTags();
|
||||
getLocalFavourites();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -66,8 +78,201 @@ public class Data {
|
||||
mDBHelper.close();
|
||||
}
|
||||
|
||||
/****** TAG ******/
|
||||
private synchronized List<Tag> getTags() {
|
||||
/****** gallery ******/
|
||||
public GalleryInfo getGallery(String gid) {
|
||||
GalleryInfo galleryInfo = mGallerys.get(gid);
|
||||
if (galleryInfo == null) {
|
||||
Cursor cursor = mDatabase.rawQuery("select * from " + TABLE_GALLERY + " where " + COLUMN_GID + "=?",
|
||||
new String[]{gid});
|
||||
if (cursor.moveToFirst()) {
|
||||
galleryInfo = new GalleryInfo();
|
||||
galleryInfo.gid = gid;
|
||||
galleryInfo.token = cursor.getString(1);
|
||||
galleryInfo.title = cursor.getString(2);
|
||||
galleryInfo.posted = cursor.getString(3);
|
||||
galleryInfo.category = cursor.getInt(4);
|
||||
galleryInfo.thumb = cursor.getString(5);
|
||||
galleryInfo.uploader = cursor.getString(6);
|
||||
galleryInfo.rating = cursor.getString(7);
|
||||
|
||||
// add to map
|
||||
mGallerys.put(gid, galleryInfo);
|
||||
}
|
||||
}
|
||||
return galleryInfo;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private synchronized boolean containsGallery(String gid) {
|
||||
boolean re = false;
|
||||
Cursor cursor = mDatabase.rawQuery("select * from "
|
||||
+ TABLE_GALLERY + " where " + COLUMN_GID + "=?",
|
||||
new String[]{gid});
|
||||
if (cursor.moveToFirst())
|
||||
re = true;
|
||||
cursor.close();
|
||||
return re;
|
||||
}
|
||||
|
||||
/**
|
||||
* If do not contain the gallery return -1;
|
||||
* @param gid
|
||||
* @return
|
||||
*/
|
||||
private synchronized int getGalleryReference(String gid) {
|
||||
int reference = -1;
|
||||
Cursor cursor = mDatabase.rawQuery("select " + COLUMN_REFERENCE + " from "
|
||||
+ TABLE_GALLERY + " where " + COLUMN_GID + "=?",
|
||||
new String[]{gid});
|
||||
if (cursor.moveToFirst()) {
|
||||
reference = cursor.getInt(0);
|
||||
}
|
||||
cursor.close();
|
||||
return reference;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* If exits same gid, add the reference by 1.
|
||||
* If exits no same gid, add it to table reference is 1
|
||||
*
|
||||
* @param galleryInfo
|
||||
* @param isUpdate
|
||||
*/
|
||||
private void addGallery(GalleryInfo galleryInfo, boolean isUpdate) {
|
||||
boolean isInsert;
|
||||
String gid = galleryInfo.gid;
|
||||
// add to map
|
||||
mGallerys.put(gid, galleryInfo);
|
||||
|
||||
// add to sql or update and add reference by 1
|
||||
int reference;
|
||||
if ((reference = getGalleryReference(gid)) != -1) {
|
||||
isInsert = false;
|
||||
if (!isUpdate)
|
||||
reference++;
|
||||
}
|
||||
else {
|
||||
isInsert = true;
|
||||
reference = 1;
|
||||
}
|
||||
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(COLUMN_GID, gid);
|
||||
values.put(COLUMN_TOKEN, galleryInfo.token);
|
||||
values.put(COLUMN_TITLE, galleryInfo.title);
|
||||
values.put(COLUMN_POSTED, galleryInfo.posted);
|
||||
values.put(COLUMN_CATEGORY, galleryInfo.category);
|
||||
values.put(COLUMN_THUMB, galleryInfo.thumb);
|
||||
values.put(COLUMN_UPLOADER, galleryInfo.uploader);
|
||||
values.put(COLUMN_RATING, galleryInfo.rating);
|
||||
values.put(COLUMN_REFERENCE, reference);
|
||||
|
||||
if (isInsert) { // Set
|
||||
mDatabase.insert(TABLE_GALLERY, null, values);
|
||||
} else { // Update
|
||||
mDatabase.update(TABLE_GALLERY, values, COLUMN_GID + "=?", new String[]{gid});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* decrease reference by 1, only delete when reference is 0
|
||||
* @param gid
|
||||
*/
|
||||
private void deleteGallery(String gid) {
|
||||
int reference = getGalleryReference(gid);
|
||||
if (reference == -1) {
|
||||
Log.w(TAG, "Can't get reference when deleteGallery, gid is " + gid);
|
||||
return;
|
||||
}
|
||||
reference--;
|
||||
if (reference == 0) { // delete gallery
|
||||
mDatabase.delete(TABLE_GALLERY, COLUMN_GID + "=?", new String[]{gid});
|
||||
} else { // update reference
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(COLUMN_REFERENCE, reference);
|
||||
mDatabase.update(TABLE_GALLERY, values, COLUMN_GID + "=?", new String[]{gid});
|
||||
}
|
||||
}
|
||||
|
||||
/****** local favourite ******/
|
||||
private synchronized void getLocalFavourites() {
|
||||
mLocalFavourites = new ArrayList<GalleryInfo>();
|
||||
Cursor cursor = mDatabase.rawQuery("select * from "
|
||||
+ TABLE_LOCAL_FAVOURITE, null);
|
||||
|
||||
List<String> invaildGids = new ArrayList<String>();
|
||||
|
||||
if (cursor.moveToFirst()) {
|
||||
while (!cursor.isAfterLast()) {
|
||||
String gid = cursor.getString(0);
|
||||
GalleryInfo galleryInfo = getGallery(gid);
|
||||
if (galleryInfo == null) {
|
||||
invaildGids.add(gid);
|
||||
} else {
|
||||
mLocalFavourites.add(galleryInfo);
|
||||
}
|
||||
cursor.moveToNext();
|
||||
}
|
||||
}
|
||||
cursor.close();
|
||||
|
||||
// remove invail gid
|
||||
for (String invaildGid : invaildGids) {
|
||||
mDatabase.delete(TABLE_LOCAL_FAVOURITE, COLUMN_GID + "=?",
|
||||
new String[]{String.valueOf(invaildGid)});
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized boolean containsLocalFavourite(String gid) {
|
||||
boolean re = false;
|
||||
Cursor cursor = mDatabase.rawQuery("select * from "
|
||||
+ TABLE_LOCAL_FAVOURITE + " where " + COLUMN_GID + "=?",
|
||||
new String[]{gid});
|
||||
if (cursor.moveToFirst())
|
||||
re = true;
|
||||
cursor.close();
|
||||
return re;
|
||||
}
|
||||
|
||||
/**
|
||||
* galleryInfo can't be null
|
||||
* @param galleryInfo
|
||||
*/
|
||||
public synchronized void addLocalFavourite(GalleryInfo galleryInfo) {
|
||||
// add to sql
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(COLUMN_GID, galleryInfo.gid);
|
||||
boolean isUpdate = mDatabase.insert(
|
||||
TABLE_LOCAL_FAVOURITE, null, values) == -1;
|
||||
addGallery(galleryInfo, isUpdate);
|
||||
|
||||
// add to list
|
||||
if (!isUpdate)
|
||||
mLocalFavourites.add(galleryInfo);
|
||||
}
|
||||
|
||||
public synchronized void deleteLocalFavourite(String gid) {
|
||||
// delete from list
|
||||
for (GalleryInfo galleryInfo : mLocalFavourites) {
|
||||
if (galleryInfo.gid.equals(gid)) {
|
||||
mLocalFavourites.remove(galleryInfo);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// delete from sql
|
||||
mDatabase.delete(TABLE_LOCAL_FAVOURITE, COLUMN_GID + "=?", new String[]{gid});
|
||||
deleteGallery(gid);
|
||||
}
|
||||
|
||||
public synchronized List<GalleryInfo> getAllLocalFavourites() {
|
||||
return mLocalFavourites;
|
||||
}
|
||||
|
||||
|
||||
/****** tag ******/
|
||||
private synchronized void getTags() {
|
||||
mTags = new ArrayList<Tag>();
|
||||
tagRowNum = 0;
|
||||
Cursor cursor = mDatabase.rawQuery("select * from " + TABLE_TAG
|
||||
@@ -90,13 +295,13 @@ public class Data {
|
||||
tagRowNum++;
|
||||
}
|
||||
}
|
||||
return mTags;
|
||||
cursor.close();
|
||||
}
|
||||
|
||||
public synchronized boolean addTag(String name, Tag tag) {
|
||||
public synchronized boolean addTag(Tag tag) {
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(COLUMN_ID, tagRowNum);
|
||||
values.put(COLUMN_NAME, name);
|
||||
values.put(COLUMN_NAME, tag.getName());
|
||||
values.put(COLUMN_CATEGORY, tag.getType());
|
||||
values.put(COLUMN_SEARCH, tag.getSearch());
|
||||
values.put(COLUMN_ADVANCE, tag.getAdvanceType());
|
||||
@@ -111,15 +316,65 @@ public class Data {
|
||||
return ok;
|
||||
}
|
||||
|
||||
public synchronized void deleteTag(int id) {
|
||||
public synchronized boolean deleteTag(int id) {
|
||||
int deleteNum = mDatabase.delete(TABLE_TAG, COLUMN_ID + "=?", new String[]{String.valueOf(id)});
|
||||
if (deleteNum > 1)
|
||||
Log.e(TAG, "WTF? more than one id is " + id);
|
||||
|
||||
if (deleteNum == 0)
|
||||
return false;
|
||||
if (id < 0 || id >= mTags.size()) {
|
||||
Log.e(TAG, "id is out of bounds, id is " + id + ", mTags.size() is " + mTags.size());
|
||||
return false;
|
||||
}
|
||||
|
||||
// Update sql
|
||||
ContentValues values = new ContentValues();
|
||||
for (int i = id + 1; i < tagRowNum; i++) {
|
||||
values.put(COLUMN_ID, i - 1);
|
||||
mDatabase.update(TABLE_TAG, values, COLUMN_ID + "=?", new String[]{String.valueOf(i)});
|
||||
}
|
||||
tagRowNum -= deleteNum;
|
||||
|
||||
// Update list
|
||||
mTags.remove(id);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public List<Tag> getAllTags() {
|
||||
public synchronized List<Tag> getAllTags() {
|
||||
return mTags;
|
||||
}
|
||||
|
||||
public synchronized Tag getTag(int location) {
|
||||
return mTags.get(location);
|
||||
}
|
||||
|
||||
public synchronized List<String> getAllTagNames() {
|
||||
List<String> names = new ArrayList<String>();
|
||||
for (Tag tag : mTags)
|
||||
names.add(tag.getName());
|
||||
return names;
|
||||
}
|
||||
|
||||
public synchronized void setTag(int location, Tag tag) {
|
||||
if (location == tagRowNum) {
|
||||
addTag(tag);
|
||||
} else {
|
||||
// Update list
|
||||
mTags.set(location, tag);
|
||||
|
||||
// Update sql
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(COLUMN_NAME, tag.getName());
|
||||
values.put(COLUMN_CATEGORY, tag.getType());
|
||||
values.put(COLUMN_SEARCH, tag.getSearch());
|
||||
values.put(COLUMN_ADVANCE, tag.getAdvanceType());
|
||||
values.put(COLUMN_MIN_RATING, tag.getMinRating());
|
||||
mDatabase.update(TABLE_TAG, values, COLUMN_ID + "=?", new String[]{String.valueOf(location)});
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized boolean swapTag(int indexOne, int indexTwo) {
|
||||
if (indexOne < 0 || indexOne > tagRowNum
|
||||
|| indexTwo < 0 || indexTwo > tagRowNum)
|
||||
@@ -139,12 +394,10 @@ public class Data {
|
||||
values.put(COLUMN_ID, indexOne);
|
||||
mDatabase.update(TABLE_TAG, values, COLUMN_ID + "=?", new String[]{String.valueOf(indexTwo)});
|
||||
values.put(COLUMN_ID, indexTwo);
|
||||
mDatabase.update(TABLE_TAG, values, COLUMN_ID + "=?", new String[]{String.valueOf(indexOne)});
|
||||
mDatabase.update(TABLE_TAG, values, COLUMN_ID + "=?", new String[]{String.valueOf(-1)});
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public class DBHelper extends SQLiteOpenHelper {
|
||||
|
||||
public DBHelper(Context context) {
|
||||
@@ -153,6 +406,7 @@ public class Data {
|
||||
|
||||
@Override
|
||||
public void onCreate(SQLiteDatabase db) {
|
||||
// gallery
|
||||
String CreateGallery = "create table " + TABLE_GALLERY + "("
|
||||
+ "gid text primary key,"
|
||||
+ "token text,"
|
||||
@@ -160,21 +414,24 @@ public class Data {
|
||||
+ "posted text,"
|
||||
+ "category integer,"
|
||||
+ "thumb text,"
|
||||
+ "uploder text,"
|
||||
+ "uploader text,"
|
||||
+ "rating text,"
|
||||
+ "reference integer);";
|
||||
db.execSQL(CreateGallery);
|
||||
|
||||
// read
|
||||
String CreateRead = "create table "
|
||||
+ TABLE_READ + "("
|
||||
+ "gid text primary key);";
|
||||
db.execSQL(CreateRead);
|
||||
|
||||
// local favourite
|
||||
String CreateLocalFavourite = "create table "
|
||||
+ TABLE_LOCAL_FAVOURITE + "("
|
||||
+ "gid text primary key);";
|
||||
db.execSQL(CreateLocalFavourite);
|
||||
|
||||
// tag
|
||||
String CreateTag = "create table "
|
||||
+ TABLE_TAG + "("
|
||||
+ "id integer primary key,"
|
||||
|
||||
@@ -1,212 +0,0 @@
|
||||
package com.hippo.ehviewer.util;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.OptionalDataException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.hippo.ehviewer.GalleryInfo;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
|
||||
public class Favourite {
|
||||
//private static final String TAG = "Favourite";
|
||||
|
||||
private static final String SHA_PRE_NAME = "favourite";
|
||||
private static final String LIST_ORDER = "list_order";
|
||||
|
||||
private static Context mContext;
|
||||
private static SharedPreferences mFavouritePre;
|
||||
//private static boolean isLru = false; // TODO float the last read favourite item
|
||||
private static ArrayList<String> mListOrder = null;
|
||||
private static ArrayList<GalleryInfo> mFavouriteLmd = null;
|
||||
|
||||
private static boolean mInit = false;
|
||||
|
||||
/**
|
||||
* Init Favourite
|
||||
*
|
||||
* @param context Application context
|
||||
*/
|
||||
public static void init(Context context) {
|
||||
if (mInit)
|
||||
return;
|
||||
mInit = true;
|
||||
|
||||
mContext = context;
|
||||
mFavouritePre = mContext.getSharedPreferences(SHA_PRE_NAME, 0);
|
||||
|
||||
getFavourite();
|
||||
}
|
||||
|
||||
/**
|
||||
* Is init
|
||||
* @return True if init
|
||||
*/
|
||||
public static boolean isInit() {
|
||||
return mInit;
|
||||
}
|
||||
|
||||
private static void getFavourite() {
|
||||
mListOrder = new ArrayList<String>();
|
||||
mFavouriteLmd = new ArrayList<GalleryInfo>();
|
||||
String[] allOrder = Util.getStrings(mFavouritePre, LIST_ORDER);
|
||||
|
||||
if (allOrder == null)
|
||||
return;
|
||||
|
||||
boolean errorFlag = false;
|
||||
for (String item : allOrder) {
|
||||
mListOrder.add(item);
|
||||
String strLmd = mFavouritePre.getString(item, null);
|
||||
if (strLmd == null) {
|
||||
mListOrder.remove(strLmd);
|
||||
errorFlag = true;
|
||||
continue;
|
||||
}
|
||||
mFavouriteLmd.add(decodeLmd(strLmd));
|
||||
}
|
||||
if (errorFlag)
|
||||
Util.putStrings(mFavouritePre, LIST_ORDER, mListOrder);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new favourite item to the top of favourite list
|
||||
*
|
||||
* @param lmd
|
||||
* @return True if push successfully
|
||||
*/
|
||||
public static boolean push(GalleryInfo lmd) {
|
||||
if (!mInit) {
|
||||
throw new IllegalStateException("Please init Favourite first.");
|
||||
}
|
||||
// Check contain this item or not
|
||||
int oldIndex;
|
||||
if ((oldIndex = mListOrder.indexOf(lmd.gid)) != -1) {
|
||||
mListOrder.remove(oldIndex);
|
||||
mListOrder.add(0, lmd.gid);
|
||||
mFavouriteLmd.remove(oldIndex);
|
||||
mFavouriteLmd.add(0, lmd);
|
||||
} else {
|
||||
mListOrder.add(0, lmd.gid);
|
||||
mFavouriteLmd.add(0, lmd);
|
||||
}
|
||||
|
||||
Util.putStrings(mFavouritePre, LIST_ORDER, mListOrder);
|
||||
mFavouritePre.edit().putString(lmd.gid, encodeLmd(lmd)).apply();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove favourite item
|
||||
*
|
||||
* @param index
|
||||
* @return True if remove successfully
|
||||
*/
|
||||
public static boolean remove(int index) {
|
||||
mFavouriteLmd.remove(index);
|
||||
String key = mListOrder.remove(index);
|
||||
Util.putStrings(mFavouritePre, LIST_ORDER, mListOrder);
|
||||
mFavouritePre.edit().remove(key).apply();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Please do not change it
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static ArrayList<GalleryInfo> getFavouriteList() {
|
||||
return mFavouriteLmd;
|
||||
}
|
||||
|
||||
/**
|
||||
* Top a favourite item
|
||||
*
|
||||
* @param index
|
||||
*/
|
||||
public static void top(int index) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
/**
|
||||
* Update favourite item data
|
||||
*/
|
||||
public static void updateData() {
|
||||
// TODO
|
||||
}
|
||||
|
||||
protected static String encodeLmd(GalleryInfo lmd) {
|
||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||
try {
|
||||
ObjectOutputStream outputStream = new ObjectOutputStream(os);
|
||||
writeObject(lmd, outputStream);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
} finally {
|
||||
try {
|
||||
os.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return Util.byteArrayToHexString(os.toByteArray());
|
||||
}
|
||||
|
||||
protected static GalleryInfo decodeLmd(String lmdStr) {
|
||||
byte[] bytes = Util.hexStringToByteArray(lmdStr);
|
||||
ByteArrayInputStream is = new ByteArrayInputStream(bytes);
|
||||
GalleryInfo lmd = null;
|
||||
try {
|
||||
ObjectInputStream ois = new ObjectInputStream(is);
|
||||
lmd = readObject(ois);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
try {
|
||||
is.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return lmd;
|
||||
}
|
||||
|
||||
public static void writeObject(GalleryInfo lmd, ObjectOutputStream out) throws IOException {
|
||||
out.writeObject(lmd.gid);
|
||||
out.writeObject(lmd.token);
|
||||
out.writeObject(lmd.title);
|
||||
out.writeObject((Integer)lmd.category);
|
||||
out.writeObject(lmd.thumb);
|
||||
out.writeObject(lmd.uploader);
|
||||
out.writeObject(lmd.posted);
|
||||
out.writeObject(lmd.rating);
|
||||
}
|
||||
|
||||
public static GalleryInfo readObject(ObjectInputStream in) {
|
||||
GalleryInfo lmd = new GalleryInfo();
|
||||
try {
|
||||
lmd.gid = (String)in.readObject();
|
||||
lmd.token = (String)in.readObject();
|
||||
lmd.title = (String)in.readObject();
|
||||
lmd.category = (Integer)in.readObject();
|
||||
lmd.thumb = (String)in.readObject();
|
||||
lmd.uploader = (String)in.readObject();
|
||||
lmd.posted = (String)in.readObject();
|
||||
lmd.rating = (String)in.readObject();
|
||||
} catch (OptionalDataException e) {
|
||||
e.printStackTrace();
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return lmd;
|
||||
}
|
||||
}
|
||||
@@ -1,279 +0,0 @@
|
||||
package com.hippo.ehviewer.util;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.OptionalDataException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.hippo.ehviewer.ListUrls;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
|
||||
public class Tag {
|
||||
|
||||
private static final String SHA_PRE_NAME = "tag";
|
||||
private static final String LIST_ORDER = "list_order";
|
||||
|
||||
private static Context mContext;
|
||||
private static SharedPreferences mTagPre;
|
||||
private static ArrayList<String> mListOrder = new ArrayList<String>();
|
||||
private static ArrayList<ListUrls> mTags = new ArrayList<ListUrls>();
|
||||
|
||||
private static boolean mInit = false;
|
||||
/**
|
||||
* Init Tag
|
||||
*
|
||||
* @param context Application context
|
||||
*/
|
||||
public static void init(Context context) {
|
||||
if (mInit)
|
||||
return;
|
||||
mInit = true;
|
||||
|
||||
mContext = context;
|
||||
mTagPre = mContext.getSharedPreferences(SHA_PRE_NAME, 0);
|
||||
|
||||
getTag();
|
||||
}
|
||||
|
||||
/**
|
||||
* Is init
|
||||
* @return True if init
|
||||
*/
|
||||
public static boolean isInit() {
|
||||
return mInit;
|
||||
}
|
||||
|
||||
private static void getTag() {
|
||||
String[] allOrder = Util.getStrings(mTagPre, LIST_ORDER);
|
||||
|
||||
if (allOrder == null)
|
||||
return;
|
||||
|
||||
boolean errorFlag = false;
|
||||
for (String item : allOrder) {
|
||||
mListOrder.add(item);
|
||||
String strTag = mTagPre.getString(item, null);
|
||||
if (strTag == null) {
|
||||
mListOrder.remove(strTag);
|
||||
errorFlag = true;
|
||||
continue;
|
||||
}
|
||||
mTags.add(decode(strTag));
|
||||
}
|
||||
if (errorFlag)
|
||||
Util.putStrings(mTagPre, LIST_ORDER, mListOrder);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new tag item to the end of tag list
|
||||
*
|
||||
* @param key
|
||||
* @param tag
|
||||
* @return
|
||||
*/
|
||||
public static boolean add(String key, ListUrls tag) {
|
||||
// Check contain this item or not
|
||||
if (mListOrder.indexOf(key) == -1) {
|
||||
mListOrder.add(key);
|
||||
mTags.add(tag);
|
||||
Util.putStrings(mTagPre, LIST_ORDER, mListOrder);
|
||||
mTagPre.edit().putString(key, encode(tag)).apply();
|
||||
return true;
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Swap tag list order
|
||||
*
|
||||
* @param oldIndex
|
||||
* @param newIndex
|
||||
* @return
|
||||
*/
|
||||
public static boolean swap(int indexOne, int indexTwo) {
|
||||
if (indexOne < 0 || indexOne > mListOrder.size()
|
||||
|| indexTwo < 0 || indexTwo > mListOrder.size())
|
||||
return false;
|
||||
|
||||
if (indexOne == indexTwo)
|
||||
return true;
|
||||
|
||||
String temp1 = mListOrder.get(indexOne);
|
||||
mListOrder.set(indexOne, mListOrder.get(indexTwo));
|
||||
mListOrder.set(indexTwo, temp1);
|
||||
Util.putStrings(mTagPre, LIST_ORDER, mListOrder);
|
||||
|
||||
ListUrls temp2 = mTags.get(indexOne);
|
||||
mTags.set(indexOne, mTags.get(indexTwo));
|
||||
mTags.set(indexTwo, temp2);
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean contains(String key) {
|
||||
return mListOrder.contains(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove Tag item
|
||||
*
|
||||
* @param index
|
||||
* @return True if remove successfully
|
||||
*/
|
||||
public static boolean remove(String key) {
|
||||
int index = mListOrder.indexOf(key);
|
||||
if (index != -1) {
|
||||
mListOrder.remove(index);
|
||||
mTags.remove(index);
|
||||
mTagPre.edit().remove(key).apply();
|
||||
Util.putStrings(mTagPre, LIST_ORDER, mListOrder);
|
||||
return true;
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove Tag item
|
||||
*
|
||||
* @param index
|
||||
* @return True if remove successfully
|
||||
*/
|
||||
public static boolean remove(int index) {
|
||||
mTags.remove(index);
|
||||
String key = mListOrder.remove(index);
|
||||
mTagPre.edit().remove(key).apply();
|
||||
Util.putStrings(mTagPre, LIST_ORDER, mListOrder);
|
||||
return true;
|
||||
}
|
||||
|
||||
public static ListUrls get(String key) {
|
||||
int index = mListOrder.indexOf(key);
|
||||
if (index == -1)
|
||||
return null;
|
||||
return mTags.get(index);
|
||||
}
|
||||
|
||||
public static ListUrls get(int position) {
|
||||
return mTags.get(position);
|
||||
}
|
||||
|
||||
public static String getKey(int position) {
|
||||
return mListOrder.get(position);
|
||||
}
|
||||
|
||||
public static void set(int position, String newKey, ListUrls listUrls) {
|
||||
String oldKey = mListOrder.set(position, newKey);
|
||||
mTags.set(position, listUrls);
|
||||
|
||||
Util.putStrings(mTagPre, LIST_ORDER, mListOrder);
|
||||
mTagPre.edit().remove(oldKey).putString(newKey, encode(listUrls)).apply();
|
||||
}
|
||||
|
||||
public static void set(int position, ListUrls listUrls) {
|
||||
mTags.set(position, listUrls);
|
||||
mTagPre.edit().putString(mListOrder.get(position), encode(listUrls)).apply();
|
||||
}
|
||||
|
||||
/**
|
||||
* You must not modify what you get
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static ArrayList<ListUrls> getTagList() {
|
||||
return mTags;
|
||||
}
|
||||
|
||||
/**
|
||||
* You must not modify what you get
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static ArrayList<String> getKeyList() {
|
||||
return mListOrder;
|
||||
}
|
||||
|
||||
public static void set(String oldKey, String newKey, ListUrls lus) {
|
||||
int index = mListOrder.indexOf(oldKey);
|
||||
if (index == -1) {
|
||||
mListOrder.set(index, newKey);
|
||||
mTags.set(index, lus);
|
||||
}
|
||||
}
|
||||
|
||||
protected static String encode(ListUrls tag) {
|
||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||
try {
|
||||
ObjectOutputStream outputStream = new ObjectOutputStream(os);
|
||||
writeObject(tag, outputStream);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
} finally {
|
||||
try {
|
||||
os.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return Util.byteArrayToHexString(os.toByteArray());
|
||||
}
|
||||
|
||||
protected static ListUrls decode(String strTag) {
|
||||
byte[] bytes = Util.hexStringToByteArray(strTag);
|
||||
ByteArrayInputStream is = new ByteArrayInputStream(bytes);
|
||||
ListUrls tag = null;
|
||||
try {
|
||||
ObjectInputStream ois = new ObjectInputStream(is);
|
||||
tag = readObject(ois);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
try {
|
||||
is.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return tag;
|
||||
}
|
||||
|
||||
public static void writeObject(ListUrls tag, ObjectOutputStream out) throws IOException {
|
||||
out.writeObject((Integer)tag.getType());
|
||||
out.writeObject(tag.getSearch());
|
||||
out.writeObject((Boolean)tag.isAdvance());
|
||||
out.writeObject((Integer)tag.getAdvanceType());
|
||||
out.writeObject((Boolean)tag.isMinRating());
|
||||
out.writeObject((Integer)tag.getMinRating());
|
||||
}
|
||||
|
||||
public static ListUrls readObject(ObjectInputStream in) {
|
||||
ListUrls tag = null;
|
||||
try {
|
||||
int type = (Integer)in.readObject();
|
||||
String search = (String)in.readObject();
|
||||
tag = new ListUrls(type, search);
|
||||
|
||||
boolean isAdvance = (Boolean)in.readObject();
|
||||
int advanceType = (Integer)in.readObject();
|
||||
boolean isMinRating = (Boolean)in.readObject();
|
||||
int minRating = (Integer)in.readObject();
|
||||
if (isAdvance) {
|
||||
if (isMinRating)
|
||||
tag.setAdvance(advanceType, minRating);
|
||||
else
|
||||
tag.setAdvance(advanceType);
|
||||
}
|
||||
} catch (OptionalDataException e) {
|
||||
e.printStackTrace();
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return tag;
|
||||
}
|
||||
}
|
||||
@@ -25,11 +25,9 @@ import android.animation.ValueAnimator;
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.provider.Contacts.Intents.UI;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.view.MotionEvent;
|
||||
@@ -37,16 +35,11 @@ import android.view.View;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.widget.AbsListView;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.ListView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.hippo.ehviewer.util.Log;
|
||||
import com.hippo.ehviewer.util.Tag;
|
||||
import com.hippo.ehviewer.util.Ui;
|
||||
|
||||
/**
|
||||
* The dynamic listview is an extension of listview that supports cell dragging
|
||||
* and swapping.
|
||||
@@ -74,10 +67,9 @@ public class TagListView extends ListView {
|
||||
|
||||
private final int SMOOTH_SCROLL_AMOUNT_AT_EDGE = 15;
|
||||
private final int MOVE_DURATION = 150;
|
||||
private final int LINE_THICKNESS = Ui.dp2pix(3);
|
||||
private final int SENSITY = 5;
|
||||
|
||||
public ArrayList<String> mItemList;
|
||||
//public ArrayList<String> mItemList;
|
||||
|
||||
private int mLastEventX = -1;
|
||||
private int mLastEventY = -1;
|
||||
@@ -113,8 +105,10 @@ public class TagListView extends ListView {
|
||||
private boolean mIsWaitingForScrollFinish = false;
|
||||
private int mScrollState = OnScrollListener.SCROLL_STATE_IDLE;
|
||||
|
||||
private OnModifyListener listener = null;
|
||||
private OnMoveLister movelistener = null;
|
||||
private OnModifyListener mModifylistener = null;
|
||||
private OnMoveLister mMovelistener = null;
|
||||
private OnDeleteListener mOnDeleteListener = null;
|
||||
private OnSwapListener mOnSwapListener = null;
|
||||
|
||||
public TagListView(Context context) {
|
||||
super(context);
|
||||
@@ -148,8 +142,8 @@ public class TagListView extends ListView {
|
||||
if (pos < mStableItemCount)
|
||||
return true;
|
||||
|
||||
if (movelistener != null)
|
||||
movelistener.onMoveStart();
|
||||
if (mMovelistener != null)
|
||||
mMovelistener.onMoveStart();
|
||||
|
||||
mTotalOffset = 0;
|
||||
|
||||
@@ -303,7 +297,7 @@ public class TagListView extends ListView {
|
||||
}
|
||||
|
||||
public void setOnModifyListener(OnModifyListener listener) {
|
||||
this.listener = listener;
|
||||
this.mModifylistener = listener;
|
||||
}
|
||||
|
||||
public interface OnMoveLister {
|
||||
@@ -312,7 +306,23 @@ public class TagListView extends ListView {
|
||||
}
|
||||
|
||||
public void setOnMoveLister(OnMoveLister listener) {
|
||||
this.movelistener = listener;
|
||||
this.mMovelistener = listener;
|
||||
}
|
||||
|
||||
public interface OnDeleteListener {
|
||||
public void onDelete(int position);
|
||||
}
|
||||
|
||||
public void setOnDeleteListener(OnDeleteListener listener) {
|
||||
mOnDeleteListener = listener;
|
||||
}
|
||||
|
||||
public interface OnSwapListener {
|
||||
public void onSwap(int positionOne, int positionTwo);
|
||||
}
|
||||
|
||||
public void setOnSwapListener(OnSwapListener listener) {
|
||||
mOnSwapListener = listener;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -380,13 +390,13 @@ public class TagListView extends ListView {
|
||||
}
|
||||
break;
|
||||
case MotionEvent.ACTION_UP:
|
||||
if (movelistener != null)
|
||||
movelistener.onMoveOver();
|
||||
if (mMovelistener != null)
|
||||
mMovelistener.onMoveOver();
|
||||
touchEventsEnded();
|
||||
break;
|
||||
case MotionEvent.ACTION_CANCEL:
|
||||
if (movelistener != null)
|
||||
movelistener.onMoveOver();
|
||||
if (mMovelistener != null)
|
||||
mMovelistener.onMoveOver();
|
||||
touchEventsCancelled();
|
||||
break;
|
||||
case MotionEvent.ACTION_POINTER_UP:
|
||||
@@ -398,8 +408,8 @@ public class TagListView extends ListView {
|
||||
MotionEvent.ACTION_POINTER_INDEX_SHIFT;
|
||||
final int pointerId = event.getPointerId(pointerIndex);
|
||||
if (pointerId == mActivePointerId) {
|
||||
if (movelistener != null)
|
||||
movelistener.onMoveOver();
|
||||
if (mMovelistener != null)
|
||||
mMovelistener.onMoveOver();
|
||||
touchEventsEnded();
|
||||
}
|
||||
break;
|
||||
@@ -441,10 +451,9 @@ public class TagListView extends ListView {
|
||||
return;
|
||||
}
|
||||
|
||||
swapElements(mItemList, originalItem, getPositionForView(switchView));
|
||||
Tag.swap(originalItem - mStableItemCount, getPositionForView(switchView) - mStableItemCount);
|
||||
|
||||
((BaseAdapter)getAdapter()).notifyDataSetChanged();
|
||||
if (mOnSwapListener != null) {
|
||||
mOnSwapListener.onSwap(originalItem, getPositionForView(switchView));
|
||||
}
|
||||
|
||||
mDownY = mLastEventY;
|
||||
|
||||
@@ -515,8 +524,8 @@ public class TagListView extends ListView {
|
||||
|
||||
if (mIsModify) {
|
||||
mIsModify = false;
|
||||
if (listener != null) {
|
||||
listener.onModify(getPositionForID(mMobileItemId));
|
||||
if (mModifylistener != null) {
|
||||
mModifylistener.onModify(getPositionForID(mMobileItemId));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -578,9 +587,8 @@ public class TagListView extends ListView {
|
||||
}
|
||||
// Delete the item from the adapter and tag
|
||||
int position = getPositionForView(viewToRemove);
|
||||
String key = mAdapter.getItem(position);
|
||||
mAdapter.remove(key);
|
||||
Tag.remove(key);
|
||||
if (mOnDeleteListener != null)
|
||||
mOnDeleteListener.onDelete(position);
|
||||
|
||||
final ViewTreeObserver observer = getViewTreeObserver();
|
||||
observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
|
||||
@@ -728,10 +736,6 @@ public class TagListView extends ListView {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void setItemList(ArrayList<String> itemList) {
|
||||
mItemList = itemList;
|
||||
}
|
||||
|
||||
/**
|
||||
* This scroll listener is added to the listview in order to handle cell swapping
|
||||
* when the cell is either at the top or bottom edge of the listview. If the hover
|
||||
|
||||
@@ -17,20 +17,11 @@
|
||||
package com.hippo.ehviewer.view;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.TextView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import com.hippo.ehviewer.R;
|
||||
import com.hippo.ehviewer.util.Tag;
|
||||
|
||||
public class TagsAdapter extends ArrayAdapter<String> {
|
||||
|
||||
final int INVALID_ID = -1;
|
||||
|
||||
Reference in new issue
Block a user