From 15a162e5e598a3797475a2eebcca0e2b89c451bf Mon Sep 17 00:00:00 2001 From: springhack Date: Thu, 7 Oct 2021 20:24:21 +0800 Subject: [PATCH] like/unlike, refactor constants --- .idea/vcs.xml | 6 ++ app/build.gradle | 1 + .../org/springhack/stickercrap/Constants.java | 30 ++++++- .../springhack/stickercrap/MainActivity.java | 26 ++++-- .../org/springhack/stickercrap/Sticker.java | 13 +++ .../stickercrap/StickerAdapter.java | 18 +++- .../springhack/stickercrap/StickerViewer.java | 47 +++------- .../org/springhack/stickercrap/Utils.java | 85 +++++++++++++++++++ .../main/res/layout/stickers_list_item.xml | 26 +++++- app/src/main/res/values/strings.xml | 2 +- 10 files changed, 203 insertions(+), 51 deletions(-) create mode 100644 .idea/vcs.xml create mode 100644 app/src/main/java/org/springhack/stickercrap/Utils.java 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" /> + + +