mirror of https://github.com/M66B/NetGuard.git
Compare commits
72 Commits
Author | SHA1 | Date |
---|---|---|
M66B | 9030325487 | |
M66B | 836c95e49d | |
M66B | 8fa72e48ee | |
Marcel Bokhorst | feef4c7b3b | |
M66B | f050f90e2c | |
M66B | 1f56b996f5 | |
M66B | 69e2a37200 | |
M66B | c5e9414bb4 | |
M66B | 589b4828b1 | |
M66B | 37ff174b1f | |
M66B | a3375e11c8 | |
M66B | d786249594 | |
M66B | b3dd446dd3 | |
M66B | 8bf7894cd1 | |
M66B | f3dfa30f1b | |
M66B | 68dd66decd | |
M66B | e0774471d4 | |
Marcel Bokhorst | e1133bc9dd | |
M66B | 77845e02f2 | |
M66B | fb4c311ac2 | |
M66B | 9bc65a16fd | |
M66B | 4a9b16ee1e | |
M66B | 8ef3e87cb1 | |
M66B | 336c5d67d9 | |
M66B | 1b344292f3 | |
M66B | d80ae38ac2 | |
M66B | 2861b11661 | |
M66B | 2a60b69a3f | |
M66B | 43f2f62c4e | |
M66B | 2ed792332c | |
M66B | 913eb460c7 | |
M66B | eadfe1f397 | |
M66B | 132e4c8d4e | |
M66B | 31249b815b | |
M66B | 2faf361591 | |
M66B | 6ad2e037ee | |
M66B | 775be3ecd5 | |
M66B | b068900a3e | |
M66B | 86ba6346ce | |
M66B | 0ac87d0756 | |
M66B | eaea05832e | |
M66B | 1bbecfd223 | |
M66B | 0a9f790180 | |
M66B | 37c4805965 | |
M66B | 685d76dd50 | |
M66B | 5a1d2e5a0b | |
M66B | 913b28ccbb | |
M66B | d0543eb128 | |
M66B | 035196e7cc | |
M66B | 5f89592126 | |
M66B | 9aa38ebcbf | |
M66B | f806ea2162 | |
M66B | 439a39004a | |
M66B | 3326013f74 | |
M66B | a4980cc446 | |
M66B | 98c40164cc | |
M66B | edb2034a37 | |
M66B | 2a3b35cf96 | |
M66B | ae21985d6b | |
M66B | 6e3657b58f | |
M66B | f640f2f191 | |
M66B | ea46e2cd41 | |
M66B | a9a5080b81 | |
M66B | 9a2afa3b50 | |
M66B | 9bcd1e09ea | |
M66B | 5003849260 | |
M66B | 658ea3df84 | |
M66B | e9d3a2d385 | |
M66B | 36bdbc4dcf | |
M66B | e51571512a | |
M66B | 016c0b990b | |
M66B | 0ebecc2a0c |
2
FAQ.md
2
FAQ.md
|
@ -37,6 +37,8 @@ However, this does not work properly on all Android versions/variants causing Ne
|
|||
On Android N and later NetGuard can be configured as [Always-On VPN](https://developer.android.com/guide/topics/connectivity/vpn#always-on).
|
||||
On Android O **do not** enable the sub option '*Block connections without VPN*', see [question 51](#user-content-faq51)) for more information on this.
|
||||
|
||||
The app obviously can't protect you from bugs in Android, such a documented [here](https://mullvad.net/en/blog/dns-traffic-can-leak-outside-the-vpn-tunnel-on-android).
|
||||
|
||||
To protect yourself more, remember to disable Wi-Fi and mobile data before rebooting,
|
||||
and only enable them on reboot, after the firewall service has started (and the key icon is visible in the status bar).
|
||||
|
||||
|
|
|
@ -100,6 +100,9 @@ NetGuard will try to workaround this and remove the error message when it succee
|
|||
Some LineageOS versions have a broken Android VPN implementation, causing all traffic to be blocked,
|
||||
please see [this FAQ](https://github.com/M66B/NetGuard/blob/master/FAQ.md#user-content-faq51) for more information.
|
||||
|
||||
On GrapheneOS, the Android *Always-On VPN* function and the sub option '*Block connections without VPN*' are enabled by default.
|
||||
However, this sub option will result in blocking all traffic, please see [this FAQ](https://github.com/M66B/NetGuard/blob/master/FAQ.md#user-content-faq51).
|
||||
|
||||
NetGuard is not supported for apps installed in a [work profile](https://developer.android.com/work/managed-profiles),
|
||||
or in a [Secure Folder](https://www.samsung.com/uk/support/mobile-devices/what-is-the-secure-folder-and-how-do-i-use-it/) (Samsung),
|
||||
or as second instance (MIUI), or as Parallel app (OnePlus), or as Xiaomi dual app
|
||||
|
|
|
@ -9,10 +9,10 @@ android {
|
|||
|
||||
defaultConfig {
|
||||
applicationId = "eu.faircode.netguard"
|
||||
versionName = "2.311"
|
||||
versionName = "2.328"
|
||||
minSdkVersion 22
|
||||
targetSdkVersion 34
|
||||
versionCode = 2023091701
|
||||
versionCode = 2024022201
|
||||
archivesBaseName = "NetGuard-v$versionName"
|
||||
|
||||
externalNativeBuild {
|
||||
|
@ -23,7 +23,7 @@ android {
|
|||
}
|
||||
}
|
||||
|
||||
//ndkVersion "21.4.7075529"
|
||||
ndkVersion "25.2.9519653"
|
||||
ndk {
|
||||
// https://developer.android.com/ndk/guides/abis.html#sa
|
||||
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
|
||||
|
|
|
@ -73,6 +73,9 @@ import androidx.recyclerview.widget.LinearLayoutManager;
|
|||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.List;
|
||||
|
||||
public class ActivityMain extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
|
||||
|
@ -111,6 +114,8 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences
|
|||
public static final String EXTRA_METERED = "Metered";
|
||||
public static final String EXTRA_SIZE = "Size";
|
||||
|
||||
private static final String MALWARE_URL = "https://urlhaus.abuse.ch/downloads/hostfile/";
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
Log.i(TAG, "Create version=" + Util.getSelfVersionName(this) + "/" + Util.getSelfVersionCode(this));
|
||||
|
@ -522,6 +527,23 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences
|
|||
tvNotifications.setVisibility(canNotify ? View.GONE : View.VISIBLE);
|
||||
|
||||
super.onResume();
|
||||
|
||||
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R && false) {
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
if (!prefs.getBoolean("qap", false))
|
||||
if (Util.isPlayStoreInstall(this)) {
|
||||
new AlertDialog.Builder(this)
|
||||
.setMessage(R.string.app_qap)
|
||||
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
prefs.edit().putBoolean("qap", true).apply();
|
||||
}
|
||||
})
|
||||
.show();
|
||||
} else
|
||||
prefs.edit().putBoolean("qap", true).apply();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -839,6 +861,8 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences
|
|||
public boolean onPrepareOptionsMenu(Menu menu) {
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
|
||||
menu.findItem(R.id.menu_malware).setVisible(false);
|
||||
|
||||
if (prefs.getBoolean("manage_system", false)) {
|
||||
menu.findItem(R.id.menu_app_user).setChecked(prefs.getBoolean("show_user", true));
|
||||
menu.findItem(R.id.menu_app_system).setChecked(prefs.getBoolean("show_system", false));
|
||||
|
@ -858,6 +882,7 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences
|
|||
menu.findItem(R.id.menu_sort_name).setChecked(true);
|
||||
|
||||
menu.findItem(R.id.menu_lockdown).setChecked(prefs.getBoolean("lockdown", false));
|
||||
menu.findItem(R.id.menu_malware).setChecked(prefs.getBoolean("malware", false));
|
||||
|
||||
return super.onPrepareOptionsMenu(menu);
|
||||
}
|
||||
|
@ -903,6 +928,10 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences
|
|||
menu_lockdown(item);
|
||||
return true;
|
||||
|
||||
case R.id.menu_malware:
|
||||
menu_malware(item);
|
||||
return true;
|
||||
|
||||
case R.id.menu_log:
|
||||
if (Util.canFilter(this))
|
||||
if (IAB.isPurchased(ActivityPro.SKU_LOG, this))
|
||||
|
@ -1198,6 +1227,42 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences
|
|||
WidgetLockdown.updateWidgets(this);
|
||||
}
|
||||
|
||||
private void menu_malware(MenuItem item) {
|
||||
item.setChecked(!item.isChecked());
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
prefs.edit().putBoolean("malware", item.isChecked()).apply();
|
||||
if (item.isChecked())
|
||||
try {
|
||||
final File file = new File(getFilesDir(), "malware.txt");
|
||||
new DownloadTask(this, new URL(MALWARE_URL), file, new DownloadTask.Listener() {
|
||||
@Override
|
||||
public void onCompleted() {
|
||||
prefs.edit().putBoolean("filter", true).apply();
|
||||
ServiceSinkhole.reload("malware download", ActivityMain.this, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCancelled() {
|
||||
prefs.edit().putBoolean("malware", false).apply();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onException(Throwable ex) {
|
||||
Toast.makeText(ActivityMain.this, ex.getMessage(), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||
} catch (MalformedURLException ex) {
|
||||
Toast.makeText(this, ex.toString(), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
else {
|
||||
SharedPreferences.Editor editor = prefs.edit();
|
||||
for (String key : prefs.getAll().keySet())
|
||||
if (key.startsWith("malware."))
|
||||
editor.remove(key);
|
||||
editor.apply();
|
||||
}
|
||||
}
|
||||
|
||||
private void menu_about() {
|
||||
// Create view
|
||||
LayoutInflater inflater = LayoutInflater.from(this);
|
||||
|
|
|
@ -279,13 +279,18 @@ public class ActivityPro extends AppCompatActivity {
|
|||
|
||||
@Override
|
||||
public boolean onPrepareOptionsMenu(Menu menu) {
|
||||
if (IAB.isPurchased(SKU_DONATION, this) || Util.isPlayStoreInstall(this))
|
||||
if (Util.isPlayStoreInstall(this))
|
||||
menu.removeItem(R.id.menu_challenge);
|
||||
|
||||
return super.onPrepareOptionsMenu(menu);
|
||||
}
|
||||
|
||||
private void menu_challenge() {
|
||||
if (IAB.isPurchased(SKU_DONATION, this)) {
|
||||
Toast.makeText(this, getString(R.string.title_pro_already), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
|
||||
LayoutInflater inflater = LayoutInflater.from(this);
|
||||
View view = inflater.inflate(R.layout.challenge, null, false);
|
||||
|
||||
|
|
|
@ -42,6 +42,7 @@ public class AdapterDns extends CursorAdapter {
|
|||
private int colAName;
|
||||
private int colResource;
|
||||
private int colTTL;
|
||||
private int colUid;
|
||||
|
||||
public AdapterDns(Context context, Cursor cursor) {
|
||||
super(context, cursor, 0);
|
||||
|
@ -58,6 +59,7 @@ public class AdapterDns extends CursorAdapter {
|
|||
colAName = cursor.getColumnIndex("aname");
|
||||
colResource = cursor.getColumnIndex("resource");
|
||||
colTTL = cursor.getColumnIndex("ttl");
|
||||
colUid = cursor.getColumnIndex("uid");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -73,6 +75,7 @@ public class AdapterDns extends CursorAdapter {
|
|||
String aname = cursor.getString(colAName);
|
||||
String resource = cursor.getString(colResource);
|
||||
int ttl = cursor.getInt(colTTL);
|
||||
int uid = cursor.getInt(colUid);
|
||||
|
||||
long now = new Date().getTime();
|
||||
boolean expired = (time + ttl < now);
|
||||
|
@ -84,6 +87,7 @@ public class AdapterDns extends CursorAdapter {
|
|||
TextView tvAName = view.findViewById(R.id.tvAName);
|
||||
TextView tvResource = view.findViewById(R.id.tvResource);
|
||||
TextView tvTTL = view.findViewById(R.id.tvTTL);
|
||||
TextView tvUid = view.findViewById(R.id.tvUid);
|
||||
|
||||
// Set values
|
||||
tvTime.setText(new SimpleDateFormat("dd HH:mm").format(time));
|
||||
|
@ -91,5 +95,6 @@ public class AdapterDns extends CursorAdapter {
|
|||
tvAName.setText(aname);
|
||||
tvResource.setText(resource);
|
||||
tvTTL.setText("+" + Integer.toString(ttl / 1000));
|
||||
tvUid.setText(uid > 0 ? Integer.toString(uid) : null);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -74,5 +74,10 @@ public class ApplicationEx extends Application {
|
|||
access.setSound(null, Notification.AUDIO_ATTRIBUTES_DEFAULT);
|
||||
access.setBypassDnd(true);
|
||||
nm.createNotificationChannel(access);
|
||||
|
||||
NotificationChannel malware = new NotificationChannel("malware", getString(R.string.setting_malware), NotificationManager.IMPORTANCE_HIGH);
|
||||
malware.setSound(null, Notification.AUDIO_ATTRIBUTES_DEFAULT);
|
||||
malware.setBypassDnd(true);
|
||||
nm.createNotificationChannel(malware);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
|
|||
private static final String TAG = "NetGuard.Database";
|
||||
|
||||
private static final String DB_NAME = "Netguard";
|
||||
private static final int DB_VERSION = 21;
|
||||
private static final int DB_VERSION = 22;
|
||||
|
||||
private static boolean once = true;
|
||||
private static List<LogChangedListener> logChangedListeners = new ArrayList<>();
|
||||
|
@ -190,6 +190,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
|
|||
", aname TEXT NOT NULL" +
|
||||
", resource TEXT NOT NULL" +
|
||||
", ttl INTEGER" +
|
||||
", uid INTEGER" +
|
||||
");");
|
||||
db.execSQL("CREATE UNIQUE INDEX idx_dns ON dns(qname, aname, resource)");
|
||||
db.execSQL("CREATE INDEX idx_dns_resource ON dns(resource)");
|
||||
|
@ -349,6 +350,12 @@ public class DatabaseHelper extends SQLiteOpenHelper {
|
|||
oldVersion = 21;
|
||||
}
|
||||
|
||||
if (oldVersion < 22) {
|
||||
if (!columnExists(db, "dns", "uid"))
|
||||
db.execSQL("ALTER TABLE dns ADD COLUMN uid INTEGER");
|
||||
oldVersion = 22;
|
||||
}
|
||||
|
||||
if (oldVersion == DB_VERSION) {
|
||||
db.setVersion(oldVersion);
|
||||
db.setTransactionSuccessful();
|
||||
|
@ -828,6 +835,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
|
|||
cv.put("qname", rr.QName);
|
||||
cv.put("aname", rr.AName);
|
||||
cv.put("resource", rr.Resource);
|
||||
cv.put("uid", rr.uid);
|
||||
|
||||
if (db.insert("dns", null, cv) == -1)
|
||||
Log.e(TAG, "Insert dns failed");
|
||||
|
@ -892,7 +900,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
|
|||
String query = "SELECT d.qname";
|
||||
query += " FROM dns AS d";
|
||||
query += " WHERE d.resource = '" + ip.replace("'", "''") + "'";
|
||||
query += " ORDER BY d.qname";
|
||||
query += " ORDER BY (d.uid = " + uid + ") DESC, d.qname";
|
||||
query += " LIMIT 1";
|
||||
// There is no way to known for sure which domain name an app used, so just pick the first one
|
||||
return db.compileStatement(query).simpleQueryForString();
|
||||
|
|
|
@ -72,7 +72,8 @@ public class DownloadTask extends AsyncTask<Object, Integer, Object> {
|
|||
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName());
|
||||
wakeLock.acquire();
|
||||
showNotification(0);
|
||||
Toast.makeText(context, context.getString(R.string.msg_downloading, url.toString()), Toast.LENGTH_SHORT).show();
|
||||
if (!Util.isPlayStoreInstall(context))
|
||||
Toast.makeText(context, context.getString(R.string.msg_downloading, url.toString()), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -157,7 +158,7 @@ public class DownloadTask extends AsyncTask<Object, Integer, Object> {
|
|||
|
||||
private void showNotification(int progress) {
|
||||
Intent main = new Intent(context, ActivitySettings.class);
|
||||
PendingIntent pi = PendingIntent.getActivity(context, ServiceSinkhole.NOTIFY_DOWNLOAD, main, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent pi = PendingIntentCompat.getActivity(context, ServiceSinkhole.NOTIFY_DOWNLOAD, main, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
TypedValue tv = new TypedValue();
|
||||
context.getTheme().resolveAttribute(R.attr.colorOff, tv, true);
|
||||
|
@ -175,7 +176,7 @@ public class DownloadTask extends AsyncTask<Object, Integer, Object> {
|
|||
builder.setCategory(NotificationCompat.CATEGORY_STATUS)
|
||||
.setVisibility(NotificationCompat.VISIBILITY_SECRET);
|
||||
|
||||
NotificationManagerCompat.from(context).notify(ServiceSinkhole.NOTIFY_DOWNLOAD, builder.build());
|
||||
if (Util.canNotify(context))
|
||||
NotificationManagerCompat.from(context).notify(ServiceSinkhole.NOTIFY_DOWNLOAD, builder.build());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,66 @@
|
|||
package eu.faircode.netguard;
|
||||
|
||||
/*
|
||||
This file is part of NetGuard.
|
||||
|
||||
NetGuard is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
NetGuard is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with NetGuard. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Copyright 2015-2023 by Marcel Bokhorst (M66B)
|
||||
*/
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
public class PendingIntentCompat {
|
||||
private PendingIntentCompat() {
|
||||
}
|
||||
|
||||
// https://developer.android.com/about/versions/12/behavior-changes-12#pending-intent-mutability
|
||||
|
||||
// Xiaomi Android 11: Too many PendingIntent created for uid nnnnn
|
||||
// https://stackoverflow.com/questions/71266853/xiaomi-android-11-securityexception-too-many-pendingintent-created
|
||||
|
||||
public static PendingIntent getActivity(Context context, int requestCode, Intent intent, int flags) {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S || (flags & PendingIntent.FLAG_MUTABLE) != 0)
|
||||
return PendingIntent.getActivity(context, requestCode, intent, flags);
|
||||
else
|
||||
return PendingIntent.getActivity(context, requestCode, intent, flags | PendingIntent.FLAG_IMMUTABLE);
|
||||
}
|
||||
|
||||
public static PendingIntent getService(Context context, int requestCode, @NonNull Intent intent, int flags) {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S || (flags & PendingIntent.FLAG_MUTABLE) != 0)
|
||||
return PendingIntent.getService(context, requestCode, intent, flags);
|
||||
else
|
||||
return PendingIntent.getService(context, requestCode, intent, flags | PendingIntent.FLAG_IMMUTABLE);
|
||||
}
|
||||
|
||||
static PendingIntent getForegroundService(Context context, int requestCode, @NonNull Intent intent, int flags) {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S || (flags & PendingIntent.FLAG_MUTABLE) != 0)
|
||||
return PendingIntent.getService(context, requestCode, intent, flags);
|
||||
else
|
||||
return PendingIntent.getForegroundService(context, requestCode, intent, flags | PendingIntent.FLAG_IMMUTABLE);
|
||||
}
|
||||
|
||||
static PendingIntent getBroadcast(Context context, int requestCode, Intent intent, int flags) {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S || (flags & PendingIntent.FLAG_MUTABLE) != 0)
|
||||
return PendingIntent.getBroadcast(context, requestCode, intent, flags);
|
||||
else
|
||||
return PendingIntent.getBroadcast(context, requestCode, intent, flags | PendingIntent.FLAG_IMMUTABLE);
|
||||
}
|
||||
}
|
|
@ -29,6 +29,7 @@ public class ResourceRecord {
|
|||
public String AName;
|
||||
public String Resource;
|
||||
public int TTL;
|
||||
public int uid;
|
||||
|
||||
private static DateFormat formatter = SimpleDateFormat.getDateTimeInstance();
|
||||
|
||||
|
@ -42,6 +43,7 @@ public class ResourceRecord {
|
|||
" A " + AName +
|
||||
" R " + Resource +
|
||||
" TTL " + TTL +
|
||||
" uid " + uid +
|
||||
" " + formatter.format(new Date(Time + TTL * 1000L).getTime());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -104,6 +104,7 @@ import java.util.HashMap;
|
|||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
@ -144,7 +145,9 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
private boolean temporarilyStopped = false;
|
||||
|
||||
private long last_hosts_modified = 0;
|
||||
private long last_malware_modified = 0;
|
||||
private Map<String, Boolean> mapHostsBlocked = new HashMap<>();
|
||||
private Map<String, Boolean> mapMalware = new HashMap<>();
|
||||
private Map<Integer, Boolean> mapUidAllowed = new HashMap<>();
|
||||
private Map<Integer, Integer> mapUidKnown = new HashMap<>();
|
||||
private final Map<IPKey, Map<InetAddress, IPRule>> mapUidIPFilters = new HashMap<>();
|
||||
|
@ -392,9 +395,9 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
watchdogIntent.setAction(ACTION_WATCHDOG);
|
||||
PendingIntent pi;
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
|
||||
pi = PendingIntent.getForegroundService(ServiceSinkhole.this, 1, watchdogIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
pi = PendingIntentCompat.getForegroundService(ServiceSinkhole.this, 1, watchdogIntent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
else
|
||||
pi = PendingIntent.getService(ServiceSinkhole.this, 1, watchdogIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
pi = PendingIntentCompat.getService(ServiceSinkhole.this, 1, watchdogIntent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
|
||||
am.cancel(pi);
|
||||
|
@ -1092,7 +1095,7 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
remoteViews.setTextViewText(R.id.tvMax, getString(R.string.msg_mbsec, max / 2 / 1000 / 1000));
|
||||
|
||||
// Show session/file count
|
||||
if (filter && loglevel <= Log.WARN) {
|
||||
if (BuildConfig.DEBUG) {
|
||||
int[] count = jni_get_stats(jni_context);
|
||||
remoteViews.setTextViewText(R.id.tvSessions, count[0] + "/" + count[1] + "/" + count[2]);
|
||||
remoteViews.setTextViewText(R.id.tvFiles, count[3] + "/" + count[4]);
|
||||
|
@ -1103,7 +1106,7 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
|
||||
// Show notification
|
||||
Intent main = new Intent(ServiceSinkhole.this, ActivityMain.class);
|
||||
PendingIntent pi = PendingIntent.getActivity(ServiceSinkhole.this, 0, main, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent pi = PendingIntentCompat.getActivity(ServiceSinkhole.this, 0, main, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
TypedValue tv = new TypedValue();
|
||||
getTheme().resolveAttribute(R.attr.colorPrimary, tv, true);
|
||||
|
@ -1128,8 +1131,10 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
startForeground(NOTIFY_TRAFFIC, builder.build());
|
||||
state = State.stats;
|
||||
Log.d(TAG, "Start foreground state=" + state.toString());
|
||||
} else
|
||||
NotificationManagerCompat.from(ServiceSinkhole.this).notify(NOTIFY_TRAFFIC, builder.build());
|
||||
} else {
|
||||
if (Util.canNotify(ServiceSinkhole.this))
|
||||
NotificationManagerCompat.from(ServiceSinkhole.this).notify(NOTIFY_TRAFFIC, builder.build());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1238,7 +1243,7 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
|
||||
Network active = (cm == null ? null : cm.getActiveNetwork());
|
||||
if (active != null) {
|
||||
Log.i(TAG, "Setting underlying network=" + cm.getNetworkInfo(active));
|
||||
Log.i(TAG, "Setting underlying network=" + active + " " + cm.getNetworkInfo(active));
|
||||
setUnderlyingNetworks(new Network[]{active});
|
||||
}
|
||||
}
|
||||
|
@ -1287,6 +1292,20 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
}
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
|
||||
try {
|
||||
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
Network active = (cm == null ? null : cm.getActiveNetwork());
|
||||
LinkProperties props = (active == null ? null : cm.getLinkProperties(active));
|
||||
String domain = (props == null ? null : props.getDomains());
|
||||
if (domain != null) {
|
||||
Log.i(TAG, "Using search domain=" + domain);
|
||||
builder.addSearchDomain(domain);
|
||||
}
|
||||
} catch (Throwable ex) {
|
||||
Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex));
|
||||
}
|
||||
|
||||
// Subnet routing
|
||||
if (subnet) {
|
||||
// Exclude IP ranges
|
||||
|
@ -1426,19 +1445,31 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
|
||||
// Add list of allowed applications
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
try {
|
||||
builder.addDisallowedApplication(getPackageName());
|
||||
} catch (PackageManager.NameNotFoundException ex) {
|
||||
Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex));
|
||||
}
|
||||
if (last_connected && !filter)
|
||||
if (last_connected && !filter) {
|
||||
Map<String, Rule> mapDisallowed = new HashMap<>();
|
||||
for (Rule rule : listRule)
|
||||
mapDisallowed.put(rule.packageName, rule);
|
||||
for (Rule rule : listAllowed)
|
||||
mapDisallowed.remove(rule.packageName);
|
||||
for (String packageName : mapDisallowed.keySet())
|
||||
try {
|
||||
builder.addDisallowedApplication(rule.packageName);
|
||||
builder.addAllowedApplication(packageName);
|
||||
Log.i(TAG, "Sinkhole " + packageName);
|
||||
} catch (PackageManager.NameNotFoundException ex) {
|
||||
Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex));
|
||||
}
|
||||
else if (filter)
|
||||
if (mapDisallowed.size() == 0)
|
||||
try {
|
||||
builder.addAllowedApplication(getPackageName());
|
||||
} catch (PackageManager.NameNotFoundException ex) {
|
||||
Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex));
|
||||
}
|
||||
} else if (filter) {
|
||||
try {
|
||||
builder.addDisallowedApplication(getPackageName());
|
||||
} catch (PackageManager.NameNotFoundException ex) {
|
||||
Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex));
|
||||
}
|
||||
for (Rule rule : listRule)
|
||||
if (!rule.apply || (!system && rule.system))
|
||||
try {
|
||||
|
@ -1447,11 +1478,12 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
} catch (PackageManager.NameNotFoundException ex) {
|
||||
Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Build configure intent
|
||||
Intent configure = new Intent(this, ActivityMain.class);
|
||||
PendingIntent pi = PendingIntent.getActivity(this, 0, configure, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent pi = PendingIntentCompat.getActivity(this, 0, configure, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
builder.setConfigureIntent(pi);
|
||||
|
||||
return builder;
|
||||
|
@ -1469,6 +1501,7 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
if (filter) {
|
||||
prepareUidAllowed(listAllowed, listRule);
|
||||
prepareHostsBlocked();
|
||||
prepareMalwareList();
|
||||
prepareUidIPFilters(null);
|
||||
prepareForwarding();
|
||||
} else {
|
||||
|
@ -1476,6 +1509,7 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
mapUidAllowed.clear();
|
||||
mapUidKnown.clear();
|
||||
mapHostsBlocked.clear();
|
||||
mapMalware.clear();
|
||||
mapUidIPFilters.clear();
|
||||
mapForward.clear();
|
||||
lock.writeLock().unlock();
|
||||
|
@ -1553,6 +1587,7 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
mapUidAllowed.clear();
|
||||
mapUidKnown.clear();
|
||||
mapHostsBlocked.clear();
|
||||
mapMalware.clear();
|
||||
mapUidIPFilters.clear();
|
||||
mapForward.clear();
|
||||
mapNotify.clear();
|
||||
|
@ -1631,6 +1666,63 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
lock.writeLock().unlock();
|
||||
}
|
||||
|
||||
private void prepareMalwareList() {
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ServiceSinkhole.this);
|
||||
boolean malware = prefs.getBoolean("filter", false) && prefs.getBoolean("malware", false);
|
||||
File file = new File(getFilesDir(), "malware.txt");
|
||||
if (!malware || !file.exists() || !file.canRead()) {
|
||||
Log.i(TAG, "Malware use=" + malware + " exists=" + file.exists());
|
||||
lock.writeLock().lock();
|
||||
mapMalware.clear();
|
||||
lock.writeLock().unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
boolean changed = (file.lastModified() != last_malware_modified);
|
||||
if (!changed && mapMalware.size() > 0) {
|
||||
Log.i(TAG, "Malware unchanged");
|
||||
return;
|
||||
}
|
||||
last_malware_modified = file.lastModified();
|
||||
|
||||
lock.writeLock().lock();
|
||||
|
||||
mapMalware.clear();
|
||||
|
||||
int count = 0;
|
||||
BufferedReader br = null;
|
||||
try {
|
||||
br = new BufferedReader(new FileReader(file));
|
||||
String line;
|
||||
while ((line = br.readLine()) != null) {
|
||||
int hash = line.indexOf('#');
|
||||
if (hash >= 0)
|
||||
line = line.substring(0, hash);
|
||||
line = line.trim();
|
||||
if (line.length() > 0) {
|
||||
String[] words = line.split("\\s+");
|
||||
if (words.length > 1) {
|
||||
count++;
|
||||
mapMalware.put(words[1], true);
|
||||
} else
|
||||
Log.i(TAG, "Invalid malware file line: " + line);
|
||||
}
|
||||
}
|
||||
Log.i(TAG, count + " malware read");
|
||||
} catch (IOException ex) {
|
||||
Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex));
|
||||
} finally {
|
||||
if (br != null)
|
||||
try {
|
||||
br.close();
|
||||
} catch (IOException exex) {
|
||||
Log.e(TAG, exex.toString() + "\n" + Log.getStackTraceString(exex));
|
||||
}
|
||||
}
|
||||
|
||||
lock.writeLock().unlock();
|
||||
}
|
||||
|
||||
private void prepareUidIPFilters(String dname) {
|
||||
SharedPreferences lockdown = getSharedPreferences("lockdown", Context.MODE_PRIVATE);
|
||||
|
||||
|
@ -1882,6 +1974,20 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
Log.i(TAG, "New IP " + rr);
|
||||
prepareUidIPFilters(rr.QName);
|
||||
}
|
||||
if (rr.uid > 0 && !TextUtils.isEmpty(rr.AName)) {
|
||||
lock.readLock().lock();
|
||||
boolean malware = (mapMalware.containsKey(rr.AName) && mapMalware.get(rr.AName));
|
||||
lock.readLock().unlock();
|
||||
|
||||
if (malware) {
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
boolean notified = prefs.getBoolean("malware." + rr.uid, false);
|
||||
if (!notified) {
|
||||
prefs.edit().putBoolean("malware." + rr.uid, true).apply();
|
||||
notifyNewApplication(rr.uid, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Called from native code
|
||||
|
@ -1936,9 +2042,9 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
// Allow system applications in disconnected state
|
||||
packet.allowed = true;
|
||||
Log.w(TAG, "Allowing disconnected system " + packet);
|
||||
} else if (packet.uid < 2000 &&
|
||||
} else if ((packet.uid < 2000 || BuildConfig.PLAY_STORE_RELEASE) &&
|
||||
!mapUidKnown.containsKey(packet.uid) && isSupported(packet.protocol)) {
|
||||
// Allow unknown system traffic
|
||||
// Allow unknown (system) traffic
|
||||
packet.allowed = true;
|
||||
Log.w(TAG, "Allowing unknown system " + packet);
|
||||
} else if (packet.uid == Process.myUid()) {
|
||||
|
@ -2016,7 +2122,7 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
|
||||
Intent i = new Intent(ACTION_SCREEN_OFF_DELAYED);
|
||||
i.setPackage(context.getPackageName());
|
||||
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent pi = PendingIntentCompat.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
am.cancel(pi);
|
||||
|
||||
try {
|
||||
|
@ -2255,7 +2361,7 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
if (IAB.isPurchased(ActivityPro.SKU_NOTIFY, context) && prefs.getBoolean("install", true)) {
|
||||
int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
|
||||
notifyNewApplication(uid);
|
||||
notifyNewApplication(uid, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2297,14 +2403,19 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
}
|
||||
};
|
||||
|
||||
public void notifyNewApplication(int uid) {
|
||||
public void notifyNewApplication(int uid, boolean malware) {
|
||||
if (uid < 0)
|
||||
return;
|
||||
if (uid == Process.myUid())
|
||||
return;
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
try {
|
||||
// Get application name
|
||||
String name = TextUtils.join(", ", Util.getApplicationNames(uid, this));
|
||||
List<String> names = Util.getApplicationNames(uid, this);
|
||||
if (names.size() == 0)
|
||||
return;
|
||||
String name = TextUtils.join(", ", names);
|
||||
|
||||
// Get application info
|
||||
PackageManager pm = getPackageManager();
|
||||
|
@ -2317,22 +2428,28 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
Intent main = new Intent(this, ActivityMain.class);
|
||||
main.putExtra(ActivityMain.EXTRA_REFRESH, true);
|
||||
main.putExtra(ActivityMain.EXTRA_SEARCH, Integer.toString(uid));
|
||||
PendingIntent pi = PendingIntent.getActivity(this, uid, main, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent pi = PendingIntentCompat.getActivity(this, uid, main, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
TypedValue tv = new TypedValue();
|
||||
getTheme().resolveAttribute(R.attr.colorPrimary, tv, true);
|
||||
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "notify");
|
||||
NotificationCompat.Builder builder = new NotificationCompat.Builder(this,
|
||||
malware ? "malware" : "notify");
|
||||
builder.setSmallIcon(R.drawable.ic_security_white_24dp)
|
||||
.setContentIntent(pi)
|
||||
.setColor(tv.data)
|
||||
.setAutoCancel(true);
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
|
||||
if (malware)
|
||||
builder.setContentTitle(name)
|
||||
.setContentText(getString(R.string.msg_installed_n));
|
||||
else
|
||||
builder.setContentTitle(getString(R.string.app_name))
|
||||
.setContentText(getString(R.string.msg_installed, name));
|
||||
.setContentText(getString(R.string.msg_malware, name));
|
||||
else {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
|
||||
builder.setContentTitle(name)
|
||||
.setContentText(getString(R.string.msg_installed_n));
|
||||
else
|
||||
builder.setContentTitle(getString(R.string.app_name))
|
||||
.setContentText(getString(R.string.msg_installed, name));
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
|
||||
builder.setCategory(NotificationCompat.CATEGORY_STATUS)
|
||||
|
@ -2352,7 +2469,7 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
riWifi.putExtra(ServiceSinkhole.EXTRA_PACKAGE, packages[0]);
|
||||
riWifi.putExtra(ServiceSinkhole.EXTRA_BLOCKED, !wifi);
|
||||
|
||||
PendingIntent piWifi = PendingIntent.getService(this, uid, riWifi, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent piWifi = PendingIntentCompat.getService(this, uid, riWifi, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
NotificationCompat.Action wAction = new NotificationCompat.Action.Builder(
|
||||
wifi ? R.drawable.wifi_on : R.drawable.wifi_off,
|
||||
getString(wifi ? R.string.title_allow_wifi : R.string.title_block_wifi),
|
||||
|
@ -2367,7 +2484,7 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
riOther.putExtra(ServiceSinkhole.EXTRA_UID, uid);
|
||||
riOther.putExtra(ServiceSinkhole.EXTRA_PACKAGE, packages[0]);
|
||||
riOther.putExtra(ServiceSinkhole.EXTRA_BLOCKED, !other);
|
||||
PendingIntent piOther = PendingIntent.getService(this, uid + 10000, riOther, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent piOther = PendingIntentCompat.getService(this, uid + 10000, riOther, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
NotificationCompat.Action oAction = new NotificationCompat.Action.Builder(
|
||||
other ? R.drawable.other_on : R.drawable.other_off,
|
||||
getString(other ? R.string.title_allow_other : R.string.title_block_other),
|
||||
|
@ -2376,16 +2493,18 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
builder.addAction(oAction);
|
||||
|
||||
// Show notification
|
||||
if (internet)
|
||||
NotificationManagerCompat.from(this).notify(uid, builder.build());
|
||||
else {
|
||||
if (internet) {
|
||||
if (Util.canNotify(this))
|
||||
NotificationManagerCompat.from(this).notify(uid, builder.build());
|
||||
} else {
|
||||
NotificationCompat.BigTextStyle expanded = new NotificationCompat.BigTextStyle(builder);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
|
||||
expanded.bigText(getString(R.string.msg_installed_n));
|
||||
else
|
||||
expanded.bigText(getString(R.string.msg_installed, name));
|
||||
expanded.setSummaryText(getString(R.string.title_internet));
|
||||
NotificationManagerCompat.from(this).notify(uid, expanded.build());
|
||||
if (Util.canNotify(this))
|
||||
NotificationManagerCompat.from(this).notify(uid, expanded.build());
|
||||
}
|
||||
|
||||
} catch (PackageManager.NameNotFoundException ex) {
|
||||
|
@ -2482,9 +2601,9 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
alarmIntent.setAction(ACTION_HOUSE_HOLDING);
|
||||
PendingIntent pi;
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
|
||||
pi = PendingIntent.getForegroundService(this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
pi = PendingIntentCompat.getForegroundService(this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
else
|
||||
pi = PendingIntent.getService(this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
pi = PendingIntentCompat.getService(this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
|
||||
am.setInexactRepeating(AlarmManager.RTC, SystemClock.elapsedRealtime() + 60 * 1000, AlarmManager.INTERVAL_HALF_DAY, pi);
|
||||
|
@ -2500,8 +2619,9 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
builder.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
|
||||
|
||||
ConnectivityManager.NetworkCallback nc = new ConnectivityManager.NetworkCallback() {
|
||||
private Network last_network = null;
|
||||
private Boolean last_connected = null;
|
||||
private Boolean last_unmetered = null;
|
||||
private Boolean last_metered = null;
|
||||
private String last_generation = null;
|
||||
private List<InetAddress> last_dns = null;
|
||||
|
||||
|
@ -2509,6 +2629,7 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
public void onAvailable(Network network) {
|
||||
Log.i(TAG, "Available network=" + network);
|
||||
last_connected = Util.isConnected(ServiceSinkhole.this);
|
||||
last_metered = Util.isMeteredNetwork(ServiceSinkhole.this);
|
||||
reload("network available", ServiceSinkhole.this, false);
|
||||
}
|
||||
|
||||
|
@ -2535,28 +2656,37 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
Log.i(TAG, "Changed capabilities=" + network + " caps=" + networkCapabilities);
|
||||
|
||||
boolean connected = Util.isConnected(ServiceSinkhole.this);
|
||||
boolean unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
|
||||
boolean metered = Util.isMeteredNetwork(ServiceSinkhole.this);
|
||||
String generation = Util.getNetworkGeneration(ServiceSinkhole.this);
|
||||
Log.i(TAG, "Connected=" + connected + "/" + last_connected +
|
||||
" unmetered=" + unmetered + "/" + last_unmetered +
|
||||
" unmetered=" + metered + "/" + last_metered +
|
||||
" generation=" + generation + "/" + last_generation);
|
||||
|
||||
if (last_connected != null && !last_connected.equals(connected))
|
||||
reload("Connected state changed", ServiceSinkhole.this, false);
|
||||
String reason = null;
|
||||
|
||||
if (last_unmetered != null && !last_unmetered.equals(unmetered))
|
||||
reload("Unmetered state changed", ServiceSinkhole.this, false);
|
||||
if (reason == null && !Objects.equals(network, last_network))
|
||||
reason = "Network changed";
|
||||
|
||||
if (last_generation != null && !last_generation.equals(generation)) {
|
||||
if (reason == null && last_connected != null && !last_connected.equals(connected))
|
||||
reason = "Connected state changed";
|
||||
|
||||
if (reason == null && last_metered != null && !last_metered.equals(metered))
|
||||
reason = "Unmetered state changed";
|
||||
|
||||
if (reason == null && last_generation != null && !last_generation.equals(generation)) {
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ServiceSinkhole.this);
|
||||
if (prefs.getBoolean("unmetered_2g", false) ||
|
||||
prefs.getBoolean("unmetered_3g", false) ||
|
||||
prefs.getBoolean("unmetered_4g", false))
|
||||
reload("Generation changed", ServiceSinkhole.this, false);
|
||||
reason = "Generation changed";
|
||||
}
|
||||
|
||||
if (reason != null)
|
||||
reload(reason, ServiceSinkhole.this, false);
|
||||
|
||||
last_network = network;
|
||||
last_connected = connected;
|
||||
last_unmetered = unmetered;
|
||||
last_metered = metered;
|
||||
last_generation = generation;
|
||||
}
|
||||
|
||||
|
@ -2692,7 +2822,7 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
ServiceSinkhole.reload("notification", ServiceSinkhole.this, false);
|
||||
|
||||
// Update notification
|
||||
notifyNewApplication(uid);
|
||||
notifyNewApplication(uid, false);
|
||||
|
||||
// Update UI
|
||||
Intent ruleset = new Intent(ActivityMain.ACTION_RULES_CHANGED);
|
||||
|
@ -2801,7 +2931,7 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
|
||||
private Notification getEnforcingNotification(int allowed, int blocked, int hosts) {
|
||||
Intent main = new Intent(this, ActivityMain.class);
|
||||
PendingIntent pi = PendingIntent.getActivity(this, 0, main, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent pi = PendingIntentCompat.getActivity(this, 0, main, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
TypedValue tv = new TypedValue();
|
||||
getTheme().resolveAttribute(R.attr.colorPrimary, tv, true);
|
||||
|
@ -2860,12 +2990,13 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
// Update notification
|
||||
Notification notification = getEnforcingNotification(allowed, total - allowed, mapHostsBlocked.size());
|
||||
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
|
||||
nm.notify(NOTIFY_ENFORCING, notification);
|
||||
if (Util.canNotify(this))
|
||||
nm.notify(NOTIFY_ENFORCING, notification);
|
||||
}
|
||||
|
||||
private Notification getWaitingNotification() {
|
||||
Intent main = new Intent(this, ActivityMain.class);
|
||||
PendingIntent pi = PendingIntent.getActivity(this, 0, main, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent pi = PendingIntentCompat.getActivity(this, 0, main, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
TypedValue tv = new TypedValue();
|
||||
getTheme().resolveAttribute(R.attr.colorPrimary, tv, true);
|
||||
|
@ -2892,7 +3023,7 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
|
||||
private void showDisabledNotification() {
|
||||
Intent main = new Intent(this, ActivityMain.class);
|
||||
PendingIntent pi = PendingIntent.getActivity(this, 0, main, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent pi = PendingIntentCompat.getActivity(this, 0, main, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
TypedValue tv = new TypedValue();
|
||||
getTheme().resolveAttribute(R.attr.colorOff, tv, true);
|
||||
|
@ -2912,12 +3043,13 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
NotificationCompat.BigTextStyle notification = new NotificationCompat.BigTextStyle(builder);
|
||||
notification.bigText(getString(R.string.msg_revoked));
|
||||
|
||||
NotificationManagerCompat.from(this).notify(NOTIFY_DISABLED, notification.build());
|
||||
if (Util.canNotify(this))
|
||||
NotificationManagerCompat.from(this).notify(NOTIFY_DISABLED, notification.build());
|
||||
}
|
||||
|
||||
private void showLockdownNotification() {
|
||||
Intent intent = new Intent(Settings.ACTION_VPN_SETTINGS);
|
||||
PendingIntent pi = PendingIntent.getActivity(this, NOTIFY_LOCKDOWN, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent pi = PendingIntentCompat.getActivity(this, NOTIFY_LOCKDOWN, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
TypedValue tv = new TypedValue();
|
||||
getTheme().resolveAttribute(R.attr.colorOff, tv, true);
|
||||
|
@ -2938,7 +3070,8 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
NotificationCompat.BigTextStyle notification = new NotificationCompat.BigTextStyle(builder);
|
||||
notification.bigText(getString(R.string.msg_always_on_lockdown));
|
||||
|
||||
NotificationManagerCompat.from(this).notify(NOTIFY_LOCKDOWN, notification.build());
|
||||
if (Util.canNotify(this))
|
||||
NotificationManagerCompat.from(this).notify(NOTIFY_LOCKDOWN, notification.build());
|
||||
}
|
||||
|
||||
private void removeLockdownNotification() {
|
||||
|
@ -2948,7 +3081,7 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
private void showAutoStartNotification() {
|
||||
Intent main = new Intent(this, ActivityMain.class);
|
||||
main.putExtra(ActivityMain.EXTRA_APPROVE, true);
|
||||
PendingIntent pi = PendingIntent.getActivity(this, NOTIFY_AUTOSTART, main, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent pi = PendingIntentCompat.getActivity(this, NOTIFY_AUTOSTART, main, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
TypedValue tv = new TypedValue();
|
||||
getTheme().resolveAttribute(R.attr.colorOff, tv, true);
|
||||
|
@ -2968,12 +3101,13 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
NotificationCompat.BigTextStyle notification = new NotificationCompat.BigTextStyle(builder);
|
||||
notification.bigText(getString(R.string.msg_autostart));
|
||||
|
||||
NotificationManagerCompat.from(this).notify(NOTIFY_AUTOSTART, notification.build());
|
||||
if (Util.canNotify(this))
|
||||
NotificationManagerCompat.from(this).notify(NOTIFY_AUTOSTART, notification.build());
|
||||
}
|
||||
|
||||
private void showErrorNotification(String message) {
|
||||
Intent main = new Intent(this, ActivityMain.class);
|
||||
PendingIntent pi = PendingIntent.getActivity(this, 0, main, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent pi = PendingIntentCompat.getActivity(this, 0, main, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
TypedValue tv = new TypedValue();
|
||||
getTheme().resolveAttribute(R.attr.colorOff, tv, true);
|
||||
|
@ -2994,15 +3128,19 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
notification.bigText(getString(R.string.msg_error, message));
|
||||
notification.setSummaryText(message);
|
||||
|
||||
NotificationManagerCompat.from(this).notify(NOTIFY_ERROR, notification.build());
|
||||
if (Util.canNotify(this))
|
||||
NotificationManagerCompat.from(this).notify(NOTIFY_ERROR, notification.build());
|
||||
}
|
||||
|
||||
private void showAccessNotification(int uid) {
|
||||
String name = TextUtils.join(", ", Util.getApplicationNames(uid, ServiceSinkhole.this));
|
||||
List<String> apps = Util.getApplicationNames(uid, ServiceSinkhole.this);
|
||||
if (apps.size() == 0)
|
||||
return;
|
||||
String name = TextUtils.join(", ", apps);
|
||||
|
||||
Intent main = new Intent(ServiceSinkhole.this, ActivityMain.class);
|
||||
main.putExtra(ActivityMain.EXTRA_SEARCH, Integer.toString(uid));
|
||||
PendingIntent pi = PendingIntent.getActivity(ServiceSinkhole.this, uid + 10000, main, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent pi = PendingIntentCompat.getActivity(ServiceSinkhole.this, uid + 10000, main, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
TypedValue tv = new TypedValue();
|
||||
getTheme().resolveAttribute(R.attr.colorOn, tv, true);
|
||||
|
@ -3079,12 +3217,13 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
}
|
||||
}
|
||||
|
||||
NotificationManagerCompat.from(this).notify(uid + 10000, notification.build());
|
||||
if (Util.canNotify(this))
|
||||
NotificationManagerCompat.from(this).notify(uid + 10000, notification.build());
|
||||
}
|
||||
|
||||
private void showUpdateNotification(String name, String url) {
|
||||
Intent download = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
|
||||
PendingIntent pi = PendingIntent.getActivity(this, 0, download, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent pi = PendingIntentCompat.getActivity(this, 0, download, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
TypedValue tv = new TypedValue();
|
||||
getTheme().resolveAttribute(R.attr.colorPrimary, tv, true);
|
||||
|
@ -3101,7 +3240,8 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
builder.setCategory(NotificationCompat.CATEGORY_STATUS)
|
||||
.setVisibility(NotificationCompat.VISIBILITY_SECRET);
|
||||
|
||||
NotificationManagerCompat.from(this).notify(NOTIFY_UPDATE, builder.build());
|
||||
if (Util.canNotify(this))
|
||||
NotificationManagerCompat.from(this).notify(NOTIFY_UPDATE, builder.build());
|
||||
}
|
||||
|
||||
private void removeWarningNotifications() {
|
||||
|
@ -3111,16 +3251,19 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
}
|
||||
|
||||
private class Builder extends VpnService.Builder {
|
||||
private Network activeNetwork;
|
||||
private NetworkInfo networkInfo;
|
||||
private int mtu;
|
||||
private List<String> listAddress = new ArrayList<>();
|
||||
private List<String> listRoute = new ArrayList<>();
|
||||
private List<InetAddress> listDns = new ArrayList<>();
|
||||
private List<String> listAllowed = new ArrayList<>();
|
||||
private List<String> listDisallowed = new ArrayList<>();
|
||||
|
||||
private Builder() {
|
||||
super();
|
||||
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
activeNetwork = (Build.VERSION.SDK_INT < Build.VERSION_CODES.M ? null : cm.getActiveNetwork());
|
||||
networkInfo = cm.getActiveNetworkInfo();
|
||||
}
|
||||
|
||||
|
@ -3159,6 +3302,12 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VpnService.Builder addAllowedApplication(String packageName) throws PackageManager.NameNotFoundException {
|
||||
listAllowed.add(packageName);
|
||||
return super.addAllowedApplication(packageName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Builder addDisallowedApplication(String packageName) throws PackageManager.NameNotFoundException {
|
||||
listDisallowed.add(packageName);
|
||||
|
@ -3173,6 +3322,9 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
if (other == null)
|
||||
return false;
|
||||
|
||||
if (!Objects.equals(this.activeNetwork, other.activeNetwork))
|
||||
return false;
|
||||
|
||||
if (this.networkInfo == null || other.networkInfo == null ||
|
||||
this.networkInfo.getType() != other.networkInfo.getType())
|
||||
return false;
|
||||
|
@ -3189,6 +3341,9 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
if (this.listDns.size() != other.listDns.size())
|
||||
return false;
|
||||
|
||||
if (this.listAllowed.size() != other.listAllowed.size())
|
||||
return false;
|
||||
|
||||
if (this.listDisallowed.size() != other.listDisallowed.size())
|
||||
return false;
|
||||
|
||||
|
@ -3204,6 +3359,10 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
if (!other.listDns.contains(dns))
|
||||
return false;
|
||||
|
||||
for (String pkg : this.listAllowed)
|
||||
if (!other.listAllowed.contains(pkg))
|
||||
return false;
|
||||
|
||||
for (String pkg : this.listDisallowed)
|
||||
if (!other.listDisallowed.contains(pkg))
|
||||
return false;
|
||||
|
|
|
@ -77,7 +77,7 @@ public class ServiceTileMain extends TileService implements SharedPreferences.On
|
|||
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
|
||||
Intent intent = new Intent(WidgetAdmin.INTENT_ON);
|
||||
intent.setPackage(getPackageName());
|
||||
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent pi = PendingIntentCompat.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
am.cancel(pi);
|
||||
|
||||
// Check state
|
||||
|
|
|
@ -53,6 +53,7 @@ import android.view.View;
|
|||
import android.widget.TextView;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
import androidx.core.net.ConnectivityManagerCompat;
|
||||
import androidx.preference.PreferenceManager;
|
||||
|
||||
|
@ -110,7 +111,6 @@ public class Util {
|
|||
"NO", // Norway
|
||||
"PL", // Poland
|
||||
"PT", // Portugal
|
||||
"RE", // La Réunion
|
||||
"RO", // Romania
|
||||
"SK", // Slovakia
|
||||
"SI", // Slovenia
|
||||
|
@ -405,13 +405,13 @@ public class Util {
|
|||
else {
|
||||
PackageManager pm = context.getPackageManager();
|
||||
String[] pkgs = pm.getPackagesForUid(uid);
|
||||
if (pkgs == null)
|
||||
listResult.add(Integer.toString(uid));
|
||||
else
|
||||
if (pkgs != null)
|
||||
for (String pkg : pkgs)
|
||||
try {
|
||||
ApplicationInfo info = pm.getApplicationInfo(pkg, 0);
|
||||
listResult.add(pm.getApplicationLabel(info).toString());
|
||||
String name = pm.getApplicationLabel(info).toString();
|
||||
if (!TextUtils.isEmpty(name))
|
||||
listResult.add(name);
|
||||
} catch (PackageManager.NameNotFoundException ignored) {
|
||||
}
|
||||
Collections.sort(listResult);
|
||||
|
@ -844,6 +844,14 @@ public class Util {
|
|||
return (cm.getRestrictBackgroundStatus() == ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED);
|
||||
}
|
||||
|
||||
public static boolean canNotify(Context context) {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU)
|
||||
return true;
|
||||
else
|
||||
return (ActivityCompat.checkSelfPermission(context,
|
||||
Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED);
|
||||
}
|
||||
|
||||
private static StringBuilder getTrafficLog(Context context) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
|
|
|
@ -55,7 +55,7 @@ public class WidgetAdmin extends ReceiverAutostart {
|
|||
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
|
||||
Intent i = new Intent(INTENT_ON);
|
||||
i.setPackage(context.getPackageName());
|
||||
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent pi = PendingIntentCompat.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
if (INTENT_ON.equals(intent.getAction()) || INTENT_OFF.equals(intent.getAction()))
|
||||
am.cancel(pi);
|
||||
|
||||
|
|
|
@ -47,7 +47,7 @@ public class WidgetLockdown extends AppWidgetProvider {
|
|||
try {
|
||||
Intent intent = new Intent(lockdown ? WidgetAdmin.INTENT_LOCKDOWN_OFF : WidgetAdmin.INTENT_LOCKDOWN_ON);
|
||||
intent.setPackage(context.getPackageName());
|
||||
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent pi = PendingIntentCompat.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
for (int id : appWidgetIds) {
|
||||
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widgetlockdown);
|
||||
views.setOnClickPendingIntent(R.id.ivEnabled, pi);
|
||||
|
|
|
@ -47,7 +47,7 @@ public class WidgetMain extends AppWidgetProvider {
|
|||
try {
|
||||
Intent intent = new Intent(enabled ? WidgetAdmin.INTENT_OFF : WidgetAdmin.INTENT_ON);
|
||||
intent.setPackage(context.getPackageName());
|
||||
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent pi = PendingIntentCompat.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
for (int id : appWidgetIds) {
|
||||
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widgetmain);
|
||||
views.setOnClickPendingIntent(R.id.ivEnabled, pi);
|
||||
|
|
|
@ -148,7 +148,7 @@ void parse_dns_response(const struct arguments *args, const struct ng_session *s
|
|||
return;
|
||||
}
|
||||
|
||||
dns_resolved(args, qname, name, rd, ttl);
|
||||
dns_resolved(args, qname, name, rd, ttl, -1);
|
||||
log_android(ANDROID_LOG_DEBUG,
|
||||
"DNS answer %d qname %s qtype %d ttl %d data %s",
|
||||
a, name, qtype, ttl, rd);
|
||||
|
|
|
@ -281,6 +281,8 @@ void handle_ip(const struct arguments *args,
|
|||
}
|
||||
}
|
||||
|
||||
jint uid = -1;
|
||||
|
||||
// Get server name
|
||||
char server_name[TLS_SNI_LENGTH + 1];
|
||||
*server_name = 0;
|
||||
|
@ -292,7 +294,8 @@ void handle_ip(const struct arguments *args,
|
|||
|
||||
if (get_sni(data, datalen, server_name)) {
|
||||
log_android(ANDROID_LOG_INFO, "TLS server name: %s", server_name);
|
||||
dns_resolved(args, server_name, server_name, dest, -1);
|
||||
uid = get_uid(version, protocol, saddr, sport, daddr, dport);
|
||||
dns_resolved(args, server_name, server_name, dest, -1, uid);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -300,10 +303,9 @@ void handle_ip(const struct arguments *args,
|
|||
strcpy(data, "sni");
|
||||
|
||||
// Get uid
|
||||
jint uid = -1;
|
||||
if (protocol == IPPROTO_ICMP || protocol == IPPROTO_ICMPV6 ||
|
||||
(protocol == IPPROTO_UDP && !has_udp_session(args, pkt, payload)) ||
|
||||
(protocol == IPPROTO_TCP && (syn || *server_name != 0))) {
|
||||
(protocol == IPPROTO_TCP && syn)) {
|
||||
if (args->ctx->sdk <= 28) // Android 9 Pie
|
||||
uid = get_uid(version, protocol, saddr, sport, daddr, dport);
|
||||
else
|
||||
|
|
|
@ -580,9 +580,10 @@ jfieldID fidQName = NULL;
|
|||
jfieldID fidAName = NULL;
|
||||
jfieldID fidResource = NULL;
|
||||
jfieldID fidTTL = NULL;
|
||||
jfieldID fidDnsUid = NULL;
|
||||
|
||||
void dns_resolved(const struct arguments *args,
|
||||
const char *qname, const char *aname, const char *resource, int ttl) {
|
||||
const char *qname, const char *aname, const char *resource, int ttl, jint uid) {
|
||||
#ifdef PROFILE_JNI
|
||||
float mselapsed;
|
||||
struct timeval start, end;
|
||||
|
@ -610,6 +611,7 @@ void dns_resolved(const struct arguments *args,
|
|||
fidAName = jniGetFieldID(args->env, clsRR, "AName", string);
|
||||
fidResource = jniGetFieldID(args->env, clsRR, "Resource", string);
|
||||
fidTTL = jniGetFieldID(args->env, clsRR, "TTL", "I");
|
||||
fidDnsUid = jniGetFieldID(args->env, clsRR, "uid", "I");
|
||||
}
|
||||
|
||||
jlong jtime = time(NULL) * 1000LL;
|
||||
|
@ -625,6 +627,7 @@ void dns_resolved(const struct arguments *args,
|
|||
(*args->env)->SetObjectField(args->env, jrr, fidAName, janame);
|
||||
(*args->env)->SetObjectField(args->env, jrr, fidResource, jresource);
|
||||
(*args->env)->SetIntField(args->env, jrr, fidTTL, ttl);
|
||||
(*args->env)->SetIntField(args->env, jrr, fidDnsUid, uid);
|
||||
|
||||
(*args->env)->CallVoidMethod(args->env, args->instance, midDnsResolved, jrr);
|
||||
jniCheckException(args->env);
|
||||
|
|
|
@ -521,7 +521,7 @@ void log_android(int prio, const char *fmt, ...);
|
|||
void log_packet(const struct arguments *args, jobject jpacket);
|
||||
|
||||
void dns_resolved(const struct arguments *args,
|
||||
const char *qname, const char *aname, const char *resource, int ttl);
|
||||
const char *qname, const char *aname, const char *resource, int ttl, jint uid);
|
||||
|
||||
jboolean is_domain_blocked(const struct arguments *args, const char *name);
|
||||
|
||||
|
|
|
@ -275,10 +275,11 @@ void *handle_events(void *a) {
|
|||
log_android(ANDROID_LOG_ERROR,
|
||||
"epoll close error %d: %s", errno, strerror(errno));
|
||||
|
||||
log_android(ANDROID_LOG_WARN, "Stopped events tun=%d", args->tun);
|
||||
|
||||
// Cleanup
|
||||
ng_free(args, __FILE__, __LINE__);
|
||||
|
||||
log_android(ANDROID_LOG_WARN, "Stopped events tun=%d", args->tun);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -62,5 +62,11 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="@style/TextSmall" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvUid"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="@style/TextSmall" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
|
|
@ -51,6 +51,10 @@
|
|||
android:id="@+id/menu_lockdown"
|
||||
android:checkable="true"
|
||||
android:title="@string/setting_lockdown"/>
|
||||
<item
|
||||
android:id="@+id/menu_malware"
|
||||
android:checkable="true"
|
||||
android:title="@string/setting_malware"/>
|
||||
<item
|
||||
android:id="@+id/menu_log"
|
||||
android:title="@string/menu_log"/>
|
||||
|
|
|
@ -7,7 +7,15 @@
|
|||
<string name="app_first">NetGuard-ı tərtib etmək və sınaqdan keçirmək üçün böyük diqqət göstərilmişdir, ancaq NetGuard-ın hər cihazda düzgün işləməyinə zəmanət vermək mümkünsüzdür.</string>
|
||||
<string name="app_agree">Razıyam</string>
|
||||
<string name="app_disagree">Razı deyiləm</string>
|
||||
<string name="app_support">NetGuard-ın köməyinizə ehtiyacı var. Pro xüsusiyyətləri satın alaraq layihəni davam etdirmək üçün toxunun.</string>
|
||||
<string name="app_support">NetGuard-ın köməyinizə ehtiyacı var. Pro özəllikləri satın alaraq layihəni davam etdirmək üçün toxunun.</string>
|
||||
<string name="app_qap"> Google, bütün tətbiqləri sorğulamaq məqsədilə icazə istədiyi üçün tətbiqi Play Store-dan siləcəkdi.
|
||||
Bu icazənin nə üçün lazım olduğuna dair yaxşı bir əsaslandırma təqdim edən beş etiraz rədd edildi.
|
||||
Tətbiqin bu versiyası artıq bu icazəni tələb etmir, buna baxmayaraq
|
||||
Android tətbiq siyahısından əllə başladıla bilməyən bəzi (sistem) tətbiqlər istisna olmaqla
|
||||
demək olar ki, bütün tətbiqlər sadalanmağa davam edəcək.
|
||||
Cihazınızın düzgün işləməyə davam etməsini təmin etmək üçün bu tətbiqlərin internet trafikinə həmişə icazə veriləcək.
|
||||
Bunun bir problem olduğunu fikirləşirsinizsə, tətbiqi GitHub versiyasına güncəlləyə və bütün (sistem) tətbiqlərini yenidən idarə edə bilərsiniz.
|
||||
</string>
|
||||
<string name="channel_foreground">İşləyən xidmətlər</string>
|
||||
<string name="channel_notify">Ümumi bildirişlər</string>
|
||||
<string name="channel_access">Bildirişlərə müraciət</string>
|
||||
|
@ -20,7 +28,7 @@
|
|||
<string name="menu_sort">Tətbiqləri sırala</string>
|
||||
<string name="menu_sort_name">Ada görə</string>
|
||||
<string name="menu_sort_uid">İstfdçi kimliyinə görə</string>
|
||||
<string name="menu_sort_data">Verilənlər istfdsnə görə</string>
|
||||
<string name="menu_sort_data">İnternet istifadəsinə görə</string>
|
||||
<string name="menu_log">Jurnalını göstər</string>
|
||||
<string name="menu_settings">Tənzimləmələr</string>
|
||||
<string name="menu_invite">Dəvət et</string>
|
||||
|
@ -31,14 +39,14 @@
|
|||
<string name="menu_protocol_other">Digər</string>
|
||||
<string name="menu_traffic_allowed">İcazə verildi</string>
|
||||
<string name="menu_traffic_blocked">Əngəlləndi</string>
|
||||
<string name="menu_live">Canlı yeniləmələr</string>
|
||||
<string name="menu_live">Canlı güncəlləmələr</string>
|
||||
<string name="menu_refresh">Təzələ</string>
|
||||
<string name="menu_resolve">Adları göstər</string>
|
||||
<string name="menu_organization">Təşkilatı göstər</string>
|
||||
<string name="menu_pcap_enabled">PCAP fəallaşdırıldı</string>
|
||||
<string name="menu_pcap_export">PCAP ixrac etmə</string>
|
||||
<string name="menu_pcap_export">PCAP xaricə köçürmə</string>
|
||||
<string name="menu_clear">Təmizlə</string>
|
||||
<string name="menu_export">İxrac et</string>
|
||||
<string name="menu_export">Xaricə köçür</string>
|
||||
<string name="menu_reset">Sıfırla</string>
|
||||
<string name="menu_add">Əlavə et</string>
|
||||
<string name="menu_delete">Sil</string>
|
||||
|
@ -51,10 +59,10 @@
|
|||
<string name="title_external">Xarici bir server üçün \'heç kim\' seç</string>
|
||||
<string name="setting_defaults">İlkin (ağ/qara siyahı)</string>
|
||||
<string name="setting_whitelist_wifi">\"Wi-Fi\"ı əngəllə</string>
|
||||
<string name="setting_whitelist_other">Mobil verlnləri əngəllə</string>
|
||||
<string name="setting_whitelist_other">Mobil interneti əngəllə</string>
|
||||
<string name="setting_screen_wifi">Wi-Fi-a ekran açıq olanda icazə ver</string>
|
||||
<string name="setting_screen_other">Mobil verlnlrə ekran açıq olanda icazə ver</string>
|
||||
<string name="setting_whitelist_roaming">Roaminqi əngəllə</string>
|
||||
<string name="setting_screen_other">Mobil internetə ekran açıq olanda icazə ver</string>
|
||||
<string name="setting_whitelist_roaming">Rouminqi əngəllə</string>
|
||||
<string name="setting_options">Seçimlər</string>
|
||||
<string name="setting_theme">Tema: %1$s</string>
|
||||
<string name="setting_dark">Tünd tema</string>
|
||||
|
@ -62,7 +70,7 @@
|
|||
<string name="setting_screen_on">\'Ekran açıq olanda\' qaydalarını tətbiq et</string>
|
||||
<string name="setting_auto">%1$s dəqiqə sonra avto-fəallaşdır</string>
|
||||
<string name="setting_delay">Ekran sönməsini %1$s dəqiqə gecikdir</string>
|
||||
<string name="setting_update">Yeniləmələri yoxla</string>
|
||||
<string name="setting_update">Güncəlləmələri yoxla</string>
|
||||
<string name="setting_network_options">Şəbəkə seçimləri</string>
|
||||
<string name="setting_subnet">Subnet marşrutu</string>
|
||||
<string name="setting_tethering">İnternet paylaşımına icazə ver</string>
|
||||
|
@ -73,11 +81,11 @@
|
|||
<string name="setting_metered_2g">2G istifadəsini nəzərə al</string>
|
||||
<string name="setting_metered_3g">3G istifadəsini nəzərə al</string>
|
||||
<string name="setting_metered_4g">LTE istifadəsini nəzərə al</string>
|
||||
<string name="setting_national_roaming">Milli roaminqə məhəl qoyma</string>
|
||||
<string name="setting_eu_roaming">AB roaminqinə məhəl qoyma</string>
|
||||
<string name="setting_national_roaming">Milli rouminqi yox say</string>
|
||||
<string name="setting_eu_roaming">AB rouminqini yox say</string>
|
||||
<string name="setting_call">Zəngdə ləğv et</string>
|
||||
<string name="setting_lockdown_wifi">Wi-Fi-ı kilidlə</string>
|
||||
<string name="setting_lockdown_other">Mobil verlnləri kilidlə</string>
|
||||
<string name="setting_lockdown_other">Mobil interneti kilidlə</string>
|
||||
<string name="setting_reload_onconnectivity">Bağlantı hər dəyişəndə yenidən yüklə</string>
|
||||
<string name="setting_advanced_options">Qabaqcıl seçimlər</string>
|
||||
<string name="setting_system">Sistem tətbiqlərini idarə et</string>
|
||||
|
@ -113,20 +121,20 @@
|
|||
<string name="setting_stats_frequency">Nümunə aralığı: %s ms</string>
|
||||
<string name="setting_stats_samples">Nümunə sayı: %s s</string>
|
||||
<string name="setting_backup">Nüsxələmə</string>
|
||||
<string name="setting_export">Tənzimləmələri ixrac et</string>
|
||||
<string name="setting_import">Tənzimləmələri idxal et</string>
|
||||
<string name="setting_hosts">Hosts fayllarını idxal et</string>
|
||||
<string name="setting_hosts_append">Hosts faylını idxal et (əlavə)</string>
|
||||
<string name="setting_export">Tənzm.ləri xaricə köçür</string>
|
||||
<string name="setting_import">Tənzm.ləri daxilə köçür</string>
|
||||
<string name="setting_hosts">Hosts fayllarını daxilə köçür</string>
|
||||
<string name="setting_hosts_append">Hosts faylını daxilə köçür (əlavə)</string>
|
||||
<string name="setting_hosts_url">Hosts faylını endirmə bağlantısı</string>
|
||||
<string name="setting_hosts_download">Hosts faylını endir</string>
|
||||
<string name="setting_technical">Texniki məlumat</string>
|
||||
<string name="setting_technical_general">Ümumi</string>
|
||||
<string name="setting_technical_networks">Şəbəkələr</string>
|
||||
<string name="setting_technical_subscription">Abunəliklər</string>
|
||||
<string name="summary_install">Yeni quraşdırılmış tətbiqləri birbaşa konfiqurasiya etmək üçün vəziyyət sətrində bildiriş göstər (pro xüsusiyyət)</string>
|
||||
<string name="summary_install">Yeni quraşdırılmış tətbiqləri birbaşa konfiqurasiya etmək üçün vəziyyət sətrində bildiriş göstər (pro özəllik)</string>
|
||||
<string name="summary_auto">Vicetin istifadəsini ləğv etdikdən sonra, seçilmiş dəqiqə sayından sonra NetGuard-ı təkrar avtomatik fəallaşdır (bu seçimi ləğv etmək üçün 0 yazın)</string>
|
||||
<string name="summary_delay">Ekran sönəndə, seçilmiş dəqiqə üçün aktiv qaydalarla ekranı açıq saxla (bu seçimi ləğv etmək üçün sıfır daxil edin)</string>
|
||||
<string name="summary_update">Yeni versiyaları GitHub-da gün ərzində iki dəfə yoxla</string>
|
||||
<string name="summary_update">Yeni versiyaları GitHub-da gündə iki dəfə yoxlayın</string>
|
||||
<string name="summary_tethering">Android versiyasından asılı olaraq, internet paylaşımı işləyə və ya işləməyə bilər. Paylaşılan trafik filtrlənə bilməz.</string>
|
||||
<string name="summary_subnet">Subnet marşrutunu fəallaşdır; Wi-Fi zəngi fəallaşdırıla bilər, ancaq Android-də xətaları işə sala və batareya istifadəsini artıra bilər</string>
|
||||
<string name="summary_lan">Tətbiqlərin 10.0.0.0/8, 172.16.0.0/12 və 192.168.0.0/16 kimi lokal şəbəkə ünvanları ilə bağlantı qurmasına icazə verər</string>
|
||||
|
@ -136,8 +144,8 @@
|
|||
<string name="summary_metered_2g">2G bağlantıları üçün Wi-Fi şəbəkə qaydalarını tətbiq et</string>
|
||||
<string name="summary_metered_3g">3G bağlantıları üçün Wi-Fi şəbəkə qaydalarını tətbiq et</string>
|
||||
<string name="summary_metered_4g">LTE bağlantıları üçün Wi-Fi şəbəkə qaydalarını tətbiq et</string>
|
||||
<string name="summary_national_roaming">SIM kart və mobil şəbəkə ölkəsi eyni olanda roaminq qaydalarını tətbiq etmə</string>
|
||||
<string name="summary_eu_roaming">SIM kart və mobil şəbəkə ölkəsi Avropa Birliyində olanda roaminq qaydalarını tətbiq etmə</string>
|
||||
<string name="summary_national_roaming">SIM kart və mobil şəbəkə ölkəsi eyni olduqda rouminq qaydalarını tətbiq etmə</string>
|
||||
<string name="summary_eu_roaming">SIM kart və mobil şəbəkə ölkəsi Avropa Birliyində olduqda rouminq qaydalarını tətbiq etmə</string>
|
||||
<string name="summary_call">Gələn və ya gedən telefon zənglərində NetGuard-ı ləğv et. Bu, IP/Wi-Fi zəng problemlərini həll etmək üçün istifadə edilə bilər.</string>
|
||||
<string name="summary_system">Sistem tətbiqləri üçün qaydalar təyin edin (mütəxəssislər üçün)</string>
|
||||
<string name="summary_log_app">Jurnal, tətbiqlər üçün internetə müraciətət cəhd edir. Bu, batareya istifadəsini artıra bilər.</string>
|
||||
|
@ -156,6 +164,7 @@
|
|||
<string name="msg_hosts">%1$d icazə verildi, %2$d əngəlləndi, %3$d hosts</string>
|
||||
<string name="msg_waiting">Tədbir gözlənilir</string>
|
||||
<string name="msg_disabled">NetGuard ləğv edildi, yuxarıdan fəallaşdırın</string>
|
||||
<string name="msg_notifications">Bildiriş icazələrini aktivləşdirmək üçün toxunun (bildirişlərə müraciət cəhdləri, xəta mesajları və s.)</string>
|
||||
<string name="msg_revoked">NetGuard ləğv edildi, yəqin ki, başqa bir VPN əsaslı tətbiq istifadə edilir</string>
|
||||
<string name="msg_installed">\'%1$s\' quraşdırıldı</string>
|
||||
<string name="msg_installed_n">Quraşdırıldı</string>
|
||||
|
@ -178,14 +187,14 @@ Buna görə də, zəhmət olmasa növbəti dialoqda VPN bağlantısına icazə v
|
|||
<string name="msg_count">%dx</string>
|
||||
<string name="msg_doze">Qərarlı nəticələr əldə etmək üçün, NetGuard üçün Android batareya optimallaşdırmaları ləğv edilməlidir.
|
||||
\n\nNövbəti dialoqda, yuxarıdan \"Bütün tətbiqlər\"i seçin, NetGuard-ı seçin və \"Optimallaşdırma\"nı təsdiqləyin.</string>
|
||||
<string name="msg_datasaving">Qərarlı nəticələr əldə etmək üçün, NetGuard üçün Android verilənlərə qənaət seçimi ləğv edilməlidir.
|
||||
\n\nNövbəti dialoqda, \"Arxaplan verilənləri\" və \"Məhdudiyyətsiz verilənlər istifadəsi\" seçimlərini fəallaşdırın.</string>
|
||||
<string name="msg_filter">Filtrləməni istifadə etmək, Android-in verilənlər və enerji istifadəsini NetGuard-a aid etməsinə səbəb olacaq - Android, verilənlər və enerjinin orijinal tətbiqlər əvəzinə NetGuard tərəfindən istifadə edildiyini nəzərə alacaq</string>
|
||||
<string name="msg_datasaving">Qərarlı nəticələr əldə etmək üçün, NetGuard üçün Android internetə qənaət seçimi ləğv edilməlidir.
|
||||
\n\nNövbəti dialoqda, \"Arxaplanda internet\" və \"Məhdudiyyətsiz internet istifadəsi\" seçimlərini fəallaşdırın</string>
|
||||
<string name="msg_filter">Filtrləməni istifadə etmək, Android-in internet və enerji istifadəsini NetGuard-a aid etməsinə səbəb olacaq - Android, internet və enerjinin orijinal tətbiqlər əvəzinə NetGuard tərəfindən istifadə edildiyini nəzərə alacaq</string>
|
||||
<string name="msg_filter4">Android 4 filtrləmənin fəallaşdırılmasını tələb edir</string>
|
||||
<string name="msg_log_disabled">Trafikin jurnala yazılması ləğv edildi, fəallaşdırmaq üçün yuxarıdakı açarı istifadə edin. Trafikin jurnala yazılmasını fəallaşdırmaq batereya istifadəsini artıra bilər.</string>
|
||||
<string name="msg_clear_rules">Bu, qaydaların və şərtlərin dəyərlərini ilkin vəziyyətə qaytarar</string>
|
||||
<string name="msg_reset_access">Bu, icazə verilən/əngəllənən qaydalar istisna olmaqla müraciət cəhdi qeyd sətirlərini siləcək</string>
|
||||
<string name="msg_import_last">Son idxal: %s</string>
|
||||
<string name="msg_import_last">Son daxilə köçürmə: %s</string>
|
||||
<string name="msg_downloading">Endirilir\n%1s</string>
|
||||
<string name="msg_downloaded">Hosts fayl endirildi</string>
|
||||
<string name="msg_download_last">Son endirmə: %s</string>
|
||||
|
@ -194,7 +203,7 @@ Buna görə də, zəhmət olmasa növbəti dialoqda VPN bağlantısına icazə v
|
|||
<string name="msg_metered">Şəbəkə ölçüldü</string>
|
||||
<string name="msg_inactive">Aktiv internet bağlantısı yoxdur</string>
|
||||
<string name="msg_queue">NetGuard məşğuldur</string>
|
||||
<string name="msg_update">Yeniləmə var, endirmək üçün toxunun</string>
|
||||
<string name="msg_update">Güncəlləmə var, endirmək üçün toxunun</string>
|
||||
<string name="msg_usage">Tətbiqin yanındakı nişanlara toxunaraq Wi-Fi və ya mobil internet müraciətinə icazə verə (yaşılımtıl) və ya rədd edə (qırmızımtıl) bilərsiniz</string>
|
||||
<string name="msg_fairemail">Gizliliyinizi qorumaq üçün NetGuard-ı quraşdırmısınızsa, açıq mənbəli, gizlilik dostu e-poçt tətbiqi olan <a href="https://email.faircode.eu/">FairEmail</a> ilə maraqlana bilərsiniz</string>
|
||||
<string name="msg_whitelist">İlkin olaraq (qara siyahı rejimi) internetə müraciətə icazə verildi, bu, tənzimləmələrdə dəyişdirilə bilər</string>
|
||||
|
@ -203,7 +212,7 @@ Buna görə də, zəhmət olmasa növbəti dialoqda VPN bağlantısına icazə v
|
|||
<string name="msg_issue">Zəhmət olmasa probleminizi təsvir edin və problemin vaxtını göstərin:</string>
|
||||
<string name="msg_vpn_cancelled">VPN bağlantısı ləğv edildi\nBaşqa bir VPN-i həmişə açıq qalacaq formada konfiqurasiya etmisiniz?</string>
|
||||
<string name="msg_on">NetGuard fəal ikən cihazınızı söndürsəniz, cihazınız açılanda NetGuard avtomatik olaraq başlayacaq</string>
|
||||
<string name="msg_unavailable">Bu xüsusiyyət bu Android versiyasında əlçatmazdır</string>
|
||||
<string name="msg_unavailable">Bu özəllik bu Android versiyasında əlçatmazdır</string>
|
||||
<string name="msg_always_on">Başqa VPN, Həmişə açıq VPN kimi tənzimləndi</string>
|
||||
<string name="msg_always_on_lockdown">NetGuard-ı filtrləmə rejimində istifadə etmək üçün Android VPN tənzimləmələrində \"VPN-siz bağlantıları əngəllə\" seçimini söndürün</string>
|
||||
<string name="msg_private_dns">NetGuard-ı filtrləmə rejimində istifadə etmək üçün Android şəbəkə tənzimləmələrində \"Özəl DNS\" seçimini söndürün</string>
|
||||
|
@ -217,7 +226,7 @@ Buna görə də, zəhmət olmasa növbəti dialoqda VPN bağlantısına icazə v
|
|||
<string name="title_host_allowed">Ünvana icazə verildi</string>
|
||||
<string name="title_host_blocked">Ünvan əngəlləndi</string>
|
||||
<string name="title_interactive_allowed">Ekran açıq olanda icazə verilən</string>
|
||||
<string name="title_roaming_blocked">Roaminqdə əngəllənən</string>
|
||||
<string name="title_roaming_blocked">Rouminqdə olarkən əngəllə</string>
|
||||
<string name="title_metered">İlkin olaraq Wi-Fi bağlantısı ölçülməmiş hesab edilir və mobil bağlantı ölçülür</string>
|
||||
<string name="title_internet">internet icazəsi yoxdur</string>
|
||||
<string name="title_disabled">ləğv edildi</string>
|
||||
|
@ -226,9 +235,9 @@ Buna görə də, zəhmət olmasa növbəti dialoqda VPN bağlantısına icazə v
|
|||
<string name="title_apply">Qaydaları və şərtləri tətbiq et</string>
|
||||
<string name="title_conditions">Şərtlər</string>
|
||||
<string name="title_screen_wifi">Wi-Fi-a ekran açıq olanda icazə ver</string>
|
||||
<string name="title_screen_other">Mobil ver.lərə ekran açıq olanda icazə ver</string>
|
||||
<string name="title_screen_other">Mobil internetə ekran açıq olanda icazə ver</string>
|
||||
<string name="title_roaming_symbol">R</string>
|
||||
<string name="title_roaming">Roaminqdə əngəllə</string>
|
||||
<string name="title_roaming">Rouminqdə olarkən əngəllə</string>
|
||||
<string name="title_lockdown">Kilid rejimində icazə ver</string>
|
||||
<string name="title_related">Əlaqəliləri filtrlə</string>
|
||||
<string name="title_access">Müraciət cəhdləri</string>
|
||||
|
@ -249,8 +258,8 @@ Buna görə də, zəhmət olmasa növbəti dialoqda VPN bağlantısına icazə v
|
|||
<string name="title_block">Əngəllə</string>
|
||||
<string name="title_allow_wifi">Wi-Fi-a icazə ver</string>
|
||||
<string name="title_block_wifi">Wi-Fi-ı əngəllə</string>
|
||||
<string name="title_allow_other">Mobil ver.lərə icazə ver</string>
|
||||
<string name="title_block_other">Mobil ver.ləri əngəllə</string>
|
||||
<string name="title_allow_other">Mobil internetə icazə ver</string>
|
||||
<string name="title_block_other">Mobil interneti əngəllə</string>
|
||||
<string name="title_root">root</string>
|
||||
<string name="title_mediaserver">mediaserver</string>
|
||||
<string name="title_nobody">heç kim</string>
|
||||
|
@ -258,14 +267,14 @@ Buna görə də, zəhmət olmasa növbəti dialoqda VPN bağlantısına icazə v
|
|||
<string name="title_log_whois">Whois %1$s</string>
|
||||
<string name="title_log_port">Port %1$d</string>
|
||||
<string name="title_log_copy">Kopyala</string>
|
||||
<string name="title_pro">Pro xüsusiyyətlər</string>
|
||||
<string name="title_pro_description">Pro versiyada aşağıdakı xüsusiyyətlər var:</string>
|
||||
<string name="title_pro">Pro özəlliklər</string>
|
||||
<string name="title_pro_description">Aşağıdakı pro özəlliklər mövcuddur:</string>
|
||||
<string name="title_pro_log">Əngəllənən trafikə bax</string>
|
||||
<string name="title_pro_filter">Şəbəkə trafikini filtrlə</string>
|
||||
<string name="title_pro_notify">Yeni tətbiq bildirişləri</string>
|
||||
<string name="title_pro_speed">Şəbəkə sürəti qrafik bildirişi</string>
|
||||
<string name="title_pro_theme">Görünüş (tema, rənglər)</string>
|
||||
<string name="title_pro_all">Bütün pro xüsusiyyətlər</string>
|
||||
<string name="title_pro_all">Yuxarıdakı bütün pro özəlliklər</string>
|
||||
<string name="title_pro_dev">Tərtibatçını dəstəklə</string>
|
||||
<string name="title_pro_buy">Satın al</string>
|
||||
<string name="title_pro_bought">Fəallaşdırıldı</string>
|
||||
|
@ -273,9 +282,9 @@ Buna görə də, zəhmət olmasa növbəti dialoqda VPN bağlantısına icazə v
|
|||
<string name="title_pro_details">Daha çox məlumat üçün başlığa toxunun</string>
|
||||
<string name="title_pro_challenge">Çağırış</string>
|
||||
<string name="title_pro_reponse">Cavab</string>
|
||||
<string name="title_pro_feature">Bu bir Pro xüsusiyyətdir</string>
|
||||
<string name="title_pro_subscription"> Vergilər xaric aylıq 1 və ya 2 avroluq abunəlik bütün pro xüsusiyyətləri aktivləşdirir.
|
||||
Play store tətbiqindəki abunəliklər vərəqi vasitəsilə abunəliyinizi ləğv edə və ya idarə edə bilərsiniz.
|
||||
<string name="title_pro_feature">Bu, bir Pro özəllikdir</string>
|
||||
<string name="title_pro_subscription"> Vergilər xaric aylıq 1 və ya 2 avroluq abunəlik bütün pro özəllkləri aktivləşdirir.
|
||||
Play Store tətbiqindəki abunəliklər vərəqi vasitəsilə abunəliyinizi ləğv edə və ya idarə edə bilərsiniz.
|
||||
</string>
|
||||
<string-array name="themeNames">
|
||||
<item>tünd yaşıl/narıncı</item>
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
<string name="app_agree">Съгласявам се</string>
|
||||
<string name="app_disagree">Не съм съгласен</string>
|
||||
<string name="app_support">FairEmail се нуждае от вашата подкрепа. Докоснете, за да закупите допълнителните възможности така проектът ще продължи да се развива.</string>
|
||||
<string name="app_qap">Google щеше да премахне приложението от Play Store, тъй като искало разрешение да прави справки за всички приложения. Пет обжалвания и предоставяне на добра обосновка защо е необходимо това разрешение бяха отхвърлени. Това издание на приложението вече не иска това разрешение, и въпреки това почти всички приложения все още ще бъдат включени в списъка, с изключение на някои (системни) приложения, които не могат да бъдат стартирани ръчно от списъка с приложения за Андроид. Интернет трафикът на тези приложения винаги ще бъде разрешен, за да се гарантира, че устройството ви продължава да работи правилно. Ако смятате, че това е проблем, можете да използвате версията на приложението в GitHub и отново да управлявате всички (системни) приложения.</string>
|
||||
<string name="channel_foreground">Работещи услуги</string>
|
||||
<string name="channel_notify">Общи известия</string>
|
||||
<string name="channel_access">Известия за достъп</string>
|
||||
|
@ -156,6 +157,7 @@
|
|||
<string name="msg_hosts">%1$d разрешени, %2$d забранени, %3$d хостове</string>
|
||||
<string name="msg_waiting">Изчакване за събитие</string>
|
||||
<string name="msg_disabled">NetGuard е изключен, използвайте превключвателя горе, за да включите NetGuard</string>
|
||||
<string name="msg_notifications">За да разрешите известията, докоснете (за питане за достъп, съобщения за грешка и др.)</string>
|
||||
<string name="msg_revoked">NetGuard се изключи, най-вероятно използвате друго VPN базирано приложение</string>
|
||||
<string name="msg_installed">\"%1$s\" инсталирани</string>
|
||||
<string name="msg_installed_n">Е инсталиран</string>
|
||||
|
|
|
@ -156,6 +156,7 @@
|
|||
<string name="msg_hosts">povoleno: %1$d | blokováno: %2$d | hosts: %3$d</string>
|
||||
<string name="msg_waiting">Čekání na událost</string>
|
||||
<string name="msg_disabled">NetGuard je deaktivován, použijte přepínač výše pro jeho aktivaci</string>
|
||||
<string name="msg_notifications">Klepnutím udělíte oprávnění oznámení (pro přístup k oznámením pokusů, chybovým zprávám atd.)</string>
|
||||
<string name="msg_revoked">NetGuard byl deaktivován, pravděpodobně jinou aplikací používající VPN rozhraní</string>
|
||||
<string name="msg_installed">\'%1$s\' nainstalováno</string>
|
||||
<string name="msg_installed_n">Instalace dokončena</string>
|
||||
|
|
|
@ -8,6 +8,14 @@
|
|||
<string name="app_agree">Jeg accepterer</string>
|
||||
<string name="app_disagree">Jeg accepterer ikke</string>
|
||||
<string name="app_support">NetGuard behøver din hjælp. Tryk for at købe pro funktioner for at holde projektet igang.</string>
|
||||
<string name="app_qap"> Google agtede at fjerne appen fra Play Butik, fordi den anmodede om tilladelse til at forespørge alle apps.
|
||||
Fem appeller og en god begrundelse for, hvorfor denne tilladelse er nødvendig, blev afvist.
|
||||
Denne version af appen anmoder ikke længere om denne tilladelse,
|
||||
og trods det vil næsten alle apps stadig være på listen,
|
||||
undtagen visse (system-)apps, som ikke kan startes manuelt fra Android-app-listen.
|
||||
Internettrafik i disse apps vil altid være tilladt for at sikre, at enheden fortsat fungerer korrekt.
|
||||
Anses dette som et problem, kan man opdatere til GitHub-versionen af appen for igen at kunne håndtere alle (system-)apps.
|
||||
</string>
|
||||
<string name="channel_foreground">Aktive tjenester</string>
|
||||
<string name="channel_notify">Generelle notifikationer</string>
|
||||
<string name="channel_access">Adgangsnotifikationer</string>
|
||||
|
@ -156,6 +164,7 @@
|
|||
<string name="msg_hosts">%1$d tilladt, %2$d blokeret, %3$d hosts</string>
|
||||
<string name="msg_waiting">Afventer begivenhed</string>
|
||||
<string name="msg_disabled">NetGuard er inaktiv. Benyt kontakten ovenfor for at aktivere NetGuard</string>
|
||||
<string name="msg_notifications">Tryk for at tildele notifikationstilladelser (for at tilgå notifikationer, fejlmeddelelser mv.)</string>
|
||||
<string name="msg_revoked">NetGuard er blevet deaktiveret formentlig grundet brug af anden VPN-baseret app</string>
|
||||
<string name="msg_installed">\'%1$s\' installeret</string>
|
||||
<string name="msg_installed_n">Er blevet installeret</string>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_description">NetGuard bietet einfache und erweiterte Möglichkeiten, um Zugriffe auf das Internet zu blockieren - keine Root-Rechte erforderlich! Anwendungen und Adressen kann der Zugriff auf die WLAN- und/oder mobile Datenverbindung einzeln erlaubt oder verweigert werden.</string>
|
||||
<string name="app_description">NetGuard bietet einfache und erweiterte Möglichkeiten, um Zugriffe auf das Internet zu blockieren – keine Root-Rechte erforderlich! Der Zugriff auf die WLAN- und/oder mobile Datenverbindung kann einzeln pro App und Internetadresse erlaubt oder blockiert werden.</string>
|
||||
<string name="app_android">NetGuard erfordert Android 5.1 oder höher</string>
|
||||
<string name="app_xposed">Xposed verursacht sehr viele Abstürze, was dazu führen kann, dass NetGuard aus dem Google Play Store entfernt werden könnte. Deshalb wird NetGuard nicht unterstützt, solange Xposed installiert ist</string>
|
||||
<string name="app_privacy"><a href="https://www.netguard.me/privacy/">Datenschutzerklärung</a></string>
|
||||
|
@ -8,16 +8,25 @@
|
|||
<string name="app_agree">Zustimmen</string>
|
||||
<string name="app_disagree">Ablehnen</string>
|
||||
<string name="app_support">NetGuard braucht Ihre Hilfe. Tippen Sie auf Pro-Funktion kaufen, um das Projekt weiterentwickeln zu können.</string>
|
||||
<string name="app_qap"> Google hat die App aus dem Play Store entfernt, da es die Berechtigung zum Abfragen aller Apps angefordert hat.
|
||||
Fünf Appelle und eine gute Rechtfertigung dafür, warum diese Genehmigung benötigt wird, wurden abgelehnt.
|
||||
Diese Version der App fordert diese Berechtigung nicht mehr an
|
||||
und trotzdem werden fast alle Apps noch aufgelistet,
|
||||
außer einigen (System-)Apps, die nicht von der Android-App-Liste manuell gestartet werden können.
|
||||
Der Internetverkehr dieser Apps wird immer erlaubt sein, um sicherzustellen, dass Ihr Gerät korrekt funktioniert.
|
||||
Wenn Sie denken, dass dies ein Problem ist, dann können Sie auf die GitHub-Version der App umsteigen und alle
|
||||
(System-)Apps weiter verwalten.
|
||||
</string>
|
||||
<string name="channel_foreground">Aktive Dienste</string>
|
||||
<string name="channel_notify">Allgemeine Benachrichtigungen</string>
|
||||
<string name="channel_access">Auf Benachrichtigungen zugreifen</string>
|
||||
<string name="menu_search">Nach App suchen</string>
|
||||
<string name="menu_filter">Anwendungen filtern</string>
|
||||
<string name="menu_app_user">Benutzeranwendungen anzeigen</string>
|
||||
<string name="menu_app_system">Systemanwendungen anzeigen</string>
|
||||
<string name="menu_app_nointernet">Anwendungen ohne Internet anzeigen</string>
|
||||
<string name="menu_app_disabled">Deaktivierte Anwendungen anzeigen</string>
|
||||
<string name="menu_sort">Anwendungen sortieren</string>
|
||||
<string name="menu_filter">Apps filtern</string>
|
||||
<string name="menu_app_user">Benutzer-Apps anzeigen</string>
|
||||
<string name="menu_app_system">System-Apps anzeigen</string>
|
||||
<string name="menu_app_nointernet">Apps ohne Internet anzeigen</string>
|
||||
<string name="menu_app_disabled">Deaktivierte Apps anzeigen</string>
|
||||
<string name="menu_sort">Apps sortieren</string>
|
||||
<string name="menu_sort_name">Nach Namen sortieren</string>
|
||||
<string name="menu_sort_uid">Nach UID sortieren</string>
|
||||
<string name="menu_sort_data">Nach Datennutzung sortieren</string>
|
||||
|
@ -47,21 +56,21 @@
|
|||
<string name="title_dport">Quellport</string>
|
||||
<string name="title_raddr">Zieladresse</string>
|
||||
<string name="title_rport">Zielport</string>
|
||||
<string name="title_ruid">Zielanwendung</string>
|
||||
<string name="title_external">Für einen externen Server wählen Sie \'Keiner\' aus</string>
|
||||
<string name="title_ruid">Ziel-App</string>
|
||||
<string name="title_external">Für einen externen Server wählen Sie »Keiner« aus</string>
|
||||
<string name="setting_defaults">Standardeinstellungen</string>
|
||||
<string name="setting_whitelist_wifi">WLAN blockieren</string>
|
||||
<string name="setting_whitelist_other">Mobilfunk blockieren</string>
|
||||
<string name="setting_whitelist_other">Mobile Daten blockieren</string>
|
||||
<string name="setting_screen_wifi">WLAN erlauben, wenn Bildschirm eingeschaltet ist</string>
|
||||
<string name="setting_screen_other">Mobilfunk erlauben, wenn Bildschirm eingeschaltet ist</string>
|
||||
<string name="setting_screen_other">Mobile Daten erlauben, wenn Bildschirm eingeschaltet ist</string>
|
||||
<string name="setting_whitelist_roaming">Roaming blockieren</string>
|
||||
<string name="setting_options">Optionen</string>
|
||||
<string name="setting_theme">Design: %1$s</string>
|
||||
<string name="setting_dark">Dunkles Design verwenden</string>
|
||||
<string name="setting_install">Benachrichtigung bei neuer Installation</string>
|
||||
<string name="setting_screen_on">\'Wenn Bildschirm an\' Regeln anwenden</string>
|
||||
<string name="setting_auto">Automatisch nach %1$s-Minuten aktivieren</string>
|
||||
<string name="setting_delay">Bildschirmabschaltung um %1$s Minuten verzögern</string>
|
||||
<string name="setting_screen_on">»Wenn Bildschirm eingeschaltet«-Regeln anwenden</string>
|
||||
<string name="setting_auto">Automatisch nach %1$s Minuten aktivieren</string>
|
||||
<string name="setting_delay">Ausschalten um %1$s Minuten verzögern</string>
|
||||
<string name="setting_update">Nach Aktualisierungen suchen</string>
|
||||
<string name="setting_network_options">Netzwerkoptionen</string>
|
||||
<string name="setting_subnet">Subnet-Routing</string>
|
||||
|
@ -80,7 +89,7 @@
|
|||
<string name="setting_lockdown_other">Mobile Daten-Zugriffsbeschränkung</string>
|
||||
<string name="setting_reload_onconnectivity">Erneut laden bei jeder Verbindungsänderung</string>
|
||||
<string name="setting_advanced_options">Erweiterte Optionen</string>
|
||||
<string name="setting_system">System-Apps anzeigen</string>
|
||||
<string name="setting_system">System-Apps verwalten</string>
|
||||
<string name="setting_log_app">Internetzugriff protokollieren</string>
|
||||
<string name="setting_access">Bei Internetzugriff benachrichtigen</string>
|
||||
<string name="setting_filter">Datenverkehr filtern</string>
|
||||
|
@ -105,11 +114,11 @@
|
|||
<string name="setting_socks5_username">SOCKS5-Benutzername: %s</string>
|
||||
<string name="setting_socks5_password">SOCKS5-Passwort: %s</string>
|
||||
<string name="setting_pcap_record_size">PCAP-Datensatzgröße: %s B</string>
|
||||
<string name="setting_pcap_file_size">PCAP-Dateigröße (max): %s MB</string>
|
||||
<string name="setting_pcap_file_size">Maximale PCAP-Dateigröße: %s MB</string>
|
||||
<string name="setting_watchdog">Watchdog: alle %s Minuten</string>
|
||||
<string name="setting_stats_category">Geschwindigkeitsbenachrichtigung</string>
|
||||
<string name="setting_stats">Netzwerkgeschwindigkeit anzeigen</string>
|
||||
<string name="setting_stats_top">Top-Anwendungen anzeigen</string>
|
||||
<string name="setting_stats_top">Top-Apps anzeigen</string>
|
||||
<string name="setting_stats_frequency">Abtastfrequenz: %s ms</string>
|
||||
<string name="setting_stats_samples">Abtastanzahl: %s s</string>
|
||||
<string name="setting_backup">Sicherung</string>
|
||||
|
@ -123,14 +132,14 @@
|
|||
<string name="setting_technical_general">Allgemein</string>
|
||||
<string name="setting_technical_networks">Netzwerke</string>
|
||||
<string name="setting_technical_subscription">Abos</string>
|
||||
<string name="summary_install">Statusleisten-Benachrichtigung anzeigen, um neu installierte Anwendungen direkt zu konfigurieren (Pro-Funktion)</string>
|
||||
<string name="summary_auto">Nach dem Deaktivieren über das Widget wird NetGuard nach einer festgelegten Anzahl von Minuten automatisch wieder aktiviert (Null eingeben zum Deaktivieren dieser Option)</string>
|
||||
<string name="summary_delay">Nach Ausschalten des Bildschirms diesen während der festgelegten Minuten aktiviert lassen (Null eingeben zum Deaktivieren dieser Option)</string>
|
||||
<string name="summary_install">Benachrichtigung in der Statusleiste anzeigen, um neu installierte Apps direkt zu konfigurieren (Pro-Funktion)</string>
|
||||
<string name="summary_auto">Nach dem Deaktivieren über das Widget wird NetGuard nach der festgelegten Anzahl von Minuten automatisch wieder aktiviert (Null eingeben zum Deaktivieren dieser Option)</string>
|
||||
<string name="summary_delay">Nach Ausschalten des Bildschirms diesen während der festgelegten Anzahl von Minuten aktiviert lassen (Null eingeben zum Deaktivieren dieser Option)</string>
|
||||
<string name="summary_update">Es wird auf GitHub zweimal täglich nach neuen Versionen gesucht</string>
|
||||
<string name="summary_tethering">Abhängig von der Android Version kann Tethering funktionieren. Dieser Verkehr kann nicht gefiltert werden.</string>
|
||||
<string name="summary_subnet">Subnet-Routing aktivieren ermöglicht möglicherweise das Telefonieren über WLAN, triggert aber auch das Auftreten von Fehler in Android und lässt den Batterieverbrauch steigen</string>
|
||||
<string name="summary_tethering">Abhängig von der Android-Version kann Tethering funktionieren. Dieser Datenverkehr kann nicht gefiltert werden.</string>
|
||||
<string name="summary_subnet">Subnet-Routing aktivieren; kann WLAN-Anrufe aktivieren, aber auch Fehler in Android auslösen und den Akkuverbrauch erhöhen</string>
|
||||
<string name="summary_lan">Apps den Zugriff auf lokale Netzwerkadressen wie 10.0.0.0/8, 172.16.0.0/12 und 192.168.0.0/16 erlauben.</string>
|
||||
<string name="summary_ip6">IP6-Datenverkehr an NetGuard weiterleiten, so dass es selektiv zugelassen oder blockiert werden kann</string>
|
||||
<string name="summary_ip6">IPv6-Datenverkehr an NetGuard weiterleiten, sodass er selektiv zugelassen oder blockiert werden kann</string>
|
||||
<string name="summary_wifi_home">WLAN-Regeln nur für ausgewähltes Netzwerk anwenden (Mobilfunknetz-Regeln für andere WLAN-Netzwerke anwenden)</string>
|
||||
<string name="summary_metered">Mobilfunk-Regeln auf volumenbeschränkte (kostenpflichtige, Tethering-) WLAN-Netzwerke anwenden</string>
|
||||
<string name="summary_metered_2g">WLAN-Regeln für 2G-Datenverbindungen anwenden</string>
|
||||
|
@ -140,12 +149,12 @@
|
|||
<string name="summary_eu_roaming">Roaming-Regeln nicht anwenden, wenn sich die Nationalitäten für SIM und mobiles Netzwerk innerhalb der EU befinden (Roaming wie Zuhause)</string>
|
||||
<string name="summary_call">NetGuard bei ein- oder ausgehenden Anrufen deaktivieren. Dadurch können Probleme bei IP-/WLAN-Telefonie gelöst werden.</string>
|
||||
<string name="summary_system">Regeln für System-Apps definieren (für Experten)</string>
|
||||
<string name="summary_log_app">Protokoll zeichnet den Internetzugriff von Anwendungen auf (Dadurch kann ein zusätzlicher Batterieverbrauch entstehen)</string>
|
||||
<string name="summary_access">Benachrichtigungsleiste anzeigen, wenn eine Anwendung versucht, auf eine neue Internetadresse zuzugreifen (bei deaktivierter Filterung werden nur blockierte Internet-Zugriffsversuche angezeigt)</string>
|
||||
<string name="summary_filter">IP-Pakete filtern, die den VPN-Tunnel verlassen. (Dadurch kann ein zusätzlicher Batterieverbrauch entstehen)</string>
|
||||
<string name="summary_track_usage">Anzahl der gesendeten und empfangenen Bytes für jede Anwendung und Adresse verfolgen. (Dadurch kann ein zusätzlicher Batterieverbrauch entstehen)</string>
|
||||
<string name="summary_log_app">Protokoll zeichnet den Internetzugriff von Apps auf. Das kann den Akkuverbrauch erhöhen!</string>
|
||||
<string name="summary_access">Benachrichtigung in der Statusleiste anzeigen, wenn eine App versucht, auf eine neue Internetadresse zuzugreifen (wenn das Filtern deaktiviert ist, werden nur blockierte Versuche auf den Internetzugriff angezeigt)</string>
|
||||
<string name="summary_filter">IP-Pakete filtern, die den VPN-Tunnel verlassen. Das kann den Akkuverbrauch erhöhen!</string>
|
||||
<string name="summary_track_usage">Anzahl der gesendeten und empfangenen Bytes für jede App und Adresse verfolgen. Das kann den Akkuverbrauch erhöhen!</string>
|
||||
<string name="summary_block_domains">Mit dem festgelegten DNS-Rückantwortcode auf blockierte Domainnamen antworten. Diese Option ist deaktiviert, wenn keine Hosts-Datei zur Verfügung steht.</string>
|
||||
<string name="summary_rcode">Der Standardwert ist 3 (NXDOMAIN) und bedeutet \'Nicht vorhandene Domain\'.</string>
|
||||
<string name="summary_rcode">Der Standardwert ist 3 (NXDOMAIN) und bedeutet »Nicht existierende Domain«.</string>
|
||||
<string name="summary_validate">Domainname, der verwendet wird, um die Internetverbindung unter Port 443 (HTTPS) zu validieren.</string>
|
||||
<string name="summary_socks5_enabled">Nur TCP-Datenverkehr wird an den Proxyserver gesendet</string>
|
||||
<string name="summary_watchdog">In regelmäßigen Abständen überprüfen, ob NetGuard noch läuft (Null, um diese Option zu deaktivieren). Das kann den Akkuverbrauch erhöhen!</string>
|
||||
|
@ -156,7 +165,8 @@
|
|||
<string name="msg_hosts">%1$d erlaubt, %2$d blockiert, %3$d Hosts</string>
|
||||
<string name="msg_waiting">Auf Ereignis warten</string>
|
||||
<string name="msg_disabled">NetGuard ist deaktiviert. Verwenden Sie den Schalter, um NetGuard zu aktivieren.</string>
|
||||
<string name="msg_revoked">NetGuard wurde deaktiviert. Wahrscheinlich durch Verwendung einer anderen VPN-Anwendung</string>
|
||||
<string name="msg_notifications">Tippen, um Benachrichtigungsberechtigungen zu erteilen (für Zugriffsversuchs-Benachrichtigungen, Fehlermeldungen usw.)</string>
|
||||
<string name="msg_revoked">NetGuard wurde deaktiviert. Wahrscheinlich durch das Verwenden einer anderen VPN-App</string>
|
||||
<string name="msg_installed">\'%1$s\' installiert</string>
|
||||
<string name="msg_installed_n">Wurde installiert</string>
|
||||
<string name="msg_access">%1$s versucht Internetzugriff</string>
|
||||
|
@ -168,17 +178,18 @@
|
|||
<string name="msg_start_failed">Android verhinderte den Start des VPN-Dienstes. Der Grund ist wahrscheinlich ein Fehler in der aktuellen Android-Version.</string>
|
||||
<string name="msg_try">NetGuard ausprobieren</string>
|
||||
<string name="msg_terms">Durch eine Spende stimmen Sie den <a href="http://www.netguard.me/#terms">AGB</a> zu.</string>
|
||||
<string name="msg_dimming">Falls Sie nicht auf OK im nächsten Fenster tippen können, manipuliert eine andere Anwendung Ihren Bildschirm.</string>
|
||||
<string name="msg_dimming">Falls Sie im nächsten Fenster nicht auf OK tippen können, manipuliert eine andere App Ihren Bildschirm.</string>
|
||||
<string name="msg_mbday">± %1$.3f▲ %2$.3f▼ MB/Tag</string>
|
||||
<string name="msg_kb">%1$7.3f▲ %2$7.3f▼ KB</string>
|
||||
<string name="msg_mb">%1$7.3f▲ %2$7.3f▼ MB</string>
|
||||
<string name="msg_gb">%1$7.3f▲ %2$7.3f▼ GB</string>
|
||||
<string name="msg_count">%dx</string>
|
||||
<string name="msg_doze">Für konsistente Ergebnisse sollten für NetGuard die Android-Batterie-Optimierungen deaktiviert werden.\n\nIm nächsten Dialogfenster wählen Sie ganz oben \"Alle Apps\", tippen auf NetGuard in der Liste und wählen und bestätigen \"Nicht optimieren\".</string>
|
||||
<string name="msg_datasaving">Für konsistente Ergebnisse sollten die Android-Datenspeicheroptionen für NetGuard deaktiviert werden.\n\nIm nächsten Fenster aktivieren Sie die Optionen \"Hintergrunddaten\" und \"Uneingeschränkte Datennutzung\".</string>
|
||||
<string name="msg_filter">Bei Verwendung von Filtern werden Daten- und Energiewerte erfasst und Android nimmt an, dass Daten und Energie von NetGuard statt von den ursprünglichen Anwendungen verbraucht werden</string>
|
||||
<string name="msg_filter4">Android 4 erfordert die Aktivierung der Filterung.</string>
|
||||
<string name="msg_log_disabled">Datenverkehrprotokollierung ist deaktiviert. Zum Aktivieren den Schalter oben verwenden. Die Protokollierung kann zu höherem Batterieverbrauch führen.</string>
|
||||
<string name="msg_doze">Für konsistente Ergebnisse sollten für NetGuard die Android-Akkuoptimierungen deaktiviert werden.
|
||||
\n\nIm nächsten Dialog wählen Sie ganz oben »Alle Apps«, tippen auf NetGuard in der Liste und wählen »Nicht optimieren«. Anschließend bestätigen.</string>
|
||||
<string name="msg_datasaving">Für konsistente Ergebnisse sollten die Android-Datenspeicheroptionen für NetGuard deaktiviert werden.\n\nIm nächsten Fenster aktivieren Sie die Optionen »Hintergrunddaten« und »Uneingeschränkte Datennutzung«.</string>
|
||||
<string name="msg_filter">Das Verwenden von Filtern führt dazu, dass Android den Daten- und Akkuverbrauch NetGuard zuordnet. Android geht davon aus, dass die Daten und der Akku von NetGuard statt von den jeweiligen Apps verbraucht werden</string>
|
||||
<string name="msg_filter4">Android 4 erfordert das Aktivieren der Filterung.</string>
|
||||
<string name="msg_log_disabled">Der Datenverkehr wird nicht protokolliert. Zum Aktivieren den Schalter oben verwenden. Das Protokollieren kann den Akkuverbrauch erhöhen.</string>
|
||||
<string name="msg_clear_rules">Dadurch werden die Regeln und Bedingungen auf ihre Standardwerte zurückgesetzt</string>
|
||||
<string name="msg_reset_access">Dadurch werden die Zugriffsversuche im Protokoll ohne Erlaubt-/Blockier-Regeln gelöscht</string>
|
||||
<string name="msg_import_last">Letzter Import: %s</string>
|
||||
|
@ -186,23 +197,23 @@
|
|||
<string name="msg_downloaded">Hosts-Datei heruntergeladen</string>
|
||||
<string name="msg_download_last">Letztes Herunterladen: %s</string>
|
||||
<string name="msg_start_forward">Weiterleitung von %2$d Port %1$s nach %3$s:%4$d von \'%5$s\' starten?</string>
|
||||
<string name="msg_stop_forward">Weiterleitung von %1$s Port %2$d stoppen?</string>
|
||||
<string name="msg_stop_forward">Weiterleitung von %1$s Port %2$d anhalten?</string>
|
||||
<string name="msg_metered">Volumenbeschränktes Netzwerk</string>
|
||||
<string name="msg_inactive">Keine aktive Internetverbindung</string>
|
||||
<string name="msg_queue">NetGuard ist beschäftigt</string>
|
||||
<string name="msg_update">Neue Version verfügbar, zum Herunterladen tippen</string>
|
||||
<string name="msg_usage">Sie können den Wi-Fi- oder mobilen Internet-Zugang zulassen (grünlich) oder verweigern (rötlich), indem Sie auf die Symbole neben einer Anwendung tippen</string>
|
||||
<string name="msg_fairemail">Falls Sie NetGuard installiert haben, um Ihre Privatsphäre zu schützen, könnten Sie auch an <a href="https://email.faircode.eu/">FairEmail</a>, einer Open-Source- und privatsphärenfreundlichen E-Mail-App, interessiert sein</string>
|
||||
<string name="msg_whitelist">Internet-Zugang ist standardmäßig erlaubt. Das kann in den Einstellungen geändert werden</string>
|
||||
<string name="msg_usage">Sie können den WLAN- oder mobilen Internetzugang erlauben (grünlich) oder blockieren (rötlich), indem Sie auf die Symbole neben einer App tippen</string>
|
||||
<string name="msg_fairemail">Falls Sie NetGuard installiert haben, um Ihre Privatsphäre zu schützen, könnten Sie auch an <a href="https://email.faircode.eu/">FairEmail</a>, einer quelloffenen und datenschutzfreundlichen E-Mail-App, interessiert sein</string>
|
||||
<string name="msg_whitelist">Internetzugang ist standardmäßig erlaubt. Das kann in den Einstellungen geändert werden</string>
|
||||
<string name="msg_push">Push-Nachrichten werden normalerweise durch die Systemkomponente Play-Dienste gesteuert, dieser ist standardmäßig der Internetzugang erlaubt</string>
|
||||
<string name="msg_system">Verwalten von Systemanwendungen kann in den erweiterten Optionen aktiviert werden</string>
|
||||
<string name="msg_system">Verwalten von System-Apps kann in den erweiterten Optionen aktiviert werden</string>
|
||||
<string name="msg_issue">Bitte beschreiben Sie Ihr Problem und geben Sie den Zeitpunkt an:</string>
|
||||
<string name="msg_vpn_cancelled">VPN-Verbindung abgebrochen\nHaben Sie eine anderes VPN für die Funktion \'VPN immer eingeschaltet\' konfiguriert?</string>
|
||||
<string name="msg_vpn_cancelled">VPN-Verbindung abgebrochen\nHaben Sie ein anderes VPN für die Funktion »Durchgehend aktives VPN« konfiguriert?</string>
|
||||
<string name="msg_on">Wenn NetGuard beim Ausschalten aktiv war, dann startet NetGuard beim Einschalten automatisch wieder.</string>
|
||||
<string name="msg_unavailable">Diese Funktion ist in dieser Android-Version nicht verfügbar</string>
|
||||
<string name="msg_always_on">Ein anderes VPN ist als \'VPN immer eingeschaltet\' festgelegt</string>
|
||||
<string name="msg_always_on_lockdown">Um NetGuard im Filtermodus benutzen zu können, deaktivieren Sie in den Android-VPN-Einstellungen \"Verbindungen ohne VPN blockieren\"</string>
|
||||
<string name="msg_private_dns">\"Private DNS\" unter Android-Netzwerkeinstellungen deaktivieren, um NetGuard im Filtermodus zu verwenden</string>
|
||||
<string name="msg_always_on">Ein anderes VPN ist als »Durchgehend aktives VPN« festgelegt</string>
|
||||
<string name="msg_always_on_lockdown">Um NetGuard im Filtermodus verwenden zu können, deaktivieren Sie in den Android-VPN-Einstellungen »Verbindungen ohne VPN blockieren«</string>
|
||||
<string name="msg_private_dns">»Privates DNS« in den Android-Netzwerkeinstellungen deaktivieren, um NetGuard im Filtermodus zu verwenden</string>
|
||||
<string name="title_lockdown_enabled">Datenverkehr ist eingeschränkt</string>
|
||||
<string name="title_unmetered_allowed">Netzwerkverkehr ohne Volumenbeschränkung ist erlaubt</string>
|
||||
<string name="title_unmetered_blocked">Nicht volumenbeschränkter Verkehr ist blockiert</string>
|
||||
|
@ -212,7 +223,7 @@
|
|||
<string name="title_metered_disabled">Beschränkte Regeln wurden nicht angewendet</string>
|
||||
<string name="title_host_allowed">Adresse ist erlaubt</string>
|
||||
<string name="title_host_blocked">Adresse ist blockiert</string>
|
||||
<string name="title_interactive_allowed">Erlauben, wenn Bildschirm an</string>
|
||||
<string name="title_interactive_allowed">Erlauben, wenn Bildschirm eingeschaltet ist</string>
|
||||
<string name="title_roaming_blocked">Bei Roaming blockieren</string>
|
||||
<string name="title_metered">Standardmäßig wird eine WLAN-Verbindung als nicht volumenbeschränkt und eine mobile Verbindung als volumenbeschränkt betrachtet.</string>
|
||||
<string name="title_internet">hat keine Internet-Berechtigung</string>
|
||||
|
@ -222,27 +233,27 @@
|
|||
<string name="title_apply">Regeln und Bedingungen anwenden</string>
|
||||
<string name="title_conditions">Bedingungen</string>
|
||||
<string name="title_screen_wifi">WLAN erlauben, wenn Bildschirm eingeschaltet ist</string>
|
||||
<string name="title_screen_other">Mobilfunk erlauben, wenn Bildschirm eingeschaltet ist</string>
|
||||
<string name="title_screen_other">Mobile Daten erlauben, wenn Bildschirm eingeschaltet ist</string>
|
||||
<string name="title_roaming_symbol">R</string>
|
||||
<string name="title_roaming">Bei Roaming blockieren</string>
|
||||
<string name="title_lockdown">Im Zugriffsbeschränkungsmodus erlauben</string>
|
||||
<string name="title_lockdown">Im zugriffsbeschränkten Modus erlauben</string>
|
||||
<string name="title_related">Filterabhängig</string>
|
||||
<string name="title_access">Zugriffsversuche</string>
|
||||
<string name="title_precedence">Zugriffsregeln haben vor anderen Regeln Vorrang</string>
|
||||
<string name="title_options">Optionen</string>
|
||||
<string name="title_notify">Bei Internetzugriffsversuchen benachrichtigen</string>
|
||||
<string name="title_logging_disabled">Protokollierung oder Filterung ist nicht aktiviert</string>
|
||||
<string name="title_logging_enabled">Protokollierung und Filterung sind aktiviert</string>
|
||||
<string name="title_logging_disabled">Protokollieren oder Filtern ist nicht aktiviert</string>
|
||||
<string name="title_logging_enabled">Protokollieren und Filtern ist aktiviert</string>
|
||||
<string name="title_logging_configure">Konfigurieren</string>
|
||||
<string name="title_enable_logging">Nur die Protokollierung für blockierte Adressen aktivieren</string>
|
||||
<string name="title_enable_filtering">Auch die Filterung für die Protokollierung erlaubter Adressen aktivieren</string>
|
||||
<string name="title_enable_notify">Zugriffsbenachrichtigungen für kürzlich protokollierte Adressen aktivieren</string>
|
||||
<string name="title_enable_logging">Das Protokollieren nur für blockierte Adressen aktivieren</string>
|
||||
<string name="title_enable_filtering">Filtern aktivieren, um auch erlaubte Adressen zu protokollieren</string>
|
||||
<string name="title_enable_notify">Zugriffsbenachrichtigungen für neu protokollierte Adressen aktivieren</string>
|
||||
<string name="title_enable_help0">Diese Einstellungen sind globale Einstellungen, die für alle Apps gelten.</string>
|
||||
<string name="title_enable_help1">Die Filterung ist auch für das Zulassen oder Blockieren einzelner Adressen erforderlich.</string>
|
||||
<string name="title_enable_help2">Die Protokollierung (weniger) oder Filterung (mehr) kann den Batterieverbrauch erhöhen und die Netzwerkgeschwindigkeit beeinflussen.</string>
|
||||
<string name="title_enable_help1">Das ist auch für das Zulassen oder Blockieren einzelner Adressen erforderlich</string>
|
||||
<string name="title_enable_help2">Das Protokollieren (weniger) oder Filtern (mehr) kann den Akkuverbrauch erhöhen und die Netzwerkgeschwindigkeit beeinflussen</string>
|
||||
<string name="title_rate">Bewerten</string>
|
||||
<string name="title_allow">Erlauben</string>
|
||||
<string name="title_block">Sperren</string>
|
||||
<string name="title_block">Blockieren</string>
|
||||
<string name="title_allow_wifi">WLAN erlauben</string>
|
||||
<string name="title_block_wifi">WLAN blockieren</string>
|
||||
<string name="title_allow_other">Mobile Daten erlauben</string>
|
||||
|
@ -260,7 +271,7 @@
|
|||
<string name="title_pro_filter">Netzwerkverkehr filtern</string>
|
||||
<string name="title_pro_notify">Benachrichtigung über neue App</string>
|
||||
<string name="title_pro_speed">Benachrichtigung mit Netzwerkgeschwindigkeitsgrafik</string>
|
||||
<string name="title_pro_theme">Aussehen (Design, Farben)</string>
|
||||
<string name="title_pro_theme">Erscheinungsbild (Design, Farben)</string>
|
||||
<string name="title_pro_all">Alle oben stehenden Pro-Funktionen</string>
|
||||
<string name="title_pro_dev">Entwicklung unterstützen</string>
|
||||
<string name="title_pro_buy">Kaufen</string>
|
||||
|
|
|
@ -8,8 +8,13 @@
|
|||
<string name="app_agree">I agree</string>
|
||||
<string name="app_disagree">I disagree</string>
|
||||
<string name="app_support">NetGuard needs your help. Tap to purchase pro features to keep the project going.</string>
|
||||
<string name="app_qap">.</string>
|
||||
<string name="channel_foreground">Running services</string>
|
||||
<string name="channel_notify">General notifications</string>
|
||||
<string name="channel_access">Access notifications</string>
|
||||
<string name="menu_search">Search for app</string>
|
||||
<string name="menu_filter">Menu_filtro</string>
|
||||
<string name="menu_app_system">Show system apps</string>
|
||||
<string name="menu_app_nointernet">Show apps without internet</string>
|
||||
<string name="menu_app_disabled">Show disabled apps</string>
|
||||
</resources>
|
||||
|
|
|
@ -8,6 +8,14 @@
|
|||
<string name="app_agree">J\'accepte</string>
|
||||
<string name="app_disagree">Je refuse</string>
|
||||
<string name="app_support">NetGuard a besoin de votre aide. Appuyez pour acheter des fonctionnalités Pro pour continuer à faire avancer le projet.</string>
|
||||
<string name="app_qap"> Google avait l\'intention de retirer l\'application du Play Store parce qu\'elle nécessitait une autorisation pour lister toutes les applications.
|
||||
Cinq requêtes assorties d\'une justification valable à propos du besoin de cette autorisation, ont été rejetées.
|
||||
Cette version de l\'application n\'utilise plus cette autorisation,
|
||||
et malgré cela, presque toutes les applications seront toujours listées,
|
||||
à l\'exception de certaines applications (système) qui ne peuvent pas être démarrées manuellement depuis la liste des applications d\'Android.
|
||||
Le trafic Internet de ces applications sera toujours autorisé afin de s\'assurer que votre appareil fonctionne correctement.
|
||||
Si ceci vous pose problème, vous pouvez mettre à jour l\'application en utilisant la version sur GitHub et gérer de nouveau toutes les applications (système).
|
||||
</string>
|
||||
<string name="channel_foreground">Services en cours d\'exécution</string>
|
||||
<string name="channel_notify">Notifications générales</string>
|
||||
<string name="channel_access">Accéder aux notifications</string>
|
||||
|
@ -156,6 +164,7 @@
|
|||
<string name="msg_hosts">%1$d autorisée(s), %2$d bloquée(s), %3$d hôte(s)</string>
|
||||
<string name="msg_waiting">En attente d\'évènement</string>
|
||||
<string name="msg_disabled">NetGuard est désactivé, utilisez le bouton ci-dessus pour activer NetGuard</string>
|
||||
<string name="msg_notifications">Appuyer pour accorder les autorisations de notification (pour les notifications de tentatives d\'accès, les messages d\'erreur, etc.)</string>
|
||||
<string name="msg_revoked">NetGuard a été désactivé, probablement en utilisant une autre application VPN</string>
|
||||
<string name="msg_installed">%1$s installé</string>
|
||||
<string name="msg_installed_n">A été installé</string>
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_description">NetGuard इंटरनेट तक पहुंच को अवरुद्ध करने के लिए सरल और उन्नत तरीके प्रदान करता है - कोई रूट आवश्यक नहीं है। ऐप्स और पते व्यक्तिगत रूप से आपके वाई-फाई और/या मोबाइल कनेक्शन तक पहुंच की अनुमति या अस्वीकार किए जा सकते हैं।</string>
|
||||
<string name="app_android">NetGuard को Android 5.1 या बाद के संस्करण की आवश्यकता है</string>
|
||||
<string name="app_xposed">Xposed बहुत से दुर्घटनाओं का कारण बनता है, जिसके परिणामस्वरूप Google Play Store से NetGuard को हटाया जा सकता है, इसलिए NetGuard समर्थित नहीं है, जब तक Xposed स्थापित है</string>
|
||||
<string name="app_privacy"><a href="https://www.netguard.me/privacy/">गोपनीयता नीति</a></string>
|
||||
<string name="app_description">NetGuard provides simple and advanced ways to block access to the internet - no root required. Apps and addresses can individually be allowed or denied access to your Wi-Fi and/or mobile connection.</string>
|
||||
<string name="app_android">NetGuard requires Android 5.1 or later</string>
|
||||
<string name="app_xposed">Xposed causes too many crashes, which might result in NetGuard being removed from the Google Play Store, therefore NetGuard isn\'t supported while Xposed is installed</string>
|
||||
<string name="app_privacy"><a href="https://www.netguard.me/privacy/">Privacy policy</a></string>
|
||||
<string name="app_first">नेटगार्ड को विकसित करने और परीक्षण करने के लिए बहुत सावधानी बरती गई है, हालांकि यह गारंटी देना असंभव है कि नेटगार्ड हर डिवाइस पर सही ढंग से काम करेगा।</string>
|
||||
<string name="app_agree">मैं सहमत हूँ</string>
|
||||
<string name="app_disagree">मैं असहमत हूं</string>
|
||||
|
|
|
@ -8,6 +8,12 @@
|
|||
<string name="app_agree">Acconsento</string>
|
||||
<string name="app_disagree">Nego il consenso</string>
|
||||
<string name="app_support">NetGuard ha bisogno del tuo aiuto. Tocca per acquistare le funzionalità pro per sostenere il progetto.</string>
|
||||
<string name="app_qap">Google aveva intenzione di rimuovere l\'app dal Play Store, perché richiedeva i permessi di investigare tutte le app.
|
||||
Cinque appelli e aver fornito una buona giustificazione sul perché questo permesso è necessario sono stati respinti.
|
||||
Questa versione dell\'app non richiede più questo permesso, e, nonostante ciò, quasi tutte le app sono ancora elencate,
|
||||
ad eccezione di alcune app (di sitema) che non possono essere avviate manualmente dalla lista delle app di Android.
|
||||
Il traffico internet di queste app sarà sempre permesso per assicurare che il tuo dispositivo continui a funzionare correttamente.
|
||||
Se pensi che questo sia un problema, potrai fare l\'update alla versione GitHub dell\'app e gestire ancora tutte le app (di sistema). </string>
|
||||
<string name="channel_foreground">Servizi in esecuzione</string>
|
||||
<string name="channel_notify">Notifiche generali</string>
|
||||
<string name="channel_access">Notifiche d\'accesso</string>
|
||||
|
@ -156,6 +162,7 @@
|
|||
<string name="msg_hosts">%1$d consentiti, %2$d bloccati, %3$d host</string>
|
||||
<string name="msg_waiting">In attesa dell\'evento</string>
|
||||
<string name="msg_disabled">NetGuard è disabilitato, usa l\'interruttore sopra per abilitare NetGuard</string>
|
||||
<string name="msg_notifications">Tocca per concedere le autorizzazioni per le notifiche (per le notifiche sui tentativi di accesso, messaggi di errore, etc.)</string>
|
||||
<string name="msg_revoked">NetGuard è stata disabilitata, probabilmente usando un\'altra app basata sul VPN</string>
|
||||
<string name="msg_installed">\'%1$s\' installata</string>
|
||||
<string name="msg_installed_n">È stata installata</string>
|
||||
|
|
|
@ -52,7 +52,7 @@
|
|||
<string name="title_external">עבור שרת חיצוני בחר \'ללא\'</string>
|
||||
<string name="setting_defaults">ברירות מחדל</string>
|
||||
<string name="setting_whitelist_wifi">חסום Wi-Fi</string>
|
||||
<string name="setting_whitelist_other">חסום נייד</string>
|
||||
<string name="setting_whitelist_other">חסימת תקשורת סלולרית</string>
|
||||
<string name="setting_screen_wifi">אפשר גישה לרשתות Wi-Fi כאשר המסך פועל</string>
|
||||
<string name="setting_screen_other">אפשר גישה לרשתות סלולריות כאשר המסך פועל</string>
|
||||
<string name="setting_whitelist_roaming">חסום נדידה</string>
|
||||
|
@ -157,6 +157,7 @@
|
|||
<string name="msg_hosts">%1$d אושרו, %2$d נחסמו, %3$d שרתים</string>
|
||||
<string name="msg_waiting">ממתין לאירוע</string>
|
||||
<string name="msg_disabled">NetGuard מנוטרל, השתמש במתג שמעל כדי לאפשר את NetGuard</string>
|
||||
<string name="msg_notifications">נגיעה תעניק הרשאות להתראות (להתראות על ניסיון גישה, הודעות שגיאה וכו׳)</string>
|
||||
<string name="msg_revoked">NetGuard מנוטרל, ככל הנראה בגלל שימוש ביישום מבוסס VPN אחר</string>
|
||||
<string name="msg_installed">\'%1$s\' מותקן</string>
|
||||
<string name="msg_installed_n">הותקן</string>
|
||||
|
|
|
@ -8,6 +8,13 @@
|
|||
<string name="app_agree">同意する</string>
|
||||
<string name="app_disagree">同意しない</string>
|
||||
<string name="app_support">NetGuard にはあなたの支援が必要です。プロジェクトを維持するため、タップしてプロ版を購入してください。</string>
|
||||
<string name="app_qap"> Google は、このアプリがすべてのアプリのクエリを実行する権限を要求することを理由に Play ストアから削除しようとしています。
|
||||
5 回の不服申し立てと、この権限を必要とする理由の弁明はすべて拒否されました。
|
||||
対策のため、このバージョンでは問題となった権限を要求しません。
|
||||
それでもほとんどのアプリは一覧に表示されますが、いくつかの (システム) アプリは Android アプリリストから操作できません。
|
||||
これらのアプリのインターネットトラフィックは、端末を正常に動作させ続けるために常に許可されます。
|
||||
この変更が問題となる場合には、Github 版を使用するとシステムアプリを含むすべてのアプリを管理できます。
|
||||
</string>
|
||||
<string name="channel_foreground">実行中のサービス</string>
|
||||
<string name="channel_notify">全般通知</string>
|
||||
<string name="channel_access">アクセス通知</string>
|
||||
|
@ -156,6 +163,7 @@
|
|||
<string name="msg_hosts">許可 %1$d、ブロック %2$d、ホスト %3$d</string>
|
||||
<string name="msg_waiting">イベントの待機中</string>
|
||||
<string name="msg_disabled">NetGuard は無効です。有効にするには上のスイッチを使用してください</string>
|
||||
<string name="msg_notifications">タップすると通知の権限を付与します (アクセス試行通知、エラーメッセージなど)</string>
|
||||
<string name="msg_revoked">NetGuard が無効にされました。別の VPN ベースのアプリケーションを使用した可能性があります</string>
|
||||
<string name="msg_installed">\'%1$s\' がインストールされました</string>
|
||||
<string name="msg_installed_n">インストールされています</string>
|
||||
|
|
|
@ -156,6 +156,7 @@
|
|||
<string name="msg_hosts">%1$d건 허용됨, %2$d건 차단됨, 호스트 %3$d개</string>
|
||||
<string name="msg_waiting">이벤트를 기다리는 중</string>
|
||||
<string name="msg_disabled">넷가드가 해제되어 있습니다. 상단 스위치를 사용해 넷가드를 활성화하세요.</string>
|
||||
<string name="msg_notifications">눌러서 알림 권한을 부여합니다 (접근 시도 알림, 오류 메시지 등을 표시할 때 필요)</string>
|
||||
<string name="msg_revoked">다른 VPN 기반 앱이 사용 중이라 NetGuard가 꺼졌습니다</string>
|
||||
<string name="msg_installed">\'%1$s\' 설치됨</string>
|
||||
<string name="msg_installed_n">설치되었습니다</string>
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<string name="app_disagree">ମୁଁ ସହମତ ନୁହେଁ</string>
|
||||
<string name="menu_settings">ସେଟିଂସମୂହ</string>
|
||||
<string name="menu_support">ସମର୍ଥନ</string>
|
||||
<string name="menu_about">ବିଷୟରେ</string>
|
||||
<string name="menu_about">ସମ୍ବନ୍ଧରେ</string>
|
||||
<string name="menu_protocol_other">ଅନ୍ୟ</string>
|
||||
<string name="title_protocol">ପ୍ରୋଟୋକଲ୍</string>
|
||||
<string name="setting_theme">ଥିମ୍: %1$s</string>
|
||||
|
|
|
@ -156,6 +156,7 @@
|
|||
<string name="msg_hosts">%1$d zezwolono, %2$d zablokowano, %3$d hosts</string>
|
||||
<string name="msg_waiting">Czekam na zdarzenie</string>
|
||||
<string name="msg_disabled">NetGuard jest wyłączony, użyj przełącznika u góry by go uruchomić</string>
|
||||
<string name="msg_notifications">Kliknij, aby przyznać uprawnienia do powiadomień (dla powiadomień o próbach dostępu, komunikatach o błędach itp.)</string>
|
||||
<string name="msg_revoked">NetGuard został wyłączony, prawdopodobnie poprzez inną aplikację bazującą na VPN</string>
|
||||
<string name="msg_installed">\'%1$s\' zainstalowane</string>
|
||||
<string name="msg_installed_n">Został zainstalowany</string>
|
||||
|
|
|
@ -8,6 +8,13 @@
|
|||
<string name="app_agree">Eu concordo</string>
|
||||
<string name="app_disagree">Eu discordo</string>
|
||||
<string name="app_support">NetGuard precisa da sua ajuda. Toque para comprar Recursos Pro para manter o projeto.</string>
|
||||
<string name="app_qap">A Google tinha intenção de remover o app da Play Store porque ele requisita permissão para buscar a lista de todos os aplicativos.
|
||||
Cinco apelos e uma boa justificativa do porquê essa permissão é necessária foram rejeitados.
|
||||
Esta versão do aplicativo não requer mais esta permissão,
|
||||
e apesar disso quase todos os apps ainda serão listados,
|
||||
exceto alguns apps (de sistema) que não podem ser iniciados manualmente da lista de apps do Android.
|
||||
O tráfego de internet para esses apps será sempre permitido a fim de garantir que seu dispositivo continue funcionando corretamente.
|
||||
Se acredita que isso é um problema, você pode atualizar para a versão do app hospedada no GitHub e voltar a gerenciar todos os apps (de sistema). </string>
|
||||
<string name="channel_foreground">Serviços em execução</string>
|
||||
<string name="channel_notify">Notificações Gerais</string>
|
||||
<string name="channel_access">Acessar notificações</string>
|
||||
|
@ -157,6 +164,7 @@
|
|||
<string name="msg_hosts">%1$d permitido, %2$d bloqueado, %3$d hosts</string>
|
||||
<string name="msg_waiting">Aguardando evento</string>
|
||||
<string name="msg_disabled">NetGuard desativado, use o interruptor acima para ativá-lo</string>
|
||||
<string name="msg_notifications">Toque em garantir permissão a notificações (para ser notificado de tentativas de acesso, mensagens de erro, etc.)</string>
|
||||
<string name="msg_revoked">NetGuard foi desativado, provavelmente outro aplicativo baseado em VPN esta sendo usado</string>
|
||||
<string name="msg_installed">\'%1$s\' instalado</string>
|
||||
<string name="msg_installed_n">Foi instalado</string>
|
||||
|
|
|
@ -8,6 +8,14 @@
|
|||
<string name="app_agree">Accept</string>
|
||||
<string name="app_disagree">Nu accept</string>
|
||||
<string name="app_support">NetGuard are nevoie de ajutorul dumneavoastră. Atingeți pentru a achiziționa funcții Pro și a susține proiectul.</string>
|
||||
<string name="app_qap"> Google avea de gând să elimine aplicația din Play Store, deoarece aceasta solicita permisiunea de a interoga lista de aplicații.
|
||||
Cinci apeluri și furnizarea unei justificări bune despre motivul pentru care este nevoie de această permisiune au fost respinse.
|
||||
Această versiune a aplicației nu mai solicită această permisiune,
|
||||
și, în ciuda acestui fapt, aproape toate aplicațiile vor fi în continuare listate,
|
||||
cu excepția unor aplicații (de sistem) care nu pot fi lansate manual din lista de aplicații Android.
|
||||
Traficul de internet al acestor aplicații va fi întotdeauna permis pentru a vă asigura că dispozitivul dvs. continuă să funcționeze corect.
|
||||
Dacă credeți că aceasta este o problemă, puteți actualiza la versiunea GitHub a aplicației și puteți gestiona din nou toate aplicațiile (de sistem).
|
||||
</string>
|
||||
<string name="channel_foreground">Serviciile care rulează</string>
|
||||
<string name="channel_notify">Notificări generale</string>
|
||||
<string name="channel_access">Notificări acces</string>
|
||||
|
@ -156,6 +164,7 @@
|
|||
<string name="msg_hosts">%1$d permise, %2$d blocate, %3$d domenii blocate</string>
|
||||
<string name="msg_waiting">Așteptare eveniment</string>
|
||||
<string name="msg_disabled">NetGuard este momentan dezactivat, folosește comutatorul de mai sus pentru a îl activa</string>
|
||||
<string name="msg_notifications">Atinge pentru a acorda permisiuni de notificare (pentru notificări de acces, mesaje de eroare, etc.)</string>
|
||||
<string name="msg_revoked">NetGuard a fost dezactivat, probabil de o altă aplicație ce folosește o conexiune VPN</string>
|
||||
<string name="msg_installed">\'%1$s\' instalat</string>
|
||||
<string name="msg_installed_n">A fost instalat</string>
|
||||
|
|
|
@ -8,6 +8,13 @@
|
|||
<string name="app_agree">Погоджуюся</string>
|
||||
<string name="app_disagree">Не погоджуюся</string>
|
||||
<string name="app_support">NetGuard потребує вашої допомоги. Торкніться, щоб придбати професійні функції й підтримати подальше продовження проекту.</string>
|
||||
<string name="app_qap"> Компанія Google мала намір видалити цей додаток із Play Store, оскільки він запитував дозвіл до всіх додатків.
|
||||
П\'ять апеляцій з обґрунтуванням того, чому цей дозвіл потрібен, були відхилені.
|
||||
Ця версія програми більше не запитує такого дозволу,
|
||||
але, попри це, майже всі програми залишаться в списку,
|
||||
за винятком деяких (системних) додатків, які не можна запустити вручну зі списку програм Android.
|
||||
Інтернет-трафік цих програм завжди буде дозволений, щоб гарантувати належну роботу вашого пристрою.
|
||||
Якщо вас це не влаштовує, ви можете оновити версію програми з GitHub і знову керувати всіма (системними) додатками. </string>
|
||||
<string name="channel_foreground">Запущені служби</string>
|
||||
<string name="channel_notify">Загальні сповіщення</string>
|
||||
<string name="channel_access">Сповіщеня про доступ</string>
|
||||
|
@ -156,6 +163,7 @@
|
|||
<string name="msg_hosts">%1$d дозволено, %2$d заблоковано, хостів - %3$d</string>
|
||||
<string name="msg_waiting">Очікування події</string>
|
||||
<string name="msg_disabled">NetGuard вимкнено. Для увімкнення скористайтеся перемикачем, розташованим вище</string>
|
||||
<string name="msg_notifications">Торкніться, щоб надати дозволи на сповіщення (щоб отримати доступ до спроб, повідомлень про помилки тощо)</string>
|
||||
<string name="msg_revoked">NetGuard було вимкнено, найімовірніше, через використання іншого VPN-підключення</string>
|
||||
<string name="msg_installed">%1$s встановлено</string>
|
||||
<string name="msg_installed_n">Було встановлено</string>
|
||||
|
|
|
@ -8,6 +8,14 @@
|
|||
<string name="app_agree">我同意</string>
|
||||
<string name="app_disagree">我不同意</string>
|
||||
<string name="app_support">NetGuard 需要您的協助。請點選購買 Pro 版本,使這個專案能繼續開發下去。</string>
|
||||
<string name="app_qap"> Google 本來要從 Play Store 上移除本應用程式,因為它要求能夠查詢所有應用程式的權限。
|
||||
儘管我們已經提出了五次申訴,並清楚說明需要此權限的理由,但仍然遭到拒絕。
|
||||
在目前這個版本中,我們將不再要求這項權限,
|
||||
儘管如此,除了那些無法從 Android 應用程式清單中點選執行的(系統)應用程式以外,
|
||||
其他應用程式都能夠正常列出。
|
||||
這些(系統)應用程式的網路流量將一直維持通過,以確保您的裝置能正常運作。
|
||||
如果您覺得這樣會造成困擾,可將此應用程式更新成 GitHub 版本,以重新獲得管理所有(系統)應用程式的權限。
|
||||
</string>
|
||||
<string name="channel_foreground">正在運行的服務</string>
|
||||
<string name="channel_notify">一般通知</string>
|
||||
<string name="channel_access">存取通知</string>
|
||||
|
@ -156,6 +164,7 @@
|
|||
<string name="msg_hosts">已允許 %1$d,已封鎖 %2$d,%3$d hosts</string>
|
||||
<string name="msg_waiting">等待事件</string>
|
||||
<string name="msg_disabled">NetGuard 已停用,請透過上方開關切換成啟用 NetGuard</string>
|
||||
<string name="msg_notifications">輕觸以授與「通知」權限(以利存取嘗試通知、錯誤訊息等)。</string>
|
||||
<string name="msg_revoked">NetGuard 已停用,很可能是使用其他具 VPN 功能的 app 所致</string>
|
||||
<string name="msg_installed">已安裝 \'%1$s\'</string>
|
||||
<string name="msg_installed_n">已經安裝了</string>
|
||||
|
|
|
@ -10,6 +10,15 @@
|
|||
<string name="app_agree">I agree</string>
|
||||
<string name="app_disagree">I disagree</string>
|
||||
<string name="app_support">NetGuard needs your help. Tap to purchase pro features to keep the project going.</string>
|
||||
<string name="app_qap">
|
||||
Google was going to remove the app from the Play Store because it requested permission to query all apps.
|
||||
Five appeals and providing a good justification about why this permission is needed were rejected.
|
||||
This version of the app does not request this permission anymore,
|
||||
and despite that, almost all apps will still be listed,
|
||||
except some (system) apps which cannot be started manually from the Android app list.
|
||||
The internet traffic of these apps will always be allowed to make sure your device keeps working correctly.
|
||||
If you think this is a problem, you can update to the GitHub version of the app and manage all (system) apps again.
|
||||
</string>
|
||||
|
||||
<string name="channel_foreground">Running services</string>
|
||||
<string name="channel_notify">General notifications</string>
|
||||
|
@ -102,6 +111,7 @@
|
|||
<string name="setting_handover">Seamless VPN handover on reload</string>
|
||||
<string name="setting_clear_onreload">Close connections on reload</string>
|
||||
<string name="setting_lockdown">Lockdown traffic</string>
|
||||
<string name="setting_malware" translatable="false">Malware protection</string>
|
||||
<string name="setting_track_usage">Track network usage</string>
|
||||
<string name="setting_reset_usage">Reset network usage</string>
|
||||
<string name="setting_show_resolved">Show resolved domain names</string>
|
||||
|
@ -184,6 +194,7 @@
|
|||
<string name="msg_revoked">NetGuard has been disabled, likely by using another VPN based app</string>
|
||||
<string name="msg_installed">\'%1$s\' installed</string>
|
||||
<string name="msg_installed_n">Has been installed</string>
|
||||
<string name="msg_malware" translatable="false">Possible malware: \'%1$s\'</string>
|
||||
<string name="msg_access">%1$s attempted internet access</string>
|
||||
<string name="msg_access_n">Attempted internet access</string>
|
||||
<string name="msg_completed">Action completed</string>
|
||||
|
@ -314,6 +325,7 @@ Your internet traffic is not being sent to a remote VPN server.</string>
|
|||
A monthly subscriptions of 1 or 2 euros (excluding local taxes) will activate all pro features.
|
||||
You can cancel or manage a subscription via the subscriptions tab in the Play store app.
|
||||
</string>
|
||||
<string name="title_pro_already">The pro features are already activated</string>
|
||||
|
||||
<string-array name="themeNames">
|
||||
<item>teal/orange</item>
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
android:key="screen_other"
|
||||
android:title="@string/setting_screen_other" />
|
||||
<CheckBoxPreference
|
||||
android:defaultValue="false"
|
||||
android:defaultValue="true"
|
||||
android:key="whitelist_roaming"
|
||||
android:title="@string/setting_whitelist_roaming" />
|
||||
</PreferenceCategory>
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
android:key="screen_other"
|
||||
android:title="@string/setting_screen_other" />
|
||||
<eu.faircode.netguard.SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:defaultValue="true"
|
||||
android:key="whitelist_roaming"
|
||||
android:title="@string/setting_whitelist_roaming" />
|
||||
</PreferenceCategory>
|
||||
|
|
|
@ -46,6 +46,13 @@
|
|||
package="com.google.android.apps.gcs"
|
||||
roaming="false" />
|
||||
|
||||
<wifi
|
||||
blocked="false"
|
||||
package="com.samsung.android.fmm" />
|
||||
<other
|
||||
blocked="false"
|
||||
package="com.samsung.android.fmm" />
|
||||
|
||||
<relation
|
||||
package="com.android.vending"
|
||||
related="com.google.android.gms,com.android.providers.downloads" />
|
||||
|
|
|
@ -0,0 +1,324 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:installLocation="internalOnly">
|
||||
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||
<uses-permission android:name="com.android.vending.BILLING" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
|
||||
<!-- http://developer.android.com/guide/topics/security/permissions.html#normal-dangerous -->
|
||||
|
||||
<!-- https://developer.android.com/preview/privacy/package-visibility -->
|
||||
<uses-permission
|
||||
android:name="android.permission.QUERY_ALL_PACKAGES"
|
||||
tools:node="remove" />
|
||||
<queries>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
</intent>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.PICK" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.GET_CONTENT" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.INSERT" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.EDIT" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.SENDTO" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent>
|
||||
</queries>
|
||||
|
||||
<permission
|
||||
android:name="eu.faircode.netguard.permission.ADMIN"
|
||||
android:description="@string/app_description"
|
||||
android:label="@string/app_name"
|
||||
android:protectionLevel="signature" />
|
||||
|
||||
<uses-permission android:name="eu.faircode.netguard.permission.ADMIN" />
|
||||
|
||||
<uses-feature
|
||||
android:name="android.hardware.wifi"
|
||||
android:required="false" />
|
||||
<uses-feature
|
||||
android:name="android.hardware.telephony"
|
||||
android:required="false" />
|
||||
<uses-feature
|
||||
android:name="android.software.app_widgets"
|
||||
android:required="false" />
|
||||
<uses-feature
|
||||
android:name="android.hardware.touchscreen"
|
||||
android:required="false" />
|
||||
|
||||
<application
|
||||
android:name="ApplicationEx"
|
||||
android:allowBackup="false"
|
||||
android:appCategory="productivity"
|
||||
android:description="@string/app_description"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:networkSecurityConfig="@xml/network_security_config"
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppThemeTeal"
|
||||
tools:ignore="ManifestResource">
|
||||
|
||||
<meta-data
|
||||
android:name="android.max_aspect"
|
||||
android:value="2.1" />
|
||||
|
||||
<activity
|
||||
android:name=".ActivityMain"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:exported="true"
|
||||
android:label="@string/app_name"
|
||||
android:launchMode="singleTop"
|
||||
android:resizeableActivity="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
<!-- intent-filter android:label="@string/app_name">
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
|
||||
<data
|
||||
android:host="www.netguard.me"
|
||||
android:pathPrefix="/"
|
||||
android:scheme="https" />
|
||||
</intent-filter-->
|
||||
|
||||
<meta-data
|
||||
android:name="android.app.shortcuts"
|
||||
android:resource="@xml/shortcuts" />
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".ActivitySettings"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:exported="true"
|
||||
android:label="@string/menu_settings"
|
||||
android:parentActivityName=".ActivityMain">
|
||||
<intent-filter>
|
||||
<action android:name="android.service.quicksettings.action.QS_TILE_PREFERENCES" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.APPLICATION_PREFERENCES" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value=".ActivityMain" />
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".ActivityLog"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/menu_log"
|
||||
android:parentActivityName=".ActivityMain">
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value=".ActivityMain" />
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".ActivityPro"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/title_pro"
|
||||
android:parentActivityName=".ActivityMain">
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value=".ActivityMain" />
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".ActivityDns"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/setting_show_resolved"
|
||||
android:parentActivityName=".ActivitySettings">
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value=".ActivitySettings" />
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".ActivityForwarding"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/setting_forwarding"
|
||||
android:parentActivityName=".ActivitySettings">
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value=".ActivitySettings" />
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".ActivityForwardApproval"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:exported="true"
|
||||
android:label="@string/app_name"
|
||||
android:theme="@style/AppDialog">
|
||||
<intent-filter>
|
||||
<action android:name="eu.faircode.netguard.START_PORT_FORWARD" />
|
||||
<action android:name="eu.faircode.netguard.STOP_PORT_FORWARD" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<service
|
||||
android:name=".ServiceSinkhole"
|
||||
android:exported="true"
|
||||
android:foregroundServiceType="dataSync"
|
||||
android:label="@string/app_name"
|
||||
android:permission="android.permission.BIND_VPN_SERVICE">
|
||||
<intent-filter>
|
||||
<action android:name="android.net.VpnService" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<service
|
||||
android:name=".ServiceExternal"
|
||||
android:exported="true"
|
||||
android:foregroundServiceType="dataSync"
|
||||
android:label="@string/app_name">
|
||||
<intent-filter>
|
||||
<action android:name="eu.faircode.netguard.DOWNLOAD_HOSTS_FILE" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<service
|
||||
android:name=".ServiceTileMain"
|
||||
android:exported="true"
|
||||
android:icon="@drawable/ic_security_white_24dp"
|
||||
android:label="@string/app_name"
|
||||
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
|
||||
<intent-filter>
|
||||
<action android:name="android.service.quicksettings.action.QS_TILE" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<service
|
||||
android:name=".ServiceTileGraph"
|
||||
android:exported="true"
|
||||
android:icon="@drawable/ic_equalizer_white_24dp"
|
||||
android:label="@string/setting_stats_category"
|
||||
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
|
||||
<intent-filter>
|
||||
<action android:name="android.service.quicksettings.action.QS_TILE" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<service
|
||||
android:name=".ServiceTileFilter"
|
||||
android:exported="true"
|
||||
android:icon="@drawable/ic_filter_list_white_24dp"
|
||||
android:label="@string/setting_filter"
|
||||
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
|
||||
<intent-filter>
|
||||
<action android:name="android.service.quicksettings.action.QS_TILE" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<service
|
||||
android:name=".ServiceTileLockdown"
|
||||
android:exported="true"
|
||||
android:icon="@drawable/ic_lock_outline_white_24dp"
|
||||
android:label="@string/setting_lockdown"
|
||||
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
|
||||
<intent-filter>
|
||||
<action android:name="android.service.quicksettings.action.QS_TILE" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<receiver
|
||||
android:name=".ReceiverAutostart"
|
||||
android:exported="true"
|
||||
android:label="@string/app_name">
|
||||
<intent-filter android:priority="999">
|
||||
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
||||
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<receiver
|
||||
android:name=".ReceiverPackageRemoved"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" />
|
||||
<data android:scheme="package" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<receiver
|
||||
android:name=".WidgetMain"
|
||||
android:exported="true"
|
||||
android:label="@string/app_name">
|
||||
<intent-filter>
|
||||
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
||||
</intent-filter>
|
||||
<meta-data
|
||||
android:name="android.appwidget.provider"
|
||||
android:resource="@xml/widgetmain" />
|
||||
</receiver>
|
||||
|
||||
<receiver
|
||||
android:name=".WidgetLockdown"
|
||||
android:exported="true"
|
||||
android:label="@string/setting_lockdown">
|
||||
<intent-filter>
|
||||
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
||||
</intent-filter>
|
||||
<meta-data
|
||||
android:name="android.appwidget.provider"
|
||||
android:resource="@xml/widgetlockdown" />
|
||||
</receiver>
|
||||
|
||||
<receiver
|
||||
android:name=".WidgetAdmin"
|
||||
android:exported="true"
|
||||
android:label="@string/app_name"
|
||||
android:permission="eu.faircode.netguard.permission.ADMIN">
|
||||
<intent-filter>
|
||||
<action android:name="eu.faircode.netguard.ON" />
|
||||
<action android:name="eu.faircode.netguard.OFF" />
|
||||
<action android:name="eu.faircode.netguard.LOCKDOWN_ON" />
|
||||
<action android:name="eu.faircode.netguard.LOCKDOWN_OFF" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
</application>
|
||||
</manifest>
|
Loading…
Reference in New Issue