[app] Add newyear header (#97)

This commit is contained in:
tehcneko 2021-02-08 18:28:34 +08:00 committed by GitHub
parent ec3c982f3d
commit dfed755f81
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 631 additions and 215 deletions

View File

@ -32,6 +32,7 @@ android {
packagingOptions {
exclude 'META-INF/**'
exclude 'kotlin/**'
exclude 'org/**'
exclude '**.properties'
exclude '**.bin'
@ -72,5 +73,9 @@ dependencies {
implementation 'tech.rectifier.preferencex-android:preferencex-simplemenu:88f93154b2'
implementation 'me.zhanghai.android.appiconloader:appiconloader-glide:1.2.0'
implementation 'me.zhanghai.android.fastscroll:library:1.1.5'
//noinspection DifferentStdlibGradleVersion
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.21'
implementation 'com.github.jinatonic.confetti:confetti:1.1.2'
implementation files('libs/WeatherView-2.0.3.aar')
compileOnly project(":hiddenapi-stubs")
}

Binary file not shown.

View File

@ -149,7 +149,7 @@ public class BaseActivity extends AppCompatActivity {
getWindow().setStatusBarColor(getThemedColor(R.attr.colorPrimaryDark));
}
} else {
getWindow().setStatusBarColor(getThemedColor(android.R.attr.colorBackground));
getWindow().setStatusBarColor(0);
}
if (!Objects.equals(theme, getTheme(this) + getCustomTheme() + preferences.getBoolean("md2", true))) {
recreate();

View File

@ -2,10 +2,15 @@ package io.github.lsposed.manager.ui.activity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowCompat;
import androidx.core.view.WindowInsetsCompat;
import com.bumptech.glide.Glide;
import com.google.android.material.snackbar.Snackbar;
@ -20,6 +25,8 @@ import io.github.lsposed.manager.util.GlideHelper;
import io.github.lsposed.manager.util.ModuleUtil;
import io.github.lsposed.manager.util.NavUtil;
import io.github.lsposed.manager.util.light.Light;
import name.mikanoshi.customiuizer.holidays.HolidayHelper;
import name.mikanoshi.customiuizer.utils.Helpers;
public class MainActivity extends BaseActivity {
ActivityMainBinding binding;
@ -30,6 +37,15 @@ public class MainActivity extends BaseActivity {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
WindowCompat.setDecorFitsSystemWindows(getWindow(), false);
ViewCompat.setOnApplyWindowInsetsListener(binding.nestedScrollView, (v, insets) -> {
Insets insets1 = insets.getInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.ime());
v.setPadding(insets1.left, insets1.top, insets1.right, insets1.bottom);
return WindowInsetsCompat.CONSUMED;
});
}
HolidayHelper.setup(this);
binding.status.setOnClickListener(v -> {
if (Constants.getXposedVersionCode() != -1) {
new StatusDialogBuilder(this)
@ -51,7 +67,11 @@ public class MainActivity extends BaseActivity {
if (installedXposedVersion != null) {
binding.statusTitle.setText(String.format(Locale.US, "%s %s", getString(R.string.Activated), Constants.getXposedVariant()));
if (!Constants.isPermissive()) {
binding.status.setCardBackgroundColor(ContextCompat.getColor(this, R.color.colorNormal));
if (Helpers.currentHoliday == Helpers.Holidays.LUNARNEWYEAR) {
binding.status.setCardBackgroundColor(0xfff05654);
} else {
binding.status.setCardBackgroundColor(ContextCompat.getColor(this, R.color.colorNormal));
}
binding.statusIcon.setImageResource(R.drawable.ic_check_circle);
binding.statusSummary.setText(String.format(Locale.US, "%s (%d)", installedXposedVersion, Constants.getXposedVersionCode()));
} else {
@ -99,5 +119,18 @@ public class MainActivity extends BaseActivity {
});
super.onResume();
binding.modulesSummary.setText(String.format(getString(R.string.ModulesDetail), ModuleUtil.getInstance().getEnabledModules().size()));
HolidayHelper.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
HolidayHelper.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
HolidayHelper.onPause();
}
}

View File

@ -0,0 +1,29 @@
package name.mikanoshi.customiuizer.holidays;
import android.content.Context;
import com.github.jinatonic.confetti.ConfettoGenerator;
import com.github.jinatonic.confetti.confetto.Confetto;
import com.github.matteobattilana.weather.PrecipType;
import com.github.matteobattilana.weather.confetti.ConfettoInfo;
import java.util.Random;
public class FlowerGenerator implements ConfettoGenerator {
private final ConfettoInfo confettoInfo;
private final Context context;
public FlowerGenerator(Context ctx) {
super();
this.context = ctx;
this.confettoInfo = new ConfettoInfo(PrecipType.SNOW);
}
public Confetto generateConfetto(Random random) {
return new FlowerParticle(this.context, this.confettoInfo);
}
public final ConfettoInfo getConfettoInfo() {
return this.confettoInfo;
}
}

View File

@ -0,0 +1,70 @@
package name.mikanoshi.customiuizer.holidays;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.view.Surface;
import android.view.WindowManager;
import com.github.jinatonic.confetti.confetto.Confetto;
import com.github.matteobattilana.weather.confetti.ConfettoInfo;
import java.util.Random;
import io.github.lsposed.manager.R;
@SuppressWarnings("FieldCanBeLocal")
public class FlowerParticle extends Confetto {
private final ConfettoInfo confettoInfo;
private final Bitmap petal;
private float petalScale;
private final int[] petals = new int[]{R.drawable.confetti1, R.drawable.confetti1, R.drawable.confetti2, R.drawable.confetti2, R.drawable.confetti3, R.drawable.confetti3, R.drawable.petal};
FlowerParticle(Context context, ConfettoInfo confettoInfo) {
super();
this.confettoInfo = confettoInfo;
petalScale = 0.6f - (float) Math.random() * 0.15f;
petal = BitmapFactory.decodeResource(context.getResources(), petals[new Random().nextInt(petals.length)]);
int rotation = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) petalScale *= 1.5;
}
public int getHeight() {
return 0;
}
public int getWidth() {
return 0;
}
public void reset() {
super.reset();
}
protected void configurePaint(Paint paint) {
super.configurePaint(paint);
paint.setColor(-1);
paint.setAntiAlias(true);
}
protected void drawInternal(Canvas canvas, Matrix matrix, Paint paint, float x, float y, float rotation, float percentageAnimated) {
switch (confettoInfo.getPrecipType()) {
case CLEAR:
break;
case SNOW:
matrix.postScale(petalScale, petalScale);
matrix.postRotate(rotation, petal.getWidth() / 2f, petal.getHeight() / 2f);
matrix.postTranslate(x, y);
canvas.drawBitmap(petal, matrix, paint);
break;
}
}
public final ConfettoInfo getConfettoInfo() {
return this.confettoInfo;
}
}

View File

@ -0,0 +1,119 @@
package name.mikanoshi.customiuizer.holidays;
import android.app.Activity;
import android.view.Surface;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import com.github.jinatonic.confetti.ConfettiManager;
import com.github.jinatonic.confetti.ConfettoGenerator;
import com.github.matteobattilana.weather.PrecipType;
import com.github.matteobattilana.weather.WeatherView;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import io.github.lsposed.manager.R;
import name.mikanoshi.customiuizer.utils.GravitySensor;
import name.mikanoshi.customiuizer.utils.Helpers;
public class HolidayHelper {
private static WeakReference<WeatherView> weatherView;
private static WeakReference<GravitySensor> angleListener;
public static void setWeatherGenerator(ConfettoGenerator generator) {
try {
ConfettiManager manager = weatherView.get().getConfettiManager();
Field confettoGenerator = ConfettiManager.class.getDeclaredField("confettoGenerator");
confettoGenerator.setAccessible(true);
confettoGenerator.set(manager, generator);
} catch (Throwable t) {
t.printStackTrace();
}
}
public static void setup(Activity activity) {
Helpers.detectHoliday();
WeatherView view = activity.findViewById(R.id.weather_view);
ImageView header = activity.findViewById(R.id.holiday_header);
view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
weatherView = new WeakReference<>(view);
GravitySensor listener = null;
if (Helpers.currentHoliday == Helpers.Holidays.NEWYEAR) {
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
view.setPrecipType(PrecipType.SNOW);
view.setSpeed(50);
view.setEmissionRate(rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270 ? 8 : 4);
view.setFadeOutPercent(0.75f);
view.setAngle(0);
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) view.getLayoutParams();
lp.height = activity.getResources().getDisplayMetrics().heightPixels / (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270 ? 2 : 3);
view.setLayoutParams(lp);
setWeatherGenerator(new SnowGenerator(activity));
view.resetWeather();
view.setVisibility(View.VISIBLE);
view.getConfettiManager().setRotationalVelocity(0, 45);
listener = new GravitySensor(activity, view);
listener.setOrientation(rotation);
listener.setSpeed(50);
listener.start();
header.setImageResource(R.drawable.newyear_header);
header.setVisibility(View.VISIBLE);
} else if (Helpers.currentHoliday == Helpers.Holidays.LUNARNEWYEAR) {
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
view.setPrecipType(PrecipType.SNOW);
view.setSpeed(35);
view.setEmissionRate(rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270 ? 4 : 2);
view.setFadeOutPercent(0.75f);
view.setAngle(0);
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) view.getLayoutParams();
lp.height = activity.getResources().getDisplayMetrics().heightPixels / (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270 ? 3 : 4);
view.setLayoutParams(lp);
setWeatherGenerator(new FlowerGenerator(activity));
view.resetWeather();
view.setVisibility(View.VISIBLE);
view.getConfettiManager().setRotationalVelocity(0, 45);
listener = new GravitySensor(activity, view);
listener.setOrientation(rotation);
listener.setSpeed(35);
listener.start();
header.setImageResource(R.drawable.lunar_newyear_header);
header.setVisibility(View.VISIBLE);
} else {
((ViewGroup) view.getParent()).removeView(view);
((ViewGroup) header.getParent()).removeView(header);
}
angleListener = new WeakReference<>(listener);
}
public static void onPause() {
GravitySensor listener = angleListener.get();
if (listener != null) listener.onPause();
WeatherView view = weatherView.get();
if (view != null) view.getConfettiManager().terminate();
}
public static void onResume() {
GravitySensor listener = angleListener.get();
if (listener != null) listener.onResume();
WeatherView view = weatherView.get();
if (view != null) view.getConfettiManager().animate();
}
public static void onDestroy() {
GravitySensor listener = angleListener.get();
if (listener != null) listener.stop();
}
}

View File

@ -0,0 +1,29 @@
package name.mikanoshi.customiuizer.holidays;
import android.content.Context;
import com.github.jinatonic.confetti.ConfettoGenerator;
import com.github.jinatonic.confetti.confetto.Confetto;
import com.github.matteobattilana.weather.PrecipType;
import com.github.matteobattilana.weather.confetti.ConfettoInfo;
import java.util.Random;
public class SnowGenerator implements ConfettoGenerator {
private final ConfettoInfo confettoInfo;
private final Context context;
public SnowGenerator(Context ctx) {
super();
this.context = ctx;
this.confettoInfo = new ConfettoInfo(PrecipType.SNOW);
}
public Confetto generateConfetto(Random random) {
return new SnowParticle(this.context, this.confettoInfo);
}
public final ConfettoInfo getConfettoInfo() {
return this.confettoInfo;
}
}

View File

@ -0,0 +1,84 @@
package name.mikanoshi.customiuizer.holidays;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import com.github.jinatonic.confetti.confetto.Confetto;
import com.github.matteobattilana.weather.confetti.ConfettoInfo;
import io.github.lsposed.manager.R;
public class SnowParticle extends Confetto {
private Float prevX;
private Float prevY;
private final ConfettoInfo confettoInfo;
private final Bitmap snowflake;
private final float snowScale;
//private float rainStretch;
SnowParticle(Context context, ConfettoInfo confettoInfo) {
super();
this.confettoInfo = confettoInfo;
snowScale = 0.6f - (float) Math.random() * 0.3f;
//rainStretch = 1.5f + (float)Math.random() - 0.5f;
snowflake = BitmapFactory.decodeResource(context.getResources(), R.drawable.snowflake);
}
public int getHeight() {
return 0;
}
public int getWidth() {
return 0;
}
public void reset() {
super.reset();
this.prevX = null;
this.prevY = null;
}
protected void configurePaint(Paint paint) {
super.configurePaint(paint);
paint.setColor(-1);
paint.setAntiAlias(true);
}
protected void drawInternal(Canvas canvas, Matrix matrix, Paint paint, float x, float y, float rotation, float percentageAnimated) {
if (prevX == null || prevY == null) {
prevX = x;
prevY = y;
}
switch (confettoInfo.getPrecipType()) {
case CLEAR:
break;
// case RAIN:
// float dX = x - prevX;
// float dY = y - prevY;
// float x1 = prevX - dX * rainStretch;
// float y1 = prevY - dY * rainStretch;
// float x2 = x + dX * rainStretch;
// float y2 = y + dY * rainStretch;
// paint.setShader(new LinearGradient(x1, y1, x2, y2, new int[] { Color.TRANSPARENT, 0xb29aa3ad, 0xb29aa3ad, Color.TRANSPARENT }, new float[] { 0f, 0.45f, 0.55f, 1f }, Shader.TileMode.CLAMP));
// canvas.drawLine(x1, y1, x2, y2, paint);
// break;
case SNOW:
matrix.postScale(snowScale, snowScale);
matrix.postRotate(rotation, snowflake.getWidth() / 2f, snowflake.getHeight() / 2f);
matrix.postTranslate(x, y);
canvas.drawBitmap(snowflake, matrix, paint);
break;
}
prevX = x;
prevY = y;
}
public final ConfettoInfo getConfettoInfo() {
return this.confettoInfo;
}
}

View File

@ -0,0 +1,102 @@
package name.mikanoshi.customiuizer.utils;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.view.Surface;
import com.github.matteobattilana.weather.WeatherView;
public final class GravitySensor implements SensorEventListener {
private final SensorManager sensorManager;
private float[] magneticValues;
private float[] accelerometerValues;
private int orientation;
private int speed;
private boolean started;
private final Context context;
private final WeatherView weatherView;
public GravitySensor(Context context, WeatherView weatherView) {
super();
this.context = context;
this.weatherView = weatherView;
this.sensorManager = (SensorManager) this.context.getSystemService(Context.SENSOR_SERVICE);
}
public void setOrientation(int orient) {
this.orientation = orient;
}
public void setSpeed(int spd) {
this.speed = spd;
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
if (event == null || event.sensor == null) return;
switch (event.sensor.getType()) {
case 1:
this.accelerometerValues = event.values;
break;
case 2:
this.magneticValues = event.values;
break;
}
if (this.magneticValues == null || this.accelerometerValues == null) return;
float[] rotationMatrix = new float[9];
SensorManager.getRotationMatrix(rotationMatrix, null, this.accelerometerValues, this.magneticValues);
float[] remappedRotationMatrix = new float[9];
SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Z, remappedRotationMatrix);
float[] orientationAngles = new float[3];
SensorManager.getOrientation(remappedRotationMatrix, orientationAngles);
//double pitch = Math.toDegrees((double)orientationAngles[1]);
double roll = Math.toDegrees(orientationAngles[2]) + Math.random() * 20 - 10;
if (this.orientation == Surface.ROTATION_90) roll += 90;
else if (this.orientation == Surface.ROTATION_270) roll -= 90;
else if (this.orientation == Surface.ROTATION_180) roll += roll > 0 ? 180 : -180;
if (roll > 90) roll -= 180;
else if (roll < -90) roll += 180;
this.weatherView.setAngle((int) roll);
this.weatherView.setSpeed(this.speed + (int) Math.round(Math.random() * 20 - 10));
}
private void registerListener() {
this.sensorManager.registerListener(this, this.sensorManager.getDefaultSensor(1), 2);
this.sensorManager.registerListener(this, this.sensorManager.getDefaultSensor(2), 2);
}
private void unregisterListener() {
this.sensorManager.unregisterListener(this);
}
public final void start() {
this.started = true;
this.registerListener();
}
public final void stop() {
this.started = false;
this.unregisterListener();
}
public final void onResume() {
if (this.started) {
this.registerListener();
}
}
public final void onPause() {
this.unregisterListener();
}
public final Context getContext() {
return this.context;
}
}

View File

@ -0,0 +1,25 @@
package name.mikanoshi.customiuizer.utils;
import java.util.Calendar;
public class Helpers {
public static Holidays currentHoliday = Holidays.NONE;
public enum Holidays {
NONE, NEWYEAR, LUNARNEWYEAR
}
public static void detectHoliday() {
currentHoliday = Holidays.NONE;
Calendar cal = Calendar.getInstance();
int month = cal.get(Calendar.MONTH);
int monthDay = cal.get(Calendar.DAY_OF_MONTH);
//int year = cal.get(Calendar.YEAR);
// Lunar NY
if ((month == 0 && monthDay > 15) || month == 1) currentHoliday = Holidays.LUNARNEWYEAR;
// NY
else if (month == 0 || month == 11) currentHoliday = Holidays.NEWYEAR;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 921 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 891 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 628 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 754 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 730 B

View File

@ -5,6 +5,27 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.github.matteobattilana.weather.WeatherView
android:id="@+id/weather_view"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:translationZ="101dp"
android:focusable="false"
android:focusableInTouchMode="false"
android:visibility="gone" />
<ImageView
android:id="@+id/holiday_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="fitStart"
android:adjustViewBounds="true"
android:translationZ="100dp"
android:focusable="false"
android:focusableInTouchMode="false"
android:visibility="gone"
tools:ignore="ContentDescription" />
<androidx.core.widget.NestedScrollView
android:id="@+id/nestedScrollView"
android:layout_width="match_parent"

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

View File

@ -1,209 +1,111 @@
<resources>
<string name="About">Про модифікацію</string>
<string name="Activated">Активовано</string>
<string name="Install">Установити</string>
<string name="InstallDetail">Натисніть для встановлення LSPosed</string>
<string name="Logs">Звіти</string>
<string name="Modules">Модулі</string>
<string name="ModulesDetail">%d модулі(в) увімкнено</string>
<string name="Settings">Налаштування</string>
<string name="abc_action_bar_home_description">Перейти на головну</string>
<string name="abc_action_bar_up_description">Перейти вгору</string>
<string name="abc_action_menu_overflow_description">Більше опцій</string>
<string name="abc_action_mode_done">Готово</string>
<string name="abc_activity_chooser_view_see_all">Показати всі</string>
<string name="abc_activitychooserview_choose_application">Вибрати програму</string>
<string name="abc_capital_off">ЗНИЖКА</string>
<string name="abc_capital_on">УВІМК.</string>
<string name="abc_menu_alt_shortcut_label">Alt+</string>
<string name="abc_menu_ctrl_shortcut_label">Ctrl+</string>
<string name="abc_menu_delete_shortcut_label">delete</string>
<string name="abc_menu_enter_shortcut_label">enter</string>
<string name="abc_menu_function_shortcut_label">Function+</string>
<string name="abc_menu_meta_shortcut_label">Meta+</string>
<string name="abc_menu_shift_shortcut_label">Shift+</string>
<string name="abc_menu_space_shortcut_label">пробіл</string>
<string name="abc_menu_sym_shortcut_label">Sym+</string>
<string name="abc_prepend_shortcut_label">Menu+</string>
<string name="abc_search_hint">Введіть пошуковий запит…</string>
<string name="abc_searchview_description_clear">Очистити запит</string>
<string name="abc_searchview_description_query">Пошуковий запит</string>
<string name="abc_searchview_description_search">Пошук</string>
<string name="abc_searchview_description_submit">Наіслати запит</string>
<string name="abc_searchview_description_voice">Голосовий пошук</string>
<string name="abc_shareactionprovider_share_with">Поділитися:</string>
<string name="abc_shareactionprovider_share_with_application">Поділитися через додаток %s</string>
<string name="abc_toolbar_collapse_description">Згорнути</string>
<string name="about_source">https://github.com/LSPosed/LSPosed/</string>
<string name="about_source_label">Вихідний код</string>
<string name="accent_color">Колір акценту</string>
<string name="android_framework">System Framework</string>
<string name="android_sdk">Android %2$s (%1$s, API %3$d)</string>
<string name="app_destroyed">Ця програма припинила роботу, будь ласка, переконайтесь, що завантажили її з офіційного джерела.</string>
<string name="app_launch">Запустити</string>
<string name="app_name">LSPosed Manager</string>
<string name="appbar_scrolling_view_behavior">com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior</string>
<string name="bottom_sheet_behavior">com.google.android.material.bottomsheet.BottomSheetBehavior</string>
<string name="character_counter_content_description">Набрано символів %1$d з %2$d</string>
<string name="character_counter_overflowed_content_description">Перевищено ліміт символів %1$d з %2$d</string>
<string name="character_counter_pattern">%1$d/%2$d</string>
<string name="chip_text">Chip text</string>
<string name="clear_text_end_icon_content_description">Очистити текст</string>
<string name="color_picker_default_title">Вибрати колір</string>
<string name="color_swatch_description">Колір %1$d</string>
<string name="color_swatch_description_selected">Вибрано колір: %1$d</string>
<string name="colorized_action_bar">Кольоровий ActionBar</string>
<string name="compile_failed">Помилка оптимізації або повернене значення порожнє</string>
<string name="compile_failed_with_info">Помилка оптимізації:</string>
<string name="compile_speed">Повторна оптимізація</string>
<string name="compile_speed_msg">Оптимізація…</string>
<string name="copy">Скопіювати</string>
<string name="copy_toast_msg">Посилання скопійовано в буфер обміну</string>
<string name="done">Готово!</string>
<string name="dont_show_again">Не показувати знову</string>
<string name="enable_module">Увімкнути модуль</string>
<string name="error_icon_content_description">Помилка</string>
<string name="expand_button_title">Додатково</string>
<string name="exposed_dropdown_menu_content_description">Показати спадне меню</string>
<string name="fab_transformation_scrim_behavior">com.google.android.material.transformation.FabTransformationScrimBehavior</string>
<string name="fab_transformation_sheet_behavior">com.google.android.material.transformation.FabTransformationSheetBehavior</string>
<string name="failed_to_save_scope_list">Не вдалося зберегти список областей</string>
<string name="fallback_menu_item_copy_link">Копіювати посилання</string>
<string name="fallback_menu_item_open_in_browser">Відкрити у веб-переглядачі</string>
<string name="fallback_menu_item_share_link">Надіслати посилання</string>
<string name="follow_system">Слідувати системі</string>
<string name="group_telegram_channel_link">http://t.me/LSPosed</string>
<string name="hide_bottom_view_on_scroll_behavior">com.google.android.material.behavior.HideBottomViewOnScrollBehavior</string>
<string name="icon_content_description">Значок діалогового вікна</string>
<string name="info">Інформація</string>
<string name="install_warning_title">Обережно!</string>
<string name="item_view_role_description">Вкладка</string>
<string name="loading">Завантаження…</string>
<string name="log_is_empty">Звіт порожній.</string>
<string name="logs_cannot_read">"Не вдається прочитати звіт: "</string>
<string name="logs_clear_failed">Не вдалося очистити звіт:</string>
<string name="logs_cleared">Звіт успішно очищено.</string>
<string name="logs_save_failed">Не вдалося зберегти:</string>
<string name="lsposed_not_active">LSPosed наразі не встановлений або не активний.</string>
<string name="material_design_2">Material Design 2</string>
<string name="material_slider_range_end">Кінець діапазону,</string>
<string name="material_slider_range_start">Початок діапазону,</string>
<string name="menuClearLog">Очистити звіт зараз</string>
<string name="menuReload">Перезавантажити</string>
<string name="menuSaveToSd">Зберегти</string>
<string name="menuSend">Надіслати</string>
<string name="menu_backup">Створити резервну копію</string>
<string name="menu_backup_and_restore">Створення резервної копії…</string>
<string name="menu_restore">Відновити</string>
<string name="menu_show_games">Ігри</string>
<string name="menu_show_modules">Модулі</string>
<string name="menu_show_system_apps">Системні програми</string>
<string name="menu_sort">Сортування...</string>
<string name="module_app_info">Інформація про програму</string>
<string name="module_disabled_no_selection">Модуль %s вимкнено, оскільки жодна програма не вибрана.</string>
<string name="module_empty_description">(опису не надано)</string>
<string name="module_is_not_activated_yet">Модуль LSPosed ще не активований</string>
<string name="module_is_not_activated_yet_detailed">%s було встановлено, але ще не активовано</string>
<string name="module_no_ui">Цей модуль не надає інтерфейсу користувача</string>
<string name="module_settings">Налаштування модуля</string>
<string name="module_uninstall">Видалити</string>
<string name="modules_app_store">Переглянути в Play Store</string>
<string name="mtrl_badge_numberless_content_description">Нове сповіщення</string>
<string name="mtrl_chip_close_icon_content_description">Видалити %1$s</string>
<string name="mtrl_exceed_max_badge_number_content_description">Більше %1$d нових сповіщень</string>
<string name="mtrl_exceed_max_badge_number_suffix">%1$d%2$s</string>
<string name="mtrl_picker_a11y_next_month">Змінити на наступний місяць</string>
<string name="mtrl_picker_a11y_prev_month">Змінити на попередній місяць</string>
<string name="mtrl_picker_announce_current_selection">Поточний вибір: %1$s</string>
<string name="mtrl_picker_cancel">@android:string/cancel</string>
<string name="mtrl_picker_confirm">@android:string/ok</string>
<string name="mtrl_picker_date_header_selected">%1$s</string>
<string name="mtrl_picker_date_header_title">Виберіть дату</string>
<string name="mtrl_picker_date_header_unselected">Вибрана дата</string>
<string name="mtrl_picker_day_of_week_column_header">Стовпець днів: %1$s</string>
<string name="mtrl_picker_invalid_format">Недійсний формат.</string>
<string name="mtrl_picker_invalid_format_example">Приклад: %1$s</string>
<string name="mtrl_picker_invalid_format_use">Використання: %1$s</string>
<string name="mtrl_picker_invalid_range">Недійсний діапазон.</string>
<string name="mtrl_picker_navigate_to_year_description">Перейти до року %1$s</string>
<string name="mtrl_picker_out_of_range">Не належить діапазону: %1$s</string>
<string name="mtrl_picker_range_header_only_end_selected">Дата початку %1$s</string>
<string name="mtrl_picker_range_header_only_start_selected">%1$s Кінцева дата</string>
<string name="mtrl_picker_range_header_selected">%1$s %2$s</string>
<string name="mtrl_picker_range_header_title">Виберіть діапазон дат</string>
<string name="mtrl_picker_range_header_unselected">Дата початку - дата закінчення</string>
<string name="mtrl_picker_save">Зберегти</string>
<string name="mtrl_picker_text_input_date_hint">Дата</string>
<string name="mtrl_picker_text_input_date_range_end_hint">Дата закінчення</string>
<string name="mtrl_picker_text_input_date_range_start_hint">Дата початку</string>
<string name="mtrl_picker_text_input_day_abbr">д</string>
<string name="mtrl_picker_text_input_month_abbr">м</string>
<string name="mtrl_picker_text_input_year_abbr">р</string>
<string name="mtrl_picker_toggle_to_calendar_input_mode">Перемкнутись на режим введення календаря</string>
<string name="mtrl_picker_toggle_to_day_selection">Торкніться, щоб перейти до вибору дня</string>
<string name="mtrl_picker_toggle_to_text_input_mode">Перемкнутись до режиму введення тексту</string>
<string name="mtrl_picker_toggle_to_year_selection">Торкніться, щоб перейти до вибору року</string>
<string name="nav_item_logs">Детальні звіти</string>
<string name="nav_item_logs_err">Звіти модулів</string>
<string name="nav_item_modules">Модулі</string>
<string name="no_min_version_specified">Цей модуль не визначає потрібну йому версію LSP.</string>
<string name="no_scope_selected">Ви не вибрали жодної програми. Продовжити?</string>
<string name="no_scope_selected_has_recommended">Ви не вибрали жодної програми. Вибрати рекомендовані програми?</string>
<string name="not_installed">Не встановлено</string>
<string name="not_logcat">"Це звіт LSPosed Framework та модулів, якщо вам потрібен Android logcat, ви можете спробувати наш модуль Magisk Log Catcher"</string>
<string name="not_set">Не налаштовано</string>
<string name="ok">OK</string>
<string name="outdated_manager">Версія LSPosed Manager і LSPosed Core не узгоджуються. Будь ласка, встановіть відповідну версію.</string>
<string name="password_toggle_content_description">Показувати пароль</string>
<string name="path_password_eye">M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z</string>
<string name="path_password_eye_mask_strike_through">M2,4.27 L19.73,22 L22.27,19.46 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 Z</string>
<string name="path_password_eye_mask_visible">M2,4.27 L2,4.27 L4.54,1.73 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 Z</string>
<string name="path_password_strike_through">M3.27,4.27 L19.74,20.74</string>
<string name="pref_title_disable_verbose_log">Вимкнути детальні звіти</string>
<string name="preference_copied">\"%1$s\": скопійовано в буфер обміну.</string>
<string name="primary_color">Основний колір</string>
<string name="pure_black_dark_theme">Використовувати чисто чорну темну тему</string>
<string name="requested_by_module">Рекомендовано</string>
<string name="scroll_bottom">Прокрутити донизу</string>
<string name="scroll_top">Прокрутити догори</string>
<string name="search_menu_title">Пошук</string>
<string name="selinux_permissive"><b>УВАГА:</b> Статус SELinux не Enforcing! Шкідливі програми, які користуються цим, зможуть повністю керувати вашим пристроєм і спричинити шкоду вашим даним.</string>
<string name="selinux_permissive_summary">Статус SELinux не Enforcing!</string>
<string name="settings_backup">Резервне копіювання</string>
<string name="settings_backup_and_restore">Резервне копіювання і відновлення</string>
<string name="settings_backup_and_restore_summery">Резервне копіювання або відновлення списку модулів та списків областей.</string>
<string name="settings_backup_failed">Не вдалося зробити резервну копію</string>
<string name="settings_backup_success">Резервне копіювання закінчено!</string>
<string name="settings_backuping">Резервне копіювання…</string>
<string name="settings_enable_resources">Увімкнути хуки ресурсів</string>
<string name="settings_enable_resources_summary">УВАГА: Хуки ресурсів застаріли</string>
<string name="settings_group_framework">Framework</string>
<string name="settings_group_theme">Тема</string>
<string name="settings_restore">Відновлення</string>
<string name="settings_restore_failed">Не вдалося відновити</string>
<string name="settings_restore_success">Відновлення закінчено!</string>
<string name="settings_restoring">Відновлення…</string>
<string name="settings_theme">Тема</string>
<string name="settings_theme_dark">Темна</string>
<string name="settings_theme_light">Світла</string>
<string name="settings_variant">Варіант</string>
<string name="sort_by_install_time">Сортувати за часом встановлення</string>
<string name="sort_by_install_time_reverse">Сортувати за часом встановлення (зворотній)</string>
<string name="sort_by_name">Сортувати за назвою програми</string>
<string name="sort_by_name_reverse">Сортувати за назвою програми (зворотній)</string>
<string name="sort_by_package_name">Сортувати за назвою пакета</string>
<string name="sort_by_package_name_reverse">Сортувати за назвою пакету (зворотній)</string>
<string name="sort_by_update_time">Сортувати за часом оновлення</string>
<string name="sort_by_update_time_reverse">Сортувати за часом оновлення (зворотній)</string>
<string name="status_bar_notification_info_overflow">999+</string>
<string name="summary_collapsed_preference_list">%1$s, %2$s</string>
<string name="transparent_status_bar">Прозорий рядок стану</string>
<string name="use_recommended">Рекомендовано</string>
<string name="use_recommended_message">Вибрати рекомендовані програми?</string>
<string name="v7_preference_off">ВИМКНЕНО</string>
<string name="v7_preference_on">УВІМКНЕНО</string>
<string name="warning_installed_on_external_storage">Цей модуль не можна завантажити, оскільки він встановлений на SD-карті, перенесіть його у внутрішню пам’ять</string>
<string name="warning_min_version_too_low">Цей модуль був створений для версії LSP %1$d, але через несумісні зміни у версії %2$d його було вимкнено</string>
<string name="warning_xposed_min_version">Цей модуль вимагає новішої версії LSP (%d), тому його неможливо активувати</string>
<string name="xposed_module_updated_notification_title">Модуль LSPosed оновлено</string>
<string name="About">Про модифікацію</string>
<string name="Activated">Активовано</string>
<string name="Install">Установити</string>
<string name="InstallDetail">Натисніть для встановлення LSPosed</string>
<string name="Logs">Звіти</string>
<string name="Modules">Модулі</string>
<string name="ModulesDetail">%d модулі(в) увімкнено</string>
<string name="Settings">Налаштування</string>
<string name="about_source">https://github.com/LSPosed/LSPosed/</string>
<string name="about_source_label">Вихідний код</string>
<string name="accent_color">Колір акценту</string>
<string name="android_framework">System Framework</string>
<string name="android_sdk">Android %2$s (%1$s, API %3$d)</string>
<string name="app_destroyed">Ця програма припинила роботу, будь ласка, переконайтесь, що завантажили її з офіційного джерела.</string>
<string name="app_launch">Запустити</string>
<string name="app_name">LSPosed Manager</string>
<string name="appbar_scrolling_view_behavior">com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior</string>
<string name="colorized_action_bar">Кольоровий ActionBar</string>
<string name="compile_failed">Помилка оптимізації або повернене значення порожнє</string>
<string name="compile_failed_with_info">Помилка оптимізації:</string>
<string name="compile_speed">Повторна оптимізація</string>
<string name="compile_speed_msg">Оптимізація…</string>
<string name="copy_toast_msg">Посилання скопійовано в буфер обміну</string>
<string name="dont_show_again">Не показувати знову</string>
<string name="enable_module">Увімкнути модуль</string>
<string name="failed_to_save_scope_list">Не вдалося зберегти список областей</string>
<string name="follow_system">Слідувати системі</string>
<string name="group_telegram_channel_link">http://t.me/LSPosed</string>
<string name="info">Інформація</string>
<string name="install_warning_title">Обережно!</string>
<string name="loading">Завантаження…</string>
<string name="log_is_empty">Звіт порожній.</string>
<string name="logs_cannot_read">"Не вдається прочитати звіт: "</string>
<string name="logs_clear_failed">Не вдалося очистити звіт:</string>
<string name="logs_cleared">Звіт успішно очищено.</string>
<string name="logs_save_failed">Не вдалося зберегти:</string>
<string name="lsposed_not_active">LSPosed наразі не встановлений або не активний.</string>
<string name="material_design_2">Material Design 2</string>
<string name="menuClearLog">Очистити звіт зараз</string>
<string name="menuReload">Перезавантажити</string>
<string name="menuSaveToSd">Зберегти</string>
<string name="menuSend">Надіслати</string>
<string name="menu_backup">Створити резервну копію</string>
<string name="menu_backup_and_restore">Створення резервної копії…</string>
<string name="menu_restore">Відновити</string>
<string name="menu_show_games">Ігри</string>
<string name="menu_show_modules">Модулі</string>
<string name="menu_show_system_apps">Системні програми</string>
<string name="menu_sort">Сортування...</string>
<string name="module_app_info">Інформація про програму</string>
<string name="module_disabled_no_selection">Модуль %s вимкнено, оскільки жодна програма не вибрана.</string>
<string name="module_empty_description">(опису не надано)</string>
<string name="module_is_not_activated_yet">Модуль LSPosed ще не активований</string>
<string name="module_is_not_activated_yet_detailed">%s було встановлено, але ще не активовано</string>
<string name="module_no_ui">Цей модуль не надає інтерфейсу користувача</string>
<string name="module_settings">Налаштування модуля</string>
<string name="module_uninstall">Видалити</string>
<string name="modules_app_store">Переглянути в Play Store</string>
<string name="nav_item_logs">Детальні звіти</string>
<string name="nav_item_logs_err">Звіти модулів</string>
<string name="nav_item_modules">Модулі</string>
<string name="no_min_version_specified">Цей модуль не визначає потрібну йому версію LSP.</string>
<string name="no_scope_selected">Ви не вибрали жодної програми. Продовжити?</string>
<string name="no_scope_selected_has_recommended">Ви не вибрали жодної програми. Вибрати рекомендовані програми?</string>
<string name="not_installed">Не встановлено</string>
<string name="not_logcat">"Це звіт LSPosed Framework та модулів, якщо вам потрібен Android logcat, ви можете спробувати наш модуль Magisk Log Catcher"</string>
<string name="ok">OK</string>
<string name="outdated_manager">Версія LSPosed Manager і LSPosed Core не узгоджуються. Будь ласка, встановіть відповідну версію.</string>
<string name="pref_title_disable_verbose_log">Вимкнути детальні звіти</string>
<string name="primary_color">Основний колір</string>
<string name="pure_black_dark_theme">Використовувати чисто чорну темну тему</string>
<string name="requested_by_module">Рекомендовано</string>
<string name="scroll_bottom">Прокрутити донизу</string>
<string name="scroll_top">Прокрутити догори</string>
<string name="selinux_permissive"><b>УВАГА:</b> Статус SELinux не Enforcing! Шкідливі програми, які користуються цим, зможуть повністю керувати вашим пристроєм і спричинити шкоду вашим даним.</string>
<string name="selinux_permissive_summary">Статус SELinux не Enforcing!</string>
<string name="settings_backup">Резервне копіювання</string>
<string name="settings_backup_and_restore">Резервне копіювання і відновлення</string>
<string name="settings_backup_and_restore_summery">Резервне копіювання або відновлення списку модулів та списків областей.</string>
<string name="settings_backup_failed">Не вдалося зробити резервну копію</string>
<string name="settings_backup_success">Резервне копіювання закінчено!</string>
<string name="settings_backuping">Резервне копіювання…</string>
<string name="settings_enable_resources">Увімкнути хуки ресурсів</string>
<string name="settings_enable_resources_summary">УВАГА: Хуки ресурсів застаріли</string>
<string name="settings_group_framework">Framework</string>
<string name="settings_group_theme">Тема</string>
<string name="settings_restore">Відновлення</string>
<string name="settings_restore_failed">Не вдалося відновити</string>
<string name="settings_restore_success">Відновлення закінчено!</string>
<string name="settings_restoring">Відновлення…</string>
<string name="settings_theme">Тема</string>
<string name="settings_theme_dark">Темна</string>
<string name="settings_theme_light">Світла</string>
<string name="settings_variant">Варіант</string>
<string name="sort_by_install_time">Сортувати за часом встановлення</string>
<string name="sort_by_install_time_reverse">Сортувати за часом встановлення (зворотній)</string>
<string name="sort_by_name">Сортувати за назвою програми</string>
<string name="sort_by_name_reverse">Сортувати за назвою програми (зворотній)</string>
<string name="sort_by_package_name">Сортувати за назвою пакета</string>
<string name="sort_by_package_name_reverse">Сортувати за назвою пакету (зворотній)</string>
<string name="sort_by_update_time">Сортувати за часом оновлення</string>
<string name="sort_by_update_time_reverse">Сортувати за часом оновлення (зворотній)</string>
<string name="transparent_status_bar">Прозорий рядок стану</string>
<string name="use_recommended">Рекомендовано</string>
<string name="use_recommended_message">Вибрати рекомендовані програми?</string>
<string name="warning_installed_on_external_storage">Цей модуль не можна завантажити, оскільки він встановлений на SD-карті, перенесіть його у внутрішню пам’ять</string>
<string name="warning_min_version_too_low">Цей модуль був створений для версії LSP %1$d, але через несумісні зміни у версії %2$d його було вимкнено</string>
<string name="warning_xposed_min_version">Цей модуль вимагає новішої версії LSP (%d), тому його неможливо активувати</string>
<string name="xposed_module_updated_notification_title">Модуль LSPosed оновлено</string>
</resources>

View File

@ -77,7 +77,6 @@
<!-- LSPd related -->
<string name="compile_speed_msg">优化中…</string>
<string name="done">完成!</string>
<string name="pref_title_disable_verbose_log">禁用详细日志</string>
<string name="logs_cannot_read">无法读取日志: \n</string>

View File

@ -75,7 +75,6 @@
<!-- LSPd related -->
<string name="compile_speed_msg">優化中…</string>
<string name="done">完成!</string>
<string name="pref_title_disable_verbose_log">禁用詳細日誌</string>
<string name="logs_cannot_read">無法讀取日誌: \n</string>

View File

@ -80,7 +80,6 @@
<string name="android_sdk" translatable="false">Android %2$s (%1$s, API %3$d)</string>
<string name="not_logcat">這裡是 LSPosed 框架和模組的日誌\n若您需要 Android 的 logcat您可以嘗試我們 Log Catcher 的 Magisk 模組</string>
<string name="done">Done!</string>
<!-- LSPd related -->
<string name="compile_speed_msg">最佳化中…</string>