diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index b2c2081..25e719d 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -34,6 +34,7 @@ android {
dependencies {
+ implementation 'com.google.code.gson:gson:2.8.8'
implementation 'com.squareup.picasso:picasso:2.8'
implementation 'com.google.android:flexbox:1.0.0'
implementation 'org.jsoup:jsoup:1.14.3'
diff --git a/app/src/main/java/org/springhack/stickercrap/Constants.java b/app/src/main/java/org/springhack/stickercrap/Constants.java
index 9decd3c..33ddfca 100644
--- a/app/src/main/java/org/springhack/stickercrap/Constants.java
+++ b/app/src/main/java/org/springhack/stickercrap/Constants.java
@@ -3,10 +3,38 @@
public class Constants {
public static String FILE_PROVIDER = BuildConfig.APPLICATION_ID + ".fileprovider";
public static String USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36";
- public static String STICKER_LIST_URL = "https://sticker.weixin.qq.com/cgi-bin/mmemoticon-bin/emoticonview?oper=billboard&t=rank";
+ public static class Emojis {
+ public static String NO = "\uD83D\uDD05";
+ public static String LIKE = "\uD83D\uDC96";
+ public static String NORMAL = "\uD83D\uDCAD";
+ }
public static String[] ALLOW_PACKAGES = {
"com.fluidtouch.noteshelf2",
"com.samsung.android.app.notes",
"com.samsung.android.spdfnote"
};
+ public static class FetchConfig {
+ public static String STICKER_LIST_URL = "https://sticker.weixin.qq.com/cgi-bin/mmemoticon-bin/emoticonview?oper=billboard&t=rank";
+ public static String STICKER_LIST_SELECTOR = ".table_container .tbody tr .table_cell.detail";
+ public static class NameResolver {
+ public static String SELECTOR =".detail_content a.title";
+ public static String GETTER = "text";
+ }
+ public static class UrlResolver {
+ public static String SELECTOR =".detail_content a.title";
+ public static String GETTER = "href";
+ }
+ public static class AuthorResolver {
+ public static String SELECTOR =".detail_content .desc";
+ public static String GETTER = "text";
+ }
+ public static class ImageResolver {
+ public static String SELECTOR ="img";
+ public static String GETTER = "src";
+ }
+ public static class StickerResolver {
+ public static String SELECTOR =".stiker_content_ele";
+ public static String GETTER = "src";
+ }
+ }
}
diff --git a/app/src/main/java/org/springhack/stickercrap/MainActivity.java b/app/src/main/java/org/springhack/stickercrap/MainActivity.java
index b1fe0aa..8a2b735 100644
--- a/app/src/main/java/org/springhack/stickercrap/MainActivity.java
+++ b/app/src/main/java/org/springhack/stickercrap/MainActivity.java
@@ -12,12 +12,15 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
+import static org.springhack.stickercrap.Utils.AttrGetter;
+
public class MainActivity extends AppCompatActivity {
@Override
@@ -30,20 +33,27 @@ protected void onCreate(Bundle savedInstanceState) {
public void run() {
try {
List list = new ArrayList();
+ Set likes = Utils.GetLikeStickers(getApplicationContext());
+ for (String like : likes) {
+ list.add(Utils.GetSticker(getApplicationContext(), like));
+ }
Document document =
Jsoup
- .connect(Constants.STICKER_LIST_URL)
+ .connect(Constants.FetchConfig.STICKER_LIST_URL)
.userAgent(Constants.USER_AGENT)
- .referrer(Constants.STICKER_LIST_URL)
+ .referrer(Constants.FetchConfig.STICKER_LIST_URL)
.get();
- Elements elements = document.select(".table_container .tbody tr .table_cell.detail");
+ Elements elements = document.select(Constants.FetchConfig.STICKER_LIST_SELECTOR);
for (Element node : elements) {
Sticker sticker = new Sticker(
- node.select(".detail_content a.title").first().text(),
- node.select(".detail_content a.title").first().absUrl("href"),
- node.select(".detail_content .desc").first().text(),
- node.select("img").first().absUrl("src"));
- list.add(sticker);
+ AttrGetter(node.select(Constants.FetchConfig.NameResolver.SELECTOR).first(),Constants.FetchConfig.NameResolver.GETTER),
+ AttrGetter(node.select(Constants.FetchConfig.UrlResolver.SELECTOR).first(),Constants.FetchConfig.UrlResolver.GETTER),
+ AttrGetter(node.select(Constants.FetchConfig.AuthorResolver.SELECTOR).first(),Constants.FetchConfig.AuthorResolver.GETTER),
+ AttrGetter(node.select(Constants.FetchConfig.ImageResolver.SELECTOR).first(),Constants.FetchConfig.ImageResolver.GETTER));
+ String key = Utils.GetIDFromURL(sticker.url);
+ if (!likes.contains(key)) {
+ list.add(sticker);
+ }
}
runOnUiThread(new Runnable() {
@Override
diff --git a/app/src/main/java/org/springhack/stickercrap/Sticker.java b/app/src/main/java/org/springhack/stickercrap/Sticker.java
index 56c1b4a..1c5f598 100644
--- a/app/src/main/java/org/springhack/stickercrap/Sticker.java
+++ b/app/src/main/java/org/springhack/stickercrap/Sticker.java
@@ -1,11 +1,24 @@
package org.springhack.stickercrap;
+import com.google.gson.Gson;
+
public class Sticker {
+ public static Gson gson = new Gson();
+
public String name;
public String url;
public String author;
public String image;
+ public Boolean like = false;
+
+ public static Sticker fromJSON(String json) {
+ return gson.fromJson(json, Sticker.class);
+ }
+
+ public static String toJSON(Sticker sticker) {
+ return gson.toJson(sticker, Sticker.class);
+ }
public Sticker(String n, String u, String a, String i) {
this.name = n;
diff --git a/app/src/main/java/org/springhack/stickercrap/StickerAdapter.java b/app/src/main/java/org/springhack/stickercrap/StickerAdapter.java
index 56f61e4..38e341f 100644
--- a/app/src/main/java/org/springhack/stickercrap/StickerAdapter.java
+++ b/app/src/main/java/org/springhack/stickercrap/StickerAdapter.java
@@ -1,12 +1,15 @@
package org.springhack.stickercrap;
import android.content.Context;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
+import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
+import android.widget.Toast;
import com.squareup.picasso.Picasso;
@@ -25,17 +28,30 @@ public StickerAdapter(Context context, int textViewResourceId,
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Sticker sticker = getItem(position);
+ int like_count = Utils.GetLikeStickers(getContext()).size();
+ int real_position = position - like_count + 1;
View view = LayoutInflater.from(getContext()).inflate(resourceId, null);
TextView index = (TextView) view.findViewById(R.id.sticker_index);
TextView name = (TextView) view.findViewById(R.id.sticker_name);
TextView author = (TextView) view.findViewById(R.id.sticker_author);
ImageView image = (ImageView) view.findViewById(R.id.sticker_image);
+ Button like = (Button) view.findViewById(R.id.sticker_like);
- index.setText(Integer.toString(position + 1));
name.setText(sticker.name);
author.setText(sticker.author);
+ index.setText(real_position > 0 ? Integer.toString(real_position) : Constants.Emojis.NO);
+ like.setText(sticker.like ? Constants.Emojis.LIKE : Constants.Emojis.NORMAL);
Picasso.get().load(sticker.image).into(image);
+ like.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ sticker.like = !sticker.like;
+ Utils.ChangeStickerStatus(getContext(), sticker);
+ Toast.makeText(getContext(), (sticker.like ? "Like " : "Unlike ") + sticker.name, 1000).show();
+ like.setText(sticker.like ? Constants.Emojis.LIKE : Constants.Emojis.NORMAL);
+ }
+ });
return view;
}
diff --git a/app/src/main/java/org/springhack/stickercrap/StickerViewer.java b/app/src/main/java/org/springhack/stickercrap/StickerViewer.java
index 497b367..a50e643 100644
--- a/app/src/main/java/org/springhack/stickercrap/StickerViewer.java
+++ b/app/src/main/java/org/springhack/stickercrap/StickerViewer.java
@@ -1,29 +1,23 @@
package org.springhack.stickercrap;
import android.content.ClipData;
-import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
-import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
-import android.media.Image;
import android.net.Uri;
import android.os.Bundle;
-import android.provider.MediaStore;
+import android.os.FileUtils;
import android.util.Log;
-import android.view.DragEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
-import androidx.constraintlayout.widget.ConstraintHelper;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.content.FileProvider;
import com.google.android.flexbox.AlignItems;
-import com.google.android.flexbox.AlignSelf;
import com.google.android.flexbox.FlexboxLayout;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target;
@@ -41,16 +35,20 @@
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
-import java.util.UUID;
+import static org.springhack.stickercrap.Utils.AttrGetter;
+import static org.springhack.stickercrap.Utils.md5;
public class StickerViewer extends AppCompatActivity {
+
+ private File shared_files = null;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sticker_viewer);
final int DPS = getResources().getDimensionPixelSize(R.dimen.dps);
- File shared_files = new File(getCacheDir(), "shared_files");
+ shared_files = new File(getCacheDir(), "shared_files");
shared_files.mkdirs();
ConstraintLayout layout = (ConstraintLayout)findViewById(R.id.viewer);
@@ -84,12 +82,12 @@ public void run() {
Document document = Jsoup
.connect(url)
.userAgent(Constants.USER_AGENT)
- .referrer(Constants.STICKER_LIST_URL)
+ .referrer(Constants.FetchConfig.STICKER_LIST_URL)
.get();
- Elements elements = document.select(".stiker_content_ele");
+ Elements elements = document.select(Constants.FetchConfig.StickerResolver.SELECTOR);
List stickers = new ArrayList();
for (Element node : elements) {
- stickers.add(node.absUrl("src"));
+ stickers.add(AttrGetter(node, Constants.FetchConfig.StickerResolver.GETTER));
}
runOnUiThread(new Runnable() {
@Override
@@ -143,29 +141,4 @@ public void onPrepareLoad(Drawable placeHolderDrawable) {
}
}).start();
}
-
- public static String md5(final String s) {
- final String MD5 = "MD5";
- try {
- // Create MD5 Hash
- MessageDigest digest = java.security.MessageDigest
- .getInstance(MD5);
- digest.update(s.getBytes());
- byte messageDigest[] = digest.digest();
-
- // Create Hex String
- StringBuilder hexString = new StringBuilder();
- for (byte aMessageDigest : messageDigest) {
- String h = Integer.toHexString(0xFF & aMessageDigest);
- while (h.length() < 2)
- h = "0" + h;
- hexString.append(h);
- }
- return hexString.toString();
-
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- }
- return "";
- }
}
\ No newline at end of file
diff --git a/app/src/main/java/org/springhack/stickercrap/Utils.java b/app/src/main/java/org/springhack/stickercrap/Utils.java
new file mode 100644
index 0000000..04f746c
--- /dev/null
+++ b/app/src/main/java/org/springhack/stickercrap/Utils.java
@@ -0,0 +1,85 @@
+package org.springhack.stickercrap;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.net.Uri;
+import android.preference.PreferenceManager;
+import android.util.ArraySet;
+
+import org.jsoup.nodes.Element;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Set;
+
+public class Utils {
+ public static String LIKE_STICKERS_KEY = "LIKE_STICKERS_KEY";
+
+ public static String AttrGetter(Element node, String getter) {
+ if (getter == "text") {
+ return node.text();
+ } else {
+ return node.absUrl(getter);
+ }
+ }
+
+ public static String GetIDFromURL(String url) {
+ Uri uri = Uri.parse(url);
+ return uri.getQueryParameter("productid");
+ }
+
+ public static Set GetLikeStickers(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences("sticker_like", Context.MODE_PRIVATE);
+ return prefs.getStringSet(LIKE_STICKERS_KEY, new ArraySet<>());
+ }
+
+ public static Sticker GetSticker(Context context, String key) {
+ SharedPreferences prefs = context.getSharedPreferences("sticker_like", Context.MODE_PRIVATE);
+ String json = prefs.getString(key, Sticker.toJSON(new Sticker("", "", "", "")));
+ return Sticker.fromJSON(json);
+ }
+
+ public static void ChangeStickerStatus(Context context, Sticker sticker) {
+ ChangeStickerStatus(context, sticker, sticker.like);
+ }
+
+ public static void ChangeStickerStatus(Context context, Sticker sticker, Boolean like) {
+ Set likes = GetLikeStickers(context);
+ String key = GetIDFromURL(sticker.url);
+ SharedPreferences.Editor editor = context.getSharedPreferences("sticker_like", Context.MODE_PRIVATE).edit();
+ if (like) {
+ editor.putString(key, Sticker.toJSON(sticker));
+ likes.add(key);
+ } else {
+ editor.remove(key);
+ likes.remove(key);
+ }
+ editor.putStringSet(LIKE_STICKERS_KEY, likes);
+ editor.apply();
+ }
+
+ public static String md5(final String s) {
+ final String MD5 = "MD5";
+ try {
+ // Create MD5 Hash
+ MessageDigest digest = java.security.MessageDigest
+ .getInstance(MD5);
+ digest.update(s.getBytes());
+ byte messageDigest[] = digest.digest();
+
+ // Create Hex String
+ StringBuilder hexString = new StringBuilder();
+ for (byte aMessageDigest : messageDigest) {
+ String h = Integer.toHexString(0xFF & aMessageDigest);
+ while (h.length() < 2)
+ h = "0" + h;
+ hexString.append(h);
+ }
+ return hexString.toString();
+
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+}
diff --git a/app/src/main/res/layout/stickers_list_item.xml b/app/src/main/res/layout/stickers_list_item.xml
index 4e5c8ae..78b8e5b 100644
--- a/app/src/main/res/layout/stickers_list_item.xml
+++ b/app/src/main/res/layout/stickers_list_item.xml
@@ -1,5 +1,8 @@
@@ -9,8 +12,8 @@
android:layout_width="90dp"
android:layout_height="90dp"
android:textAlignment="center"
- android:textSize="30dp"
- android:paddingTop="20dp"
+ android:gravity="center_vertical"
+ android:textSize="26dp"
android:layout_gravity="center" />
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 1cb1b2e..7ee4f67 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,5 +1,5 @@
- WeCrap
+ StickerCrap
StickerViewer