diff --git a/res/drawable-hdpi/ic_action_delete.png b/res/drawable-hdpi/ic_action_delete.png new file mode 100644 index 000000000..878b378aa Binary files /dev/null and b/res/drawable-hdpi/ic_action_delete.png differ diff --git a/res/drawable-hdpi/ic_action_delete_dark.png b/res/drawable-hdpi/ic_action_delete_dark.png new file mode 100644 index 000000000..ece5ad8d6 Binary files /dev/null and b/res/drawable-hdpi/ic_action_delete_dark.png differ diff --git a/res/drawable-hdpi/ic_action_list.png b/res/drawable-hdpi/ic_action_list.png new file mode 100644 index 000000000..71283ad4a Binary files /dev/null and b/res/drawable-hdpi/ic_action_list.png differ diff --git a/res/drawable-hdpi/ic_action_list_dark.png b/res/drawable-hdpi/ic_action_list_dark.png new file mode 100644 index 000000000..f8688d898 Binary files /dev/null and b/res/drawable-hdpi/ic_action_list_dark.png differ diff --git a/res/drawable-hdpi/ic_action_move.png b/res/drawable-hdpi/ic_action_move.png new file mode 100644 index 000000000..b6576c13f Binary files /dev/null and b/res/drawable-hdpi/ic_action_move.png differ diff --git a/res/drawable-hdpi/ic_action_move_dark.png b/res/drawable-hdpi/ic_action_move_dark.png new file mode 100644 index 000000000..58b5e49af Binary files /dev/null and b/res/drawable-hdpi/ic_action_move_dark.png differ diff --git a/res/drawable-mdpi/ic_action_delete.png b/res/drawable-mdpi/ic_action_delete.png new file mode 100644 index 000000000..5ba245465 Binary files /dev/null and b/res/drawable-mdpi/ic_action_delete.png differ diff --git a/res/drawable-mdpi/ic_action_delete_dark.png b/res/drawable-mdpi/ic_action_delete_dark.png new file mode 100644 index 000000000..93483b6cb Binary files /dev/null and b/res/drawable-mdpi/ic_action_delete_dark.png differ diff --git a/res/drawable-mdpi/ic_action_list.png b/res/drawable-mdpi/ic_action_list.png new file mode 100644 index 000000000..f9f8a2f9c Binary files /dev/null and b/res/drawable-mdpi/ic_action_list.png differ diff --git a/res/drawable-mdpi/ic_action_list_dark.png b/res/drawable-mdpi/ic_action_list_dark.png new file mode 100644 index 000000000..e13fb118a Binary files /dev/null and b/res/drawable-mdpi/ic_action_list_dark.png differ diff --git a/res/drawable-mdpi/ic_action_move.png b/res/drawable-mdpi/ic_action_move.png new file mode 100644 index 000000000..c1b96ea8e Binary files /dev/null and b/res/drawable-mdpi/ic_action_move.png differ diff --git a/res/drawable-mdpi/ic_action_move_dark.png b/res/drawable-mdpi/ic_action_move_dark.png new file mode 100644 index 000000000..36101dd14 Binary files /dev/null and b/res/drawable-mdpi/ic_action_move_dark.png differ diff --git a/res/drawable-xhdpi/ic_action_delete.png b/res/drawable-xhdpi/ic_action_delete.png new file mode 100644 index 000000000..09ce75e29 Binary files /dev/null and b/res/drawable-xhdpi/ic_action_delete.png differ diff --git a/res/drawable-xhdpi/ic_action_delete_dark.png b/res/drawable-xhdpi/ic_action_delete_dark.png new file mode 100644 index 000000000..94f7c8c1c Binary files /dev/null and b/res/drawable-xhdpi/ic_action_delete_dark.png differ diff --git a/res/drawable-xhdpi/ic_action_list.png b/res/drawable-xhdpi/ic_action_list.png new file mode 100644 index 000000000..c912b39aa Binary files /dev/null and b/res/drawable-xhdpi/ic_action_list.png differ diff --git a/res/drawable-xhdpi/ic_action_list_dark.png b/res/drawable-xhdpi/ic_action_list_dark.png new file mode 100644 index 000000000..fd8fb3192 Binary files /dev/null and b/res/drawable-xhdpi/ic_action_list_dark.png differ diff --git a/res/drawable-xhdpi/ic_action_move.png b/res/drawable-xhdpi/ic_action_move.png new file mode 100644 index 000000000..8cfdeb62e Binary files /dev/null and b/res/drawable-xhdpi/ic_action_move.png differ diff --git a/res/drawable-xhdpi/ic_action_move_dark.png b/res/drawable-xhdpi/ic_action_move_dark.png new file mode 100644 index 000000000..c1a72feb3 Binary files /dev/null and b/res/drawable-xhdpi/ic_action_move_dark.png differ diff --git a/res/drawable-xxhdpi/card_bg_activated.9.png b/res/drawable-xxhdpi/card_bg_activated.9.png new file mode 100644 index 000000000..368f0079b Binary files /dev/null and b/res/drawable-xxhdpi/card_bg_activated.9.png differ diff --git a/res/drawable-xxhdpi/ic_action_delete.png b/res/drawable-xxhdpi/ic_action_delete.png new file mode 100644 index 000000000..d5952ea0c Binary files /dev/null and b/res/drawable-xxhdpi/ic_action_delete.png differ diff --git a/res/drawable-xxhdpi/ic_action_delete_dark.png b/res/drawable-xxhdpi/ic_action_delete_dark.png new file mode 100644 index 000000000..0390e5782 Binary files /dev/null and b/res/drawable-xxhdpi/ic_action_delete_dark.png differ diff --git a/res/drawable-xxhdpi/ic_action_list.png b/res/drawable-xxhdpi/ic_action_list.png new file mode 100644 index 000000000..a0cc3d0f5 Binary files /dev/null and b/res/drawable-xxhdpi/ic_action_list.png differ diff --git a/res/drawable-xxhdpi/ic_action_list_dark.png b/res/drawable-xxhdpi/ic_action_list_dark.png new file mode 100644 index 000000000..b6a366f10 Binary files /dev/null and b/res/drawable-xxhdpi/ic_action_list_dark.png differ diff --git a/res/drawable-xxhdpi/ic_action_move.png b/res/drawable-xxhdpi/ic_action_move.png new file mode 100644 index 000000000..7b73cf848 Binary files /dev/null and b/res/drawable-xxhdpi/ic_action_move.png differ diff --git a/res/drawable-xxhdpi/ic_action_move_dark.png b/res/drawable-xxhdpi/ic_action_move_dark.png new file mode 100644 index 000000000..85c4eb1f7 Binary files /dev/null and b/res/drawable-xxhdpi/ic_action_move_dark.png differ diff --git a/res/drawable/list_item_bg.xml b/res/drawable/list_item_bg.xml index cb2bdb9b4..3e38b8a35 100644 --- a/res/drawable/list_item_bg.xml +++ b/res/drawable/list_item_bg.xml @@ -24,6 +24,9 @@ + \ No newline at end of file diff --git a/res/layout/favorite_menu.xml b/res/layout/favorite_menu.xml new file mode 100644 index 000000000..95cc51bc8 --- /dev/null +++ b/res/layout/favorite_menu.xml @@ -0,0 +1,24 @@ + + + \ No newline at end of file diff --git a/res/layout/favourite.xml b/res/layout/favourite.xml index 75dad9766..72c895da6 100644 --- a/res/layout/favourite.xml +++ b/res/layout/favourite.xml @@ -13,10 +13,15 @@ See the License for the specific language governing permissions and limitations under the License. --> - + android:layout_height="fill_parent" > + + + android:cacheColorHint="@color/list_main_bg" > - \ No newline at end of file + \ No newline at end of file diff --git a/res/xml/settings.xml b/res/menu/favorite.xml similarity index 66% rename from res/xml/settings.xml rename to res/menu/favorite.xml index e8b8e49f3..c66efbf70 100644 --- a/res/xml/settings.xml +++ b/res/menu/favorite.xml @@ -13,12 +13,10 @@ See the License for the specific language governing permissions and limitations under the License. --> - - - - - - - \ No newline at end of file + + + \ No newline at end of file diff --git a/res/menu/favorite_choice.xml b/res/menu/favorite_choice.xml new file mode 100644 index 000000000..efd2a371b --- /dev/null +++ b/res/menu/favorite_choice.xml @@ -0,0 +1,27 @@ + + + + + + diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index e91a7e570..a5dbf93f5 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -292,6 +292,7 @@ 感觉快要窒息了 + 本地 标签 已复制 发送 @@ -318,6 +319,9 @@ 跳页 第 %d 页 默认 + 删除 + 移动 + 列表 首页 模式 diff --git a/res/values/colors.xml b/res/values/colors.xml index 9c81fe5af..f01a377ea 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -47,6 +47,17 @@ #ffeaccf3 @android:color/black + #ff616161 + #ffff3e3e + #ffff923e + #fffff43e + #ff3eff6b + #ffb1ff3e + #ff3efeff + #ff4b3eff + #ffa23eff + #ffff3ec4 + #ff333333 #ffaaaaaa diff --git a/res/values/strings.xml b/res/values/strings.xml index 163e02471..2f7c87194 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -296,6 +296,7 @@ DISASTER + Local Tag Copyed Send @@ -323,6 +324,9 @@ Jump Page %d Default + Delete + Move + List Homepage Mode diff --git a/src/com/hippo/ehviewer/ehclient/EhClient.java b/src/com/hippo/ehviewer/ehclient/EhClient.java index 7544484b2..232f27f03 100644 --- a/src/com/hippo/ehviewer/ehclient/EhClient.java +++ b/src/com/hippo/ehviewer/ehclient/EhClient.java @@ -75,6 +75,8 @@ public class EhClient { private static final String TAG = "EhClient"; + public static final int FAVORITE_SLOT_NUM = 10; + public static final int G = 0x0; public static final int EX = 0x1; public static final int LOFI_460x = 0x2; @@ -169,6 +171,19 @@ public class EhClient { } } + public static String getFavoriteUrl(int index) { + return getFavoriteUrl(Config.getMode(), index); + } + + public static String getFavoriteUrl(int mode, int index) { + switch (mode) { + case EX: + return EX_HEADER + "favorites.php?favcat=" + index; + default: + return G_HEADER + "favorites.php?favcat=" + index; + } + } + public interface OnLogoutListener { public void onSuccess(); public void onFailure(String eMsg); @@ -1689,7 +1704,8 @@ public class EhClient { // modifyFavorite public interface OnModifyFavoriteListener { - void onSuccess(); + void onSuccess(ArrayList gis, + int indexPerPage, int maxPage); void onFailure(String eMsg); } @@ -1706,8 +1722,14 @@ public class EhClient { } } + /** + * + * @param gids + * @param cat -1 for delete + * @param listener + */ public void modifyFavorite(final int[] gids, final int cat, - final OnAddToFavoriteListener listener) { + final OnModifyFavoriteListener listener) { new Thread(new Runnable() { @Override public void run() { @@ -1717,7 +1739,15 @@ public class EhClient { hp.setOnRespondListener(new HttpHelper.OnRespondListener() { @Override public void onSuccess(String pageContext) { - listener.onSuccess(); + ListParser parser = new ListParser(); + int re = parser.parser(pageContext); + if (re == ListParser.ALL) { + listener.onSuccess(parser.giList, parser.indexPerPage, parser.maxPage); + } else if (re == ListParser.NOT_FOUND) { + listener.onSuccess(parser.giList, parser.indexPerPage, parser.maxPage); + } else if (re == ListParser.PARSER_ERROR) { + listener.onFailure("parser error"); // TODO + } } @Override public void onFailure(String eMsg) { diff --git a/src/com/hippo/ehviewer/ehclient/ListParser.java b/src/com/hippo/ehviewer/ehclient/ListParser.java index 8b0a140c5..456b4b964 100644 --- a/src/com/hippo/ehviewer/ehclient/ListParser.java +++ b/src/com/hippo/ehviewer/ehclient/ListParser.java @@ -28,7 +28,6 @@ public class ListParser { public static final int ALL = 0x1; public static final int NOT_FOUND = 0x2; - public static final int SAD_PANDA = 0x3; public static final int PARSER_ERROR = -1; public int indexPerPage = 25; @@ -45,7 +44,7 @@ public class ListParser { m = p.matcher(pageContext); if (m.find()) { maxPage = Integer.parseInt(m.group(1)); - } else if (pageContext.contains("No hits found

")) { + } else if (pageContext.contains("No hits found

")) { maxPage = 0; return NOT_FOUND; } else { @@ -53,7 +52,7 @@ public class ListParser { } giList = new ArrayList(indexPerPage); - p = Pattern.compile("" // category + p = Pattern.compile("(?:)?(?:)?" // category + "(.+?)" // posted + "" + "(?:" diff --git a/src/com/hippo/ehviewer/network/HttpHelper.java b/src/com/hippo/ehviewer/network/HttpHelper.java index fddf74e97..e53c566d9 100644 --- a/src/com/hippo/ehviewer/network/HttpHelper.java +++ b/src/com/hippo/ehviewer/network/HttpHelper.java @@ -363,6 +363,7 @@ public class HttpHelper { sb.append(URLEncoder.encode(arg[1], "UTF-8")); i++; } + Log.d(TAG, sb.toString()); out.writeBytes(sb.toString()); out.flush(); out.close(); diff --git a/src/com/hippo/ehviewer/ui/FavouriteActivity.java b/src/com/hippo/ehviewer/ui/FavouriteActivity.java index a304079b1..d07b3f73b 100644 --- a/src/com/hippo/ehviewer/ui/FavouriteActivity.java +++ b/src/com/hippo/ehviewer/ui/FavouriteActivity.java @@ -16,15 +16,25 @@ package com.hippo.ehviewer.ui; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; -import android.app.Activity; import android.app.AlertDialog; import android.content.Intent; import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.Bitmap; +import android.graphics.Path; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.ShapeDrawable; +import android.graphics.drawable.shapes.PathShape; import android.os.Bundle; +import android.view.ActionMode; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; @@ -33,9 +43,8 @@ import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.RatingBar; import android.widget.TextView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.AdapterView.OnItemLongClickListener; import android.widget.Toast; +import android.widget.AdapterView.OnItemClickListener; import com.hippo.ehviewer.AppContext; import com.hippo.ehviewer.ImageGeterManager; @@ -46,64 +55,40 @@ import com.hippo.ehviewer.ehclient.EhClient; 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.Log; import com.hippo.ehviewer.util.Ui; -import com.hippo.ehviewer.widget.AlertButton; import com.hippo.ehviewer.widget.DialogBuilder; +import com.hippo.ehviewer.widget.FswView; import com.hippo.ehviewer.widget.LoadImageView; +import com.hippo.ehviewer.widget.OnFitSystemWindowsListener; +import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; -public class FavouriteActivity extends AbstractActivity { +public class FavouriteActivity extends AbstractSlidingActivity + implements ListView.MultiChoiceModeListener { @SuppressWarnings("unused") private static final String TAG = "FavouriteActivity"; private AppContext mAppContext; private Data mData; + private Resources mResources; + private EhClient mClient; - private FlAdapter flAdapter; - private List mFavouriteLmd; - private int longClickItemIndex; + private SlidingMenu mSlidingMenu; + private ListView mMenuList; + + private ListView mListView; + private FlAdapter mAdapter; + private List mGis; + private Set mChoiceGids; // Store gid + private int mMenuIndex; + private String[] mFavoriteTitles; + + private AlertDialog mMoveDialog; private ImageGeterManager mImageGeterManager; private DownloadServiceConnection mServiceConn = new DownloadServiceConnection(); - // List item long click dialog - private AlertDialog longClickDialog; - - private AlertDialog setLongClickDialog() { - return new DialogBuilder(this).setTitle(R.string.what_to_do) - .setItems(R.array.favourite_item_long_click, new OnItemClickListener() { - @Override - public void onItemClick(AdapterView arg0, View arg1, - int position, long arg3) { - switch (position) { - case 0: // Remove favourite item - mData.deleteLocalFavourite(mFavouriteLmd.get(longClickItemIndex).gid); - flAdapter.notifyDataSetChanged(); - break; - case 1: - GalleryInfo lmd = mFavouriteLmd.get(longClickItemIndex); - Intent it = new Intent(FavouriteActivity.this, DownloadService.class); - startService(it); - mServiceConn.getService().add(String.valueOf(lmd.gid), lmd.thumb, - EhClient.getDetailUrl(lmd.gid, lmd.token), lmd.title); - Toast.makeText(FavouriteActivity.this, - getString(R.string.toast_add_download), - Toast.LENGTH_SHORT).show(); - break; - default: - break; - } - longClickDialog.cancel(); - } - }).setNegativeButton(android.R.string.cancel, new View.OnClickListener() { - @Override - public void onClick(View v) { - ((AlertButton)v).dialog.dismiss(); - } - }).create(); - } - private class FlAdapter extends BaseAdapter { private LayoutInflater mInflater; @@ -113,12 +98,12 @@ public class FavouriteActivity extends AbstractActivity { @Override public int getCount() { - return mFavouriteLmd.size(); + return mGis.size(); } @Override public Object getItem(int arg0) { - return mFavouriteLmd.get(arg0); + return mGis.get(arg0); } @Override @@ -128,7 +113,7 @@ public class FavouriteActivity extends AbstractActivity { @Override public View getView(int position, View convertView, ViewGroup parent) { - GalleryInfo lmd= mFavouriteLmd.get(position); + GalleryInfo lmd= mGis.get(position); if (convertView == null) convertView = mInflater.inflate(R.layout.list_item, null); @@ -188,8 +173,8 @@ public class FavouriteActivity extends AbstractActivity { protected void onResume() { super.onResume(); - if (flAdapter != null) - flAdapter.notifyDataSetChanged(); + if (mAdapter != null) + mAdapter.notifyDataSetChanged(); } @Override @@ -199,44 +184,157 @@ public class FavouriteActivity extends AbstractActivity { mAppContext = (AppContext)getApplication(); mData = mAppContext.getData(); + mResources =getResources(); mImageGeterManager = mAppContext.getImageGeterManager(); + mClient = mAppContext.getEhClient(); Ui.translucent(this); + getActionBar().setDisplayHomeAsUpEnabled(true); // Download service Intent it = new Intent(FavouriteActivity.this, DownloadService.class); bindService(it, mServiceConn, BIND_AUTO_CREATE); - longClickDialog = setLongClickDialog(); + setBehindContentView(R.layout.favorite_menu); + setSlidingActionBarEnabled(false); + mSlidingMenu = getSlidingMenu(); + mSlidingMenu.setMode(SlidingMenu.RIGHT); + mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); + mSlidingMenu.setBehindWidth( + mResources.getDimensionPixelOffset(R.dimen.menu_offset)); + mSlidingMenu.setShadowDrawable(R.drawable.shadow_right); + mSlidingMenu.setShadowWidthRes(R.dimen.shadow_width); - getActionBar().setDisplayHomeAsUpEnabled(true); - - mFavouriteLmd = mData.getAllLocalFavourites(); - - ListView listView = (ListView)findViewById(R.id.favourite); - flAdapter = new FlAdapter(); - listView.setAdapter(flAdapter); - listView.setOnItemClickListener(new OnItemClickListener() { + mFavoriteTitles = new String[EhClient.FAVORITE_SLOT_NUM]; + for (int i = 0; i < EhClient.FAVORITE_SLOT_NUM; i++) { + mFavoriteTitles[i] = "收藏 " + i; + } + mMenuIndex = 0; + setTitle("本地收藏"); // TODO + mGis = mData.getAllLocalFavourites(); + mChoiceGids = new HashSet(); + mListView = (ListView)findViewById(R.id.favourite); + mListView.setClipToPadding(false); + mAdapter = new FlAdapter(); + mListView.setAdapter(mAdapter); + mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView arg0, View arg1, int position, long arg3) { Intent intent = new Intent(FavouriteActivity.this, MangaDetailActivity.class); - GalleryInfo gi = mFavouriteLmd.get(position); + GalleryInfo gi = mGis.get(position); intent.putExtra("url", EhClient.getDetailUrl(gi.gid, gi.token)); intent.putExtra(MangaDetailActivity.KEY_G_INFO, gi); startActivity(intent); } }); - listView.setOnItemLongClickListener(new OnItemLongClickListener() { + mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); + mListView.setMultiChoiceModeListener(this); + + mMenuList = (ListView)findViewById(R.id.favorite_menu_list); + mMenuList.setClipToPadding(false); + mMenuList.setAdapter(new BaseAdapter() { + private ShapeDrawable d; + private ShapeDrawable createDrawable() { + Path path = new Path(); + path.moveTo(50, 10); + path.lineTo(10, 50); + path.lineTo(50, 90); + path.lineTo(90, 50); + path.close(); + ShapeDrawable d = new ShapeDrawable(new PathShape(path, 100, 100)); + d.getPaint().setColor(0xcdffffff); + d.setBounds(0, 0, Ui.dp2pix(36), Ui.dp2pix(36)); + return d; + } @Override - public boolean onItemLongClick(AdapterView arg0, View arg1, - int position, long arg3) { - longClickItemIndex = position; - longClickDialog.show(); - return true; + public int getCount() { + return EhClient.FAVORITE_SLOT_NUM + 1; + } + @Override + public Object getItem(int position) { + return null; + } + @Override + public long getItemId(int position) { + return position; + } + @Override + public View getView(int position, View convertView, ViewGroup parent) { + LayoutInflater li= LayoutInflater.from(FavouriteActivity.this); + TextView tv = (TextView)li.inflate(R.layout.menu_item, null); + + if (position == 0) { + Drawable dr = mResources.getDrawable(R.drawable.ic_action_panda); + dr.setBounds(0, 0, Ui.dp2pix(36), Ui.dp2pix(36)); + tv.setCompoundDrawables(dr, null, null, null); + tv.setCompoundDrawablePadding(Ui.dp2pix(8)); + tv.setText("本地收藏"); // TODO + } else { + if (d == null) + d = createDrawable(); + tv.setCompoundDrawables(d, null, null, null); + tv.setCompoundDrawablePadding(Ui.dp2pix(8)); + tv.setText(mFavoriteTitles[position - 1]); // TODO + } + return tv; } }); + mMenuList.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, + int position, long id) { + // If same index, do nothing + if (mMenuIndex == position) + return; + + showContent(); + mMenuIndex = position; + if (mMenuIndex == 0) { + setTitle("本地收藏"); // TODO + mGis = mData.getAllLocalFavourites(); + mAdapter.notifyDataSetChanged(); + } else { + setTitle(mFavoriteTitles[mMenuIndex - 1]); // TODO + mClient.getMangaList(EhClient.getFavoriteUrl(mMenuIndex - 1), + null, new EhClient.OnGetMangaListListener() { + @Override + public void onSuccess(Object checkFlag, ArrayList lmdArray, + int indexPerPage, int maxPage) { + + mGis = lmdArray; + mAdapter.notifyDataSetChanged(); + } + + @Override + public void onFailure(Object checkFlag, String eMsg) { + Toast.makeText(FavouriteActivity.this, eMsg, Toast.LENGTH_SHORT).show(); + } + }); + // TODO + } + } + }); + + + FswView alignment = (FswView)findViewById(R.id.alignment); + alignment.addOnFitSystemWindowsListener(new OnFitSystemWindowsListener() { + @Override + public void onfitSystemWindows(int paddingLeft, int paddingTop, + int paddingRight, int paddingBottom) { + mListView.setPadding(mListView.getPaddingLeft(), paddingTop, + mListView.getPaddingRight(), paddingBottom); + mMenuList.setPadding(mMenuList.getPaddingLeft(), paddingTop, + mMenuList.getPaddingRight(), paddingBottom); + } + }); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.favorite, menu); + return true; } @Override @@ -246,6 +344,9 @@ public class FavouriteActivity extends AbstractActivity { case android.R.id.home: finish(); return true; + case R.id.action_list: + toggle(); + return true; default: return super.onOptionsItemSelected(item); } @@ -257,7 +358,108 @@ public class FavouriteActivity extends AbstractActivity { unbindService(mServiceConn); } - public void buttonListItemCancel(View v) { - longClickDialog.cancel(); + + // ListView.MultiChoiceModeListener + + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.favorite_choice, menu); + mode.setTitle("Select Items"); // TODO + return true; + } + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return true; + } + + private AlertDialog createMoveDialog(final ActionMode mode) { + return new DialogBuilder(this).setTitle("移动至何处?") // + .setItems(mFavoriteTitles, new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, + int position, long id) { + int[] gids = new int[mChoiceGids.size()]; + int i = 0; + for (Integer gid : mChoiceGids) + gids[i++] = gid; + mClient.modifyFavorite(gids, position, new EhClient.OnModifyFavoriteListener() { + @Override + public void onSuccess(ArrayList gis, + int indexPerPage, int maxPage) { + Toast.makeText(FavouriteActivity.this, + "移动成功", Toast.LENGTH_SHORT).show(); // TODO + mGis = gis; + mAdapter.notifyDataSetChanged(); + } + + @Override + public void onFailure(String eMsg) { + Toast.makeText(FavouriteActivity.this, + "移动失败\n" + eMsg, Toast.LENGTH_SHORT).show(); // TODO + } + }); + + mMoveDialog.dismiss(); + mMoveDialog = null; + mode.finish(); + } + }).create(); + } + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + + switch (item.getItemId()) { + case R.id.action_delete: + if (mMenuIndex == 0) { + for (Integer gid : mChoiceGids) + mData.deleteLocalFavourite(gid); + mAdapter.notifyDataSetChanged(); + } else { + int[] gids = new int[mChoiceGids.size()]; + int i = 0; + for (Integer gid : mChoiceGids) + gids[i++] = gid; + mClient.modifyFavorite(gids, -1, new EhClient.OnModifyFavoriteListener() { + @Override + public void onSuccess(ArrayList gis, int indexPerPage, + int maxPage) { + Toast.makeText(FavouriteActivity.this, + "删除成功", Toast.LENGTH_SHORT).show(); // TODO + mGis = gis; + mAdapter.notifyDataSetChanged(); + } + @Override + public void onFailure(String eMsg) { + Toast.makeText(FavouriteActivity.this, + "删除失败\n" + eMsg, Toast.LENGTH_SHORT).show(); // TODO + } + }); + } + mode.finish(); + return true; + case R.id.action_move: + mMoveDialog = createMoveDialog(mode); + mMoveDialog.show(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + @Override + public void onDestroyActionMode(ActionMode mode) { + mChoiceGids.clear(); + } + + @Override + public void onItemCheckedStateChanged(ActionMode mode, int position, + long id, boolean checked) { + if (checked) + mChoiceGids.add(mGis.get(position).gid); + else + mChoiceGids.remove(mGis.get(position).gid); } }