jadx
jadx copied to clipboard
Incorrect order of decompiled statements
Hi, I've decompiled an APK and it displays those things in de.number26.machete.android.ui.FragmentDisplayActivity
:
protected android.support.v4.app.Fragment mo41724a(android.content.Intent intent, java.lang.Class<? extends android.support.v4.app.Fragment> cls) {
android.support.v4.app.Fragment fragment;
if (intent.hasExtra("fragment_class")) {
try {
fragment = (android.support.v4.app.Fragment) ((java.lang.Class) getIntent().getSerializableExtra("fragment_class")).newInstance();
} catch (java.lang.Throwable e) {
com.n26.legacy.tracking.Track.m4400a(e);
}
if (fragment != null && cls != null) {
try {
return (android.support.v4.app.Fragment) cls.newInstance();
} catch (java.lang.Throwable e2) {
com.n26.legacy.tracking.Track.m4400a(e2);
return fragment;
}
}
}
fragment = null;
return fragment != null ? fragment : fragment;
}
So those two things seem incorrect:
fragment = null;
return fragment != null ? fragment : fragment;
I believe it should be assigned with null
in definition:
android.support.v4.app.Fragment fragment;
?
APK: https://drive.google.com/file/d/1x5m5wpewPebt-eYPowu7otyR0cbzPrjl/view?usp=sharing
And similar thing in de.number26.machete.android.deeplink.DeepLinkUtils
. By some reason the most code is placed to catch
block, but it definitely shouldn't be over there:
/* renamed from: a */
public static boolean m7001a(java.lang.String str) {
java.lang.String host;
try {
host = new java.net.URI(str).getHost();
try {
if (!com.n26.legacy.p157d.NullSafe.m4340b((java.lang.CharSequence) host)) {
java.lang.String str2 = f5569a;
java.lang.StringBuilder stringBuilder = new java.lang.StringBuilder();
stringBuilder.append("Is trusted domain function failed because the host in the passed url was null or empty: ");
stringBuilder.append(str);
com.n26.p098d.Logger.m3884e(str2, stringBuilder.toString());
} else if (host.startsWith("www.")) {
host = host.substring(4);
}
} catch (java.net.URISyntaxException unused) {
if (android.text.TextUtils.isEmpty(host)) {
return false;
}
java.lang.String[] split = host.split("\\.");
if (split.length > 1) {
java.lang.StringBuilder stringBuilder2 = new java.lang.StringBuilder();
stringBuilder2.append(split[split.length - 2]);
stringBuilder2.append(".");
stringBuilder2.append(split[split.length - 1]);
host = stringBuilder2.toString();
}
int i = -1;
int hashCode = host.hashCode();
if (hashCode != 323953861) {
if (hashCode != 694396610) {
if (hashCode != 710037552) {
if (hashCode == 888649011 && host.equals("staging-n26.com")) {
i = 3;
}
} else if (host.equals("staging-number26.de")) {
i = 2;
}
} else if (host.equals("number26.de")) {
i = false;
}
} else if (host.equals("n26.com")) {
i = true;
}
switch (i) {
case 0:
case 1:
case 2:
case 3:
return true;
default:
return false;
}
}
} catch (java.net.URISyntaxException unused2) {
host = null;
}
}
@sergey-wowwow thanks you! This is a very interesting example.
A problem in strange if
code flow. To produce correct java code jadx need to duplicate fragment = null
part because it used in if
else
block and also in catch
block. Until now code duplication was not needed and jadx can't restore such pattern (
Correct method code:
protected Fragment mo41724a(Intent intent, Class<? extends Fragment> cls) {
Fragment fragment;
if (intent.hasExtra("fragment_class")) {
try {
fragment = (Fragment) ((Class) getIntent().getSerializableExtra("fragment_class")).newInstance();
} catch (Throwable e) {
Track.m7771a(e);
fragment = null; // duplicated code
}
} else {
fragment = null; // duplicated code
}
if (fragment != null && cls != null) {
try {
return (Fragment) cls.newInstance();
} catch (Throwable e2) {
Track.m7771a(e2);
return fragment;
}
}
return fragment;
}
@skylot The second issue is fixed by the latest commit. The first one is still reproducible
@skylot
One more similar thing de.number26.machete.android.refactor.presentation.my_account.MyAccountDeepLinkRouter
public final void mo39484a(android.content.Intent intent) {
io.reactivex.p839c.C9699a aVar;
kotlin.p873e.p875b.C10004k.m48138b(intent, "intent");
java.lang.String stringExtra = intent.getStringExtra("deep_link_action");
if (stringExtra != null) {
switch (stringExtra.hashCode()) {
case -1532668199:
if (stringExtra.equals("taxinfo")) {
aVar = this.f23617c.mo39563c();
break;
}
case -836588272:
if (stringExtra.equals("controlcenter/account")) {
aVar = this.f23616b.mo39583a();
break;
}
case -596705568:
if (stringExtra.equals("controlcenter/shipping_address")) {
aVar = this.f23617c.mo39561a();
break;
}
case -533465884:
if (stringExtra.equals("supportcenter")) {
aVar = m35739b(intent);
break;
}
case -94588637:
if (stringExtra.equals("statistics")) {
aVar = this.f23615a.mo39615k();
break;
}
case 1101921037:
if (stringExtra.equals("controlcenter/card")) {
aVar = this.f23615a.mo39610g();
break;
}
case 1460012639:
if (stringExtra.equals("invite_friends")) {
aVar = this.f23615a.mo39609f();
break;
}
case 1940650330:
if (stringExtra.equals("controlcenter/card/limits")) {
aVar = this.f23615a.mo39611h();
break;
}
}
}
// all previous assignments are discarded :(
aVar = de.number26.machete.android.refactor.presentation.my_account.MyAccountDeepLinkRouter.C7565a.f23619a;
aVar.run();
}
APK: https://drive.google.com/file/d/1c_DAUnNnv_DF-1BSdWhXeNt69W0W-Gxa/view?usp=sharing