Skip to content

Commit

Permalink
Merge branch 'master' into patch-30
Browse files Browse the repository at this point in the history
  • Loading branch information
s1204IT authored Oct 27, 2024
2 parents 5f42870 + 1304e28 commit a8f16fc
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 119 deletions.
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ android {
defaultConfig {
minSdk 28
targetSdk 34
versionCode 15
versionName "1.10.1"
versionCode 16
versionName "1.11.0-rc1"
multiDexEnabled false
proguardFiles += 'proguard-rules.pro'
buildConfigField 'String', 'HOOK_TARGET_VERSION', '"141600311"'
Expand Down
46 changes: 24 additions & 22 deletions app/src/main/java/io/github/chipppppppppp/lime/LimeOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public Option(String name, int id, boolean checked) {
public Option removeRecommendation = new Option("remove_recommendation", R.string.switch_remove_recommendation, true);
public Option removePremiumRecommendation = new Option("remove_premium_recommendation", R.string.switch_remove_premium_recommendation, true);
public Option removeServiceLabels = new Option("remove_service_labels", R.string.switch_remove_service_labels, false);
public Option removeAllServices = new Option("remove_services", R.string.switch_remove_service, false);
public Option removeReplyMute = new Option("remove_reply_mute", R.string.switch_remove_reply_mute, true);
public Option redirectWebView = new Option("redirect_webview", R.string.switch_redirect_webview, true);
public Option openInBrowser = new Option("open_in_browser", R.string.switch_open_in_browser, false);
Expand All @@ -37,27 +38,28 @@ public Option(String name, int id, boolean checked) {
public Option callTone = new Option("call_tone", R.string.call_tone, false);

public Option[] options = {
removeVoom,
removeWallet,
removeNewsOrCall,
distributeEvenly,
extendClickableArea,
removeIconLabels,
removeAds,
removeRecommendation,
removePremiumRecommendation,
removeServiceLabels,
removeReplyMute,
redirectWebView,
openInBrowser,
preventMarkAsRead,
preventUnsendMessage,
archived,
sendMuteMessage,
removeKeepUnread,
blockTracking,
stopVersionCheck,
outputCommunication,
callTone
removeVoom,
removeWallet,
removeNewsOrCall,
distributeEvenly,
extendClickableArea,
removeIconLabels,
removeAds,
removeRecommendation,
removePremiumRecommendation,
removeServiceLabels,
removeAllServices,
removeReplyMute,
redirectWebView,
openInBrowser,
preventMarkAsRead,
preventUnsendMessage,
archived,
sendMuteMessage,
removeKeepUnread,
blockTracking,
stopVersionCheck,
outputCommunication,
callTone
};
}
100 changes: 27 additions & 73 deletions app/src/main/java/io/github/chipppppppppp/lime/hooks/KeepUnread.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,98 +23,52 @@
import io.github.chipppppppppp.lime.R;

public class KeepUnread implements IHook {
static boolean keepUnread = false;

@Override
public void hook(LimeOptions limeOptions, XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
if (limeOptions.removeKeepUnread.checked) return;

XposedBridge.hookAllConstructors(
loadPackageParam.classLoader.loadClass("jp.naver.line.android.common.view.listview.PopupListView"),
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
ViewGroup viewGroup = (ViewGroup) param.thisObject;
Context context = viewGroup.getContext();
context.getApplicationContext().createPackageContext(Constants.MODULE_NAME, Context.CONTEXT_IGNORE_SECURITY);

Context moduleContext = context.getApplicationContext().createPackageContext(Constants.MODULE_NAME, Context.CONTEXT_IGNORE_SECURITY);
String textKeepUnread = moduleContext.getResources().getString(R.string.switch_keep_unread);

keepUnread = readStateFromFile(context);
Class<?> hookTarget;
hookTarget = loadPackageParam.classLoader.loadClass("jp.naver.line.android.common.view.listview.PopupListView");
XposedBridge.hookAllConstructors(hookTarget, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {

RelativeLayout container = new RelativeLayout(context);
RelativeLayout.LayoutParams containerParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
container.setLayoutParams(containerParams);
ViewGroup viewGroup = (ViewGroup) param.thisObject;
Context context = viewGroup.getContext();
Context moduleContext = context.getApplicationContext().createPackageContext(Constants.MODULE_NAME, Context.CONTEXT_IGNORE_SECURITY);
String textKeepUnread = moduleContext.getResources().getString(R.string.switch_keep_unread);
RelativeLayout layout = new RelativeLayout(context);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
layout.setLayoutParams(layoutParams);

GradientDrawable background = new GradientDrawable();
background.setShape(GradientDrawable.RECTANGLE);
background.setColor(Color.parseColor("#06C755"));
background.setCornerRadii(new float[]{100, 100, 80, 30, 100, 100, 80, 30});
container.setBackground(background);
Switch switchView = new Switch(context);
switchView.setText(textKeepUnread);
RelativeLayout.LayoutParams switchParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
switchParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);

TextView label = new TextView(context);
label.setText(textKeepUnread);
label.setTextSize(18);
label.setTextColor(Color.WHITE);
label.setId(View.generateViewId());
RelativeLayout.LayoutParams labelParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
labelParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
labelParams.setMargins(40, 0, 0, 0);
container.addView(label, labelParams);
switchView.setChecked(false);
switchView.setOnCheckedChangeListener((buttonView, isChecked) -> {
});

Switch switchView = new Switch(context);
RelativeLayout.LayoutParams switchParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
switchParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
switchParams.setMargins(0, 0, 40, 0);
switchView.setChecked(keepUnread);
switchView.setOnCheckedChangeListener((buttonView, isChecked) -> {
keepUnread = isChecked;
saveStateToFile(context, isChecked);
});
layout.addView(switchView, switchParams);

container.addView(switchView, switchParams);

((ListView) viewGroup.getChildAt(0)).addFooterView(container);
}
}
);
((ListView) viewGroup.getChildAt(0)).addFooterView(layout);
}
});

XposedHelpers.findAndHookMethod(
loadPackageParam.classLoader.loadClass(Constants.MARK_AS_READ_HOOK.className),
Constants.MARK_AS_READ_HOOK.methodName,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
if (keepUnread) {
param.setResult(null);
}
}
}
);
}
private void saveStateToFile(Context context, boolean state) {
String filename = "keep_unread_state.txt";
try (FileOutputStream fos = context.openFileOutput(filename, Context.MODE_PRIVATE)) {
fos.write((state ? "1" : "0").getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
private boolean readStateFromFile(Context context) {
String filename = "keep_unread_state.txt";
try (FileInputStream fis = context.openFileInput(filename)) {
int c;
StringBuilder sb = new StringBuilder();
while ((c = fis.read()) != -1) {
sb.append((char) c);
}
return "1".equals(sb.toString());
} catch (IOException e) {
e.printStackTrace();
return false;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,17 @@ public void hook(LimeOptions limeOptions, XC_LoadPackage.LoadPackageParam loadPa
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
Context context = (Context) param.thisObject;
recommendationResId = context.getResources().getIdentifier("home_tab_contents_recommendation_placement", "id", context.getPackageName());
serviceNameResId = context.getResources().getIdentifier("home_tab_service_name", "id", context.getPackageName());
notificationResId = context.getResources().getIdentifier("notification_hub_row_rolling_view_group", "id", context.getPackageName());
serviceRowContainerResId = context.getResources().getIdentifier("service_row_container", "id", context.getPackageName());
serviceIconResId = context.getResources().getIdentifier("home_tab_service_icon", "id", context.getPackageName());
serviceCarouselResId = context.getResources().getIdentifier("home_tab_service_carousel", "id", context.getPackageName());
serviceTitleBackgroundResId = context.getResources().getIdentifier("home_tab_service_title_background", "id", context.getPackageName());
serviceTitleResId = context.getResources().getIdentifier("home_tab_service_title", "id", context.getPackageName());
serviceSeeMoreResId = context.getResources().getIdentifier("home_tab_service_see_more", "id", context.getPackageName());
serviceSeeMoreBadgeResId = context.getResources().getIdentifier("home_tab_service_see_more_badge", "id", context.getPackageName());

recommendationResId = getIdByName(context, "home_tab_contents_recommendation_placement");
serviceNameResId = getIdByName(context, "home_tab_service_name");
notificationResId = getIdByName(context, "notification_hub_row_rolling_view_group");
serviceRowContainerResId = getIdByName(context, "service_row_container");
serviceIconResId = getIdByName(context, "home_tab_service_icon");
serviceCarouselResId = getIdByName(context, "home_tab_service_carousel");
serviceTitleBackgroundResId = getIdByName(context, "home_tab_service_title_background");
serviceTitleResId = getIdByName(context, "home_tab_service_title");
serviceSeeMoreResId = getIdByName(context, "home_tab_service_see_more");
serviceSeeMoreBadgeResId = getIdByName(context, "home_tab_service_see_more_badge");
}
}
);
Expand All @@ -42,22 +43,23 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
View.class,
"onAttachedToWindow",
new XC_MethodHook() {
View view;

@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
View view = (View) param.thisObject;
int viewId = view.getId();
//String resourceName = getResourceName(view.getContext(), viewId);
//XposedBridge.log("View ID: " + viewId + ", Resource Name: " + resourceName);
view = (View) param.thisObject;

int viewId = view.getId();
if (limeOptions.removeRecommendation.checked && viewId == recommendationResId
|| limeOptions.removeServiceLabels.checked && viewId == serviceNameResId
|| viewId == serviceRowContainerResId
|| limeOptions.removeAllServices.checked && (viewId == serviceRowContainerResId
|| viewId == serviceIconResId
|| viewId == serviceCarouselResId
|| viewId == serviceTitleBackgroundResId
|| viewId == serviceTitleResId
|| viewId == serviceSeeMoreResId
|| viewId == serviceSeeMoreBadgeResId) {
|| viewId == serviceSeeMoreBadgeResId))
{
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
layoutParams.height = 0;
view.setLayoutParams(layoutParams);
Expand All @@ -70,9 +72,8 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
);
}

/*
private String getResourceName(Context context, int resourceId) {
return context.getResources().getResourceEntryName(resourceId);
private int getIdByName(Context context, String resourceName) {
return context.getResources().getIdentifier(resourceName, "id", context.getPackageName());
}
*/

}
6 changes: 4 additions & 2 deletions app/src/main/res/values-ja/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
<string name="switch_remove_recommendation">おすすめを削除</string>
<string name="switch_remove_premium_recommendation">LYP プレミアムのおすすめを削除</string>
<string name="switch_remove_service_labels">サービスのラベルを削除</string>
<string name="switch_remove_service">サービスの項目を削除</string>
<string name="switch_remove_reply_mute">通知から \"通知をオフ\" アクションを削除</string>
<string name="switch_redirect_webview">WebView を既定のブラウザにリダイレクト</string>
<string name="switch_open_in_browser">ブラウザアプリで開く</string>
Expand All @@ -52,6 +53,7 @@
<string name="button_copy">コピー</string>
<string name="button_paste">ペースト</string>
<string name="call_tone">着信音を鳴らす(LSPatch用)</string>

<!-- Menu -->
<string name="switch_keep_unread">未読のまま閲覧</string>

Expand All @@ -74,5 +76,5 @@
<string name="confirm_delete">本当に削除しますか?</string>
<string name="no_backup_found">何もバックアップされていません</string>
<string name="no_get_restart_app">正しく取得できませんでした。\nアプリを再起動してください</string>
</resources>

</resources>
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
<string name="switch_remove_recommendation">Remove recommendations</string>
<string name="switch_remove_premium_recommendation">Remove LYP Premium recommendations</string>
<string name="switch_remove_service_labels">Remove tbe service labels</string>
<string name="switch_remove_service">Remove services item</string>
<string name="switch_remove_reply_mute">Remove the \"Mute chat\" action from notifications</string>
<string name="switch_redirect_webview">Redirect WebView to the default browser</string>
<string name="switch_open_in_browser">Open in the browser app</string>
Expand Down

0 comments on commit a8f16fc

Please sign in to comment.