diff --git a/app/src/main/java/com/hippo/ehviewer/EhDB.java b/app/src/main/java/com/hippo/ehviewer/EhDB.java index 2d9d2b332..9b2a4f79d 100644 --- a/app/src/main/java/com/hippo/ehviewer/EhDB.java +++ b/app/src/main/java/com/hippo/ehviewer/EhDB.java @@ -44,7 +44,6 @@ import com.hippo.ehviewer.dao.QuickSearchDao; import com.hippo.ehviewer.dao.QuickSearchRaw; import com.hippo.ehviewer.download.DownloadInfo; -import java.util.ArrayList; import java.util.List; import de.greenrobot.dao.query.LazyList; @@ -329,17 +328,6 @@ public class EhDB { } } - @NonNull - public static synchronized List getAllDownloadLabelList() { - DownloadLabelDao dao = sDaoSession.getDownloadLabelDao(); - List list = dao.queryBuilder().orderAsc(DownloadLabelDao.Properties.Time).list(); - List result = new ArrayList<>(list.size()); - for (int i = 0, n = list.size(); i < n; i++) { - result.add(list.get(i).getLabel()); - } - return result; - } - public static synchronized LazyList getDownloadInfoLazyList() { return sDaoSession.getDownloadInfoDao().queryBuilder() .orderAsc(DownloadInfoDao.Properties.Date).listLazy(); @@ -414,4 +402,19 @@ public class EhDB { DownloadDirnameDao dao = sDaoSession.getDownloadDirnameDao(); dao.deleteByKey((long) gid); } + + @NonNull + public static synchronized List getAllDownloadLabelList() { + DownloadLabelDao dao = sDaoSession.getDownloadLabelDao(); + return dao.queryBuilder().orderAsc(DownloadLabelDao.Properties.Time).list(); + } + + public static synchronized DownloadLabelRaw addDownloadLabel(String label) { + DownloadLabelDao dao = sDaoSession.getDownloadLabelDao(); + DownloadLabelRaw raw = new DownloadLabelRaw(); + raw.setLabel(label); + raw.setTime(System.currentTimeMillis()); + raw.setId(dao.insert(raw)); + return raw; + } } diff --git a/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.java b/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.java index 4eb66f8e2..c8a05e53a 100644 --- a/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.java +++ b/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.java @@ -25,6 +25,7 @@ import android.util.SparseArray; import com.hippo.ehviewer.EhDB; import com.hippo.ehviewer.client.data.GalleryInfo; import com.hippo.ehviewer.dao.DownloadInfoRaw; +import com.hippo.ehviewer.dao.DownloadLabelRaw; import com.hippo.ehviewer.spider.SpiderQueen; import com.hippo.image.Image; import com.hippo.yorozuya.ConcurrentPool; @@ -49,7 +50,7 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { private final Map> mMap; // All labels without default label @NonNull - private final List mLabelList; + private final List mLabelList; // Store download info with default label @NonNull private final LinkedList mDefaultInfoList; @@ -75,14 +76,14 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { public DownloadManager(Context context) { mContext = context; - List labels = EhDB.getAllDownloadLabelList(); + List labels = EhDB.getAllDownloadLabelList(); mLabelList = labels; // Create list for each label HashMap> map = new HashMap<>(); mMap = map; - for (String label : labels) { - map.put(label, new LinkedList()); + for (DownloadLabelRaw label : labels) { + map.put(label.getLabel(), new LinkedList()); } // Create default for non tag mDefaultInfoList = new LinkedList<>(); @@ -106,8 +107,9 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { if (list == null) { list = new LinkedList<>(); map.put(info.label, list); - if (!labels.contains(info.label)) { - labels.add(info.label); + if (!containLabel(info.label)) { + // Add label to DB and list + labels.add(EhDB.addDownloadLabel(info.label)); } } list.add(info); @@ -151,11 +153,21 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { } public boolean containLabel(String label) { - return mLabelList.contains(label); + if (label == null) { + return false; + } + + for (DownloadLabelRaw raw: mLabelList) { + if (label.equals(raw.getLabel())) { + return true; + } + } + + return false; } @NonNull - public List getLabelList() { + public List getLabelList() { return mLabelList; } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java index 6122fd995..a2dcd2974 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java @@ -211,6 +211,12 @@ public final class MainActivity extends StageActivity } } + public void closeDrawer(int drawerGravity) { + if (mDrawerLayout != null) { + mDrawerLayout.closeDrawer(drawerGravity); + } + } + public void toggleDrawer(int drawerGravity) { if (mDrawerLayout != null) { if (mDrawerLayout.isDrawerOpen(drawerGravity)) { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.java index 36b51bfa3..2928e5136 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.java @@ -38,6 +38,13 @@ public class BaseScene extends SceneFragment { } } + public void closeDrawer(int drawerGravity) { + FragmentActivity activity = getActivity(); + if (activity instanceof MainActivity) { + ((MainActivity) activity).closeDrawer(drawerGravity); + } + } + public void toggleDrawer(int drawerGravity) { FragmentActivity activity = getActivity(); if (activity instanceof MainActivity) { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadScene.java index 3d126f542..131c59171 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadScene.java @@ -30,11 +30,16 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; import android.transition.TransitionInflater; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; @@ -47,6 +52,7 @@ import com.hippo.ehviewer.Settings; import com.hippo.ehviewer.client.EhCacheKeyFactory; import com.hippo.ehviewer.client.EhUtils; import com.hippo.ehviewer.client.data.GalleryInfo; +import com.hippo.ehviewer.dao.DownloadLabelRaw; import com.hippo.ehviewer.download.DownloadInfo; import com.hippo.ehviewer.download.DownloadManager; import com.hippo.ehviewer.download.DownloadService; @@ -64,7 +70,9 @@ import com.hippo.view.ViewTransition; import com.hippo.widget.LoadImageView; import com.hippo.widget.SimpleImageView; import com.hippo.yorozuya.FileUtils; +import com.hippo.yorozuya.ObjectUtils; +import java.util.ArrayList; import java.util.List; public class DownloadScene extends ToolbarScene @@ -106,8 +114,7 @@ public class DownloadScene extends ToolbarScene } } - private void onInit() { - mLabel = Settings.getRecentDownloadLabel(); + private void updateForLabel() { DownloadManager manager = EhApplication.getDownloadManager(getContext()); if (mLabel == null) { mList = manager.getDefaultDownloadInfoList(); @@ -118,20 +125,19 @@ public class DownloadScene extends ToolbarScene mList = manager.getDefaultDownloadInfoList(); } } + setTitle(getString(R.string.scene_download_title, + mLabel != null ? mLabel : getString(R.string.default_download_label_name))); + Settings.putRecentDownloadLabel(mLabel); + } + + private void onInit() { + mLabel = Settings.getRecentDownloadLabel(); + updateForLabel(); } private void onRestore(@NonNull Bundle savedInstanceState) { mLabel = savedInstanceState.getString(KEY_LABEL); - DownloadManager manager = EhApplication.getDownloadManager(getContext()); - if (mLabel == null) { - mList = manager.getDefaultDownloadInfoList(); - } else { - mList = manager.getLabelDownloadInfoList(mLabel); - if (mList == null) { - mLabel = null; - mList = manager.getDefaultDownloadInfoList(); - } - } + updateForLabel(); } @Override @@ -177,7 +183,6 @@ public class DownloadScene extends ToolbarScene @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - setTitle(R.string.download); setNavigationIcon(VectorDrawable.create(getContext(), R.xml.ic_arrow_left_dark_x24)); // Clear nav checked item @@ -228,6 +233,65 @@ public class DownloadScene extends ToolbarScene mAdapter = null; } + @Override + public View onCreateDrawerView(LayoutInflater inflater, + @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.drawer_download, container, false); + + Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar); + toolbar.setTitle(R.string.drawer_download_label_title); + toolbar.inflateMenu(R.menu.drawer_download); + toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + int id = item.getItemId(); + switch (id) { + case R.id.action_settings: + // TODO + return true; + } + return false; + } + }); + + List list = EhApplication.getDownloadManager(getContext()).getLabelList(); + final List labels = new ArrayList<>(list.size() + 1); + // Add default label name + labels.add(getString(R.string.default_download_label_name)); + for (DownloadLabelRaw raw: list) { + labels.add(raw.getLabel()); + } + + // TODO handle download label items update + ListView listView = (ListView) view.findViewById(R.id.list_view); + listView.setAdapter(new ArrayAdapter<>(getContext(), R.layout.item_simple_list, labels)); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + String label; + if (position == 0) { + label = null; + } else { + label = labels.get(position); + } + if (!ObjectUtils.equal(label, mLabel)) { + mLabel = label; + updateForLabel(); + if (mViewTransition != null) { + if (mList == null || mList.size() == 0) { + mViewTransition.showView(1); + } else { + mViewTransition.showView(0); + } + } + closeDrawer(Gravity.RIGHT); + } + } + }); + + return view; + } + @Override public void onDestroy() { super.onDestroy(); diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/ToolbarScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/ToolbarScene.java index 99c869cb1..4bc12cdee 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/ToolbarScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/ToolbarScene.java @@ -33,8 +33,11 @@ import com.hippo.ehviewer.R; public abstract class ToolbarScene extends BaseScene { + @Nullable private Toolbar mToolbar; + private CharSequence mTempTitle; + @Nullable public View onCreateView2(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -69,6 +72,11 @@ public abstract class ToolbarScene extends BaseScene { public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); if (mToolbar != null) { + if (mTempTitle != null) { + mToolbar.setTitle(mTempTitle); + mTempTitle = null; + } + int menuResId = getMenuResId(); if (menuResId != 0) { mToolbar.inflateMenu(menuResId); @@ -78,6 +86,7 @@ public abstract class ToolbarScene extends BaseScene { return ToolbarScene.this.onMenuItemClick(item); } }); + onMenuCreated(mToolbar.getMenu()); } mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override @@ -85,7 +94,6 @@ public abstract class ToolbarScene extends BaseScene { onNavigationClick(); } }); - onMenuCreated(mToolbar.getMenu()); } } @@ -116,14 +124,14 @@ public abstract class ToolbarScene extends BaseScene { } public void setTitle(@StringRes int resId) { - if (mToolbar != null) { - mToolbar.setTitle(resId); - } + setTitle(getString(resId)); } public void setTitle(CharSequence title) { if (mToolbar != null) { mToolbar.setTitle(title); + } else { + mTempTitle = title; } } } diff --git a/app/src/main/java/com/hippo/widget/DrawView.java b/app/src/main/java/com/hippo/widget/DrawView.java new file mode 100644 index 000000000..816d1b2bc --- /dev/null +++ b/app/src/main/java/com/hippo/widget/DrawView.java @@ -0,0 +1,74 @@ +/* + * Copyright 2016 Hippo Seven + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hippo.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +import com.hippo.yorozuya.LayoutUtils; + +public class DrawView extends FrameLayout { + + private static final int DEFAULT_MAX_WIDTH = 280; + + private static final int[] SIZE_ATTRS = new int[] { + android.R.attr.maxWidth + }; + + private int mMaxWidth; + + public DrawView(Context context) { + super(context); + init(context, null); + } + + public DrawView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs); + } + + public DrawView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context, attrs); + } + + private void init(Context context, AttributeSet attrs) { + TypedArray a = context.obtainStyledAttributes(attrs, SIZE_ATTRS); + mMaxWidth = a.getDimensionPixelOffset(0, LayoutUtils.dp2pix(context, DEFAULT_MAX_WIDTH)); + a.recycle(); + } + + @Override + protected void onMeasure(int widthSpec, int heightSpec) { + switch (MeasureSpec.getMode(widthSpec)) { + case MeasureSpec.EXACTLY: + // Nothing to do + break; + case MeasureSpec.AT_MOST: + widthSpec = MeasureSpec.makeMeasureSpec( + Math.min(MeasureSpec.getSize(widthSpec), mMaxWidth), MeasureSpec.EXACTLY); + break; + case MeasureSpec.UNSPECIFIED: + widthSpec = MeasureSpec.makeMeasureSpec(mMaxWidth, MeasureSpec.EXACTLY); + break; + } + // Let super sort out the height + super.onMeasure(widthSpec, heightSpec); + } +} diff --git a/app/src/main/res/drawable-hdpi/ic_settings_dark_x24.png b/app/src/main/res/drawable-hdpi/ic_settings_dark_x24.png new file mode 100644 index 000000000..d4e6abcaa Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_settings_dark_x24.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_settings_dark_x24.png b/app/src/main/res/drawable-mdpi/ic_settings_dark_x24.png new file mode 100644 index 000000000..b30d9a85c Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_settings_dark_x24.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_settings_dark_x24.png b/app/src/main/res/drawable-xhdpi/ic_settings_dark_x24.png new file mode 100644 index 000000000..083d6135b Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_settings_dark_x24.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_settings_dark_x24.png b/app/src/main/res/drawable-xxhdpi/ic_settings_dark_x24.png new file mode 100644 index 000000000..4f6bb7674 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_settings_dark_x24.png differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 5e2ce7678..4732d3871 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -38,11 +38,13 @@ app:headerLayout="@layout/nav_header_main" app:menu="@menu/nav_drawer_main"/> - + android:maxWidth="280dp" + android:background="@color/background_light" + android:clickable="true"/> diff --git a/app/src/main/res/layout/drawer_download.xml b/app/src/main/res/layout/drawer_download.xml new file mode 100644 index 000000000..c74469dfb --- /dev/null +++ b/app/src/main/res/layout/drawer_download.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_simple_list.xml b/app/src/main/res/layout/item_simple_list.xml new file mode 100644 index 000000000..53795f57a --- /dev/null +++ b/app/src/main/res/layout/item_simple_list.xml @@ -0,0 +1,27 @@ + + + + diff --git a/app/src/main/res/menu/drawer_download.xml b/app/src/main/res/menu/drawer_download.xml new file mode 100644 index 000000000..54cbeb7cf --- /dev/null +++ b/app/src/main/res/menu/drawer_download.xml @@ -0,0 +1,28 @@ + + + + + + + + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 33bf986f5..970429285 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -173,6 +173,7 @@ 跳页 + 下载 - %s 无下载项目 未启动 等待中 @@ -191,6 +192,8 @@ 从下载列表移除 %s ? 删除图片文件 全部停止 + 标签 + 默认 第 %d 页 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index eb413e64f..5dd5f3927 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -213,6 +213,7 @@ Go to + Download - %s No download items Idle Waiting @@ -231,6 +232,8 @@ Remove %s from download list ? Delete image files Stop All + Label + Default Page %d