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