|
51 | 51 | import java.util.HashMap; |
52 | 52 | import java.util.Objects; |
53 | 53 | import java.util.Properties; |
54 | | -import java.util.concurrent.CompletableFuture; |
55 | 54 |
|
56 | 55 | import cz.vutbr.web.css.CSSFactory; |
57 | 56 | import cz.vutbr.web.css.CombinedSelector; |
@@ -177,30 +176,42 @@ public void registerView(StyleSheet sheet) { |
177 | 176 | } |
178 | 177 | } |
179 | 178 |
|
| 179 | + XposedHelpers.findAndHookMethod(View.class, "invalidate", boolean.class, new XC_MethodHook() { |
| 180 | + @Override |
| 181 | + protected void afterHookedMethod(MethodHookParam param) throws Throwable { |
| 182 | + if (ReflectionUtils.isCalledFromClass(CustomView.class)) return; |
| 183 | + var view = (View) param.thisObject; |
| 184 | + requestLayoutChange(view, mapIds); |
| 185 | + } |
| 186 | + }); |
| 187 | + |
180 | 188 | XposedHelpers.findAndHookMethod(View.class, "requestLayout", new XC_MethodHook() { |
181 | 189 | @Override |
182 | 190 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { |
183 | 191 | if (ReflectionUtils.isCalledFromClass(CustomView.class)) return; |
184 | 192 | var view = (View) param.thisObject; |
185 | | - var id = view.getId(); |
186 | | - var list = mapIds.get(id); |
187 | | - if (list == null) return; |
188 | | - CompletableFuture.runAsync(() -> { |
189 | | - for (var item : list) { |
190 | | - try { |
191 | | - if (item.targetActivityClass != null && !item.targetActivityClass.isInstance(WppCore.getCurrentActivity())) |
192 | | - continue; |
193 | | - setCssRule(view, item); |
194 | | - } catch (Throwable ignored) { |
195 | | - } |
196 | | - } |
197 | | - }, Utils.getExecutor()); |
| 193 | + view.invalidate(); |
198 | 194 | } |
199 | 195 | }); |
200 | 196 |
|
| 197 | + |
201 | 198 | } |
202 | 199 |
|
203 | 200 |
|
| 201 | + private void requestLayoutChange(View view, HashMap<Integer, ArrayList<RuleItem>> mapIds) { |
| 202 | + var id = view.getId(); |
| 203 | + var list = mapIds.get(id); |
| 204 | + if (list == null) return; |
| 205 | + for (var item : list) { |
| 206 | + try { |
| 207 | + if (item.targetActivityClass != null && !item.targetActivityClass.isInstance(WppCore.getCurrentActivity())) |
| 208 | + continue; |
| 209 | + setCssRule(view, item); |
| 210 | + } catch (Throwable ignored) { |
| 211 | + } |
| 212 | + } |
| 213 | + } |
| 214 | + |
204 | 215 | private void hookDrawableViews() { |
205 | 216 | XposedHelpers.findAndHookMethod(View.class, "setBackground", Drawable.class, new XC_MethodHook() { |
206 | 217 | @Override |
@@ -244,13 +255,11 @@ private void setCssRule(View currentView, RuleItem ruleItem) { |
244 | 255 | for (var view : resultViews) { |
245 | 256 | if (view == null || !view.isAttachedToWindow()) |
246 | 257 | continue; |
247 | | - CompletableFuture.runAsync(() -> view.post(() -> { |
248 | | - try { |
249 | | - setRuleInView(ruleItem, view); |
250 | | - } catch (Throwable e) { |
251 | | - log(e); |
252 | | - } |
253 | | - }), Utils.getExecutor()); |
| 258 | + try { |
| 259 | + setRuleInView(ruleItem, view); |
| 260 | + } catch (Throwable e) { |
| 261 | + log(e); |
| 262 | + } |
254 | 263 | } |
255 | 264 | } |
256 | 265 |
|
@@ -382,6 +391,7 @@ private void setRuleInView(RuleItem ruleItem, View view) { |
382 | 391 | continue; |
383 | 392 | } |
384 | 393 | } |
| 394 | + if (view.getWidth() < 1 || view.getHeight() < 1) continue; |
385 | 395 | var resizeDrawable = new BitmapDrawable(view.getContext().getResources(), Bitmap.createScaledBitmap(bitmap, view.getWidth(), view.getHeight(), true)); |
386 | 396 | view.setBackground(resizeDrawable); |
387 | 397 | XposedHelpers.setAdditionalInstanceField(view, "mHeight", view.getHeight()); |
|
0 commit comments