tunnel: remove kernel module downloader
Nathan Chance dropped the ball repeatedly and never maintained this in a consistent way that anybody could use. With Android 12 out now, just drop it all together. A bummer, but I don't see much of a choice. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
		
							parent
							
								
									447b06ec2c
								
							
						
					
					
						commit
						a03ad51622
					
				@ -53,6 +53,10 @@ public final class WgQuickBackend implements Backend {
 | 
				
			|||||||
        this.toolsInstaller = toolsInstaller;
 | 
					        this.toolsInstaller = toolsInstaller;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static boolean hasKernelSupport() {
 | 
				
			||||||
 | 
					        return new File("/sys/module/wireguard").exists();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public Set<String> getRunningTunnelNames() {
 | 
					    public Set<String> getRunningTunnelNames() {
 | 
				
			||||||
        final List<String> output = new ArrayList<>();
 | 
					        final List<String> output = new ArrayList<>();
 | 
				
			||||||
 | 
				
			|||||||
@ -1,215 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 * Copyright © 2019-2020 WireGuard LLC. All Rights Reserved.
 | 
					 | 
				
			||||||
 * SPDX-License-Identifier: Apache-2.0
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package com.wireguard.android.util;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import android.content.Context;
 | 
					 | 
				
			||||||
import android.system.OsConstants;
 | 
					 | 
				
			||||||
import android.util.Base64;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.wireguard.android.util.RootShell.RootShellException;
 | 
					 | 
				
			||||||
import com.wireguard.crypto.Ed25519;
 | 
					 | 
				
			||||||
import com.wireguard.util.NonNullForAll;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.io.File;
 | 
					 | 
				
			||||||
import java.io.FileOutputStream;
 | 
					 | 
				
			||||||
import java.io.IOException;
 | 
					 | 
				
			||||||
import java.io.InputStream;
 | 
					 | 
				
			||||||
import java.net.HttpURLConnection;
 | 
					 | 
				
			||||||
import java.net.URL;
 | 
					 | 
				
			||||||
import java.nio.charset.StandardCharsets;
 | 
					 | 
				
			||||||
import java.security.InvalidParameterException;
 | 
					 | 
				
			||||||
import java.security.MessageDigest;
 | 
					 | 
				
			||||||
import java.security.NoSuchAlgorithmException;
 | 
					 | 
				
			||||||
import java.util.ArrayList;
 | 
					 | 
				
			||||||
import java.util.Arrays;
 | 
					 | 
				
			||||||
import java.util.HashMap;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
import java.util.Map;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import androidx.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Class that implements the logic for downloading and loading signed, prebuilt modules for
 | 
					 | 
				
			||||||
 * WireGuard into the running kernel.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
@NonNullForAll
 | 
					 | 
				
			||||||
@SuppressWarnings("MagicNumber")
 | 
					 | 
				
			||||||
public class ModuleLoader {
 | 
					 | 
				
			||||||
    private static final String MODULE_LIST_URL = "https://download.wireguard.com/android-module/modules.txt.sig";
 | 
					 | 
				
			||||||
    private static final String MODULE_NAME = "wireguard-%s.ko";
 | 
					 | 
				
			||||||
    private static final String MODULE_PUBLIC_KEY_BASE64 = "RWRmHuT9PSqtwfsLtEx+QS06BJtLgFYteL9WCNjH7yuyu5Y1DieSN7If";
 | 
					 | 
				
			||||||
    private static final String MODULE_URL = "https://download.wireguard.com/android-module/%s";
 | 
					 | 
				
			||||||
    private final File moduleDir;
 | 
					 | 
				
			||||||
    private final RootShell rootShell;
 | 
					 | 
				
			||||||
    private final File tmpDir;
 | 
					 | 
				
			||||||
    private final String userAgent;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Public constructor for ModuleLoader
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param context   A {@link Context} instance.
 | 
					 | 
				
			||||||
     * @param rootShell A {@link RootShell} instance used to run elevated commands required for module
 | 
					 | 
				
			||||||
     *                  loading.
 | 
					 | 
				
			||||||
     * @param userAgent A {@link String} that represents the User-Agent string used for connections
 | 
					 | 
				
			||||||
     *                  to the upstream server.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public ModuleLoader(final Context context, final RootShell rootShell, final String userAgent) {
 | 
					 | 
				
			||||||
        moduleDir = new File(context.getCacheDir(), "kmod");
 | 
					 | 
				
			||||||
        tmpDir = new File(context.getCacheDir(), "tmp");
 | 
					 | 
				
			||||||
        this.rootShell = rootShell;
 | 
					 | 
				
			||||||
        this.userAgent = userAgent;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Check whether a WireGuard module is already loaded into the kernel.
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @return boolean indicating if WireGuard is already enabled in the kernel.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public static boolean isModuleLoaded() {
 | 
					 | 
				
			||||||
        return new File("/sys/module/wireguard").exists();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Download the correct WireGuard module for the device
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @return {@link OsConstants}.EXIT_SUCCESS if everything succeeds, ENOENT otherwise.
 | 
					 | 
				
			||||||
     * @throws IOException              if the remote hash list was not found or empty.
 | 
					 | 
				
			||||||
     * @throws RootShellException       if {@link RootShell} has a failure executing elevated commands.
 | 
					 | 
				
			||||||
     * @throws NoSuchAlgorithmException if SHA256 algorithm is not available in device JDK.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public Integer download() throws IOException, RootShellException, NoSuchAlgorithmException {
 | 
					 | 
				
			||||||
        final List<String> output = new ArrayList<>();
 | 
					 | 
				
			||||||
        rootShell.run(output, "sha256sum /proc/version|cut -d ' ' -f 1");
 | 
					 | 
				
			||||||
        if (output.size() != 1 || output.get(0).length() != 64)
 | 
					 | 
				
			||||||
            throw new InvalidParameterException("Invalid sha256 of /proc/version");
 | 
					 | 
				
			||||||
        final String moduleName = String.format(MODULE_NAME, output.get(0));
 | 
					 | 
				
			||||||
        HttpURLConnection connection = (HttpURLConnection) new URL(MODULE_LIST_URL).openConnection();
 | 
					 | 
				
			||||||
        connection.setRequestProperty("User-Agent", userAgent);
 | 
					 | 
				
			||||||
        connection.connect();
 | 
					 | 
				
			||||||
        if (connection.getResponseCode() != HttpURLConnection.HTTP_OK)
 | 
					 | 
				
			||||||
            throw new IOException("Hash list could not be found");
 | 
					 | 
				
			||||||
        final byte[] input = new byte[1024 * 1024 * 3 /* 3MiB */];
 | 
					 | 
				
			||||||
        int len;
 | 
					 | 
				
			||||||
        try (final InputStream inputStream = connection.getInputStream()) {
 | 
					 | 
				
			||||||
            int offset = 0;
 | 
					 | 
				
			||||||
            while (input.length - offset > 0 && (len = inputStream.read(input, offset, input.length - offset)) > 0) {
 | 
					 | 
				
			||||||
                offset += len;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            len = offset;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (len <= 0)
 | 
					 | 
				
			||||||
            throw new IOException("Hash list was empty");
 | 
					 | 
				
			||||||
        final Map<String, Sha256Digest> modules = verifySignedHashes(new String(input, 0, len, StandardCharsets.UTF_8));
 | 
					 | 
				
			||||||
        if (modules == null)
 | 
					 | 
				
			||||||
            throw new InvalidParameterException("The signature did not verify or invalid hash list format");
 | 
					 | 
				
			||||||
        if (!modules.containsKey(moduleName))
 | 
					 | 
				
			||||||
            return OsConstants.ENOENT;
 | 
					 | 
				
			||||||
        connection = (HttpURLConnection) new URL(String.format(MODULE_URL, moduleName)).openConnection();
 | 
					 | 
				
			||||||
        connection.setRequestProperty("User-Agent", userAgent);
 | 
					 | 
				
			||||||
        connection.connect();
 | 
					 | 
				
			||||||
        if (connection.getResponseCode() != HttpURLConnection.HTTP_OK)
 | 
					 | 
				
			||||||
            throw new IOException("Module file could not be found, despite being on hash list");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        tmpDir.mkdirs();
 | 
					 | 
				
			||||||
        moduleDir.mkdir();
 | 
					 | 
				
			||||||
        File tempFile = null;
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            tempFile = File.createTempFile("UNVERIFIED-", null, tmpDir);
 | 
					 | 
				
			||||||
            final MessageDigest digest = MessageDigest.getInstance("SHA-256");
 | 
					 | 
				
			||||||
            try (final InputStream inputStream = connection.getInputStream();
 | 
					 | 
				
			||||||
                 final FileOutputStream outputStream = new FileOutputStream(tempFile)) {
 | 
					 | 
				
			||||||
                int total = 0;
 | 
					 | 
				
			||||||
                while ((len = inputStream.read(input)) > 0) {
 | 
					 | 
				
			||||||
                    total += len;
 | 
					 | 
				
			||||||
                    if (total > 1024 * 1024 * 15 /* 15 MiB */)
 | 
					 | 
				
			||||||
                        throw new IOException("File too big");
 | 
					 | 
				
			||||||
                    outputStream.write(input, 0, len);
 | 
					 | 
				
			||||||
                    digest.update(input, 0, len);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                outputStream.getFD().sync();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            if (!Arrays.equals(digest.digest(), modules.get(moduleName).bytes))
 | 
					 | 
				
			||||||
                throw new IOException("Incorrect file hash");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (!tempFile.renameTo(new File(moduleDir, moduleName)))
 | 
					 | 
				
			||||||
                throw new IOException("Unable to rename to final destination");
 | 
					 | 
				
			||||||
        } finally {
 | 
					 | 
				
			||||||
            if (tempFile != null)
 | 
					 | 
				
			||||||
                tempFile.delete();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return OsConstants.EXIT_SUCCESS;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Load the downloaded module. ModuleLoader#download must be called before this.
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @throws IOException        if {@link RootShell} has a failure executing elevated commands.
 | 
					 | 
				
			||||||
     * @throws RootShellException if {@link RootShell} has a failure executing elevated commands.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public void loadModule() throws IOException, RootShellException {
 | 
					 | 
				
			||||||
        rootShell.run(null, String.format("insmod \"%s/wireguard-$(sha256sum /proc/version|cut -d ' ' -f 1).ko\"", moduleDir.getAbsolutePath()));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Check if the module might already exist in the app's data.
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @return boolean indicating whether downloadable module might exist already.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public boolean moduleMightExist() {
 | 
					 | 
				
			||||||
        return moduleDir.exists() && moduleDir.isDirectory();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Nullable
 | 
					 | 
				
			||||||
    private Map<String, Sha256Digest> verifySignedHashes(final String signifyDigest) {
 | 
					 | 
				
			||||||
        byte[] publicKeyBytes = Base64.decode(MODULE_PUBLIC_KEY_BASE64, Base64.DEFAULT);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (publicKeyBytes == null || publicKeyBytes.length != 32 + 10 || publicKeyBytes[0] != 'E' || publicKeyBytes[1] != 'd')
 | 
					 | 
				
			||||||
            return null;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        final String[] lines = signifyDigest.split("\n", 3);
 | 
					 | 
				
			||||||
        if (lines.length != 3)
 | 
					 | 
				
			||||||
            return null;
 | 
					 | 
				
			||||||
        if (!lines[0].startsWith("untrusted comment: "))
 | 
					 | 
				
			||||||
            return null;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        byte[] signatureBytes = Base64.decode(lines[1], Base64.DEFAULT);
 | 
					 | 
				
			||||||
        if (signatureBytes == null || signatureBytes.length != 64 + 10)
 | 
					 | 
				
			||||||
            return null;
 | 
					 | 
				
			||||||
        for (int i = 0; i < 10; ++i) {
 | 
					 | 
				
			||||||
            if (signatureBytes[i] != publicKeyBytes[i])
 | 
					 | 
				
			||||||
                return null;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        publicKeyBytes = Arrays.copyOfRange(publicKeyBytes, 10, 10 + 32);
 | 
					 | 
				
			||||||
        signatureBytes = Arrays.copyOfRange(signatureBytes, 10, 10 + 64);
 | 
					 | 
				
			||||||
        if (!Ed25519.verify(lines[2].getBytes(StandardCharsets.UTF_8), signatureBytes, publicKeyBytes))
 | 
					 | 
				
			||||||
            return null;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        final Map<String, Sha256Digest> hashes = new HashMap<>();
 | 
					 | 
				
			||||||
        for (final String line : lines[2].split("\n")) {
 | 
					 | 
				
			||||||
            final String[] components = line.split(" {2}", 2);
 | 
					 | 
				
			||||||
            if (components.length != 2)
 | 
					 | 
				
			||||||
                return null;
 | 
					 | 
				
			||||||
            try {
 | 
					 | 
				
			||||||
                hashes.put(components[1], new Sha256Digest(components[0]));
 | 
					 | 
				
			||||||
            } catch (final Exception ignored) {
 | 
					 | 
				
			||||||
                return null;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return hashes;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private static final class Sha256Digest {
 | 
					 | 
				
			||||||
        private final byte[] bytes;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        private Sha256Digest(final String hex) {
 | 
					 | 
				
			||||||
            if (hex.length() != 64)
 | 
					 | 
				
			||||||
                throw new InvalidParameterException("SHA256 hashes must be 32 bytes long");
 | 
					 | 
				
			||||||
            bytes = new byte[32];
 | 
					 | 
				
			||||||
            for (int i = 0; i < 32; ++i)
 | 
					 | 
				
			||||||
                bytes[i] = (byte) Integer.parseInt(hex.substring(i * 2, i * 2 + 2), 16);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -21,7 +21,6 @@ import com.wireguard.android.backend.GoBackend
 | 
				
			|||||||
import com.wireguard.android.backend.WgQuickBackend
 | 
					import com.wireguard.android.backend.WgQuickBackend
 | 
				
			||||||
import com.wireguard.android.configStore.FileConfigStore
 | 
					import com.wireguard.android.configStore.FileConfigStore
 | 
				
			||||||
import com.wireguard.android.model.TunnelManager
 | 
					import com.wireguard.android.model.TunnelManager
 | 
				
			||||||
import com.wireguard.android.util.ModuleLoader
 | 
					 | 
				
			||||||
import com.wireguard.android.util.RootShell
 | 
					import com.wireguard.android.util.RootShell
 | 
				
			||||||
import com.wireguard.android.util.ToolsInstaller
 | 
					import com.wireguard.android.util.ToolsInstaller
 | 
				
			||||||
import com.wireguard.android.util.UserKnobs
 | 
					import com.wireguard.android.util.UserKnobs
 | 
				
			||||||
@ -42,7 +41,6 @@ class Application : android.app.Application() {
 | 
				
			|||||||
    private val futureBackend = CompletableDeferred<Backend>()
 | 
					    private val futureBackend = CompletableDeferred<Backend>()
 | 
				
			||||||
    private val coroutineScope = CoroutineScope(Job() + Dispatchers.Main.immediate)
 | 
					    private val coroutineScope = CoroutineScope(Job() + Dispatchers.Main.immediate)
 | 
				
			||||||
    private var backend: Backend? = null
 | 
					    private var backend: Backend? = null
 | 
				
			||||||
    private lateinit var moduleLoader: ModuleLoader
 | 
					 | 
				
			||||||
    private lateinit var rootShell: RootShell
 | 
					    private lateinit var rootShell: RootShell
 | 
				
			||||||
    private lateinit var preferencesDataStore: DataStore<Preferences>
 | 
					    private lateinit var preferencesDataStore: DataStore<Preferences>
 | 
				
			||||||
    private lateinit var toolsInstaller: ToolsInstaller
 | 
					    private lateinit var toolsInstaller: ToolsInstaller
 | 
				
			||||||
@ -67,15 +65,7 @@ class Application : android.app.Application() {
 | 
				
			|||||||
    private suspend fun determineBackend(): Backend {
 | 
					    private suspend fun determineBackend(): Backend {
 | 
				
			||||||
        var backend: Backend? = null
 | 
					        var backend: Backend? = null
 | 
				
			||||||
        var didStartRootShell = false
 | 
					        var didStartRootShell = false
 | 
				
			||||||
        if (!ModuleLoader.isModuleLoaded() && moduleLoader.moduleMightExist()) {
 | 
					        if (UserKnobs.enableKernelModule.first() && WgQuickBackend.hasKernelSupport()) {
 | 
				
			||||||
            try {
 | 
					 | 
				
			||||||
                rootShell.start()
 | 
					 | 
				
			||||||
                didStartRootShell = true
 | 
					 | 
				
			||||||
                moduleLoader.loadModule()
 | 
					 | 
				
			||||||
            } catch (ignored: Exception) {
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (!UserKnobs.disableKernelModule.first() && ModuleLoader.isModuleLoaded()) {
 | 
					 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
                if (!didStartRootShell)
 | 
					                if (!didStartRootShell)
 | 
				
			||||||
                    rootShell.start()
 | 
					                    rootShell.start()
 | 
				
			||||||
@ -100,7 +90,6 @@ class Application : android.app.Application() {
 | 
				
			|||||||
        super.onCreate()
 | 
					        super.onCreate()
 | 
				
			||||||
        rootShell = RootShell(applicationContext)
 | 
					        rootShell = RootShell(applicationContext)
 | 
				
			||||||
        toolsInstaller = ToolsInstaller(applicationContext, rootShell)
 | 
					        toolsInstaller = ToolsInstaller(applicationContext, rootShell)
 | 
				
			||||||
        moduleLoader = ModuleLoader(applicationContext, rootShell, USER_AGENT)
 | 
					 | 
				
			||||||
        preferencesDataStore = PreferenceDataStoreFactory.create { applicationContext.preferencesDataStoreFile("settings") }
 | 
					        preferencesDataStore = PreferenceDataStoreFactory.create { applicationContext.preferencesDataStoreFile("settings") }
 | 
				
			||||||
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
 | 
					        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
 | 
				
			||||||
            coroutineScope.launch {
 | 
					            coroutineScope.launch {
 | 
				
			||||||
@ -140,9 +129,6 @@ class Application : android.app.Application() {
 | 
				
			|||||||
        @JvmStatic
 | 
					        @JvmStatic
 | 
				
			||||||
        suspend fun getBackend() = get().futureBackend.await()
 | 
					        suspend fun getBackend() = get().futureBackend.await()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @JvmStatic
 | 
					 | 
				
			||||||
        fun getModuleLoader() = get().moduleLoader
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        @JvmStatic
 | 
					        @JvmStatic
 | 
				
			||||||
        fun getRootShell() = get().rootShell
 | 
					        fun getRootShell() = get().rootShell
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -17,7 +17,6 @@ import com.wireguard.android.R
 | 
				
			|||||||
import com.wireguard.android.backend.WgQuickBackend
 | 
					import com.wireguard.android.backend.WgQuickBackend
 | 
				
			||||||
import com.wireguard.android.preference.PreferencesPreferenceDataStore
 | 
					import com.wireguard.android.preference.PreferencesPreferenceDataStore
 | 
				
			||||||
import com.wireguard.android.util.AdminKnobs
 | 
					import com.wireguard.android.util.AdminKnobs
 | 
				
			||||||
import com.wireguard.android.util.ModuleLoader
 | 
					 | 
				
			||||||
import kotlinx.coroutines.Dispatchers
 | 
					import kotlinx.coroutines.Dispatchers
 | 
				
			||||||
import kotlinx.coroutines.launch
 | 
					import kotlinx.coroutines.launch
 | 
				
			||||||
import kotlinx.coroutines.withContext
 | 
					import kotlinx.coroutines.withContext
 | 
				
			||||||
@ -79,30 +78,19 @@ class SettingsActivity : ThemeChangeAwareActivity() {
 | 
				
			|||||||
                startActivity(Intent(requireContext(), LogViewerActivity::class.java))
 | 
					                startActivity(Intent(requireContext(), LogViewerActivity::class.java))
 | 
				
			||||||
                true
 | 
					                true
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            val moduleInstaller = preferenceManager.findPreference<Preference>("module_downloader")
 | 
					            val kernelModuleEnabler = preferenceManager.findPreference<Preference>("kernel_module_enabler")
 | 
				
			||||||
            val kernelModuleDisabler = preferenceManager.findPreference<Preference>("kernel_module_disabler")
 | 
					            if (WgQuickBackend.hasKernelSupport()) {
 | 
				
			||||||
            moduleInstaller?.isVisible = false
 | 
					 | 
				
			||||||
            if (ModuleLoader.isModuleLoaded()) {
 | 
					 | 
				
			||||||
                moduleInstaller?.parent?.removePreference(moduleInstaller)
 | 
					 | 
				
			||||||
                lifecycleScope.launch {
 | 
					                lifecycleScope.launch {
 | 
				
			||||||
                    if (Application.getBackend() !is WgQuickBackend) {
 | 
					                    if (Application.getBackend() !is WgQuickBackend) {
 | 
				
			||||||
                        try {
 | 
					                        try {
 | 
				
			||||||
                            withContext(Dispatchers.IO) { Application.getRootShell().start() }
 | 
					                            withContext(Dispatchers.IO) { Application.getRootShell().start() }
 | 
				
			||||||
                        } catch (_: Throwable) {
 | 
					                        } catch (_: Throwable) {
 | 
				
			||||||
                            kernelModuleDisabler?.parent?.removePreference(kernelModuleDisabler)
 | 
					                            kernelModuleEnabler?.parent?.removePreference(kernelModuleEnabler)
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                kernelModuleDisabler?.parent?.removePreference(kernelModuleDisabler)
 | 
					                kernelModuleEnabler?.parent?.removePreference(kernelModuleEnabler)
 | 
				
			||||||
                lifecycleScope.launch {
 | 
					 | 
				
			||||||
                    try {
 | 
					 | 
				
			||||||
                        withContext(Dispatchers.IO) { Application.getRootShell().start() }
 | 
					 | 
				
			||||||
                        moduleInstaller?.isVisible = true
 | 
					 | 
				
			||||||
                    } catch (_: Throwable) {
 | 
					 | 
				
			||||||
                        moduleInstaller?.parent?.removePreference(moduleInstaller)
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -26,7 +26,7 @@ import kotlinx.coroutines.launch
 | 
				
			|||||||
import kotlinx.coroutines.withContext
 | 
					import kotlinx.coroutines.withContext
 | 
				
			||||||
import kotlin.system.exitProcess
 | 
					import kotlin.system.exitProcess
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class KernelModuleDisablerPreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
 | 
					class KernelModuleEnablerPreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
 | 
				
			||||||
    private var state = State.UNKNOWN
 | 
					    private var state = State.UNKNOWN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    init {
 | 
					    init {
 | 
				
			||||||
@ -44,10 +44,10 @@ class KernelModuleDisablerPreference(context: Context, attrs: AttributeSet?) : P
 | 
				
			|||||||
        activity.lifecycleScope.launch {
 | 
					        activity.lifecycleScope.launch {
 | 
				
			||||||
            if (state == State.DISABLED) {
 | 
					            if (state == State.DISABLED) {
 | 
				
			||||||
                setState(State.ENABLING)
 | 
					                setState(State.ENABLING)
 | 
				
			||||||
                UserKnobs.setDisableKernelModule(false)
 | 
					                UserKnobs.setEnableKernelModule(true)
 | 
				
			||||||
            } else if (state == State.ENABLED) {
 | 
					            } else if (state == State.ENABLED) {
 | 
				
			||||||
                setState(State.DISABLING)
 | 
					                setState(State.DISABLING)
 | 
				
			||||||
                UserKnobs.setDisableKernelModule(true)
 | 
					                UserKnobs.setEnableKernelModule(false)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            val observableTunnels = Application.getTunnelManager().getTunnels()
 | 
					            val observableTunnels = Application.getTunnelManager().getTunnels()
 | 
				
			||||||
            val downings = observableTunnels.map { async(SupervisorJob()) { it.setStateAsync(Tunnel.State.DOWN) } }
 | 
					            val downings = observableTunnels.map { async(SupervisorJob()) { it.setStateAsync(Tunnel.State.DOWN) } }
 | 
				
			||||||
@ -76,13 +76,13 @@ class KernelModuleDisablerPreference(context: Context, attrs: AttributeSet?) : P
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private enum class State(val titleResourceId: Int, val summaryResourceId: Int, val shouldEnableView: Boolean, val visible: Boolean) {
 | 
					    private enum class State(val titleResourceId: Int, val summaryResourceId: Int, val shouldEnableView: Boolean, val visible: Boolean) {
 | 
				
			||||||
        UNKNOWN(0, 0, false, false),
 | 
					        UNKNOWN(0, 0, false, false),
 | 
				
			||||||
        ENABLED(R.string.module_disabler_enabled_title, R.string.module_disabler_enabled_summary, true, true),
 | 
					        ENABLED(R.string.module_enabler_enabled_title, R.string.module_enabler_enabled_summary, true, true),
 | 
				
			||||||
        DISABLED(R.string.module_disabler_disabled_title, R.string.module_disabler_disabled_summary, true, true),
 | 
					        DISABLED(R.string.module_enabler_disabled_title, R.string.module_enabler_disabled_summary, true, true),
 | 
				
			||||||
        ENABLING(R.string.module_disabler_disabled_title, R.string.success_application_will_restart, false, true),
 | 
					        ENABLING(R.string.module_enabler_disabled_title, R.string.success_application_will_restart, false, true),
 | 
				
			||||||
        DISABLING(R.string.module_disabler_enabled_title, R.string.success_application_will_restart, false, true);
 | 
					        DISABLING(R.string.module_enabler_enabled_title, R.string.success_application_will_restart, false, true);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    companion object {
 | 
					    companion object {
 | 
				
			||||||
        private const val TAG = "WireGuard/KernelModuleDisablerPreference"
 | 
					        private const val TAG = "WireGuard/KernelModuleEnablerPreference"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -1,70 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 * Copyright © 2019 WireGuard LLC. All Rights Reserved.
 | 
					 | 
				
			||||||
 * SPDX-License-Identifier: Apache-2.0
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
package com.wireguard.android.preference
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import android.content.Context
 | 
					 | 
				
			||||||
import android.content.Intent
 | 
					 | 
				
			||||||
import android.system.OsConstants
 | 
					 | 
				
			||||||
import android.util.AttributeSet
 | 
					 | 
				
			||||||
import android.widget.Toast
 | 
					 | 
				
			||||||
import androidx.preference.Preference
 | 
					 | 
				
			||||||
import com.wireguard.android.Application
 | 
					 | 
				
			||||||
import com.wireguard.android.R
 | 
					 | 
				
			||||||
import com.wireguard.android.activity.SettingsActivity
 | 
					 | 
				
			||||||
import com.wireguard.android.util.ErrorMessages
 | 
					 | 
				
			||||||
import com.wireguard.android.util.UserKnobs
 | 
					 | 
				
			||||||
import com.wireguard.android.util.lifecycleScope
 | 
					 | 
				
			||||||
import kotlinx.coroutines.Dispatchers
 | 
					 | 
				
			||||||
import kotlinx.coroutines.launch
 | 
					 | 
				
			||||||
import kotlinx.coroutines.withContext
 | 
					 | 
				
			||||||
import kotlin.system.exitProcess
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class ModuleDownloaderPreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
 | 
					 | 
				
			||||||
    private var state = State.INITIAL
 | 
					 | 
				
			||||||
    override fun getSummary() = context.getString(state.messageResourceId)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    override fun getTitle() = context.getString(R.string.module_installer_title)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    override fun onClick() {
 | 
					 | 
				
			||||||
        setState(State.WORKING)
 | 
					 | 
				
			||||||
        lifecycleScope.launch {
 | 
					 | 
				
			||||||
            try {
 | 
					 | 
				
			||||||
                when (withContext(Dispatchers.IO) { Application.getModuleLoader().download() }) {
 | 
					 | 
				
			||||||
                    OsConstants.ENOENT -> setState(State.NOTFOUND)
 | 
					 | 
				
			||||||
                    OsConstants.EXIT_SUCCESS -> {
 | 
					 | 
				
			||||||
                        setState(State.SUCCESS)
 | 
					 | 
				
			||||||
                        UserKnobs.setDisableKernelModule(null)
 | 
					 | 
				
			||||||
                        withContext(Dispatchers.IO) {
 | 
					 | 
				
			||||||
                            val restartIntent = Intent(context, SettingsActivity::class.java)
 | 
					 | 
				
			||||||
                            restartIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
 | 
					 | 
				
			||||||
                            restartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
 | 
					 | 
				
			||||||
                            Application.get().startActivity(restartIntent)
 | 
					 | 
				
			||||||
                            exitProcess(0)
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    else -> setState(State.FAILURE)
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            } catch (e: Throwable) {
 | 
					 | 
				
			||||||
                setState(State.FAILURE)
 | 
					 | 
				
			||||||
                Toast.makeText(context, ErrorMessages[e], Toast.LENGTH_LONG).show()
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private fun setState(state: State) {
 | 
					 | 
				
			||||||
        if (this.state == state) return
 | 
					 | 
				
			||||||
        this.state = state
 | 
					 | 
				
			||||||
        if (isEnabled != state.shouldEnableView) isEnabled = state.shouldEnableView
 | 
					 | 
				
			||||||
        notifyChanged()
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private enum class State(val messageResourceId: Int, val shouldEnableView: Boolean) {
 | 
					 | 
				
			||||||
        INITIAL(R.string.module_installer_initial, true),
 | 
					 | 
				
			||||||
        FAILURE(R.string.module_installer_error, true),
 | 
					 | 
				
			||||||
        WORKING(R.string.module_installer_working, false),
 | 
					 | 
				
			||||||
        SUCCESS(R.string.success_application_will_restart, false),
 | 
					 | 
				
			||||||
        NOTFOUND(R.string.module_installer_not_found, false);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -14,18 +14,18 @@ import kotlinx.coroutines.flow.Flow
 | 
				
			|||||||
import kotlinx.coroutines.flow.map
 | 
					import kotlinx.coroutines.flow.map
 | 
				
			||||||
 | 
					
 | 
				
			||||||
object UserKnobs {
 | 
					object UserKnobs {
 | 
				
			||||||
    private val DISABLE_KERNEL_MODULE = booleanPreferencesKey("disable_kernel_module")
 | 
					    private val ENABLE_KERNEL_MODULE = booleanPreferencesKey("enable_kernel_module")
 | 
				
			||||||
    val disableKernelModule: Flow<Boolean>
 | 
					    val enableKernelModule: Flow<Boolean>
 | 
				
			||||||
        get() = Application.getPreferencesDataStore().data.map {
 | 
					        get() = Application.getPreferencesDataStore().data.map {
 | 
				
			||||||
            it[DISABLE_KERNEL_MODULE] ?: false
 | 
					            it[ENABLE_KERNEL_MODULE] ?: false
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    suspend fun setDisableKernelModule(disable: Boolean?) {
 | 
					    suspend fun setEnableKernelModule(enable: Boolean?) {
 | 
				
			||||||
        Application.getPreferencesDataStore().edit {
 | 
					        Application.getPreferencesDataStore().edit {
 | 
				
			||||||
            if (disable == null)
 | 
					            if (enable == null)
 | 
				
			||||||
                it.remove(DISABLE_KERNEL_MODULE)
 | 
					                it.remove(ENABLE_KERNEL_MODULE)
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
                it[DISABLE_KERNEL_MODULE] = disable
 | 
					                it[ENABLE_KERNEL_MODULE] = enable
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -142,9 +142,9 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">Mostra el registre d\'aplicació</string>
 | 
					    <string name="log_viewer_pref_title">Mostra el registre d\'aplicació</string>
 | 
				
			||||||
    <string name="log_viewer_title">Registre</string>
 | 
					    <string name="log_viewer_title">Registre</string>
 | 
				
			||||||
    <string name="logcat_error">No es pot executar logcat: </string>
 | 
					    <string name="logcat_error">No es pot executar logcat: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">El mòdul experimental del kernel pot millorar el rendiment</string>
 | 
					    <string name="module_enabler_disabled_summary">El mòdul experimental del kernel pot millorar el rendiment</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">Activa el backend del mòdul del kernel</string>
 | 
					    <string name="module_enabler_disabled_title">Activa el backend del mòdul del kernel</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">Desactiva el backend del mòdul del kernel</string>
 | 
					    <string name="module_enabler_enabled_title">Desactiva el backend del mòdul del kernel</string>
 | 
				
			||||||
    <string name="module_installer_error">Alguna cosa ha anat malament. Si us plau, prova de nou</string>
 | 
					    <string name="module_installer_error">Alguna cosa ha anat malament. Si us plau, prova de nou</string>
 | 
				
			||||||
    <string name="module_installer_not_found">El vostre dispositiu no té mòduls disponibles</string>
 | 
					    <string name="module_installer_not_found">El vostre dispositiu no té mòduls disponibles</string>
 | 
				
			||||||
    <string name="module_installer_title">Descàrega i instala el mòdul kernel</string>
 | 
					    <string name="module_installer_title">Descàrega i instala el mòdul kernel</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -119,9 +119,9 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">Zobrazit log aplikace</string>
 | 
					    <string name="log_viewer_pref_title">Zobrazit log aplikace</string>
 | 
				
			||||||
    <string name="log_viewer_title">Log</string>
 | 
					    <string name="log_viewer_title">Log</string>
 | 
				
			||||||
    <string name="logcat_error">Nelze spustit logcat: </string>
 | 
					    <string name="logcat_error">Nelze spustit logcat: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">Experimentální kernel modul může zlepšit výkon</string>
 | 
					    <string name="module_enabler_disabled_summary">Experimentální kernel modul může zlepšit výkon</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">Povolit backend kernel modulu</string>
 | 
					    <string name="module_enabler_disabled_title">Povolit backend kernel modulu</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">Vypnout backend kernel modulu</string>
 | 
					    <string name="module_enabler_enabled_title">Vypnout backend kernel modulu</string>
 | 
				
			||||||
    <string name="module_installer_error">Něco se pokazilo. Zkuste to prosím znovu</string>
 | 
					    <string name="module_installer_error">Něco se pokazilo. Zkuste to prosím znovu</string>
 | 
				
			||||||
    <string name="module_installer_initial">Experimentální kernel modul může zlepšit výkon</string>
 | 
					    <string name="module_installer_initial">Experimentální kernel modul může zlepšit výkon</string>
 | 
				
			||||||
    <string name="module_installer_not_found">Pro toto zařízení nejsou dostupné žádné moduly</string>
 | 
					    <string name="module_installer_not_found">Pro toto zařízení nejsou dostupné žádné moduly</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -142,10 +142,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">Anwendungs-Protokoll anzeigen</string>
 | 
					    <string name="log_viewer_pref_title">Anwendungs-Protokoll anzeigen</string>
 | 
				
			||||||
    <string name="log_viewer_title">Protokoll</string>
 | 
					    <string name="log_viewer_title">Protokoll</string>
 | 
				
			||||||
    <string name="logcat_error">Konnte logcat nicht ausführen: </string>
 | 
					    <string name="logcat_error">Konnte logcat nicht ausführen: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">Das experimentelle Kernelmodul kann die Leistung verbessern</string>
 | 
					    <string name="module_enabler_disabled_summary">Das experimentelle Kernelmodul kann die Leistung verbessern</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">Kernelmodul-Backend aktivieren</string>
 | 
					    <string name="module_enabler_disabled_title">Kernelmodul-Backend aktivieren</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">Das langsamere Userspace-Backend kann die Stabilität verbessern</string>
 | 
					    <string name="module_enabler_enabled_summary">Das langsamere Userspace-Backend kann die Stabilität verbessern</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">Kernelmodul-Backend deaktivieren</string>
 | 
					    <string name="module_enabler_enabled_title">Kernelmodul-Backend deaktivieren</string>
 | 
				
			||||||
    <string name="module_installer_error">Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut</string>
 | 
					    <string name="module_installer_error">Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut</string>
 | 
				
			||||||
    <string name="module_installer_initial">Das experimentelle Kernelmodul kann die Leistung verbessern</string>
 | 
					    <string name="module_installer_initial">Das experimentelle Kernelmodul kann die Leistung verbessern</string>
 | 
				
			||||||
    <string name="module_installer_not_found">Für Ihr Gerät sind keine Module verfügbar</string>
 | 
					    <string name="module_installer_not_found">Für Ihr Gerät sind keine Module verfügbar</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -142,10 +142,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">Ver registro de aplicación</string>
 | 
					    <string name="log_viewer_pref_title">Ver registro de aplicación</string>
 | 
				
			||||||
    <string name="log_viewer_title">Registro</string>
 | 
					    <string name="log_viewer_title">Registro</string>
 | 
				
			||||||
    <string name="logcat_error">No se puede ejecutar logcat: </string>
 | 
					    <string name="logcat_error">No se puede ejecutar logcat: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">El módulo experimental del kernel puede mejorar el rendimiento</string>
 | 
					    <string name="module_enabler_disabled_summary">El módulo experimental del kernel puede mejorar el rendimiento</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">Habilitar backend del módulo del kernel</string>
 | 
					    <string name="module_enabler_disabled_title">Habilitar backend del módulo del kernel</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">El backend más lento del espacio de usuario puede mejorar la estabilidad</string>
 | 
					    <string name="module_enabler_enabled_summary">El backend más lento del espacio de usuario puede mejorar la estabilidad</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">Desactivar backend del módulo del kernel</string>
 | 
					    <string name="module_enabler_enabled_title">Desactivar backend del módulo del kernel</string>
 | 
				
			||||||
    <string name="module_installer_error">Ocurrió un error. Intente de nuevo</string>
 | 
					    <string name="module_installer_error">Ocurrió un error. Intente de nuevo</string>
 | 
				
			||||||
    <string name="module_installer_initial">El módulo experimental del kernel puede mejorar el rendimiento</string>
 | 
					    <string name="module_installer_initial">El módulo experimental del kernel puede mejorar el rendimiento</string>
 | 
				
			||||||
    <string name="module_installer_not_found">No hay módulos disponibles para tu dispositivo</string>
 | 
					    <string name="module_installer_not_found">No hay módulos disponibles para tu dispositivo</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -142,10 +142,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">نمایش گزارش رویداد برنامه</string>
 | 
					    <string name="log_viewer_pref_title">نمایش گزارش رویداد برنامه</string>
 | 
				
			||||||
    <string name="log_viewer_title">گزارش رویداد</string>
 | 
					    <string name="log_viewer_title">گزارش رویداد</string>
 | 
				
			||||||
    <string name="logcat_error">نمیتوان logcat را اجرا کرد: </string>
 | 
					    <string name="logcat_error">نمیتوان logcat را اجرا کرد: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">ماژول آزمایشیِ کرنل می تواند کارایی را افزایش دهد</string>
 | 
					    <string name="module_enabler_disabled_summary">ماژول آزمایشیِ کرنل می تواند کارایی را افزایش دهد</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">فعالسازی ماژول کرنل ِبک اند</string>
 | 
					    <string name="module_enabler_disabled_title">فعالسازی ماژول کرنل ِبک اند</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">فضای کاربری کند ممکن است پایداری را بهبود ببخشد</string>
 | 
					    <string name="module_enabler_enabled_summary">فضای کاربری کند ممکن است پایداری را بهبود ببخشد</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">غیرفعالسازی پسزمینه واحد هسته</string>
 | 
					    <string name="module_enabler_enabled_title">غیرفعالسازی پسزمینه واحد هسته</string>
 | 
				
			||||||
    <string name="module_installer_error">مشکلی پیش آمد. لطفا دوباره تلاش کنید</string>
 | 
					    <string name="module_installer_error">مشکلی پیش آمد. لطفا دوباره تلاش کنید</string>
 | 
				
			||||||
    <string name="module_installer_initial">ماژول آزمایشیِ کرنل می تواند کارایی را افزایش دهد</string>
 | 
					    <string name="module_installer_initial">ماژول آزمایشیِ کرنل می تواند کارایی را افزایش دهد</string>
 | 
				
			||||||
    <string name="module_installer_not_found">هیچ واحدی برای دستگاه شما در دسترس نیست</string>
 | 
					    <string name="module_installer_not_found">هیچ واحدی برای دستگاه شما در دسترس نیست</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -142,10 +142,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">Afficher le journal de l\'application</string>
 | 
					    <string name="log_viewer_pref_title">Afficher le journal de l\'application</string>
 | 
				
			||||||
    <string name="log_viewer_title">Journal</string>
 | 
					    <string name="log_viewer_title">Journal</string>
 | 
				
			||||||
    <string name="logcat_error">Impossible d\'exécuter logcat : </string>
 | 
					    <string name="logcat_error">Impossible d\'exécuter logcat : </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">Le module expérimental du noyau peut améliorer les performances</string>
 | 
					    <string name="module_enabler_disabled_summary">Le module expérimental du noyau peut améliorer les performances</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">Activer le backend du module du noyau</string>
 | 
					    <string name="module_enabler_disabled_title">Activer le backend du module du noyau</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">Le backend plus lent de l\'espace utilisateur peut améliorer la stabilité</string>
 | 
					    <string name="module_enabler_enabled_summary">Le backend plus lent de l\'espace utilisateur peut améliorer la stabilité</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">Désactiver le backend du module du noyau</string>
 | 
					    <string name="module_enabler_enabled_title">Désactiver le backend du module du noyau</string>
 | 
				
			||||||
    <string name="module_installer_error">Une erreur est survenue. Veuillez réessayer</string>
 | 
					    <string name="module_installer_error">Une erreur est survenue. Veuillez réessayer</string>
 | 
				
			||||||
    <string name="module_installer_initial">Le module expérimental du noyau peut améliorer les performances</string>
 | 
					    <string name="module_installer_initial">Le module expérimental du noyau peut améliorer les performances</string>
 | 
				
			||||||
    <string name="module_installer_not_found">Aucun module n\'est disponible pour votre appareil</string>
 | 
					    <string name="module_installer_not_found">Aucun module n\'est disponible pour votre appareil</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -132,10 +132,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">एप्लिकेशन लॉग देखें</string>
 | 
					    <string name="log_viewer_pref_title">एप्लिकेशन लॉग देखें</string>
 | 
				
			||||||
    <string name="log_viewer_title">लॉग</string>
 | 
					    <string name="log_viewer_title">लॉग</string>
 | 
				
			||||||
    <string name="logcat_error">लॉगकैट चलाने में असमर्थ: </string>
 | 
					    <string name="logcat_error">लॉगकैट चलाने में असमर्थ: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">प्रयोगात्मक कर्नेल मॉड्यूल प्रदर्शन में सुधार कर सकता है</string>
 | 
					    <string name="module_enabler_disabled_summary">प्रयोगात्मक कर्नेल मॉड्यूल प्रदर्शन में सुधार कर सकता है</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">कर्नेल मॉड्यूल बैकएंड सक्षम करें</string>
 | 
					    <string name="module_enabler_disabled_title">कर्नेल मॉड्यूल बैकएंड सक्षम करें</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">धीमे यूजरस्पेस बैकएंड में स्थिरता में सुधार हो सकता है</string>
 | 
					    <string name="module_enabler_enabled_summary">धीमे यूजरस्पेस बैकएंड में स्थिरता में सुधार हो सकता है</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">कर्नेल मॉड्यूल बैकएंड को अक्षम करें</string>
 | 
					    <string name="module_enabler_enabled_title">कर्नेल मॉड्यूल बैकएंड को अक्षम करें</string>
 | 
				
			||||||
    <string name="module_installer_error">कुछ गलत हो गया। कृपया पुन: प्रयास करें</string>
 | 
					    <string name="module_installer_error">कुछ गलत हो गया। कृपया पुन: प्रयास करें</string>
 | 
				
			||||||
    <string name="module_installer_initial">प्रयोगात्मक कर्नेल मॉड्यूल प्रदर्शन में सुधार कर सकता है</string>
 | 
					    <string name="module_installer_initial">प्रयोगात्मक कर्नेल मॉड्यूल प्रदर्शन में सुधार कर सकता है</string>
 | 
				
			||||||
    <string name="module_installer_not_found">आपके डिवाइस के लिए कोई मॉड्यूल उपलब्ध नहीं हैं</string>
 | 
					    <string name="module_installer_not_found">आपके डिवाइस के लिए कोई मॉड्यूल उपलब्ध नहीं हैं</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -96,10 +96,10 @@
 | 
				
			|||||||
    <string name="module_installer_title">कर्नेल मॉड्यूल डाउनलोड और इंस्टॉल करें</string>
 | 
					    <string name="module_installer_title">कर्नेल मॉड्यूल डाउनलोड और इंस्टॉल करें</string>
 | 
				
			||||||
    <string name="module_installer_working">डाउनलोड कर रहा है और स्थापित कर रहा है…</string>
 | 
					    <string name="module_installer_working">डाउनलोड कर रहा है और स्थापित कर रहा है…</string>
 | 
				
			||||||
    <string name="module_installer_error">कुछ गलत हो गया। कृपया पुन: प्रयास करें</string>
 | 
					    <string name="module_installer_error">कुछ गलत हो गया। कृपया पुन: प्रयास करें</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">कर्नेल मॉड्यूल बैकएंड सक्षम करें</string>
 | 
					    <string name="module_enabler_disabled_title">कर्नेल मॉड्यूल बैकएंड सक्षम करें</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">प्रयोगात्मक कर्नेल मॉड्यूल प्रदर्शन में सुधार कर सकता है</string>
 | 
					    <string name="module_enabler_disabled_summary">प्रयोगात्मक कर्नेल मॉड्यूल प्रदर्शन में सुधार कर सकता है</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">कर्नेल मॉड्यूल बैकएंड को अक्षम करें</string>
 | 
					    <string name="module_enabler_enabled_title">कर्नेल मॉड्यूल बैकएंड को अक्षम करें</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">धीमे यूजरस्पेस बैकएंड में स्थिरता में सुधार हो सकता है</string>
 | 
					    <string name="module_enabler_enabled_summary">धीमे यूजरस्पेस बैकएंड में स्थिरता में सुधार हो सकता है</string>
 | 
				
			||||||
    <string name="mtu">MTU</string>
 | 
					    <string name="mtu">MTU</string>
 | 
				
			||||||
    <string name="multiple_tunnels_title">एक साथ कई टनलस को अनुमति दें</string>
 | 
					    <string name="multiple_tunnels_title">एक साथ कई टनलस को अनुमति दें</string>
 | 
				
			||||||
    <string name="multiple_tunnels_summary_on">एक साथ कई टनलस को चालू किया जा सकता है</string>
 | 
					    <string name="multiple_tunnels_summary_on">एक साथ कई टनलस को चालू किया जा सकता है</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -129,10 +129,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">Lihat log aplikasi</string>
 | 
					    <string name="log_viewer_pref_title">Lihat log aplikasi</string>
 | 
				
			||||||
    <string name="log_viewer_title">Log</string>
 | 
					    <string name="log_viewer_title">Log</string>
 | 
				
			||||||
    <string name="logcat_error">Tidak bisa menjalankan logcat: </string>
 | 
					    <string name="logcat_error">Tidak bisa menjalankan logcat: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">Modul kernel eksperimental dapat meningkatkan kinerja</string>
 | 
					    <string name="module_enabler_disabled_summary">Modul kernel eksperimental dapat meningkatkan kinerja</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">Aktifkan backend modul kernel</string>
 | 
					    <string name="module_enabler_disabled_title">Aktifkan backend modul kernel</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">Backend userspace yang lebih lambat dapat meningkatkan stabilitas</string>
 | 
					    <string name="module_enabler_enabled_summary">Backend userspace yang lebih lambat dapat meningkatkan stabilitas</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">Nonaktifkan backend modul kernel</string>
 | 
					    <string name="module_enabler_enabled_title">Nonaktifkan backend modul kernel</string>
 | 
				
			||||||
    <string name="module_installer_error">Ada yang salah. Silakan coba lagi</string>
 | 
					    <string name="module_installer_error">Ada yang salah. Silakan coba lagi</string>
 | 
				
			||||||
    <string name="module_installer_initial">Modul kernel eksperimental dapat meningkatkan kinerja</string>
 | 
					    <string name="module_installer_initial">Modul kernel eksperimental dapat meningkatkan kinerja</string>
 | 
				
			||||||
    <string name="module_installer_not_found">Tidak tersedia modul untuk perangkat anda</string>
 | 
					    <string name="module_installer_not_found">Tidak tersedia modul untuk perangkat anda</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -142,10 +142,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">Visualizza log dell\'applicazione</string>
 | 
					    <string name="log_viewer_pref_title">Visualizza log dell\'applicazione</string>
 | 
				
			||||||
    <string name="log_viewer_title">Log</string>
 | 
					    <string name="log_viewer_title">Log</string>
 | 
				
			||||||
    <string name="logcat_error">Impossibile eseguire logcat: </string>
 | 
					    <string name="logcat_error">Impossibile eseguire logcat: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">Il modulo sperimentale del kernel può migliorare le prestazioni</string>
 | 
					    <string name="module_enabler_disabled_summary">Il modulo sperimentale del kernel può migliorare le prestazioni</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">Abilita il backend del modulo del kernel</string>
 | 
					    <string name="module_enabler_disabled_title">Abilita il backend del modulo del kernel</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">Il backend in userspace più lento potrebbe migliorare la stabilità</string>
 | 
					    <string name="module_enabler_enabled_summary">Il backend in userspace più lento potrebbe migliorare la stabilità</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">Disabilita il backend del modulo del kernel</string>
 | 
					    <string name="module_enabler_enabled_title">Disabilita il backend del modulo del kernel</string>
 | 
				
			||||||
    <string name="module_installer_error">Qualcosa non ha funzionato. Riprova</string>
 | 
					    <string name="module_installer_error">Qualcosa non ha funzionato. Riprova</string>
 | 
				
			||||||
    <string name="module_installer_initial">Il modulo sperimentale del kernel può migliorare le prestazioni</string>
 | 
					    <string name="module_installer_initial">Il modulo sperimentale del kernel può migliorare le prestazioni</string>
 | 
				
			||||||
    <string name="module_installer_not_found">Nessun modulo disponibile per il tuo dispositivo</string>
 | 
					    <string name="module_installer_not_found">Nessun modulo disponibile per il tuo dispositivo</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -129,10 +129,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">アプリケーションログを表示</string>
 | 
					    <string name="log_viewer_pref_title">アプリケーションログを表示</string>
 | 
				
			||||||
    <string name="log_viewer_title">ログ</string>
 | 
					    <string name="log_viewer_title">ログ</string>
 | 
				
			||||||
    <string name="logcat_error">logcat を実行できません: </string>
 | 
					    <string name="logcat_error">logcat を実行できません: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">カーネルモジュールは実験的ですがパフォーマンスが向上する可能性があります。</string>
 | 
					    <string name="module_enabler_disabled_summary">カーネルモジュールは実験的ですがパフォーマンスが向上する可能性があります。</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">カーネルモジュールバックエンドの有効化</string>
 | 
					    <string name="module_enabler_disabled_title">カーネルモジュールバックエンドの有効化</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">ユーザースペースバックエンドは低速ですが安定しています。</string>
 | 
					    <string name="module_enabler_enabled_summary">ユーザースペースバックエンドは低速ですが安定しています。</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">カーネルモジュールバックエンドの無効化</string>
 | 
					    <string name="module_enabler_enabled_title">カーネルモジュールバックエンドの無効化</string>
 | 
				
			||||||
    <string name="module_installer_error">失敗しました. 再度実行してみてください</string>
 | 
					    <string name="module_installer_error">失敗しました. 再度実行してみてください</string>
 | 
				
			||||||
    <string name="module_installer_initial">実験的カーネルモジュールはパフォーマンスが向上する場合があります</string>
 | 
					    <string name="module_installer_initial">実験的カーネルモジュールはパフォーマンスが向上する場合があります</string>
 | 
				
			||||||
    <string name="module_installer_not_found">このデバイス用のモジュールは利用できません</string>
 | 
					    <string name="module_installer_not_found">このデバイス用のモジュールは利用できません</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -129,10 +129,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">앱 로그 보기</string>
 | 
					    <string name="log_viewer_pref_title">앱 로그 보기</string>
 | 
				
			||||||
    <string name="log_viewer_title">로그</string>
 | 
					    <string name="log_viewer_title">로그</string>
 | 
				
			||||||
    <string name="logcat_error">logcat을 실행할 수 없음: </string>
 | 
					    <string name="logcat_error">logcat을 실행할 수 없음: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">아직 실험중이 커널 모듈을 사용하면 성능이 향상될 수 있음</string>
 | 
					    <string name="module_enabler_disabled_summary">아직 실험중이 커널 모듈을 사용하면 성능이 향상될 수 있음</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">커널 모듈 백엔드 활성화하기</string>
 | 
					    <string name="module_enabler_disabled_title">커널 모듈 백엔드 활성화하기</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">사용자공간 백엔드를 사용하면 느리지만 안정성이 좋아짐</string>
 | 
					    <string name="module_enabler_enabled_summary">사용자공간 백엔드를 사용하면 느리지만 안정성이 좋아짐</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">커널 모듈 백엔드를 비활성화하기</string>
 | 
					    <string name="module_enabler_enabled_title">커널 모듈 백엔드를 비활성화하기</string>
 | 
				
			||||||
    <string name="module_installer_error">문제가 발생했습니다. 다시 시도하십시오</string>
 | 
					    <string name="module_installer_error">문제가 발생했습니다. 다시 시도하십시오</string>
 | 
				
			||||||
    <string name="module_installer_initial">아직 실험중이 커널 모듈을 사용하면 성능이 향상될 수 있음</string>
 | 
					    <string name="module_installer_initial">아직 실험중이 커널 모듈을 사용하면 성능이 향상될 수 있음</string>
 | 
				
			||||||
    <string name="module_installer_not_found">이 기기에서 사용가능한 모듈이 없음</string>
 | 
					    <string name="module_installer_not_found">이 기기에서 사용가능한 모듈이 없음</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -142,10 +142,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">Vis programlogg</string>
 | 
					    <string name="log_viewer_pref_title">Vis programlogg</string>
 | 
				
			||||||
    <string name="log_viewer_title">Logg</string>
 | 
					    <string name="log_viewer_title">Logg</string>
 | 
				
			||||||
    <string name="logcat_error">Kan ikke kjøre logcat: </string>
 | 
					    <string name="logcat_error">Kan ikke kjøre logcat: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">Den eksperimentelle kjernemodulen kan gi bedre ytelse</string>
 | 
					    <string name="module_enabler_disabled_summary">Den eksperimentelle kjernemodulen kan gi bedre ytelse</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">Aktiver backend for kjerne-modul</string>
 | 
					    <string name="module_enabler_disabled_title">Aktiver backend for kjerne-modul</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">Backend i userspace er litt tregere men kan gi bedre stabilitet</string>
 | 
					    <string name="module_enabler_enabled_summary">Backend i userspace er litt tregere men kan gi bedre stabilitet</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">Deaktiver backend for kjerne-modul</string>
 | 
					    <string name="module_enabler_enabled_title">Deaktiver backend for kjerne-modul</string>
 | 
				
			||||||
    <string name="module_installer_error">Noe gikk galt. Vennligst prøv igjen</string>
 | 
					    <string name="module_installer_error">Noe gikk galt. Vennligst prøv igjen</string>
 | 
				
			||||||
    <string name="module_installer_initial">Den eksperimentelle kjernemodulen kan gi bedre ytelse</string>
 | 
					    <string name="module_installer_initial">Den eksperimentelle kjernemodulen kan gi bedre ytelse</string>
 | 
				
			||||||
    <string name="module_installer_not_found">Ingen moduler er tilgjengelige for din enhet</string>
 | 
					    <string name="module_installer_not_found">Ingen moduler er tilgjengelige for din enhet</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -142,10 +142,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">ਐਪਲੀਕੇਸ਼ਨ ਲਾਗ ਵੇਖੋ</string>
 | 
					    <string name="log_viewer_pref_title">ਐਪਲੀਕੇਸ਼ਨ ਲਾਗ ਵੇਖੋ</string>
 | 
				
			||||||
    <string name="log_viewer_title">ਲਾਗ</string>
 | 
					    <string name="log_viewer_title">ਲਾਗ</string>
 | 
				
			||||||
    <string name="logcat_error">logcat ਚਲਾਉਣ ਲਈ ਅਸਮਰੱਥ: </string>
 | 
					    <string name="logcat_error">logcat ਚਲਾਉਣ ਲਈ ਅਸਮਰੱਥ: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">ਤਜਰਬੇ ਅਧੀਨ ਕਰਨਲ ਮੋਡੀਊਲ ਕਾਰਗੁਜ਼ਾਰੀ ਸੁਧਾਰ ਸਕਦਾ ਹੈ</string>
 | 
					    <string name="module_enabler_disabled_summary">ਤਜਰਬੇ ਅਧੀਨ ਕਰਨਲ ਮੋਡੀਊਲ ਕਾਰਗੁਜ਼ਾਰੀ ਸੁਧਾਰ ਸਕਦਾ ਹੈ</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">ਕਰਨਲ ਮੋਡੀਊਲ ਬੈਕਐਂਡ ਸਮਰੱਥ ਕਰੋ</string>
 | 
					    <string name="module_enabler_disabled_title">ਕਰਨਲ ਮੋਡੀਊਲ ਬੈਕਐਂਡ ਸਮਰੱਥ ਕਰੋ</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">ਹੌਲੀ ਵਰਤੋਂਕਾਰ-ਸਪੇਸ ਬੈਂਕਡ ਸਥਿਰਤਾ ਸੁਧਾਰ ਕਰ ਸਕਦਾ ਹੈ</string>
 | 
					    <string name="module_enabler_enabled_summary">ਹੌਲੀ ਵਰਤੋਂਕਾਰ-ਸਪੇਸ ਬੈਂਕਡ ਸਥਿਰਤਾ ਸੁਧਾਰ ਕਰ ਸਕਦਾ ਹੈ</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">ਕਰਨਲ ਮੋਡੀਊਲ ਬੈਕਐਂਡ ਅਸਮਰੱਥ ਕਰੋ</string>
 | 
					    <string name="module_enabler_enabled_title">ਕਰਨਲ ਮੋਡੀਊਲ ਬੈਕਐਂਡ ਅਸਮਰੱਥ ਕਰੋ</string>
 | 
				
			||||||
    <string name="module_installer_error">ਕੁਝ ਗਲਤ ਵਾਪਰ ਗਿਆ। ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ</string>
 | 
					    <string name="module_installer_error">ਕੁਝ ਗਲਤ ਵਾਪਰ ਗਿਆ। ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ</string>
 | 
				
			||||||
    <string name="module_installer_initial">ਤਜਰਬੇ ਅਧੀਨ ਕਰਨਲ ਮੋਡੀਊਲ ਕਾਰਗੁਜ਼ਾਰੀ ਸੁਧਾਰ ਸਕਦਾ ਹੈ</string>
 | 
					    <string name="module_installer_initial">ਤਜਰਬੇ ਅਧੀਨ ਕਰਨਲ ਮੋਡੀਊਲ ਕਾਰਗੁਜ਼ਾਰੀ ਸੁਧਾਰ ਸਕਦਾ ਹੈ</string>
 | 
				
			||||||
    <string name="module_installer_not_found">ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਲਈ ਕੋਈ ਮੋਡੀਊਲ ਮੌਜੂਦ ਨਹੀਂ ਹਨ</string>
 | 
					    <string name="module_installer_not_found">ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਲਈ ਕੋਈ ਮੋਡੀਊਲ ਮੌਜੂਦ ਨਹੀਂ ਹਨ</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -168,10 +168,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">Wyświetl log aplikacji</string>
 | 
					    <string name="log_viewer_pref_title">Wyświetl log aplikacji</string>
 | 
				
			||||||
    <string name="log_viewer_title">Log</string>
 | 
					    <string name="log_viewer_title">Log</string>
 | 
				
			||||||
    <string name="logcat_error">Nie można uruchomić narzędzia logcat: </string>
 | 
					    <string name="logcat_error">Nie można uruchomić narzędzia logcat: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">Eksperymentalny moduł jądra może poprawić wydajność</string>
 | 
					    <string name="module_enabler_disabled_summary">Eksperymentalny moduł jądra może poprawić wydajność</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">Włącz moduł jądra</string>
 | 
					    <string name="module_enabler_disabled_title">Włącz moduł jądra</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">Wolniejsza implementacja w przestrzeni użytkownika może poprawić stabilność</string>
 | 
					    <string name="module_enabler_enabled_summary">Wolniejsza implementacja w przestrzeni użytkownika może poprawić stabilność</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">Wyłącz moduł jądra</string>
 | 
					    <string name="module_enabler_enabled_title">Wyłącz moduł jądra</string>
 | 
				
			||||||
    <string name="module_installer_error">Coś poszło nie tak. Proszę spróbować ponownie</string>
 | 
					    <string name="module_installer_error">Coś poszło nie tak. Proszę spróbować ponownie</string>
 | 
				
			||||||
    <string name="module_installer_initial">Eksperymentalny moduł jądra może poprawić wydajność</string>
 | 
					    <string name="module_installer_initial">Eksperymentalny moduł jądra może poprawić wydajność</string>
 | 
				
			||||||
    <string name="module_installer_not_found">Brak dostępnych modułów dla tego urządzenia</string>
 | 
					    <string name="module_installer_not_found">Brak dostępnych modułów dla tego urządzenia</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -142,10 +142,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">Ver log da aplicação</string>
 | 
					    <string name="log_viewer_pref_title">Ver log da aplicação</string>
 | 
				
			||||||
    <string name="log_viewer_title">Log</string>
 | 
					    <string name="log_viewer_title">Log</string>
 | 
				
			||||||
    <string name="logcat_error">Não foi possível executar o logcat: </string>
 | 
					    <string name="logcat_error">Não foi possível executar o logcat: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">O módulo experimental de kernel pode melhorar o desempenho</string>
 | 
					    <string name="module_enabler_disabled_summary">O módulo experimental de kernel pode melhorar o desempenho</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">Habilitar módulo backend do kernel</string>
 | 
					    <string name="module_enabler_disabled_title">Habilitar módulo backend do kernel</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">O backend do userspace mais lento pode aumentar a estabilidade</string>
 | 
					    <string name="module_enabler_enabled_summary">O backend do userspace mais lento pode aumentar a estabilidade</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">Desabilitar módulo backend do kernel</string>
 | 
					    <string name="module_enabler_enabled_title">Desabilitar módulo backend do kernel</string>
 | 
				
			||||||
    <string name="module_installer_error">Ocorreu um erro. Por favor, tente novamente</string>
 | 
					    <string name="module_installer_error">Ocorreu um erro. Por favor, tente novamente</string>
 | 
				
			||||||
    <string name="module_installer_initial">O módulo experimental do kernel pode melhorar o desempenho</string>
 | 
					    <string name="module_installer_initial">O módulo experimental do kernel pode melhorar o desempenho</string>
 | 
				
			||||||
    <string name="module_installer_not_found">Não há módulos disponíveis para o seu dispositivo</string>
 | 
					    <string name="module_installer_not_found">Não há módulos disponíveis para o seu dispositivo</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -155,10 +155,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">Vizualizare jurnal aplicație</string>
 | 
					    <string name="log_viewer_pref_title">Vizualizare jurnal aplicație</string>
 | 
				
			||||||
    <string name="log_viewer_title">Jurnal</string>
 | 
					    <string name="log_viewer_title">Jurnal</string>
 | 
				
			||||||
    <string name="logcat_error">Programul logcat nu poate fi executat: </string>
 | 
					    <string name="logcat_error">Programul logcat nu poate fi executat: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">Modulul experimental de nucleu poate îmbunătăți performanța</string>
 | 
					    <string name="module_enabler_disabled_summary">Modulul experimental de nucleu poate îmbunătăți performanța</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">Activează biblioteca modulului de nucleu</string>
 | 
					    <string name="module_enabler_disabled_title">Activează biblioteca modulului de nucleu</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">Biblioteca mai lentă a spațiului utilizatorului poate îmbunătăți stabilitatea</string>
 | 
					    <string name="module_enabler_enabled_summary">Biblioteca mai lentă a spațiului utilizatorului poate îmbunătăți stabilitatea</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">Dezactivează biblioteca modulului de nucleu</string>
 | 
					    <string name="module_enabler_enabled_title">Dezactivează biblioteca modulului de nucleu</string>
 | 
				
			||||||
    <string name="module_installer_error">A apărut o eroare. Încearcă din nou</string>
 | 
					    <string name="module_installer_error">A apărut o eroare. Încearcă din nou</string>
 | 
				
			||||||
    <string name="module_installer_initial">Modulul experimental de nucleu poate îmbunătăți performanța</string>
 | 
					    <string name="module_installer_initial">Modulul experimental de nucleu poate îmbunătăți performanța</string>
 | 
				
			||||||
    <string name="module_installer_not_found">Nu sunt disponibile module pentru dispozitivul tău</string>
 | 
					    <string name="module_installer_not_found">Nu sunt disponibile module pentru dispozitivul tău</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -168,10 +168,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">Просмотр журналов приложения</string>
 | 
					    <string name="log_viewer_pref_title">Просмотр журналов приложения</string>
 | 
				
			||||||
    <string name="log_viewer_title">Журнал</string>
 | 
					    <string name="log_viewer_title">Журнал</string>
 | 
				
			||||||
    <string name="logcat_error">Не удалось запустить logcat: </string>
 | 
					    <string name="logcat_error">Не удалось запустить logcat: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">Экспериментальный модуль ядра может улучшить производительность</string>
 | 
					    <string name="module_enabler_disabled_summary">Экспериментальный модуль ядра может улучшить производительность</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">Включить бэкэнд модуля ядра</string>
 | 
					    <string name="module_enabler_disabled_title">Включить бэкэнд модуля ядра</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">Пользовательское пространство немного медленнее и улучшает стабильность</string>
 | 
					    <string name="module_enabler_enabled_summary">Пользовательское пространство немного медленнее и улучшает стабильность</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">Отключить бэкэнд модуля ядра</string>
 | 
					    <string name="module_enabler_enabled_title">Отключить бэкэнд модуля ядра</string>
 | 
				
			||||||
    <string name="module_installer_error">Что-то пошло не так. Пожалуйста, попробуйте еще раз</string>
 | 
					    <string name="module_installer_error">Что-то пошло не так. Пожалуйста, попробуйте еще раз</string>
 | 
				
			||||||
    <string name="module_installer_initial">Экспериментальный модуль ядра может улучшить производительность</string>
 | 
					    <string name="module_installer_initial">Экспериментальный модуль ядра может улучшить производительность</string>
 | 
				
			||||||
    <string name="module_installer_not_found">Для вашего устройства нет доступных модулей</string>
 | 
					    <string name="module_installer_not_found">Для вашего устройства нет доступных модулей</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -77,7 +77,7 @@
 | 
				
			|||||||
    <string name="log_saver_activity_label">Uložiť denník udalostí</string>
 | 
					    <string name="log_saver_activity_label">Uložiť denník udalostí</string>
 | 
				
			||||||
    <string name="log_viewer_pref_summary">Denník udalosti môžu byt nápomocné pri ladení aplikácie</string>
 | 
					    <string name="log_viewer_pref_summary">Denník udalosti môžu byt nápomocné pri ladení aplikácie</string>
 | 
				
			||||||
    <string name="log_viewer_pref_title">Zobraziť denník udalostí aplikácie</string>
 | 
					    <string name="log_viewer_pref_title">Zobraziť denník udalostí aplikácie</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">Pomalšie užívatelské prostredie môže zlepšiť stabilitu</string>
 | 
					    <string name="module_enabler_enabled_summary">Pomalšie užívatelské prostredie môže zlepšiť stabilitu</string>
 | 
				
			||||||
    <string name="module_installer_error">Niečo sa pokazilo. Prosím, skúste znova</string>
 | 
					    <string name="module_installer_error">Niečo sa pokazilo. Prosím, skúste znova</string>
 | 
				
			||||||
    <string name="module_installer_not_found">Pre vaše zariadenie nie sú k dispozícii žiadne moduly</string>
 | 
					    <string name="module_installer_not_found">Pre vaše zariadenie nie sú k dispozícii žiadne moduly</string>
 | 
				
			||||||
    <string name="module_installer_title">Stiahni a nainštaluj kernel modul</string>
 | 
					    <string name="module_installer_title">Stiahni a nainštaluj kernel modul</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -166,10 +166,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">Prikaži dnevnik aplikacije</string>
 | 
					    <string name="log_viewer_pref_title">Prikaži dnevnik aplikacije</string>
 | 
				
			||||||
    <string name="log_viewer_title">Dnevnik</string>
 | 
					    <string name="log_viewer_title">Dnevnik</string>
 | 
				
			||||||
    <string name="logcat_error">Ukaza logcat ni bilo mogoče izvesti: </string>
 | 
					    <string name="logcat_error">Ukaza logcat ni bilo mogoče izvesti: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">Eksperimentalni modul jedra lahko izboljša zmogljivost</string>
 | 
					    <string name="module_enabler_disabled_summary">Eksperimentalni modul jedra lahko izboljša zmogljivost</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">Omogoči zaledje za modul jedra</string>
 | 
					    <string name="module_enabler_disabled_title">Omogoči zaledje za modul jedra</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">Počasnejše uporabniško zaledje lahko izboljša stabilnost</string>
 | 
					    <string name="module_enabler_enabled_summary">Počasnejše uporabniško zaledje lahko izboljša stabilnost</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">Onemogoči zaledje za modul jedra</string>
 | 
					    <string name="module_enabler_enabled_title">Onemogoči zaledje za modul jedra</string>
 | 
				
			||||||
    <string name="module_installer_error">Nekaj je šlo narobe, prosimo poskusite znova</string>
 | 
					    <string name="module_installer_error">Nekaj je šlo narobe, prosimo poskusite znova</string>
 | 
				
			||||||
    <string name="module_installer_initial">Eksperimentalni modul jedra lahko izboljša zmogljivost</string>
 | 
					    <string name="module_installer_initial">Eksperimentalni modul jedra lahko izboljša zmogljivost</string>
 | 
				
			||||||
    <string name="module_installer_not_found">Za vašo napravo ni razpoložljivih modulov</string>
 | 
					    <string name="module_installer_not_found">Za vašo napravo ni razpoložljivih modulov</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -114,10 +114,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">Visa applikationslogg</string>
 | 
					    <string name="log_viewer_pref_title">Visa applikationslogg</string>
 | 
				
			||||||
    <string name="log_viewer_title">Logg</string>
 | 
					    <string name="log_viewer_title">Logg</string>
 | 
				
			||||||
    <string name="logcat_error">Kunde inte köra logcat: </string>
 | 
					    <string name="logcat_error">Kunde inte köra logcat: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">Den experimentella kärnmodulen kan förbättra prestanda</string>
 | 
					    <string name="module_enabler_disabled_summary">Den experimentella kärnmodulen kan förbättra prestanda</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">Aktivera backend för kärnmodul</string>
 | 
					    <string name="module_enabler_disabled_title">Aktivera backend för kärnmodul</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">Den långsammare backend för användarrymden kan förbättra stabiliteten</string>
 | 
					    <string name="module_enabler_enabled_summary">Den långsammare backend för användarrymden kan förbättra stabiliteten</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">Inaktivera backend för kärnmodul</string>
 | 
					    <string name="module_enabler_enabled_title">Inaktivera backend för kärnmodul</string>
 | 
				
			||||||
    <string name="module_installer_error">Något gick fel. Vänligen försök igen</string>
 | 
					    <string name="module_installer_error">Något gick fel. Vänligen försök igen</string>
 | 
				
			||||||
    <string name="module_installer_initial">Den experimentella kärnmodulen kan förbättra prestanda</string>
 | 
					    <string name="module_installer_initial">Den experimentella kärnmodulen kan förbättra prestanda</string>
 | 
				
			||||||
    <string name="module_installer_not_found">Inga moduler finns tillgängliga för din enhet</string>
 | 
					    <string name="module_installer_not_found">Inga moduler finns tillgängliga för din enhet</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -142,10 +142,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">Uygulama günlüğünü görüntüle</string>
 | 
					    <string name="log_viewer_pref_title">Uygulama günlüğünü görüntüle</string>
 | 
				
			||||||
    <string name="log_viewer_title">Günlük</string>
 | 
					    <string name="log_viewer_title">Günlük</string>
 | 
				
			||||||
    <string name="logcat_error">Logcat çalıştırılamıyor: </string>
 | 
					    <string name="logcat_error">Logcat çalıştırılamıyor: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">Deneysel çekirdek modülü performansı artırabilir</string>
 | 
					    <string name="module_enabler_disabled_summary">Deneysel çekirdek modülü performansı artırabilir</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">Çekirdek modülü arka ucunu etkinleştir</string>
 | 
					    <string name="module_enabler_disabled_title">Çekirdek modülü arka ucunu etkinleştir</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">Daha yavaş kullanıcı alanı arka ucu kararlılığı artırabilir</string>
 | 
					    <string name="module_enabler_enabled_summary">Daha yavaş kullanıcı alanı arka ucu kararlılığı artırabilir</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">Çekirdek modülü arka ucunu devre dışı bırak</string>
 | 
					    <string name="module_enabler_enabled_title">Çekirdek modülü arka ucunu devre dışı bırak</string>
 | 
				
			||||||
    <string name="module_installer_error">Bir şeyler yanlış gitti. Lütfen tekrar deneyin</string>
 | 
					    <string name="module_installer_error">Bir şeyler yanlış gitti. Lütfen tekrar deneyin</string>
 | 
				
			||||||
    <string name="module_installer_initial">Deneysel çekirdek modülü performansı artırabilir</string>
 | 
					    <string name="module_installer_initial">Deneysel çekirdek modülü performansı artırabilir</string>
 | 
				
			||||||
    <string name="module_installer_not_found">Cihazınız için uygun modül yok</string>
 | 
					    <string name="module_installer_not_found">Cihazınız için uygun modül yok</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -168,10 +168,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">Переглянути журнал програми</string>
 | 
					    <string name="log_viewer_pref_title">Переглянути журнал програми</string>
 | 
				
			||||||
    <string name="log_viewer_title">Журнал</string>
 | 
					    <string name="log_viewer_title">Журнал</string>
 | 
				
			||||||
    <string name="logcat_error">Не вдалося запустити logcat: </string>
 | 
					    <string name="logcat_error">Не вдалося запустити logcat: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">Експериментальний модуль ядра може підвищити продуктивність</string>
 | 
					    <string name="module_enabler_disabled_summary">Експериментальний модуль ядра може підвищити продуктивність</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">Увімкнути модуль ядра</string>
 | 
					    <string name="module_enabler_disabled_title">Увімкнути модуль ядра</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">Користувацький простір повільніший, проте може покращити стабільність</string>
 | 
					    <string name="module_enabler_enabled_summary">Користувацький простір повільніший, проте може покращити стабільність</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">Вимкнути модуль ядра</string>
 | 
					    <string name="module_enabler_enabled_title">Вимкнути модуль ядра</string>
 | 
				
			||||||
    <string name="module_installer_error">Щось пішло не так. Спробуйте ще раз</string>
 | 
					    <string name="module_installer_error">Щось пішло не так. Спробуйте ще раз</string>
 | 
				
			||||||
    <string name="module_installer_initial">Експериментальний модуль ядра може підвищити продуктивність</string>
 | 
					    <string name="module_installer_initial">Експериментальний модуль ядра може підвищити продуктивність</string>
 | 
				
			||||||
    <string name="module_installer_not_found">Немає доступних модулів для вашого пристрою</string>
 | 
					    <string name="module_installer_not_found">Немає доступних модулів для вашого пристрою</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -129,10 +129,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">查看应用日志</string>
 | 
					    <string name="log_viewer_pref_title">查看应用日志</string>
 | 
				
			||||||
    <string name="log_viewer_title">日志</string>
 | 
					    <string name="log_viewer_title">日志</string>
 | 
				
			||||||
    <string name="logcat_error">无法运行 logcat: </string>
 | 
					    <string name="logcat_error">无法运行 logcat: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">内核空间的模块性能较强,但可能不稳定</string>
 | 
					    <string name="module_enabler_disabled_summary">内核空间的模块性能较强,但可能不稳定</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">启用内核模块</string>
 | 
					    <string name="module_enabler_disabled_title">启用内核模块</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">用户空间的模块性能较弱,但稳定性更好</string>
 | 
					    <string name="module_enabler_enabled_summary">用户空间的模块性能较弱,但稳定性更好</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">停用内核模块</string>
 | 
					    <string name="module_enabler_enabled_title">停用内核模块</string>
 | 
				
			||||||
    <string name="module_installer_error">发生错误,请重试</string>
 | 
					    <string name="module_installer_error">发生错误,请重试</string>
 | 
				
			||||||
    <string name="module_installer_initial">使用内核模块可以提升性能(实验性)</string>
 | 
					    <string name="module_installer_initial">使用内核模块可以提升性能(实验性)</string>
 | 
				
			||||||
    <string name="module_installer_not_found">没有可用于此设备的模块</string>
 | 
					    <string name="module_installer_not_found">没有可用于此设备的模块</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -129,8 +129,8 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">檢視應用程式日誌</string>
 | 
					    <string name="log_viewer_pref_title">檢視應用程式日誌</string>
 | 
				
			||||||
    <string name="log_viewer_title">日誌</string>
 | 
					    <string name="log_viewer_title">日誌</string>
 | 
				
			||||||
    <string name="logcat_error">無法執行 logcat: </string>
 | 
					    <string name="logcat_error">無法執行 logcat: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">使用還在實驗階段的 kernel module 以便改善效能</string>
 | 
					    <string name="module_enabler_disabled_summary">使用還在實驗階段的 kernel module 以便改善效能</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">啟用 kernel module</string>
 | 
					    <string name="module_enabler_disabled_title">啟用 kernel module</string>
 | 
				
			||||||
    <string name="save">儲存</string>
 | 
					    <string name="save">儲存</string>
 | 
				
			||||||
    <string name="select_all">全選</string>
 | 
					    <string name="select_all">全選</string>
 | 
				
			||||||
    <string name="toggle_all">切換全部</string>
 | 
					    <string name="toggle_all">切換全部</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -144,10 +144,10 @@
 | 
				
			|||||||
    <string name="log_viewer_pref_title">View application log</string>
 | 
					    <string name="log_viewer_pref_title">View application log</string>
 | 
				
			||||||
    <string name="log_viewer_title">Log</string>
 | 
					    <string name="log_viewer_title">Log</string>
 | 
				
			||||||
    <string name="logcat_error">Unable to run logcat: </string>
 | 
					    <string name="logcat_error">Unable to run logcat: </string>
 | 
				
			||||||
    <string name="module_disabler_disabled_summary">The experimental kernel module can improve performance</string>
 | 
					    <string name="module_enabler_disabled_summary">The experimental kernel module can improve performance</string>
 | 
				
			||||||
    <string name="module_disabler_disabled_title">Enable kernel module backend</string>
 | 
					    <string name="module_enabler_disabled_title">Enable kernel module backend</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_summary">The slower userspace backend may improve stability</string>
 | 
					    <string name="module_enabler_enabled_summary">The slower userspace backend may improve stability</string>
 | 
				
			||||||
    <string name="module_disabler_enabled_title">Disable kernel module backend</string>
 | 
					    <string name="module_enabler_enabled_title">Disable kernel module backend</string>
 | 
				
			||||||
    <string name="module_installer_error">Something went wrong. Please try again</string>
 | 
					    <string name="module_installer_error">Something went wrong. Please try again</string>
 | 
				
			||||||
    <string name="module_installer_initial">The experimental kernel module can improve performance</string>
 | 
					    <string name="module_installer_initial">The experimental kernel module can improve performance</string>
 | 
				
			||||||
    <string name="module_installer_not_found">No modules are available for your device</string>
 | 
					    <string name="module_installer_not_found">No modules are available for your device</string>
 | 
				
			||||||
 | 
				
			|||||||
@ -27,9 +27,8 @@
 | 
				
			|||||||
        android:summaryOff="@string/multiple_tunnels_summary_off"
 | 
					        android:summaryOff="@string/multiple_tunnels_summary_off"
 | 
				
			||||||
        android:summaryOn="@string/multiple_tunnels_summary_on"
 | 
					        android:summaryOn="@string/multiple_tunnels_summary_on"
 | 
				
			||||||
        android:title="@string/multiple_tunnels_title" />
 | 
					        android:title="@string/multiple_tunnels_title" />
 | 
				
			||||||
    <com.wireguard.android.preference.ModuleDownloaderPreference android:key="module_downloader" />
 | 
					 | 
				
			||||||
    <com.wireguard.android.preference.ToolsInstallerPreference android:key="tools_installer" />
 | 
					    <com.wireguard.android.preference.ToolsInstallerPreference android:key="tools_installer" />
 | 
				
			||||||
    <com.wireguard.android.preference.KernelModuleDisablerPreference android:key="kernel_module_disabler" />
 | 
					    <com.wireguard.android.preference.KernelModuleEnablerPreference android:key="kernel_module_enabler" />
 | 
				
			||||||
    <CheckBoxPreference
 | 
					    <CheckBoxPreference
 | 
				
			||||||
        android:defaultValue="false"
 | 
					        android:defaultValue="false"
 | 
				
			||||||
        android:key="allow_remote_control_intents"
 | 
					        android:key="allow_remote_control_intents"
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user