diff --git a/app/src/main/java/com/android/settings/applications/PreferredSettingsUtils.java b/app/src/main/java/com/android/settings/applications/PreferredSettingsUtils.java
new file mode 100644
index 0000000..7175ec4
--- /dev/null
+++ b/app/src/main/java/com/android/settings/applications/PreferredSettingsUtils.java
@@ -0,0 +1,17 @@
+package com.android.settings.applications;
+
+public class PreferredSettingsUtils {
+
+ @SuppressWarnings({"unused", "RedundantSuppression"})
+ public enum PreferredApplication {
+ PREFERRED_HOME,
+ @SuppressWarnings("SpellCheckingInspection") PREFERRED_DAILER,
+ PREFERRED_MMS,
+ PREFERRED_CAMERA,
+ PREFERRED_GALLERY,
+ PREFERRED_MUSIC,
+ PREFERRED_MAIL,
+ PREFERRED_BROWSER
+ }
+
+}
diff --git a/app/src/main/java/dummydomain/yetanothercallblocker/IntentHelper.java b/app/src/main/java/dummydomain/yetanothercallblocker/IntentHelper.java
index 8aeaf5a..a3a1c31 100644
--- a/app/src/main/java/dummydomain/yetanothercallblocker/IntentHelper.java
+++ b/app/src/main/java/dummydomain/yetanothercallblocker/IntentHelper.java
@@ -25,12 +25,14 @@ public class IntentHelper {
return intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
}
- public static void startActivity(Context context, Intent intent) {
+ public static boolean startActivity(Context context, Intent intent) {
try {
context.startActivity(intent);
+ return true;
} catch (Exception e) {
LOG.warn("startActivity() error starting activity", e);
}
+ return false;
}
}
diff --git a/app/src/main/java/dummydomain/yetanothercallblocker/PermissionHelper.java b/app/src/main/java/dummydomain/yetanothercallblocker/PermissionHelper.java
index dc0a5fb..78bad29 100644
--- a/app/src/main/java/dummydomain/yetanothercallblocker/PermissionHelper.java
+++ b/app/src/main/java/dummydomain/yetanothercallblocker/PermissionHelper.java
@@ -2,26 +2,40 @@ package dummydomain.yetanothercallblocker;
import android.Manifest;
import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.PackageManager;
+import android.net.Uri;
import android.os.Build;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.telecom.PhoneAccount;
import android.telecom.TelecomManager;
import android.text.TextUtils;
import android.widget.Toast;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
+import com.android.settings.applications.PreferredSettingsUtils;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import static dummydomain.yetanothercallblocker.IntentHelper.startActivity;
import static java.util.Objects.requireNonNull;
public class PermissionHelper {
@@ -127,6 +141,7 @@ public class PermissionHelper {
}
}
+ @SuppressWarnings("BooleanMethodIsAlwaysInverted")
public static boolean hasNumberInfoPermissions(Context context) {
for (String permission : INFO_PERMISSIONS) {
if (!hasPermission(context, permission)) return false;
@@ -151,12 +166,14 @@ public class PermissionHelper {
== PackageManager.PERMISSION_GRANTED;
}
- public static void requestCallScreening(Activity activity) {
+ public static RequestToken requestCallScreening(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
RoleManagerHelper.requestCallScreeningRole(activity);
- } else {
- setAsDefaultDialer(activity);
+ return null;
+ } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+ return setAsDefaultDialer(activity);
}
+ return null;
}
public static boolean isCallScreeningHeld(Context context) {
@@ -167,15 +184,36 @@ public class PermissionHelper {
return isDefaultDialer(context);
}
+ public static void disableCallScreening(Context context) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ if (RoleManagerHelper.hasCallScreeningRole(context)) {
+ new AlertDialog.Builder(context)
+ .setTitle(R.string.default_caller_id_app)
+ .setMessage(R.string.default_caller_id_app_unset)
+ .setPositiveButton(R.string.open_system_settings,
+ (d, w) -> openDefaultAppsSettings(context))
+ .show();
+ return;
+ }
+ }
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+ if (isDefaultDialer(context)) {
+ showDefaultDialerDialog(context, false);
+ }
+ }
+ }
+
public static boolean handleCallScreeningResult(Context context,
- int requestCode, int resultCode) {
+ int requestCode, int resultCode,
+ RequestToken requestToken) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
if (RoleManagerHelper.handleCallScreeningResult(context, requestCode, resultCode)) {
return true;
}
}
- return handleDefaultDialerResult(context, requestCode, resultCode);
+ return handleDefaultDialerResult(context, requestCode, resultCode, requestToken);
}
public static boolean isDefaultDialer(Context context) {
@@ -187,22 +225,127 @@ public class PermissionHelper {
return BuildConfig.APPLICATION_ID.equals(telecomManager.getDefaultDialerPackage());
}
- public static void setAsDefaultDialer(Activity activity) {
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return;
- if (isDefaultDialer(activity)) return;
+ @RequiresApi(Build.VERSION_CODES.N)
+ public static RequestToken setAsDefaultDialer(Activity activity) {
+ if (isDefaultDialer(activity)) return null;
Intent intent = new Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER);
intent.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME,
BuildConfig.APPLICATION_ID);
- activity.startActivityForResult(intent, REQUEST_CODE_DEFAULT_DIALER);
+ try {
+ activity.startActivityForResult(intent, REQUEST_CODE_DEFAULT_DIALER);
+ return new RequestToken(System.nanoTime());
+ } catch (Exception e) {
+ LOG.warn("setAsDefaultDialer()", e);
+
+ setAsDefaultDialerFallback(activity);
+ }
+
+ return null;
+ }
+
+ @RequiresApi(Build.VERSION_CODES.N)
+ private static void setAsDefaultDialerFallback(Context context) {
+ showDefaultDialerDialog(context, true);
+ }
+
+ @RequiresApi(Build.VERSION_CODES.N)
+ private static void showDefaultDialerDialog(Context context, boolean set) {
+ new AlertDialog.Builder(context)
+ .setTitle(R.string.default_phone_app)
+ .setMessage(set ? R.string.default_phone_app_set : R.string.default_phone_app_unset)
+ .setPositiveButton(R.string.open_system_settings,
+ (d, w) -> openDefaultDialerSettings(context))
+ .show();
+ }
+
+ @RequiresApi(Build.VERSION_CODES.N)
+ private static void openDefaultAppsSettings(Context context) {
+ if (startActivity(context, new Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS))) return;
+ startActivity(context, new Intent(Settings.ACTION_SETTINGS));
+ }
+
+ @RequiresApi(Build.VERSION_CODES.N)
+ private static void openDefaultDialerSettings(Context context) {
+ if (openDefaultDialerSettingsEmui(context)) return;
+ openDefaultAppsSettings(context);
+ }
+
+ @RequiresApi(Build.VERSION_CODES.M)
+ private static boolean openDefaultDialerSettingsEmui(Context context) {
+ if (!isEmui()) return false;
+
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(Intent.ACTION_DIAL);
+ intentFilter.addDataScheme(PhoneAccount.SCHEME_TEL);
+
+ Intent preferredAppIntent = getEmuiPreferredAppIntent(intentFilter);
+
+ Intent intent = new Intent();
+ intent.setComponent(new ComponentName("com.android.settings",
+ "com.android.settings.Settings$PreferredSettingsActivity"));
+
+ intent.putExtra("preferred_app_intent", preferredAppIntent);
+ intent.putExtra("preferred_app_intent_filter", intentFilter);
+ intent.putExtra("preferred_app_type",
+ PreferredSettingsUtils.PreferredApplication.PREFERRED_DAILER);
+ intent.putExtra("preferred_app_label", "");
+ intent.putExtra("preferred_app_package_name", "");
+
+ if (startActivity(context, intent)) {
+ return true;
+ }
+
+ return startActivity(context, new Intent("com.android.settings.PREFERRED_SETTINGS"));
+ }
+
+ private static boolean isEmui() {
+ // not sure about min and max SDK versions
+ if ("huawei".equalsIgnoreCase(Build.BRAND) || "honor".equalsIgnoreCase(Build.BRAND)) {
+ try {
+ @SuppressWarnings("JavaReflectionMemberAccess")
+ Field field = Intent.class.getField("FLAG_HW_HOME_INTENT_FROM_SYSTEM");
+ field.setAccessible(true);
+ return field.getInt(Intent.class) != 0;
+ } catch (Exception e) {
+ LOG.debug("isEmui()", e);
+ }
+ }
+ return false;
+ }
+
+ private static Intent getEmuiPreferredAppIntent(IntentFilter filter) {
+ Intent intent = new Intent(filter.getAction(0));
+ if (filter.countCategories() > 0 && !TextUtils.isEmpty(filter.getCategory(0))) {
+ intent.addCategory(filter.getCategory(0));
+ }
+ if (filter.countDataSchemes() > 0 && !TextUtils.isEmpty(filter.getDataScheme(0))) {
+ Uri localUri = Uri.parse(filter.getDataScheme(0) + ":");
+ String str = null;
+ if (filter.countDataTypes() > 0 && !TextUtils.isEmpty(filter.getDataType(0))) {
+ str = filter.getDataType(0);
+ if (!str.contains("\\") && !str.contains("/")) {
+ str = str + "/*";
+ }
+ }
+ intent.setDataAndType(localUri, str);
+ }
+ return intent;
}
public static boolean handleDefaultDialerResult(Context context,
- int requestCode, int resultCode) {
+ int requestCode, int resultCode,
+ RequestToken requestToken) {
if (requestCode != REQUEST_CODE_DEFAULT_DIALER) return false;
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return true;
+ if (resultCode == Activity.RESULT_OK) return true;
- if (resultCode != Activity.RESULT_OK) {
+ if (requestToken != null && System.nanoTime() - requestToken.timestamp
+ < TimeUnit.MILLISECONDS.toNanos(500)) {
+ // probably the request is not supported, try workarounds
+ setAsDefaultDialerFallback(context);
+ } else {
Toast.makeText(context, R.string.denied_default_dialer_message, Toast.LENGTH_LONG)
.show();
}
@@ -210,4 +353,22 @@ public class PermissionHelper {
return true;
}
+ public static class RequestToken {
+ private final long timestamp;
+
+ private RequestToken(long timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public void onSaveInstanceState(@NonNull Bundle outState, String key) {
+ outState.putLong(key, timestamp);
+ }
+
+ public static RequestToken fromSavedInstanceState(@Nullable Bundle savedInstanceState,
+ String key) {
+ return savedInstanceState != null && savedInstanceState.containsKey(key)
+ ? new RequestToken(savedInstanceState.getLong(key)) : null;
+ }
+ }
+
}
diff --git a/app/src/main/java/dummydomain/yetanothercallblocker/SettingsActivity.java b/app/src/main/java/dummydomain/yetanothercallblocker/SettingsActivity.java
index d7e6e7e..45fc49b 100644
--- a/app/src/main/java/dummydomain/yetanothercallblocker/SettingsActivity.java
+++ b/app/src/main/java/dummydomain/yetanothercallblocker/SettingsActivity.java
@@ -14,6 +14,7 @@ import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentTransaction;
import androidx.preference.EditTextPreference;
import androidx.preference.Preference;
@@ -40,12 +41,19 @@ import static java.util.Objects.requireNonNull;
public class SettingsActivity extends AppCompatActivity
implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
+ private static final String STATE_REQUEST_TOKEN = "STATE_REQUEST_TOKEN";
+
+ private PermissionHelper.RequestToken requestToken;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings_activity);
- if (savedInstanceState == null) {
+ if (savedInstanceState != null) {
+ requestToken = PermissionHelper.RequestToken
+ .fromSavedInstanceState(savedInstanceState, STATE_REQUEST_TOKEN);
+ } else {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.settings, new SettingsFragment())
@@ -58,6 +66,22 @@ public class SettingsActivity extends AppCompatActivity
}
}
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ updateCallScreeningPreference();
+ }
+
+ @Override
+ protected void onSaveInstanceState(@NonNull Bundle outState) {
+ super.onSaveInstanceState(outState);
+
+ if (requestToken != null) {
+ requestToken.onSaveInstanceState(outState, STATE_REQUEST_TOKEN);
+ }
+ }
+
@Override
public boolean onPreferenceStartScreen(PreferenceFragmentCompat preferenceFragmentCompat,
PreferenceScreen preferenceScreen) {
@@ -91,11 +115,16 @@ public class SettingsActivity extends AppCompatActivity
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
- if (PermissionHelper.handleCallScreeningResult(this, requestCode, resultCode)) {
- for (Fragment fragment : getSupportFragmentManager().getFragments()) {
- if (fragment instanceof SettingsFragment) {
- ((SettingsFragment) fragment).updateCallScreeningPreference();
- }
+ if (PermissionHelper.handleCallScreeningResult(
+ this, requestCode, resultCode, requestToken)) {
+ updateCallScreeningPreference();
+ }
+ }
+
+ private void updateCallScreeningPreference() {
+ for (Fragment fragment : getSupportFragmentManager().getFragments()) {
+ if (fragment instanceof SettingsFragment) {
+ ((SettingsFragment) fragment).updateCallScreeningPreference();
}
}
}
@@ -170,11 +199,16 @@ public class SettingsActivity extends AppCompatActivity
callScreeningPref.setChecked(PermissionHelper.isCallScreeningHeld(requireContext()));
callScreeningPref.setOnPreferenceChangeListener((preference, newValue) -> {
if (Boolean.TRUE.equals(newValue)) {
- PermissionHelper.requestCallScreening(requireActivity());
+ FragmentActivity activity = requireActivity();
+
+ PermissionHelper.RequestToken requestToken
+ = PermissionHelper.requestCallScreening(activity);
+
+ if (activity instanceof SettingsActivity) {
+ ((SettingsActivity) activity).requestToken = requestToken;
+ }
} else {
- Toast.makeText(requireActivity(),
- R.string.use_call_screening_service_disable_message,
- Toast.LENGTH_LONG).show();
+ PermissionHelper.disableCallScreening(requireContext());
return false;
}
return true;
@@ -299,9 +333,11 @@ public class SettingsActivity extends AppCompatActivity
}
public void updateCallScreeningPreference() {
- SwitchPreferenceCompat callScreeningPref =
- requireNonNull(findPreference(PREF_USE_CALL_SCREENING_SERVICE));
- callScreeningPref.setChecked(PermissionHelper.isCallScreeningHeld(requireContext()));
+ SwitchPreferenceCompat callScreeningPref
+ = findPreference(PREF_USE_CALL_SCREENING_SERVICE);
+ if (callScreeningPref != null) {
+ callScreeningPref.setChecked(PermissionHelper.isCallScreeningHeld(requireContext()));
+ }
}
private void exportLogcat() {
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index defef61..e03c236 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -94,7 +94,6 @@
Χρήση επαφών
Αυτόματη λήψη ημερήσιων ενημερώσεων της βάσης δεδομένων (αυτές είναι προσθετικές/delta ενημερώσεις, επομένως καταναλώνουν πολύ λίγα δεδομένα)
Αυτόματη ενημέρωση βάσης δεδομένων
- Επιλέξτε διαφορετική \"Εφαρμογή τηλεφώνου\" ή \"Εφαρμογή αναγνώρισης κλήσης\" στις Ρυθμίσεις - Εφαρμογές - Προεπιλεγμένες εφαρμογές
Επιτρέπει τον αποκλεισμό κλήσεων πριν αρχίσει να κουδουνίζει το τηλέφωνο. Απαιτεί η εφαρμογή να οριστεί ως \"Εφαρμογή τηλεφώνου\" (Android 7–9) ή ως \"Εφαρμογή αναγνώρισης κλήσης\" (Android 10+)
Σύνθετη λειτουργία αποκλεισμού κλήσεων
Αποκλεισμός κλήσεων από αριθμούς που έχουν προστεθεί στη μαύρη λίστα
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 740ea4b..8c43e33 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -79,7 +79,6 @@
(Expérimental.) Bloquer les appels provenant de numéros masqués. Fonctionne probablement mieux en mode blocage d\'appel avancé. Merci de signaler votre retour d\'expérience sur GitLab
Mode de blocage d\'appel avancé
Permet de bloquer les appels avant que le téléphone ne commence à sonner. Nécessite que l\'application soit définie comme appli "téléphone" (Android 7–9) ou comme appli \"reconnaissance d\'appel entrant\" (Android 10+)
- Sélectionner une autre \"application téléphonique\" ou \"application d\'identification de l\'appelant\" dans Paramètres - Apps - Apps par défaut
Mettre à jour automatiquement la base de données
Recevoir automatiquement les mises à jour quotidiennes de la BD (il s\'agit de mises à jour incrémentielles/delta, donc elles consomment très peu de données)
Utiliser les contacts
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 24cc5fb..f85bd77 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -71,7 +71,6 @@
Anketa
Spremi izvještaje i log-zapise o rušenju aplikacije u javno spremište, u protivnom se izvještaji o rušenju spremaju u mapu privatne aplikacije. Izvještaji mogu sadržavati osjetljive podatke (telefonske brojeve, imena kontakata). Ostale aplikacije s dozvolom za spemanje podataka mogu imati pristup tim podacima u javnom spremištu
nema podataka
- Odaberi „Aplikacija telefona” ili „Aplikacija ID oznake pozivatelja” u Postavke – Aplikacije – Standardne aplikacije
Natrag
Glavna
Predstavljeno ime: %s
diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml
index 112c301..badd502 100644
--- a/app/src/main/res/values-nb-rNO/strings.xml
+++ b/app/src/main/res/values-nb-rNO/strings.xml
@@ -4,7 +4,6 @@
Nummer i telefonboken blokkeres aldri, og kontaktnavnet vises ved siden av/istedenfor et nummer i hele programmet
Motta daglige databaseoppdateringer (disse legger kun til endringer, slik at de bruker lite data)
Automatisk oppdatering av database
- Velg forskjellig \"telefonprogram\" eller \"samtale-ID-program\" i Innstillinger → Programmer → Forvalgte programmer
Blokkerer anrop før telefonen runger. Krever at programmet er satt som \"Telefonprogram\" (Android 7–9) eller som \"Samtale-ID-program\" (Android 10+)
Viser en merknad med telefonnummersammendrag (vurdering, vurderingsantall, kategori) ved innkommende anrop
Innlasting av nettbaserte vurderinger lekker nummeret til en tredjepartstjeneste. Er du sikker på at du vil gjøre dette med et nummer som er å finne i kontaktlisten\?
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 507310e..6650097 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -163,7 +163,6 @@
Eksportuj i udostępnij zawartość logcata wybranej przez siebie aplikacji (np. klientowi poczty elektronicznej). Raporty mogą zawierać dane wrażliwe (numery telefonów, nazwy kontaktów). Tylko wybrana aplikacja będzie miała dostęp do tych danych
Zapisz raporty w pamięci publicznej
Kody krajów używane są w zapytaniach do serwerów zewnętrznych. Kody te ustawione są tak, aby naśladować działanie oficjalnej aplikacji zewnętrznej firmy. Jeśli kod pasuje do kraju, w którym przebywasz (a to może zostać wykryte poprzez twój adres IP), twoje zapytania będą wyglądać najbardziej niepozornie. Domyślnie używane jest automatyczne wykrywanie (na podstawie informacji o sieci komórkowej lub ustawień regionalnych systemu), co powinno wystarczyć większości użytkownikom, ale możesz ustawić kod ręcznie. Jest to 2-literowy kod zgodny ze standardem ISO 3166 (np. PL)
- Wybierz inną „Aplikację do obsługi telefonu” lub „Aplikację do identyfikacji rozmówcy i spamu” w Ustawienia → Aplikacje i powiadomienia → Aplikacje domyślne
Wyróżniona nazwa: %s
Wyszukaj numer
Nieprawidłowy format kodu kraju. Wartość nie zostanie zmieniona
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index e819410..23ab8b7 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -30,7 +30,6 @@
Блокировать звонки с номеров добавленных в чёрный список
Продвинутый режим блокирования вызовов
Позволяет блокировать вызовы до того, как телефон зазвонит. Это требует назначить приложение \"приложением для звонков\" (на Android 7–9) или \"приложением для АОН и защиты от спама\" (на Android 10+)
- Выберите другое приложение для звонков или защиты от спама в меню Настройки - Приложения - Приложения по умолчанию
Авто-обновл. базы номеров
Получать ежедневные обновления базы (загружаются только изменения, поэтому расход трафика небольшой)
Управление базой
@@ -64,6 +63,12 @@
имена контактов
Продвинутый режим блокирования не сможет работать, т.к. приложение не назначено \"приложением для звонков\"
Продвинутый режим блокирования не сможет работать, т.к. приложение не назначено \"приложением для АОН и защиты от спама\"
+ \"Приложение для АОН\" по умолчанию
+ Выберите другое \"приложение для АОН и защиты от спама\" в \"Приложениях по умолчанию\" в настройках системы
+ \"Приложение для звонков\" по умолчанию
+ Выберите \"Yet Another Call Blocker\" в качестве \"приложения для звонков\" в \"Приложениях по умолчанию\" в настройках системы
+ Выберите другое \"приложение для звонков\" в \"Приложениях по умолчанию\" в настройках системы
+ Открыть Настройки
Загрузить базу номеров
База номеров отсутствует. Для полноценной работы приложения требуется загрузка базы номеров (около 25 МБ трафика).
Загрузить базу номеров
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index d6d8692..efa6138 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -80,7 +80,6 @@
Günlük veri tabanı güncellemelerini otomatik olarak al (bunlar artımlı/delta güncellemelerdir, bu nedenle çok az veri harcarlar)
Bazı telefonlarda telefon olaylarının alınmasına yardımcı olan, sürekli çalışan bir izleme hizmetini etkinleştirir. Bu özelliği sadece arama engelleme ve bilgilendirme bildirimleri çalışmıyorsa etkinleştirin. Bu özelliğin pil ömrü üzerinde hiçbir etkisi yoktur
Bir izleme hizmeti kullan
- Ayarlar - Uygulamalar - Öntanımlı uygulamalar bölümünde farklı \"Telefon uygulaması\" veya \"Arayan kimliği uygulaması\" seçin
Telefon çalmaya başlamadan önce aramaları engellemeye izin verir. Uygulamanın \"Telefon uygulaması\" (Android 7–9) veya \"Arayan kimliği uygulaması\" (Android 10+) olarak ayarlanması gerekir
Gelişmiş arama engelleme modu
Kara listeye eklenen numaralardan gelen aramaları engelle
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 24449f8..fe64955 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -30,7 +30,6 @@
Блокувати дзвінки з номерів доданих в чорний список
Просунутий режим блокування викликів
Дозволяє блокувати виклики до того, як телефон задзвонить. Це вимагає призначити додаток \"додатком для дзвінків \" (на Android 7–9) або \"додатком для АВН і захисту від спаму\" (на Android 10 +)
- Виберіть інший додаток для дзвінків або захисту від спаму в меню Налаштування - Додатки - Додатки за замовчуванням
Авто-оновл. бази номерів
Отримувати щоденні оновлення бази (завантажуються тільки зміни, тому витрата трафіку невеликий)
Інфо про встановлену базу
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5fd8da9..6c910db 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -59,6 +59,12 @@
using contacts
Advanced call blocking won\'t work due to the app not being set as the \"Phone app\"
Advanced call blocking won\'t work due to the app not being set as the \"Caller ID app\"
+ Default \"Caller ID app\"
+ Select a different app as the \"Caller ID app\" in \"Default apps\" in system settings
+ Default \"Phone app\"
+ Select \"Yet Another Call Blocker\" as the \"Phone app\" in \"Default apps\" in system settings
+ Select a different app as the \"Phone app\" in \"Default apps\" in system settings
+ Open Settings
Grant \"Phone\" permission to see recent calls
@@ -103,7 +109,6 @@
Block calls from numbers added to the blacklist
Advanced call blocking mode
Allows to block calls before the phone starts to ring. Requires the app to be set as the \"Phone app\" (Android 7–9) or as the \"Caller ID app\" (Android 10+)
- Select different \"Phone app\" or \"Caller ID app\" in Settings - Apps - Default apps
Use a monitoring service
Enables an always-running monitoring service that helps with receiving telephony events on some phones. Enable this feature only if call blocking and informational notifications don\'t work. This feature has no effect on battery life
Auto-update database