Skip to content

Commit

Permalink
1、不再区分32与64位版本
Browse files Browse the repository at this point in the history
2、精简tab
3、精简侧边栏
  • Loading branch information
nining377 committed Oct 22, 2021
1 parent cc4aac4 commit 5a0dcfe
Show file tree
Hide file tree
Showing 9 changed files with 445 additions and 6 deletions.
15 changes: 12 additions & 3 deletions .idea/codeStyles/Project.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions app/src/main/java/com/raincat/dolby_beta/Hook.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.raincat.dolby_beta.hook.DownloadMD5Hook;
import com.raincat.dolby_beta.hook.EAPIHook;
import com.raincat.dolby_beta.hook.GrayHook;
import com.raincat.dolby_beta.hook.HideSidebarHook;
import com.raincat.dolby_beta.hook.HideTabHook;
import com.raincat.dolby_beta.hook.InternalDialogHook;
import com.raincat.dolby_beta.hook.MagiskFixHook;
Expand Down Expand Up @@ -98,6 +99,8 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
ClassHelper.getCacheClassList(context, versionCode, () -> {
//精简tab
new HideTabHook(context, versionCode);
//精简侧边栏
new HideSidebarHook(context, versionCode);
//获取账号信息
new UserProfileHook(context);
//网络访问
Expand Down
33 changes: 33 additions & 0 deletions app/src/main/java/com/raincat/dolby_beta/helper/ClassHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;

import static de.robv.android.xposed.XposedHelpers.findClass;
Expand Down Expand Up @@ -310,6 +311,38 @@ public static Method getTabRefreshMethod() {
}
}

public static class SidebarItem {
private static Class<?> clazz;

public static Class<?> getClazz() {
if (clazz == null) {
try {
Pattern pattern = Pattern.compile("^com\\.netease\\.cloudmusic\\.module\\.account\\.[a-z]$");
Pattern pattern2 = Pattern.compile("^com\\.netease\\.cloudmusic\\.music\\.biz\\.sidebar\\.account\\.[a-z]$");
List<String> list = ClassHelper.getFilteredClasses(pattern, Collections.reverseOrder());
list.addAll(ClassHelper.getFilteredClasses(pattern2, Collections.reverseOrder()));
clazz = Stream.of(list)
.map(s -> findClass(s, classLoader))
.filter(c -> Modifier.isPublic(c.getModifiers()))
.filter(m -> Modifier.isFinal(m.getModifiers()))
.filter(m -> !Modifier.isInterface(m.getModifiers()))
.filter(m -> !Modifier.isStatic(m.getModifiers()))
.filter(m -> !Modifier.isAbstract(m.getModifiers()))
.filter(c -> Stream.of(c.getDeclaredFields()).anyMatch(m -> m.getType() == int.class))
.filter(c -> Stream.of(c.getDeclaredFields()).anyMatch(m -> m.getType() == List.class))
.filter(c -> Stream.of(c.getDeclaredMethods()).anyMatch(m -> m.getReturnType() == List.class))
.filter(c -> Stream.of(c.getDeclaredMethods()).anyMatch(m -> m.getReturnType() == Throwable.class))
.findFirst()
.get();
} catch (NoSuchElementException e) {
e.printStackTrace();
}
XposedBridge.log("测试:" + clazz.getName());
}
return clazz;
}
}

public static class OKHttp3Response {
private static Class<?> clazz;

Expand Down
26 changes: 24 additions & 2 deletions app/src/main/java/com/raincat/dolby_beta/helper/SettingHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import android.text.TextUtils;

import java.util.HashMap;
import java.util.LinkedHashMap;

/**
* <pre>
Expand All @@ -20,6 +21,7 @@ public class SettingHelper {
public static final String refresh_setting = "β_refresh_setting";
public static final String proxy_setting = "β_proxy_setting";
public static final String beauty_setting = "β_beauty_setting";
public static final String sidebar_setting = "β_sidebar_setting";

public static final String master_key = "β_master_key";
public static final String master_title = "总开关";
Expand Down Expand Up @@ -75,7 +77,7 @@ public class SettingHelper {

public static final String proxy_original_key = "β_proxy_original_key";
public static final String proxy_original_title = "代理源(空格隔开)";
public static final String proxy_original_default = "kuwo migu qq kugou";
public static final String proxy_original_default = "pyncmd kuwo qq";

public static final String proxy_cover_key = "β_proxy_cover_key";
public static final String proxy_cover_title = "重新释放脚本";
Expand All @@ -86,12 +88,17 @@ public class SettingHelper {

public static final String beauty_tab_hide_key = "β_beauty_tab_hide_key";
public static final String beauty_tab_hide_title = "精简Tab";
public static final String beauty_tab_hide_sub = "首页仅保留“我的”与“发现”";
public static final String beauty_tab_hide_sub = "首页仅保留“我的”与“发现”,并默认显示“我的";

public static final String beauty_sidebar_hide_key = "β_beauty_sidebar_hide_key";
public static final String beauty_sidebar_hide_title = "精简侧边栏";
public static final String beauty_sidebar_hide_sub = "部分Item需配合“设置”->“侧边栏管理”开关生效";

private static SettingHelper instance;

private SharedPreferences sharedPreferences;
private HashMap<String, Boolean> settingMap;
private HashMap<String, Boolean> sidebarSettingMap;

public static SettingHelper getInstance() {
return instance;
Expand Down Expand Up @@ -134,6 +141,21 @@ public boolean getSetting(String key) {
return settingMap.get(key);
}

public HashMap<String, Boolean> getSidebarSetting(LinkedHashMap<String, String> map) {
if (sidebarSettingMap == null) {
sidebarSettingMap = new HashMap<>();
for (String key : map.keySet()) {
sidebarSettingMap.put(key, sharedPreferences.getBoolean(key, false));
}
}
return sidebarSettingMap;
}

public void setSidebarSetting(String key, boolean value) {
sidebarSettingMap.put(key, value);
sharedPreferences.edit().putBoolean(key, value).apply();
}

public boolean isEnable(String key) {
return settingMap.get(master_key) && settingMap.get(key);
}
Expand Down
156 changes: 156 additions & 0 deletions app/src/main/java/com/raincat/dolby_beta/hook/HideSidebarHook.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
package com.raincat.dolby_beta.hook;

import android.content.Context;
import android.text.TextUtils;
import android.view.View;
import android.widget.LinearLayout;

import com.raincat.dolby_beta.helper.ClassHelper;
import com.raincat.dolby_beta.helper.SettingHelper;
import com.raincat.dolby_beta.model.SidebarEnum;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;

/**
* <pre>
* author : RainCat
* e-mail : nining377@gmail.com
* time : 2021/10/22
* desc : 侧边栏精简
* version: 1.0
* </pre>
*/

public class HideSidebarHook {
private Class<?> classDrawerItemEnum;
private HashMap<String, Boolean> sidebarSettingMap = new HashMap<>();

private String classMainDrawerString = "com.netease.cloudmusic.ui.MainDrawer";
private String classDrawerItemEnumString = "com.netease.cloudmusic.ui.MainDrawer$DrawerItemEnum";
private String methodRefreshDrawerString = "refreshDrawer";
private String objectMDrawerContainerString = "mDrawerContainer";

public HideSidebarHook(Context context, int versionCode) {
if (versionCode < 138) {
classMainDrawerString = "com.netease.cloudmusic.ui.l";
classDrawerItemEnumString = "com.netease.cloudmusic.ui.l$b";
methodRefreshDrawerString = "m";
objectMDrawerContainerString = "i";
}

classDrawerItemEnum = XposedHelpers.findClassIfExists(classDrawerItemEnumString, context.getClassLoader());
if (classDrawerItemEnum == null)
classDrawerItemEnum = XposedHelpers.findClassIfExists("com.netease.cloudmusic.music.biz.sidebar.ui.MainDrawer$DrawerItemEnum", context.getClassLoader());
if (classDrawerItemEnum != null && classDrawerItemEnum.isEnum()) {
Object[] enumConstants = classDrawerItemEnum.getEnumConstants();
SidebarEnum.setSidebarEnum(enumConstants);
sidebarSettingMap = SettingHelper.getInstance().getSidebarSetting(SidebarEnum.getSidebarEnum());
}

if (versionCode >= 7003010 && ClassHelper.SidebarItem.getClazz() != null) {
XposedBridge.hookAllConstructors(ClassHelper.SidebarItem.getClazz(), new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
if (param.args.length == 2 && param.args[1] instanceof List) {
List<Object> objectList = (List<Object>) param.args[1];
for (Iterator<Object> iterator = objectList.iterator(); iterator.hasNext(); ) {
try {
Object object = iterator.next();
String enumString = XposedHelpers.callMethod(object, "getEnumType").toString();
if (!TextUtils.isEmpty(enumString) && !enumString.equals("SETTING")) {
if (enumString.equals("GROUP")) {
int group = (int) XposedHelpers.callMethod(object, "getGroup");
if (group == 1 && sidebarSettingMap.get("GROUP1") != null || sidebarSettingMap.get("GROUP1")) {
iterator.remove();
} else if (group == 2 && sidebarSettingMap.get("GROUP2") != null || sidebarSettingMap.get("GROUP2")) {
iterator.remove();
}
} else if (sidebarSettingMap.get(enumString) != null && sidebarSettingMap.get(enumString))
iterator.remove();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
});
} else if (versionCode < 7003010) {
Class<?> mainDrawerClass = XposedHelpers.findClassIfExists(classMainDrawerString, context.getClassLoader());
if (mainDrawerClass != null)
XposedHelpers.findAndHookMethod(mainDrawerClass, methodRefreshDrawerString, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
removeUselessItem(param, versionCode);
}
});
}
}

private void removeUselessItem(XC_MethodHook.MethodHookParam param, int versionCode) {
LinearLayout drawerContainer;
LinearLayout dynamicContainer = null;
drawerContainer = (LinearLayout) XposedHelpers.getObjectField(param.thisObject, objectMDrawerContainerString);
if (versionCode >= 138)
dynamicContainer = (LinearLayout) XposedHelpers.getObjectField(param.thisObject, "mDynamicContainer");
removeItemInner(drawerContainer);
removeItemInner(dynamicContainer);

if (sidebarSettingMap.get("DIV2") != null && sidebarSettingMap.get("DIV2")) {
try {
View div2 = (View) XposedHelpers.getObjectField(param.thisObject, "div2");
div2.setVisibility(View.GONE);
} catch (NoSuchFieldError ignored) {
}
}
if (sidebarSettingMap.get("DIV3") != null && sidebarSettingMap.get("DIV3")) {
try {
View div3 = (View) XposedHelpers.getObjectField(param.thisObject, "div3");
div3.setVisibility(View.GONE);
} catch (NoSuchFieldError ignored) {
}
}
if (sidebarSettingMap.get("DIV4") != null && sidebarSettingMap.get("DIV4")) {
try {
View div3 = (View) XposedHelpers.getObjectField(param.thisObject, "div4");
div3.setVisibility(View.GONE);
} catch (NoSuchFieldError ignored) {
}
}

if (sidebarSettingMap.get("VIP") != null && sidebarSettingMap.get("VIP")) {
try {
View mMainActivityDrawerHeaderCard = (View) XposedHelpers.getObjectField(param.thisObject, "mMainActivityDrawerHeaderCard");
mMainActivityDrawerHeaderCard.setVisibility(View.GONE);
} catch (NoSuchFieldError ignored) {
}
}
}

private void removeItemInner(LinearLayout container) {
if (container == null) return;
for (int i = 0; i < container.getChildCount(); i++) {
View v = container.getChildAt(i);
Object tag = v.getTag();
if (tag != null && shouldRemove(tag)) {
v.setVisibility(View.GONE);
}
}
}

private boolean shouldRemove(Object drawerItemEnum) {
if (drawerItemEnum.getClass().getName().equals("com.netease.cloudmusic.ui.MainDrawer$DrawerItemEnum")
|| drawerItemEnum.getClass().getName().equals("com.netease.cloudmusic.ui.l$b")) {
String name = drawerItemEnum.toString();
return sidebarSettingMap.get(name) != null && sidebarSettingMap.get(name);
} else
return false;
}
}
35 changes: 34 additions & 1 deletion app/src/main/java/com/raincat/dolby_beta/hook/SettingHook.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,12 @@

import com.raincat.dolby_beta.helper.ExtraHelper;
import com.raincat.dolby_beta.helper.SettingHelper;
import com.raincat.dolby_beta.model.SidebarEnum;
import com.raincat.dolby_beta.utils.Tools;
import com.raincat.dolby_beta.view.BaseDialogInputItem;
import com.raincat.dolby_beta.view.BaseDialogItem;
import com.raincat.dolby_beta.view.beauty.BeautySidebarHideItem;
import com.raincat.dolby_beta.view.beauty.BeautySidebarHideView;
import com.raincat.dolby_beta.view.beauty.BeautyTabHideView;
import com.raincat.dolby_beta.view.beauty.BeautyTitleView;
import com.raincat.dolby_beta.view.proxy.ProxyCoverView;
Expand All @@ -42,7 +45,10 @@
import com.raincat.dolby_beta.view.setting.UpdateView;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
Expand All @@ -61,7 +67,7 @@
public class SettingHook {
private String switchViewName = "";
private TextView titleView, subView;
private LinearLayout dialogRoot, dialogProxyRoot, dialogBeautyRoot;
private LinearLayout dialogRoot, dialogProxyRoot, dialogBeautyRoot, dialogSidebarRoot;

private BroadcastReceiver broadcastReceiver;

Expand Down Expand Up @@ -164,6 +170,7 @@ private void registerBroadcastReceiver(final Context context) {
intentFilter.addAction(SettingHelper.refresh_setting);
intentFilter.addAction(SettingHelper.proxy_setting);
intentFilter.addAction(SettingHelper.beauty_setting);
intentFilter.addAction(SettingHelper.sidebar_setting);
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context c, Intent intent) {
Expand All @@ -188,6 +195,8 @@ else if (dialogProxyRoot.getChildAt(i) instanceof BaseDialogInputItem)
showProxyDialog(context);
} else if (intent.getAction().equals(SettingHelper.beauty_setting)) {
showBeautyDialog(context);
} else if (intent.getAction().equals(SettingHelper.sidebar_setting)) {
showSidebarDialog(context);
}
}
};
Expand Down Expand Up @@ -271,13 +280,37 @@ private void showBeautyDialog(final Context context) {
dialogBeautyRoot.setOrientation(LinearLayout.VERTICAL);
dialogBeautyRoot.addView(new BeautyTitleView(context));
dialogBeautyRoot.addView(new BeautyTabHideView(context));
dialogBeautyRoot.addView(new BeautySidebarHideView(context));
new AlertDialog.Builder(context)
.setView(dialogBeautyRoot)
.setCancelable(true)
.setPositiveButton("仅保存", (dialogInterface, i) -> refresh())
.setNegativeButton("保存并重启", (dialogInterface, i) -> restartApplication(context)).show();
}

private void showSidebarDialog(final Context context) {
dialogSidebarRoot = new BaseDialogItem(context);
dialogSidebarRoot.setOrientation(LinearLayout.VERTICAL);
ScrollView scrollView = new ScrollView(context);
scrollView.setOverScrollMode(ScrollView.OVER_SCROLL_NEVER);
scrollView.setVerticalScrollBarEnabled(false);
scrollView.addView(dialogSidebarRoot);

final LinkedHashMap<String, String> sidebarMap = SidebarEnum.getSidebarEnum();
final HashMap<String, Boolean> sidebarSettingMap = SettingHelper.getInstance().getSidebarSetting(sidebarMap);
for (Map.Entry<String, String> entry : sidebarMap.entrySet()) {
BeautySidebarHideItem item = new BeautySidebarHideItem(context);
item.initData(sidebarMap, sidebarSettingMap, entry.getKey());
dialogSidebarRoot.addView(item);
}

new AlertDialog.Builder(context)
.setView(scrollView)
.setCancelable(true)
.setPositiveButton("仅保存", (dialogInterface, i) -> refresh())
.setNegativeButton("保存并重启", (dialogInterface, i) -> restartApplication(context)).show();
}

private void restartApplication(Context context) {
ExtraHelper.setExtraDate(ExtraHelper.SCRIPT_STATUS, "0");
ExtraHelper.setExtraDate(ExtraHelper.SCRIPT_RETRY, "3");
Expand Down
Loading

0 comments on commit 5a0dcfe

Please sign in to comment.