soul-browser/sources/java/com/google/android/material/timepicker/TimePickerTextInputPresenter.java
KaKi87 550ddb0413
Decompile and recreate Soul Browser v1.4.85 with APK CI builds (#1)
* Decompile and recreate Soul Browser v1.4.85 with APK CI builds

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix CI build: include bundled google.jks and remove PR trigger

The apktool build failed in CI because app/unknown/.../google.jks was
excluded by the *.jks gitignore rule. Whitelist app-bundled JKS files
and commit the missing resource.

Also remove the redundant pull_request workflow trigger.

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Change package ID to com.github.kaki87.soulbrowser

Rename the application ID so the rebuilt APK can be installed
alongside the original Soul Browser from Google Play.

- Update AndroidManifest package, permissions, providers, and actions
- Update R class references in smali (com/github/kaki87/soulbrowser/R)
- Update shortcuts.xml targetPackage
- Rename app label to "Soul Rebuild" for easy identification

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix install compatibility: remove split APK metadata and bundle native libs

The rebuilt APK still declared requiredSplitTypes and Play Store split
metadata, causing Android to reject standalone installs as incompatible.

- Remove requiredSplitTypes and split-related manifest meta-data
- Merge native libs from all ABI splits with uncompressed storage
- Page-align before signing for extractNativeLibs=false
- Add .so to apktool doNotCompress list

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix install failure: use apksigner v2/v3 and bundle arm64 native libs

Target SDK 36 requires APK Signature Scheme v2+, but jarsigner only
produces v1 signatures, causing Android to reject the install.

- Sign with apksigner (v1+v2+v3) instead of jarsigner
- Add arm64-v8a native libraries from universal Soul Browser 1.4.79
- Set extractNativeLibs=true for reliable sideload installs
- Commit stable debug keystore for consistent signatures across builds

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Add committed debug keystore for consistent APK signatures

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix startup crash: use original classes2.dex desugar libraries

Apktool recompiles smali_classes2 into a broken classes2.dex, causing
ClassNotFoundException for j$.com.android.tools.r8.a at ML Kit init.

Inject the original classes2.dex (Java 8+ desugar libs) after apktool
build instead of using the recompiled version.

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix missing drawable resources from density split APKs

The base APK is an app bundle module; density-specific drawables like
seek_thumb_nor_b live in config.xhdpi.apk and were missing after rebuild,
causing Resources$NotFoundException at runtime.

- Merge non-9-patch resources from split APKs before apktool build
- Sync public.xml IDs from R smali only when backing files exist
- Add 713 density-specific resource IDs to public.xml

Co-authored-by: KaKi87 <KaKi87@pm.me>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-10 16:07:14 +02:00

281 lines
14 KiB
Java

package com.google.android.material.timepicker;
import android.content.res.Resources;
import android.text.Editable;
import android.text.InputFilter;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.core.view.ViewCompat;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
import com.google.android.material.R;
import com.google.android.material.button.MaterialButtonToggleGroup;
import com.google.android.material.internal.TextWatcherAdapter;
import com.google.android.material.textfield.TextInputLayout;
import com.google.android.material.timepicker.TimePickerView;
import java.util.Arrays;
import java.util.Locale;
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes3.dex */
public class TimePickerTextInputPresenter implements TimePickerView.OnSelectionChange, TimePickerPresenter {
/* renamed from: c, reason: collision with root package name */
public final LinearLayout f12003c;
public final TimeModel f;
public final TextWatcher g;
public final TextWatcher h;
public final ChipTextInputComboView i;
public final ChipTextInputComboView j;
public final EditText k;
public final EditText l;
public final MaterialButtonToggleGroup m;
public TimePickerTextInputPresenter(LinearLayout linearLayout, final TimeModel timeModel) {
TextWatcherAdapter textWatcherAdapter = new TextWatcherAdapter() { // from class: com.google.android.material.timepicker.TimePickerTextInputPresenter.1
@Override // com.google.android.material.internal.TextWatcherAdapter, android.text.TextWatcher
public final void afterTextChanged(Editable editable) {
TimeModel timeModel2 = TimePickerTextInputPresenter.this.f;
try {
if (TextUtils.isEmpty(editable)) {
timeModel2.i = 0;
} else {
timeModel2.i = Integer.parseInt(editable.toString()) % 60;
}
} catch (NumberFormatException unused) {
}
}
};
this.g = textWatcherAdapter;
TextWatcherAdapter textWatcherAdapter2 = new TextWatcherAdapter() { // from class: com.google.android.material.timepicker.TimePickerTextInputPresenter.2
@Override // com.google.android.material.internal.TextWatcherAdapter, android.text.TextWatcher
public final void afterTextChanged(Editable editable) {
try {
boolean isEmpty = TextUtils.isEmpty(editable);
TimePickerTextInputPresenter timePickerTextInputPresenter = TimePickerTextInputPresenter.this;
if (isEmpty) {
timePickerTextInputPresenter.f.c(0);
} else {
timePickerTextInputPresenter.f.c(Integer.parseInt(editable.toString()));
}
} catch (NumberFormatException unused) {
}
}
};
this.h = textWatcherAdapter2;
this.f12003c = linearLayout;
this.f = timeModel;
final Resources resources = linearLayout.getResources();
ChipTextInputComboView chipTextInputComboView = (ChipTextInputComboView) linearLayout.findViewById(R.id.material_minute_text_input);
this.i = chipTextInputComboView;
ChipTextInputComboView chipTextInputComboView2 = (ChipTextInputComboView) linearLayout.findViewById(R.id.material_hour_text_input);
this.j = chipTextInputComboView2;
View findViewById = chipTextInputComboView.findViewById(R.id.material_label);
TextInputLayout textInputLayout = chipTextInputComboView.f;
TextView textView = (TextView) findViewById;
View findViewById2 = chipTextInputComboView2.findViewById(R.id.material_label);
TextInputLayout textInputLayout2 = chipTextInputComboView2.f;
TextView textView2 = (TextView) findViewById2;
textView.setText(resources.getString(R.string.material_timepicker_minute));
textView.setImportantForAccessibility(2);
textView2.setText(resources.getString(R.string.material_timepicker_hour));
textView2.setImportantForAccessibility(2);
chipTextInputComboView.setTag(R.id.selection_type, 12);
chipTextInputComboView2.setTag(R.id.selection_type, 10);
if (timeModel.g == 0) {
MaterialButtonToggleGroup materialButtonToggleGroup = (MaterialButtonToggleGroup) linearLayout.findViewById(R.id.material_clock_period_toggle);
this.m = materialButtonToggleGroup;
materialButtonToggleGroup.p.add(new c(0, this));
this.m.setVisibility(0);
f();
}
View.OnClickListener onClickListener = new View.OnClickListener() { // from class: com.google.android.material.timepicker.TimePickerTextInputPresenter.3
@Override // android.view.View.OnClickListener
public final void onClick(View view) {
TimePickerTextInputPresenter.this.a(((Integer) view.getTag(R.id.selection_type)).intValue());
}
};
chipTextInputComboView2.setOnClickListener(onClickListener);
chipTextInputComboView.setOnClickListener(onClickListener);
MaxInputValidator maxInputValidator = timeModel.f;
EditText editText = chipTextInputComboView2.g;
InputFilter[] filters = editText.getFilters();
InputFilter[] inputFilterArr = (InputFilter[]) Arrays.copyOf(filters, filters.length + 1);
inputFilterArr[filters.length] = maxInputValidator;
editText.setFilters(inputFilterArr);
MaxInputValidator maxInputValidator2 = timeModel.f12000c;
EditText editText2 = chipTextInputComboView.g;
InputFilter[] filters2 = editText2.getFilters();
InputFilter[] inputFilterArr2 = (InputFilter[]) Arrays.copyOf(filters2, filters2.length + 1);
inputFilterArr2[filters2.length] = maxInputValidator2;
editText2.setFilters(inputFilterArr2);
EditText editText3 = textInputLayout2.getEditText();
this.k = editText3;
final Resources resources2 = linearLayout.getResources();
final int i = R.string.material_timepicker_hour;
editText3.setAccessibilityDelegate(new View.AccessibilityDelegate() { // from class: com.google.android.material.timepicker.TimePickerTextInputPresenter.6
@Override // android.view.View.AccessibilityDelegate
public final void onInitializeAccessibilityNodeInfo(View view, AccessibilityNodeInfo accessibilityNodeInfo) {
super.onInitializeAccessibilityNodeInfo(view, accessibilityNodeInfo);
accessibilityNodeInfo.setText(resources2.getString(i));
}
});
EditText editText4 = textInputLayout.getEditText();
this.l = editText4;
final Resources resources3 = linearLayout.getResources();
final int i2 = R.string.material_timepicker_minute;
editText4.setAccessibilityDelegate(new View.AccessibilityDelegate() { // from class: com.google.android.material.timepicker.TimePickerTextInputPresenter.6
@Override // android.view.View.AccessibilityDelegate
public final void onInitializeAccessibilityNodeInfo(View view, AccessibilityNodeInfo accessibilityNodeInfo) {
super.onInitializeAccessibilityNodeInfo(view, accessibilityNodeInfo);
accessibilityNodeInfo.setText(resources3.getString(i2));
}
});
TimePickerTextInputKeyController timePickerTextInputKeyController = new TimePickerTextInputKeyController(chipTextInputComboView2, chipTextInputComboView, timeModel);
ViewCompat.z(chipTextInputComboView2.f11991c, new ClickActionDelegate(linearLayout.getContext(), R.string.material_hour_selection) { // from class: com.google.android.material.timepicker.TimePickerTextInputPresenter.4
@Override // com.google.android.material.timepicker.ClickActionDelegate, androidx.core.view.AccessibilityDelegateCompat
public final void d(View view, AccessibilityNodeInfoCompat accessibilityNodeInfoCompat) {
int i3;
super.d(view, accessibilityNodeInfoCompat);
StringBuilder sb = new StringBuilder();
sb.append(resources.getString(R.string.material_timepicker_hour));
sb.append(" ");
Resources resources4 = view.getResources();
TimeModel timeModel2 = timeModel;
if (timeModel2.g == 1) {
i3 = R.string.material_hour_24h_suffix;
} else {
i3 = R.string.material_hour_suffix;
}
sb.append(resources4.getString(i3, String.valueOf(timeModel2.b())));
accessibilityNodeInfoCompat.n(sb.toString());
}
});
ViewCompat.z(chipTextInputComboView.f11991c, new ClickActionDelegate(linearLayout.getContext(), R.string.material_minute_selection) { // from class: com.google.android.material.timepicker.TimePickerTextInputPresenter.5
@Override // com.google.android.material.timepicker.ClickActionDelegate, androidx.core.view.AccessibilityDelegateCompat
public final void d(View view, AccessibilityNodeInfoCompat accessibilityNodeInfoCompat) {
super.d(view, accessibilityNodeInfoCompat);
accessibilityNodeInfoCompat.n(resources.getString(R.string.material_timepicker_minute) + " " + view.getResources().getString(R.string.material_minute_suffix, String.valueOf(timeModel.i)));
}
});
editText3.addTextChangedListener(textWatcherAdapter2);
editText4.addTextChangedListener(textWatcherAdapter);
e(timeModel);
EditText editText5 = textInputLayout2.getEditText();
EditText editText6 = textInputLayout.getEditText();
editText5.setImeOptions(268435461);
editText6.setImeOptions(268435462);
editText5.setOnEditorActionListener(timePickerTextInputKeyController);
editText5.setOnKeyListener(timePickerTextInputKeyController);
editText6.setOnKeyListener(timePickerTextInputKeyController);
}
public final void a(int i) {
boolean z;
this.f.j = i;
boolean z2 = false;
if (i == 12) {
z = true;
} else {
z = false;
}
this.i.setChecked(z);
if (i == 10) {
z2 = true;
}
this.j.setChecked(z2);
f();
}
@Override // com.google.android.material.timepicker.TimePickerPresenter
public final void b() {
this.f12003c.setVisibility(0);
a(this.f.j);
}
@Override // com.google.android.material.timepicker.TimePickerPresenter
public final void c() {
InputMethodManager inputMethodManager;
LinearLayout linearLayout = this.f12003c;
View focusedChild = linearLayout.getFocusedChild();
if (focusedChild != null && (inputMethodManager = (InputMethodManager) focusedChild.getContext().getSystemService(InputMethodManager.class)) != null) {
inputMethodManager.hideSoftInputFromWindow(focusedChild.getWindowToken(), 0);
}
linearLayout.setVisibility(8);
}
public final void d() {
boolean z;
TimeModel timeModel = this.f;
boolean z2 = false;
if (timeModel.j == 12) {
z = true;
} else {
z = false;
}
this.i.setChecked(z);
if (timeModel.j == 10) {
z2 = true;
}
this.j.setChecked(z2);
}
public final void e(TimeModel timeModel) {
EditText editText = this.k;
TextWatcher textWatcher = this.h;
editText.removeTextChangedListener(textWatcher);
EditText editText2 = this.l;
TextWatcher textWatcher2 = this.g;
editText2.removeTextChangedListener(textWatcher2);
Locale locale = this.f12003c.getResources().getConfiguration().locale;
String format = String.format(locale, "%02d", Integer.valueOf(timeModel.i));
String format2 = String.format(locale, "%02d", Integer.valueOf(timeModel.b()));
ChipTextInputComboView chipTextInputComboView = this.i;
TextWatcher textWatcher3 = chipTextInputComboView.h;
EditText editText3 = chipTextInputComboView.g;
String a2 = TimeModel.a(chipTextInputComboView.getResources(), format, "%02d");
chipTextInputComboView.f11991c.setText(a2);
if (!TextUtils.isEmpty(a2)) {
editText3.removeTextChangedListener(textWatcher3);
editText3.setText(a2);
editText3.addTextChangedListener(textWatcher3);
}
ChipTextInputComboView chipTextInputComboView2 = this.j;
TextWatcher textWatcher4 = chipTextInputComboView2.h;
EditText editText4 = chipTextInputComboView2.g;
String a3 = TimeModel.a(chipTextInputComboView2.getResources(), format2, "%02d");
chipTextInputComboView2.f11991c.setText(a3);
if (!TextUtils.isEmpty(a3)) {
editText4.removeTextChangedListener(textWatcher4);
editText4.setText(a3);
editText4.addTextChangedListener(textWatcher4);
}
editText.addTextChangedListener(textWatcher);
editText2.addTextChangedListener(textWatcher2);
f();
}
public final void f() {
int i;
MaterialButtonToggleGroup materialButtonToggleGroup = this.m;
if (materialButtonToggleGroup == null) {
return;
}
if (this.f.k == 0) {
i = R.id.material_clock_period_am_button;
} else {
i = R.id.material_clock_period_pm_button;
}
materialButtonToggleGroup.f(i, true);
}
@Override // com.google.android.material.timepicker.TimePickerPresenter
public final void invalidate() {
e(this.f);
}
}