Skip to content

Commit e20e09b

Browse files
committed
Improve Custom View
Signed-off-by: Dev4Mod <[email protected]>
1 parent f64a051 commit e20e09b

File tree

1 file changed

+71
-58
lines changed
  • app/src/main/java/com/wmods/wppenhacer/xposed/features/customization

1 file changed

+71
-58
lines changed

app/src/main/java/com/wmods/wppenhacer/xposed/features/customization/CustomView.java

Lines changed: 71 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import android.graphics.drawable.Drawable;
1717
import android.graphics.drawable.ShapeDrawable;
1818
import android.graphics.drawable.shapes.RectShape;
19-
import android.os.Bundle;
2019
import android.text.TextUtils;
2120
import android.util.DisplayMetrics;
2221
import android.util.Log;
@@ -142,18 +141,64 @@ public void doHook() throws Throwable {
142141
filter_itens += "\n" + custom_css;
143142
cacheImages = new DrawableCache(Utils.getApplication(), 100 * 1024 * 1024);
144143
var sheet = CSSFactory.parseString(filter_itens, new URL("https://base.url/"));
144+
registerView(sheet);
145145

146-
XposedHelpers.findAndHookMethod(Activity.class, "onCreate", Bundle.class, new XC_MethodHook() {
147-
@Override
148-
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
149-
var activity = (Activity) param.thisObject;
150-
View rootView = activity.getWindow().getDecorView().getRootView();
151-
rootView.getViewTreeObserver().addOnGlobalLayoutListener(() -> CompletableFuture.runAsync(() -> registerCssRules(activity, (ViewGroup) rootView, sheet), Utils.getExecutor()));
146+
}
152147

148+
public void registerView(StyleSheet sheet) {
149+
var mapIds = new HashMap<Integer, ArrayList<RuleItem>>();
153150

151+
try {
152+
for (var selector : sheet) {
153+
var ruleSet = (RuleSet) selector;
154+
for (var selectorItem : ruleSet.getSelectors()) {
155+
var item = selectorItem.get(0);
156+
String className;
157+
String name;
158+
if ((className = item.getClassName()) != null) {
159+
className = className.replaceAll("_", ".").trim();
160+
var clazz = XposedHelpers.findClass(className, classLoader);
161+
if (clazz == null || !clazz.isInstance(WppCore.getCurrentActivity()))
162+
continue;
163+
name = selectorItem.get(1).getIDName().trim();
164+
} else {
165+
name = selectorItem.get(0).getIDName().trim();
166+
}
167+
int id = 0;
168+
if (name.contains("android_")) {
169+
try {
170+
id = android.R.id.class.getField(name.substring(8)).getInt(null);
171+
} catch (NoSuchFieldException | IllegalAccessException ignored) {
172+
}
173+
} else {
174+
id = Utils.getID(name, "id");
175+
}
176+
if (id <= 0) continue;
177+
var list = mapIds.getOrDefault(id, new ArrayList<>());
178+
list.add(new RuleItem(selectorItem, ruleSet));
179+
mapIds.put(id, list);
180+
}
181+
}
182+
} catch (Throwable ignored) {
183+
}
184+
XposedHelpers.findAndHookMethod(View.class, "invalidate", boolean.class, new XC_MethodHook() {
185+
@Override
186+
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
187+
if (ReflectionUtils.isCalledFromClass(CustomView.class)) return;
188+
var view = (View) param.thisObject;
189+
var id = view.getId();
190+
var list = mapIds.get(id);
191+
if (list == null) return;
192+
CompletableFuture.runAsync(() -> {
193+
for (var item : list) {
194+
try {
195+
setCssRule(view, item);
196+
} catch (Throwable ignored) {
197+
}
198+
}
199+
}, Utils.getExecutor());
154200
}
155201
});
156-
157202
}
158203

159204

@@ -192,44 +237,6 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
192237

193238
}
194239

195-
196-
private void registerCssRules(Activity activity, ViewGroup currenView, StyleSheet sheet) {
197-
try {
198-
for (var selector : sheet) {
199-
var ruleSet = (RuleSet) selector;
200-
for (var selectorItem : ruleSet.getSelectors()) {
201-
var item = selectorItem.get(0);
202-
String className;
203-
String name;
204-
if ((className = item.getClassName()) != null) {
205-
className = className.replaceAll("_", ".").trim();
206-
var clazz = XposedHelpers.findClass(className, classLoader);
207-
if (clazz == null || !clazz.isInstance(activity)) continue;
208-
name = selectorItem.get(1).getIDName().trim();
209-
} else {
210-
name = selectorItem.get(0).getIDName().trim();
211-
}
212-
int id = 0;
213-
if (name.contains("android_")) {
214-
try {
215-
id = android.R.id.class.getField(name.substring(8)).getInt(null);
216-
} catch (NoSuchFieldException | IllegalAccessException ignored) {
217-
}
218-
} else {
219-
id = Utils.getID(name, "id");
220-
}
221-
if (id <= 0) continue;
222-
var view = currenView.findViewById(id);
223-
if (view == null || !view.isShown() || view.getVisibility() != View.VISIBLE || !view.isAttachedToWindow())
224-
continue;
225-
var ruleItem = new RuleItem(selectorItem, ruleSet);
226-
setCssRule(view, ruleItem);
227-
}
228-
}
229-
} catch (Throwable ignored) {
230-
}
231-
}
232-
233240
private void setCssRule(View currentView, RuleItem ruleItem) {
234241
var resultViews = new ArrayList<View>();
235242
captureSelector(currentView, ruleItem.selector, 0, resultViews);
@@ -364,20 +371,22 @@ private void setRuleInView(RuleItem ruleItem, View view) {
364371
if (value.equals("cover")) {
365372
if (view instanceof ImageView imageView) {
366373
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
374+
XposedBridge.log("resize ImageView to cover");
367375
} else {
368376
var drawable = view.getBackground();
369377
if (!(drawable instanceof BitmapDrawable)) continue;
370378
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
371379
var widthObj = XposedHelpers.getAdditionalInstanceField(view, "mWidth");
372380
var heightObj = XposedHelpers.getAdditionalInstanceField(view, "mHeight");
373381
if (widthObj != null && heightObj != null) {
374-
if ((int) widthObj == view.getWidth() && (int) heightObj == view.getHeight())
382+
if (Math.abs((int) widthObj - view.getWidth()) <= 20 && Math.abs((int) heightObj - view.getHeight()) <= 20) {
375383
continue;
384+
}
376385
}
377386
var resizeDrawable = new BitmapDrawable(view.getContext().getResources(), Bitmap.createScaledBitmap(bitmap, view.getWidth(), view.getHeight(), true));
387+
view.setBackground(resizeDrawable);
378388
XposedHelpers.setAdditionalInstanceField(view, "mHeight", view.getHeight());
379389
XposedHelpers.setAdditionalInstanceField(view, "mWidth", view.getWidth());
380-
view.setBackground(resizeDrawable);
381390
}
382391
}
383392
}
@@ -567,13 +576,16 @@ private static ColorStateList getColorStateList(Declaration declaration) {
567576
);
568577
}
569578

570-
private int getRealValue(TermLength value, int size) {
571-
if (value.getUnit() == TermNumeric.Unit.px) {
572-
return Utils.dipToPixels(value.getValue().intValue());
573-
} else if (value.isPercentage()) {
574-
return size * value.getValue().intValue() / 100;
579+
private int getRealValue(TermLength pValue, int size) {
580+
int value;
581+
if (pValue.getUnit() == TermNumeric.Unit.px) {
582+
value = Utils.dipToPixels(pValue.getValue().intValue());
583+
} else if (pValue.isPercentage()) {
584+
value = size * pValue.getValue().intValue() / 100;
585+
} else {
586+
value = pValue.getValue().intValue();
575587
}
576-
return value.getValue().intValue();
588+
return value > 0 ? value : 1;
577589
}
578590

579591
private void captureSelector(View currentView, CombinedSelector selector, int position, ArrayList<View> resultViews) {
@@ -669,13 +681,14 @@ private Drawable loadDrawableFromFile(String filePath, int reqWidth, int reqHeig
669681
File file = new File(filePath);
670682
Bitmap bitmap;
671683
if (!file.canRead()) {
672-
var parcelFile = WppCore.getClientBridge().openFile(filePath, false);
673-
bitmap = BitmapFactory.decodeStream(new FileInputStream(parcelFile.getFileDescriptor()));
684+
try (var parcelFile = WppCore.getClientBridge().openFile(filePath, false)) {
685+
bitmap = BitmapFactory.decodeStream(new FileInputStream(parcelFile.getFileDescriptor()));
686+
}
674687
} else {
675688
bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
676689
}
677-
var newHeight = reqHeight < 10 ? bitmap.getHeight() : Math.min(bitmap.getHeight(), reqHeight);
678-
var newWidth = reqWidth < 10 ? bitmap.getWidth() : Math.min(bitmap.getWidth(), reqWidth);
690+
var newHeight = reqHeight < 1 ? bitmap.getHeight() : Math.min(bitmap.getHeight(), reqHeight);
691+
var newWidth = reqWidth < 1 ? bitmap.getWidth() : Math.min(bitmap.getWidth(), reqWidth);
679692
bitmap = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true);
680693
return new BitmapDrawable(context.getResources(), bitmap);
681694
} catch (Exception e) {

0 commit comments

Comments
 (0)