Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,174 changes: 1,174 additions & 0 deletions app/src/main/assets/i18n/ru.tsv

Large diffs are not rendered by default.

28 changes: 16 additions & 12 deletions app/src/main/java/io/github/order52/tinykit/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,7 @@ public void onReceive(Context context, Intent intent) {
@android.annotation.SuppressLint("UnspecifiedRegisterReceiverFlag") // flag exists from Android 13
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Tr.init(this);
prefs = getSharedPreferences("tinykit", MODE_PRIVATE);
// Warm the installed-apps cache (loading labels is the slow part) so every per-app list,
// picker and log opens instantly. Runs off the worker queue to not delay the first tap.
Expand Down Expand Up @@ -596,7 +597,8 @@ private View buildTabBar() {
TextView label = text(TAB_NAMES[i], 12, false);
label.setGravity(Gravity.CENTER);
label.setSingleLine(true);
label.setPadding(dp(2), dp(4), dp(2), 0);
label.setEllipsize(android.text.TextUtils.TruncateAt.END);
label.setPadding(dp(1), dp(4), dp(1), 0);
label.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
tabs[i] = label;
tab.addView(label, new LinearLayout.LayoutParams(-1, -2));
Expand Down Expand Up @@ -1927,7 +1929,7 @@ private void openDebloat() {
Adapter<Pkg> adapter = new Adapter<>(true, (p, row) -> {
row.first.setText(Tr.t(p.label));
row.second.setText(Tr.t(p.pkg));
row.third.setText(Tr.t(Bloat.LEVELS[p.level] + " · " + p.note));
row.third.setText(Tr.t(Bloat.LEVELS[p.level]) + " · " + Tr.t(p.note));
row.third.setTextColor(LEVEL_COLORS[p.level]);
row.check.setChecked(p.checked);
row.check.setVisibility(p.locked ? View.INVISIBLE : View.VISIBLE);
Expand Down Expand Up @@ -1995,7 +1997,7 @@ private void openDebloat() {
Pkg p = adapter.getItem(position);
new AlertDialog.Builder(this)
.setTitle(Tr.t(p.label))
.setMessage(Tr.t(Bloat.LEVELS[p.level] + ": " + Bloat.MEANING[p.level] + "\n\n" + p.note
.setMessage(Tr.t(Bloat.LEVELS[p.level]) + ": " + Tr.t(Bloat.MEANING[p.level]) + "\n\n" + Tr.t(p.note)
+ "\n\n" + p.pkg + (versionName(p.pkg).isEmpty() ? "" : "\nVersion " + versionName(p.pkg))))
.setPositiveButton(Tr.t("OK"), null)
.show();
Expand Down Expand Up @@ -2299,10 +2301,10 @@ private String installOptionsSummary() {
StringBuilder on = new StringBuilder();
String[] short_ = {"Allow downgrade", "Grant all permissions", "Test-only apps"};
for (int i = 0; i < INSTALL_OPTION_BITS.length; i++) {
if ((options & INSTALL_OPTION_BITS[i]) != 0) on.append(on.length() > 0 ? ", " : "").append(short_[i]);
if ((options & INSTALL_OPTION_BITS[i]) != 0) on.append(on.length() > 0 ? ", " : "").append(Tr.t(short_[i]));
}
return on.length() == 0 ? "Normal install. Tap to allow downgrades or grant permissions."
: "On: " + on + ".";
return on.length() == 0 ? Tr.t("Normal install. Tap to allow downgrades or grant permissions.")
: Tr.t("On: ") + on + ".";
}

private void chooseInstallOptions(TextView summary) {
Expand Down Expand Up @@ -2952,8 +2954,8 @@ private void openRunning() {
ActivityManager.MemoryInfo mem = new ActivityManager.MemoryInfo();
((ActivityManager) getSystemService(ACTIVITY_SERVICE)).getMemoryInfo(mem);
main.post(() -> {
summary.setText(Tr.t("Memory: " + Formatter.formatShortFileSize(this, mem.totalMem - mem.availMem)
+ " used of " + Formatter.formatShortFileSize(this, mem.totalMem)));
summary.setText(Tr.t("Memory: ") + Formatter.formatShortFileSize(this, mem.totalMem - mem.availMem)
+ " " + Tr.t("used of") + " " + Formatter.formatShortFileSize(this, mem.totalMem));
procs.clear();
procs.addAll(found);
apply.run();
Expand Down Expand Up @@ -6732,7 +6734,9 @@ private TextView chip(String icon, String title, String[] options, OnPage onSele
final int[] sel = {0};
TextView chip = text("", 13, true);
chip.setGravity(Gravity.CENTER);
chip.setPadding(dp(16), dp(8), dp(16), dp(8));
chip.setSingleLine(true);
chip.setEllipsize(android.text.TextUtils.TruncateAt.END);
chip.setPadding(dp(12), dp(6), dp(12), dp(6));
chip.setTextColor(attrColor(android.R.attr.colorAccent));
GradientDrawable shape = new GradientDrawable();
shape.setCornerRadius(dp(22));
Expand All @@ -6742,15 +6746,15 @@ private TextView chip(String icon, String title, String[] options, OnPage onSele
LinearLayout.LayoutParams margin = new LinearLayout.LayoutParams(-2, -2);
margin.setMargins(0, 0, dp(8), 0);
chip.setLayoutParams(margin);
Runnable render = () -> chip.setText(Tr.t(icon + title + ": " + options[sel[0]]));
Runnable render = () -> chip.setText((icon.isEmpty() ? "" : icon) + Tr.t(title) + ": " + Tr.t(options[sel[0]]));
chip.setOnClickListener(v -> {
String[] items = new String[options.length];
for (int i = 0; i < options.length; i++) {
items[i] = (i == sel[0] ? "● " : "○ ") + options[i];
items[i] = (i == sel[0] ? "● " : "○ ") + Tr.t(options[i]);
}
new AlertDialog.Builder(this)
.setTitle(Tr.t(title))
.setItems(Tr.all(items), (d, which) -> {
.setItems(items, (d, which) -> {
sel[0] = which;
render.run();
onSelect.run(which);
Expand Down
18 changes: 17 additions & 1 deletion app/src/main/java/io/github/order52/tinykit/Tr.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,28 @@ final class Tr {
private static volatile String[] starts = new String[0];
private static volatile String[] ends = new String[0];

private static String getLanguage(Context c) {
if (c != null) {
try {
android.content.res.Configuration cfg = c.getResources().getConfiguration();
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
android.os.LocaleList list = cfg.getLocales();
if (list != null && !list.isEmpty()) return list.get(0).getLanguage();
} else if (cfg.locale != null) {
return cfg.locale.getLanguage();
}
} catch (RuntimeException ignored) {
}
}
return Locale.getDefault().getLanguage();
}

private Tr() {
}

/** Loads the translation for the phone's language, if there is one. Safe to call again. */
static void init(Context c) {
String language = Locale.getDefault().getLanguage();
String language = getLanguage(c);
try (InputStream in = c.getAssets().open("i18n/" + language + ".tsv")) {
load(new InputStreamReader(in, StandardCharsets.UTF_8));
} catch (java.io.IOException | RuntimeException none) {
Expand Down
28 changes: 28 additions & 0 deletions app/src/main/res/values-ru/strings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">TinyKit</string>
<string name="widget_name">Ускорить</string>
<string name="widget_hint">Нажмите для ускорения</string>
<string name="widget_description">Одно нажатие освобождает память и очищает кэш приложений без открытия TinyKit.</string>
<string name="tile_shizuku">Shizuku</string>
<string name="tile_screenshot">Скриншот</string>
<string name="tile_caffeine">Кофеин</string>
<string name="tile_developer_options">Для разработчиков</string>
<string name="tile_usb_debugging">Отладка по USB</string>
<string name="tile_close_app">Закрыть приложение</string>
<string name="tile_sensors_off">Отключить датчики</string>
<string name="tile_screen_timeout">Таймаут экрана</string>
<string name="tile_grayscale">Оттенки серого</string>
<string name="tile_ad_block_dns">DNS с блокировкой рекламы</string>
<string name="tile_hide_dev_options">Скрыть меню разработчика</string>
<string name="tile_extra_dim">Экстра-затемнение</string>
<string name="tile_clear_caches">Очистить кэш</string>
<string name="tile_mic_camera_off">Микрофон и камера выкл</string>
<string name="tile_internet_block">Блокировка интернета</string>
<string name="tile_hw_overlays_off">Отключить аппаратные наложения</string>
<string name="tile_force_dark">Принудительный темный режим</string>
<string name="share_pinned">Закрепленные приложения</string>
<string name="tile_work_profile">Рабочий профиль</string>
<string name="tile_free_ram">Освободить память</string>
<string name="tile_screen_record">Запись экрана</string>
</resources>
2 changes: 1 addition & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,4 @@
<img src="images/screenshots/system.png" width="260" alt="System tab">
</p>

<p align="center"><sub>TinyKit 1.15.1 · Android 7.0+ · <a href="../LICENSE">MIT</a></sub></p>
<p align="center"><sub>TinyKit 1.17.2 · Android 7.0+ · <a href="../LICENSE">MIT</a></sub></p>
15 changes: 15 additions & 0 deletions fastlane/metadata/android/ru-RU/full_description.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
TinyKit — это компактный и быстрый набор системных твиков и инструментов Android на базе Shizuku. Без root, без рекламы, без аналитики и без фоновых процессов, если вы сами не включите опциональный переключатель: каждое изменение записывается напрямую в настройки Android или app-ops.

Интерфейс с поддержкой глубокого черного (AMOLED) и контрастного светлого режима, организованный в нижнюю панель (Shizuku, Конфиденциальность, Приложения, Система, Инфо) с удобным поиском по всем инструментам.

Плитки быстрых настроек: Кофеин (не выключать экран), Для разработчиков, Отладка по USB, Скрыть меню разработчика, Отключить датчики, Оттенки серого, Экстра-затемнение, DNS с блокировкой рекламы, Отключить микрофон и камеру, Таймаут экрана, Очистка кэша, Освободить RAM, Закрыть активное приложение, Скриншот, Запись экрана.

Конфиденциальность: настройка разрешений любого приложения на «Настоящие», «Фейковые» (разрешение отображается как выданное, но приложение ничего не получает) или «Отключено»; отключение всех датчиков; блокировка телеметрии Huawei и Google и HiCloud; просмотр сохранённых паролей Wi-Fi и отправка их через QR-код.

Приложения: скрытие приложений из лаунчера, выбор приложений по умолчанию, поиск неиспользуемых приложений, анализ памяти и недавнего доступа к датчикам, совместное воспроизведение звука или заглушение звука приложения.

Система: принудительная тёмная тема для приложений без тёмного режима, редактирование панели быстрых настроек, запуск терминальных команд, восстановление удалённых файлов (с миниатюрами) из корзины, резервное копирование и восстановление настроек.

Инфо: батарея, сеть (с публичным IP и переходом к настройкам роутера), зарядка, температура, идентификаторы устройства, статистика расхода батареи, пробуждения, вибрация и логи приложений — всё в виде удобных списков.

Требуется работающий Shizuku. Бесплатно и с открытым исходным кодом (MIT).
1 change: 1 addition & 0 deletions fastlane/metadata/android/ru-RU/short_description.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Системные твики на базе Shizuku. Без root и фоновых процессов.
1 change: 1 addition & 0 deletions fastlane/metadata/android/ru-RU/title.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
TinyKit