From a5d9c2fd4abc4dbd2dbd388ce869fb650494357c Mon Sep 17 00:00:00 2001 From: seven332 Date: Tue, 17 Feb 2015 15:26:24 +0800 Subject: [PATCH] Update --- .../ui/fragment/GalleryListFragment.java | 4 +- .../ehviewer/ui/fragment/SceneFragment.java | 33 ---- .../ehviewer/ui/fragment/SearchFragment.java | 17 +- .../ehviewer/ui/scene/GalleryListScene.java | 14 +- .../hippo/ehviewer/widget/SearchLayout.java | 38 ++-- .../widget/SelectSearchImageLayout.java | 177 ++++++++++++++++++ app/src/main/java/com/hippo/scene/Scene.java | 4 + .../main/java/com/hippo/util/ViewUtils.java | 9 + .../widget_select_search_image_layout.xml | 63 +++++++ .../res/layout-sw600dp/search_category.xml | 13 +- .../widget_select_search_image_layout.xml | 66 +++++++ app/src/main/res/layout/search_image.xml | 35 +--- .../widget_select_search_image_layout.xml | 46 +++++ app/src/main/res/raw/file_image.svg | 5 + app/src/main/res/raw/file_image_off.svg | 8 + app/src/main/res/values-sw600dp/dimens.xml | 29 ++- app/src/main/res/values/colors.xml | 9 + app/src/main/res/values/dimens.xml | 28 +-- 18 files changed, 461 insertions(+), 137 deletions(-) delete mode 100644 app/src/main/java/com/hippo/ehviewer/ui/fragment/SceneFragment.java create mode 100644 app/src/main/java/com/hippo/ehviewer/widget/SelectSearchImageLayout.java create mode 100644 app/src/main/res/layout-land/widget_select_search_image_layout.xml create mode 100644 app/src/main/res/layout-sw600dp/widget_select_search_image_layout.xml create mode 100644 app/src/main/res/layout/widget_select_search_image_layout.xml create mode 100644 app/src/main/res/raw/file_image.svg create mode 100644 app/src/main/res/raw/file_image_off.svg diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/GalleryListFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/GalleryListFragment.java index 84681b143..113f996a4 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/GalleryListFragment.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/GalleryListFragment.java @@ -15,5 +15,7 @@ package com.hippo.ehviewer.ui.fragment; -public class GalleryListFragment extends SceneFragment { +import android.support.v4.app.Fragment; + +public class GalleryListFragment extends Fragment { } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/SceneFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/SceneFragment.java deleted file mode 100644 index ab2c334d2..000000000 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/SceneFragment.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2015 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 - * 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.ehviewer.ui.fragment; - -import android.support.v4.app.Fragment; - -import com.hippo.scene.Scene; - -public class SceneFragment extends Fragment { - - private Scene mScene; - - public Scene getScene() { - return mScene; - } - - public void setScene(Scene scene) { - mScene = scene; - } -} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/SearchFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/SearchFragment.java index 27eaf84dd..5afb9bae8 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/SearchFragment.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/SearchFragment.java @@ -22,6 +22,7 @@ import android.net.Uri; import android.os.Bundle; import android.os.Parcelable; import android.provider.MediaStore; +import android.support.v4.app.Fragment; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; @@ -32,20 +33,22 @@ import com.hippo.ehviewer.data.GalleryListUrlBuilder; import com.hippo.ehviewer.widget.SearchLayout; import com.hippo.scene.Scene; -public class SearchFragment extends SceneFragment implements SearchLayout.SearhLayoutHelper, +public class SearchFragment extends Fragment implements SearchLayout.SearhLayoutHelper, Scene.ActivityResultListener { private static final String VIEW_STATE_TAG = "android:view_state"; private Activity mActivity; - private OnSearchListener mOnSearchListener; - private View mRootView; private SearchLayout mSearchLayout; - public void setOnSearchListener(OnSearchListener listener) { - mOnSearchListener = listener; + private static Scene sScene; + private static OnSearchListener sOnSearchListener; + + + public static void setScene(Scene scene) { + sScene = scene; } @Override @@ -80,9 +83,9 @@ public class SearchFragment extends SceneFragment implements SearchLayout.SearhL } @Override - public void requestSelectImage() { + public void onRequestSelectImage() { Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); - getScene().startActivityForResult(intent, this); + sScene.startActivityForResult(intent, this); } @Override diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java index 4c7470514..95b408b9a 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java @@ -15,6 +15,7 @@ package com.hippo.ehviewer.ui.scene; +import android.content.res.Resources; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; @@ -30,6 +31,8 @@ import com.hippo.widget.Appbar; public class GalleryListScene extends Scene implements SearchFragment.OnSearchListener { + private Resources mResources; + private Appbar mAppbar; private ViewPager mViewPager; @@ -39,13 +42,17 @@ public class GalleryListScene extends Scene implements SearchFragment.OnSearchLi public void onCreate() { setContentView(R.layout.scene_gallery_list); + mResources = getStageActivity().getResources(); + mAppbar = (Appbar) findViewById(R.id.appbar); mViewPager = (ViewPager) findViewById(R.id.viewPager); mAdapter = new GalleryListPagerAdapter(getSupportFragmentManager()); mViewPager.setAdapter(mAdapter); - mAppbar.setTitle("EhViewer"); + mAppbar.setTitle(mResources.getString(R.string.app_name)); + + SearchFragment.setScene(this); } @Override @@ -61,6 +68,8 @@ public class GalleryListScene extends Scene implements SearchFragment.OnSearchLi @Override public void onDestroy() { dispatchRemove(); + + SearchFragment.setScene(null); } @Override @@ -93,12 +102,9 @@ public class GalleryListScene extends Scene implements SearchFragment.OnSearchLi public Fragment getItem(int i) { if (i == 0) { SearchFragment fragment = new SearchFragment(); - fragment.setScene(GalleryListScene.this); - fragment.setOnSearchListener(GalleryListScene.this); return fragment; } else { GalleryListFragment fragment = new GalleryListFragment(); - fragment.setScene(GalleryListScene.this); return fragment; } } diff --git a/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.java b/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.java index 0092f59f6..60213b61e 100644 --- a/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.java +++ b/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.java @@ -18,7 +18,6 @@ package com.hippo.ehviewer.widget; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Parcelable; import android.support.v7.widget.LinearLayoutManager; @@ -32,7 +31,6 @@ import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.FrameLayout; -import android.widget.ImageView; import android.widget.TextView; import com.hippo.effect.ripple.RippleSalon; @@ -46,7 +44,7 @@ import com.hippo.widget.recyclerview.EasyRecyclerView; import org.jetbrains.annotations.NotNull; public class SearchLayout extends FrameLayout implements CompoundButton.OnCheckedChangeListener, - View.OnClickListener { + View.OnClickListener, SelectSearchImageLayout.SelectSearchImageLayoutHelper { private static final String STATE_KEY_SUPER = "super"; private static final String STATE_KEY_SEARCH_MODE = "search_mode"; @@ -92,10 +90,7 @@ public class SearchLayout extends FrameLayout implements CompoundButton.OnChecke private FloatLabelEditText mEditTextTag; - private View mImageView; - private TextView mTextSelectImage; - private TextView mTextImagePath; - private ImageView mImagePreview; + private SelectSearchImageLayout mImageView; private View mActionView; private TextView mAction1; @@ -218,24 +213,18 @@ public class SearchLayout extends FrameLayout implements CompoundButton.OnChecke // TODO add quick search } else if (v == mAction2) { taggleSearchMode(); - } else if (v == mTextSelectImage) { - if (mHelper != null) { - mHelper.requestSelectImage(); - } } } public void onSelectImage(@NotNull String imagePath) { - mTextImagePath.setText(imagePath); + mImageView.onSelectImage(imagePath); + } - if (mSearchImage != null && !mSearchImage.isRecycled()) { - mSearchImage.isRecycled(); + @Override + public void onRequstSelectImage() { + if (mHelper != null) { + mHelper.onRequestSelectImage(); } - mSearchImage = BitmapFactory.decodeFile(imagePath); - mImagePreview.setImageBitmap(mSearchImage); - - ViewUtils.setVisibility(mTextImagePath, View.VISIBLE); - ViewUtils.setVisibility(mImagePreview, View.VISIBLE); } private class SearchHolder extends RecyclerView.ViewHolder { @@ -393,19 +382,14 @@ public class SearchLayout extends FrameLayout implements CompoundButton.OnChecke if (mImageView == null) { mInflater.inflate(R.layout.search_image, holder.content); - mImageView = holder.content.getChildAt(0); - - mTextSelectImage = (TextView) mImageView.findViewById(R.id.search_select_image_action); - mTextImagePath = (TextView) mImageView.findViewById(R.id.search_select_image_path); - mImagePreview = (ImageView) mImageView.findViewById(R.id.search_select_image_image); + mImageView = (SelectSearchImageLayout) holder.content.getChildAt(0); // Restore state if (mSavedInstanceState != null) { holder.content.restoreHierarchyState(mSavedInstanceState); } - RippleSalon.addRipple(mTextSelectImage, false); - mTextSelectImage.setOnClickListener(SearchLayout.this); + mImageView.setHelper(SearchLayout.this); } else { ViewUtils.removeFromParent(mImageView); holder.content.addView(mImageView); @@ -433,6 +417,6 @@ public class SearchLayout extends FrameLayout implements CompoundButton.OnChecke } public interface SearhLayoutHelper { - public void requestSelectImage(); + public void onRequestSelectImage(); } } diff --git a/app/src/main/java/com/hippo/ehviewer/widget/SelectSearchImageLayout.java b/app/src/main/java/com/hippo/ehviewer/widget/SelectSearchImageLayout.java new file mode 100644 index 000000000..ab35d98dc --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/widget/SelectSearchImageLayout.java @@ -0,0 +1,177 @@ +/* + * Copyright (C) 2015 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 + * 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.ehviewer.widget; + +import android.annotation.TargetApi; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Build; +import android.os.Bundle; +import android.os.Parcelable; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.hippo.effect.ripple.RippleSalon; +import com.hippo.ehviewer.R; +import com.hippo.util.ViewUtils; +import com.larvalabs.svgandroid.SVG; +import com.larvalabs.svgandroid.SVGBuilder; + +import org.jetbrains.annotations.NotNull; + +public class SelectSearchImageLayout extends LinearLayout implements View.OnClickListener{ + + private static final String STATE_KEY_SUPER = "super"; + private static final String STATE_KEY_PATH = "path"; + + private TextView mButtonSelect; + private TextView mTextPath; + private ImageView mImagePreview; + + private String mSelectedPath; + private Bitmap mSelectedImage; + + private SelectSearchImageLayoutHelper mHelper; + + public SelectSearchImageLayout(Context context) { + super(context); + init(context); + } + + public SelectSearchImageLayout(Context context, AttributeSet attrs) { + super(context, attrs); + init(context); + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + public SelectSearchImageLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context); + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public SelectSearchImageLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + init(context); + } + + private void init(Context context) { + LayoutInflater.from(context).inflate(R.layout.widget_select_search_image_layout, this); + + // TODO It is a bad idea. + int childCount = getChildCount(); + if (childCount == 3) { + setOrientation(LinearLayout.VERTICAL); + } else if (childCount == 2) { + setOrientation(LinearLayout.HORIZONTAL); + } else { + throw new IllegalStateException("Can't guess orientation, did you changed the layout res ?"); + } + + mButtonSelect = (TextView) findViewById(R.id.search_select_image_action); + mTextPath = (TextView) findViewById(R.id.search_select_image_path); + mImagePreview = (ImageView) findViewById(R.id.search_select_image_image); + + RippleSalon.addRipple(mButtonSelect, false); + mButtonSelect.setOnClickListener(this); + + ViewUtils.removeHardwareAccelerationSupport(mImagePreview); + SVG svg = new SVGBuilder().readFromResource(getResources(), R.raw.file_image).build(); + mImagePreview.setImageDrawable(svg.getDrawable()); + } + + public void setHelper(SelectSearchImageLayoutHelper helper) { + mHelper = helper; + } + + private void setImagePreview(String imagePath) { + if (mSelectedImage != null && !mSelectedImage.isRecycled()) { + mSelectedImage.isRecycled(); + } + mSelectedImage = BitmapFactory.decodeFile(imagePath); + if (mSelectedImage != null) { + mImagePreview.setImageBitmap(mSelectedImage); + } else { + SVG svg = new SVGBuilder().readFromResource(getResources(), R.raw.file_image_off).build(); + mImagePreview.setImageDrawable(svg.getDrawable()); + } + } + + public void onSelectImage(@NotNull String selectPath) { + mSelectedPath = selectPath; + + mTextPath.setText(selectPath); + setImagePreview(selectPath); + + ViewUtils.setVisibility(mTextPath, View.VISIBLE); + ViewUtils.setVisibility(mImagePreview, View.VISIBLE); + + super.onDetachedFromWindow(); + super.onAttachedToWindow(); + } + + @Override + protected void onAttachedToWindow() { + if (mSelectedPath != null) { + setImagePreview(mSelectedPath); + } + } + + @Override + protected void onDetachedFromWindow() { + if (mSelectedImage != null && !mSelectedImage.isRecycled()) { + mSelectedImage.isRecycled(); + } + mSelectedImage = null; + } + + @Override + public Parcelable onSaveInstanceState() { + final Bundle state = new Bundle(); + state.putParcelable(STATE_KEY_SUPER, super.onSaveInstanceState()); + state.putString(STATE_KEY_PATH, mSelectedPath); + return state; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + if (state instanceof Bundle) { + final Bundle savedState = (Bundle) state; + super.onRestoreInstanceState(savedState.getParcelable(STATE_KEY_SUPER)); + String path = savedState.getString(STATE_KEY_PATH); + if (path != null) { + onSelectImage(path); + } + } + } + + @Override + public void onClick(View v) { + if (mHelper != null) { + mHelper.onRequstSelectImage(); + } + } + + public interface SelectSearchImageLayoutHelper { + public void onRequstSelectImage(); + } + +} diff --git a/app/src/main/java/com/hippo/scene/Scene.java b/app/src/main/java/com/hippo/scene/Scene.java index a4a721f70..6b66eefb5 100644 --- a/app/src/main/java/com/hippo/scene/Scene.java +++ b/app/src/main/java/com/hippo/scene/Scene.java @@ -62,6 +62,10 @@ public abstract class Scene { return mRootView; } + public StageActivity getStageActivity() { + return mStageActivity; + } + public void startScene(Class sceneClass) { mStageActivity.startScene(this, sceneClass); } diff --git a/app/src/main/java/com/hippo/util/ViewUtils.java b/app/src/main/java/com/hippo/util/ViewUtils.java index d89c2a49b..9f7c45abe 100644 --- a/app/src/main/java/com/hippo/util/ViewUtils.java +++ b/app/src/main/java/com/hippo/util/ViewUtils.java @@ -156,6 +156,15 @@ public final class ViewUtils { } } + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + public static void addHardwareAccelerationSupport(View v) { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB) { + if (v.getLayerType() != View.LAYER_TYPE_HARDWARE) { + v.setLayerType(View.LAYER_TYPE_HARDWARE, null); + } + } + } + public static void measureView(View v, int width, int height) { int widthMeasureSpec; int heightMeasureSpec; diff --git a/app/src/main/res/layout-land/widget_select_search_image_layout.xml b/app/src/main/res/layout-land/widget_select_search_image_layout.xml new file mode 100644 index 000000000..2595fec04 --- /dev/null +++ b/app/src/main/res/layout-land/widget_select_search_image_layout.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout-sw600dp/search_category.xml b/app/src/main/res/layout-sw600dp/search_category.xml index ab1df937f..e1f208f39 100644 --- a/app/src/main/res/layout-sw600dp/search_category.xml +++ b/app/src/main/res/layout-sw600dp/search_category.xml @@ -24,6 +24,7 @@ + android:layout_height="0dp" + android:layout_weight="1"> + + + + diff --git a/app/src/main/res/layout-sw600dp/widget_select_search_image_layout.xml b/app/src/main/res/layout-sw600dp/widget_select_search_image_layout.xml new file mode 100644 index 000000000..59ebc98cb --- /dev/null +++ b/app/src/main/res/layout-sw600dp/widget_select_search_image_layout.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/search_image.xml b/app/src/main/res/layout/search_image.xml index 25e9b9911..214ded156 100644 --- a/app/src/main/res/layout/search_image.xml +++ b/app/src/main/res/layout/search_image.xml @@ -13,37 +13,8 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - - - - - - + android:layout_height="wrap_content"/> diff --git a/app/src/main/res/layout/widget_select_search_image_layout.xml b/app/src/main/res/layout/widget_select_search_image_layout.xml new file mode 100644 index 000000000..484748db2 --- /dev/null +++ b/app/src/main/res/layout/widget_select_search_image_layout.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + diff --git a/app/src/main/res/raw/file_image.svg b/app/src/main/res/raw/file_image.svg new file mode 100644 index 000000000..95534aac1 --- /dev/null +++ b/app/src/main/res/raw/file_image.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/raw/file_image_off.svg b/app/src/main/res/raw/file_image_off.svg new file mode 100644 index 000000000..f3a2817ca --- /dev/null +++ b/app/src/main/res/raw/file_image_off.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/app/src/main/res/values-sw600dp/dimens.xml b/app/src/main/res/values-sw600dp/dimens.xml index aaab676a4..60ad181fd 100644 --- a/app/src/main/res/values-sw600dp/dimens.xml +++ b/app/src/main/res/values-sw600dp/dimens.xml @@ -16,20 +16,24 @@ --> - - 64dp + + 52dp + 52dp + 24dp - + 52dp 52dp 32dp - - - 16dp - - 16dp + 252dp + 64dp + + 16dp + 8dp + 240dp + 480dp 160dp @@ -41,17 +45,8 @@ 48dp - 8dp - - - 8dp 16dp - - 52dp - 52dp - 24dp - diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 8ff87ca8d..7f045a173 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -13,6 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index b05fe31cf..645b94670 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -15,20 +15,24 @@ --> - + + 0dp + 0dp + 0dp + + 16dp 16dp 8dp - - + 8dp + 0dp 48dp - + 8dp - - - 8dp - + 4dp + 120dp + 240dp 0dp @@ -45,18 +49,14 @@ 40dp - 4dp + @dimen/search_item_interval_half - 4dp + @dimen/search_item_interval_half 8dp - - 0dp - 0dp - 4dp