diff --git a/app/build.gradle b/app/build.gradle
index d011206ed..5eede8ec7 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -87,7 +87,7 @@ dependencies {
implementation 'com.google.android.gms:play-services-oss-licenses:17.0.0'
implementation 'com.google.android.material:material:1.3.0-alpha03'
implementation 'com.getkeepsafe.relinker:relinker:1.4.1'
- implementation 'com.github.amlcurran.showcaseview:library:5.4.3'
+ implementation 'com.getkeepsafe.taptargetview:taptargetview:1.13.0'
implementation 'com.github.seven332.a7zip:extract-lite:1b21783'
implementation 'com.github.seven332:android-resource:0.1.0'
implementation 'com.github.seven332:beerbelly:0.1.4'
diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.java
index f03a012d8..a08b7dab9 100644
--- a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.java
+++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.java
@@ -24,6 +24,7 @@ import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Point;
+import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
@@ -55,10 +56,8 @@ import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.SimpleItemAnimator;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
-import com.github.amlcurran.showcaseview.ShowcaseView;
-import com.github.amlcurran.showcaseview.SimpleShowcaseEventListener;
-import com.github.amlcurran.showcaseview.targets.PointTarget;
-import com.github.amlcurran.showcaseview.targets.ViewTarget;
+import com.getkeepsafe.taptargetview.TapTarget;
+import com.getkeepsafe.taptargetview.TapTargetView;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.h6ah4i.android.widget.advrecyclerview.animator.DraggableItemAnimator;
@@ -105,6 +104,7 @@ import com.hippo.widget.recyclerview.AutoStaggeredGridLayoutManager;
import com.hippo.yorozuya.AssertUtils;
import com.hippo.yorozuya.FileUtils;
import com.hippo.yorozuya.IOUtils;
+import com.hippo.yorozuya.LayoutUtils;
import com.hippo.yorozuya.ObjectUtils;
import com.hippo.yorozuya.ViewUtils;
import com.hippo.yorozuya.collect.LongList;
@@ -151,8 +151,6 @@ public class DownloadsScene extends ToolbarScene
@Nullable
private AutoStaggeredGridLayoutManager mLayoutManager;
- private ShowcaseView mShowcaseView;
-
private int mInitPosition = -1;
private DownloadLabelAdapter mLabelAdapter;
@@ -432,23 +430,19 @@ public class DownloadsScene extends ToolbarScene
return;
}
- mShowcaseView = new ShowcaseView.Builder(activity)
- .withMaterialShowcase()
- .setStyle(R.style.Guide)
- .setTarget(new ViewTarget(((DownloadHolder) holder).thumb))
- .hideOnTouchOutside()
- .setContentTitle(R.string.guide_download_thumb_title)
- .setContentText(R.string.guide_download_thumb_text)
- .replaceEndButton(R.layout.button_guide)
- .setShowcaseEventListener(new SimpleShowcaseEventListener() {
+ TapTargetView.showFor(requireActivity(),
+ TapTarget.forView(((DownloadHolder) holder).thumb,
+ getString(R.string.guide_download_thumb_title),
+ getString(R.string.guide_download_thumb_text))
+ .transparentTarget(true),
+ new TapTargetView.Listener() {
@Override
- public void onShowcaseViewDidHide(ShowcaseView showcaseView) {
- mShowcaseView = null;
- ViewUtils.removeFromParent(showcaseView);
+ public void onTargetDismissed(TapTargetView view, boolean userInitiated) {
+ super.onTargetDismissed(view, userInitiated);
Settings.putGuideDownloadThumb(false);
guideDownloadLabels();
}
- }).build();
+ });
}
private void guideDownloadLabels() {
@@ -460,24 +454,24 @@ public class DownloadsScene extends ToolbarScene
Display display = activity.getWindowManager().getDefaultDisplay();
Point point = new Point();
display.getSize(point);
+ Rect bounds = new Rect(point.x + LayoutUtils.dp2pix(requireContext(), 20),
+ point.y / 3 + LayoutUtils.dp2pix(requireContext(), 20),
+ point.x - LayoutUtils.dp2pix(requireContext(), 20),
+ point.y / 3 - LayoutUtils.dp2pix(requireContext(), 20));
- mShowcaseView = new ShowcaseView.Builder(activity)
- .withMaterialShowcase()
- .setStyle(R.style.Guide)
- .setTarget(new PointTarget(point.x, point.y / 3))
- .hideOnTouchOutside()
- .setContentTitle(R.string.guide_download_labels_title)
- .setContentText(R.string.guide_download_labels_text)
- .replaceEndButton(R.layout.button_guide)
- .setShowcaseEventListener(new SimpleShowcaseEventListener() {
+ TapTargetView.showFor(requireActivity(),
+ TapTarget.forBounds(bounds,
+ getString(R.string.guide_download_labels_title),
+ getString(R.string.guide_download_labels_text))
+ .transparentTarget(true),
+ new TapTargetView.Listener() {
@Override
- public void onShowcaseViewDidHide(ShowcaseView showcaseView) {
- mShowcaseView = null;
- ViewUtils.removeFromParent(showcaseView);
+ public void onTargetDismissed(TapTargetView view, boolean userInitiated) {
+ super.onTargetClick(view);
Settings.puttGuideDownloadLabels(false);
openDrawer(Gravity.RIGHT);
}
- }).build();
+ });
}
@Override
@@ -491,10 +485,6 @@ public class DownloadsScene extends ToolbarScene
public void onDestroyView() {
super.onDestroyView();
- if (null != mShowcaseView) {
- ViewUtils.removeFromParent(mShowcaseView);
- mShowcaseView = null;
- }
if (null != mRecyclerView) {
mRecyclerView.stopScroll();
mRecyclerView = null;
@@ -677,10 +667,6 @@ public class DownloadsScene extends ToolbarScene
@Override
public void onBackPressed() {
- if (null != mShowcaseView) {
- return;
- }
-
if (mRecyclerView != null && mRecyclerView.isInCustomChoice()) {
mRecyclerView.outOfCustomChoiceMode();
} else {
diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java
index cc099fe9c..82a614a87 100644
--- a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java
+++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java
@@ -22,6 +22,7 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.graphics.Point;
+import android.graphics.Rect;
import android.os.Bundle;
import android.text.InputType;
import android.text.TextUtils;
@@ -43,9 +44,8 @@ import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
-import com.github.amlcurran.showcaseview.ShowcaseView;
-import com.github.amlcurran.showcaseview.SimpleShowcaseEventListener;
-import com.github.amlcurran.showcaseview.targets.PointTarget;
+import com.getkeepsafe.taptargetview.TapTarget;
+import com.getkeepsafe.taptargetview.TapTargetView;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.hippo.android.resource.AttrResources;
@@ -82,6 +82,7 @@ import com.hippo.widget.ContentLayout;
import com.hippo.widget.FabLayout;
import com.hippo.widget.SearchBarMover;
import com.hippo.yorozuya.AssertUtils;
+import com.hippo.yorozuya.LayoutUtils;
import com.hippo.yorozuya.ObjectUtils;
import com.hippo.yorozuya.SimpleHandler;
import com.hippo.yorozuya.ViewUtils;
@@ -161,7 +162,6 @@ public class FavoritesScene extends BaseScene implements
// For modify action
private boolean mModifyAdd;
- private ShowcaseView mShowcaseView;
private final Runnable showNormalFabsRunnable = new Runnable() {
@Override
public void run() {
@@ -325,24 +325,24 @@ public class FavoritesScene extends BaseScene implements
Display display = activity.getWindowManager().getDefaultDisplay();
Point point = new Point();
display.getSize(point);
+ Rect bounds = new Rect(point.x + LayoutUtils.dp2pix(requireContext(), 20),
+ point.y / 3 + LayoutUtils.dp2pix(requireContext(), 20),
+ point.x - LayoutUtils.dp2pix(requireContext(), 20),
+ point.y / 3 - LayoutUtils.dp2pix(requireContext(), 20));
- mShowcaseView = new ShowcaseView.Builder(activity)
- .withMaterialShowcase()
- .setStyle(R.style.Guide)
- .setTarget(new PointTarget(point.x, point.y / 3))
- .hideOnTouchOutside()
- .setContentTitle(R.string.guide_collections_title)
- .setContentText(R.string.guide_collections_text)
- .replaceEndButton(R.layout.button_guide)
- .setShowcaseEventListener(new SimpleShowcaseEventListener() {
+ TapTargetView.showFor(requireActivity(),
+ TapTarget.forBounds(bounds,
+ getString(R.string.guide_collections_title),
+ getString(R.string.guide_collections_text))
+ .transparentTarget(true),
+ new TapTargetView.Listener() {
@Override
- public void onShowcaseViewDidHide(ShowcaseView showcaseView) {
- mShowcaseView = null;
- ViewUtils.removeFromParent(showcaseView);
+ public void onTargetDismissed(TapTargetView view, boolean userInitiated) {
+ super.onTargetClick(view);
Settings.putGuideCollections(false);
openDrawer(Gravity.RIGHT);
}
- }).build();
+ });
}
// keyword of mUrlBuilder, fav cat of mUrlBuilder, mFavCatArray.
@@ -390,11 +390,6 @@ public class FavoritesScene extends BaseScene implements
public void onDestroyView() {
super.onDestroyView();
- if (null != mShowcaseView) {
- ViewUtils.removeFromParent(mShowcaseView);
- mShowcaseView = null;
- }
-
if (null != mHelper) {
mHelper.destroy();
if (1 == mHelper.getShownViewIndex()) {
@@ -472,10 +467,6 @@ public class FavoritesScene extends BaseScene implements
@Override
public void onBackPressed() {
- if (null != mShowcaseView) {
- return;
- }
-
if (mRecyclerView != null && mRecyclerView.isInCustomChoice()) {
mRecyclerView.outOfCustomChoiceMode();
} else if (mFabLayout != null && mFabLayout.isExpanded()) {
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 28128125e..0fab89cba 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
@@ -23,6 +23,7 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Point;
+import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.InputType;
@@ -51,9 +52,8 @@ import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
-import com.github.amlcurran.showcaseview.ShowcaseView;
-import com.github.amlcurran.showcaseview.SimpleShowcaseEventListener;
-import com.github.amlcurran.showcaseview.targets.PointTarget;
+import com.getkeepsafe.taptargetview.TapTarget;
+import com.getkeepsafe.taptargetview.TapTargetView;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.h6ah4i.android.widget.advrecyclerview.animator.DraggableItemAnimator;
@@ -107,6 +107,7 @@ import com.hippo.widget.FabLayout;
import com.hippo.widget.SearchBarMover;
import com.hippo.yorozuya.AnimationUtils;
import com.hippo.yorozuya.AssertUtils;
+import com.hippo.yorozuya.LayoutUtils;
import com.hippo.yorozuya.MathUtils;
import com.hippo.yorozuya.SimpleAnimatorListener;
import com.hippo.yorozuya.StringUtils;
@@ -217,7 +218,6 @@ public final class GalleryListScene extends BaseScene
private long mPressBackTime = 0;
private boolean mHasFirstRefresh = false;
private int mNavCheckedId = 0;
- private ShowcaseView mShowcaseView;
private DownloadManager mDownloadManager;
private DownloadManager.DownloadInfoListener mDownloadInfoListener;
private FavouriteStatusRouter mFavouriteStatusRouter;
@@ -635,34 +635,30 @@ public final class GalleryListScene extends BaseScene
Display display = activity.getWindowManager().getDefaultDisplay();
Point point = new Point();
display.getSize(point);
+ Rect bounds = new Rect(point.x + LayoutUtils.dp2pix(requireContext(), 20),
+ point.y / 3 + LayoutUtils.dp2pix(requireContext(), 20),
+ point.x - LayoutUtils.dp2pix(requireContext(), 20),
+ point.y / 3 - LayoutUtils.dp2pix(requireContext(), 20));
- mShowcaseView = new ShowcaseView.Builder(activity)
- .withMaterialShowcase()
- .setStyle(R.style.Guide)
- .setTarget(new PointTarget(point.x, point.y / 3))
- .hideOnTouchOutside()
- .setContentTitle(R.string.guide_quick_search_title)
- .setContentText(R.string.guide_quick_search_text)
- .replaceEndButton(R.layout.button_guide)
- .setShowcaseEventListener(new SimpleShowcaseEventListener() {
+ TapTargetView.showFor(requireActivity(),
+ TapTarget.forBounds(bounds,
+ getString(R.string.guide_quick_search_title),
+ getString(R.string.guide_quick_search_text))
+ .transparentTarget(true),
+ new TapTargetView.Listener() {
@Override
- public void onShowcaseViewDidHide(ShowcaseView showcaseView) {
- mShowcaseView = null;
- ViewUtils.removeFromParent(showcaseView);
+ public void onTargetDismissed(TapTargetView view, boolean userInitiated) {
+ super.onTargetClick(view);
Settings.putGuideQuickSearch(false);
openDrawer(Gravity.RIGHT);
}
- }).build();
+ });
}
@Override
public void onDestroyView() {
super.onDestroyView();
- if (null != mShowcaseView) {
- ViewUtils.removeFromParent(mShowcaseView);
- mShowcaseView = null;
- }
if (null != mSearchBarMover) {
mSearchBarMover.cancelAnimation();
mSearchBarMover = null;
@@ -845,10 +841,6 @@ public final class GalleryListScene extends BaseScene
@Override
public void onBackPressed() {
- if (null != mShowcaseView) {
- return;
- }
-
if (null != mFabLayout && mFabLayout.isExpanded()) {
mFabLayout.setExpanded(false);
return;
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 6db17c30d..28b069355 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -130,12 +130,6 @@
- ?attr/guideTextColor
-
-