From ffa4f028f0eea18b13eed01d1b0b2bea02b9251e Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:07:20 -0300 Subject: [PATCH 01/64] Use requested FTP defaults --- .../main/java/com/erikraft/drop/FtpSettingsActivity.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java b/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java index e30e04396..3c3aa5277 100644 --- a/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java +++ b/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java @@ -138,17 +138,17 @@ private void buildUi() { }); portInput = field(getString(R.string.ftp_port_hint), prefs.getString(getString(R.string.pref_ftp_port), "2221"), InputType.TYPE_CLASS_NUMBER); content.addView((TextInputLayout) portInput.getTag(), lpTop(dp(12))); - usernameInput = field(getString(R.string.ftp_username_hint), prefs.getString(getString(R.string.pref_ftp_username), "admin"), InputType.TYPE_CLASS_TEXT); + usernameInput = field(getString(R.string.ftp_username_hint), prefs.getString(getString(R.string.pref_ftp_username), "android"), InputType.TYPE_CLASS_TEXT); content.addView((TextInputLayout) usernameInput.getTag(), lpTop(dp(8))); - passwordInput = field(getString(R.string.ftp_password_hint), prefs.getString(getString(R.string.pref_ftp_password), "admin"), InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); + passwordInput = field(getString(R.string.ftp_password_hint), prefs.getString(getString(R.string.pref_ftp_password), "android"), InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); content.addView((TextInputLayout) passwordInput.getTag(), lpTop(dp(8))); anonymousSwitch = new SwitchCompat(this); anonymousSwitch.setText(R.string.ftp_anonymous_title); - anonymousSwitch.setChecked(prefs.getBoolean(getString(R.string.pref_ftp_anonymous), false)); + anonymousSwitch.setChecked(prefs.getBoolean(getString(R.string.pref_ftp_anonymous), true)); content.addView(anonymousSwitch, lpTop(dp(8))); ftpsSwitch = new SwitchCompat(this); ftpsSwitch.setText(R.string.ftp_ftps_title); - ftpsSwitch.setChecked(prefs.getBoolean(getString(R.string.pref_ftp_ftps), true)); + ftpsSwitch.setChecked(prefs.getBoolean(getString(R.string.pref_ftp_ftps), false)); content.addView(ftpsSwitch, lpTop(dp(4))); stopNotificationSwitch = new SwitchCompat(this); stopNotificationSwitch.setText(R.string.ftp_stop_notification_title); From 95d42bfe57c14a370278f0b575b8d369b0ea44ba Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:07:25 -0300 Subject: [PATCH 02/64] Align FTP service defaults with settings --- app/src/main/java/com/erikraft/drop/FtpServerService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/erikraft/drop/FtpServerService.java b/app/src/main/java/com/erikraft/drop/FtpServerService.java index b793b5c83..b46ff086e 100644 --- a/app/src/main/java/com/erikraft/drop/FtpServerService.java +++ b/app/src/main/java/com/erikraft/drop/FtpServerService.java @@ -99,10 +99,10 @@ private void startServer(long generation) { try { android.content.SharedPreferences prefs = androidx.preference.PreferenceManager.getDefaultSharedPreferences(this); int port = parsePort(prefs.getString(getString(R.string.pref_ftp_port), "" + DEFAULT_PORT)); - String username = valueOrDefault(prefs.getString(getString(R.string.pref_ftp_username), ""), "admin"); - String password = valueOrDefault(prefs.getString(getString(R.string.pref_ftp_password), ""), "erikraft"); - boolean anonymous = prefs.getBoolean(getString(R.string.pref_ftp_anonymous), false); - boolean ftps = prefs.getBoolean(getString(R.string.pref_ftp_ftps), true); + String username = valueOrDefault(prefs.getString(getString(R.string.pref_ftp_username), ""), "android"); + String password = valueOrDefault(prefs.getString(getString(R.string.pref_ftp_password), ""), "android"); + boolean anonymous = prefs.getBoolean(getString(R.string.pref_ftp_anonymous), true); + boolean ftps = prefs.getBoolean(getString(R.string.pref_ftp_ftps), false); File home = resolveHome(prefs.getString(getString(R.string.pref_save_location), "")); if (!home.exists() && !home.mkdirs()) throw new IllegalStateException("Não foi possível criar a pasta base: " + home); From b2a3b360c5659c10fd26f9fa17e4557a556f0e8b Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:07:29 -0300 Subject: [PATCH 03/64] Use requested SFTP credentials by default --- app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java b/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java index 012e84aa0..9a07f1859 100644 --- a/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java +++ b/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java @@ -97,7 +97,7 @@ private void buildUi(){ MaterialButton choose=new MaterialButton(this);choose.setText(R.string.ftp_choose_directory);c.addView(choose,top(12)); folder=text(p.getString(getString(R.string.pref_sftp_save_location),Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath()),13);folder.setTextIsSelectable(true);c.addView(folder,top(4)); choose.setOnClickListener(v->{Intent i=new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION|Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION|Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);picker.launch(i);}); - port=field(getString(R.string.ftp_port_hint),p.getString(getString(R.string.pref_sftp_port),"2222"));user=field(getString(R.string.ftp_username_hint),p.getString(getString(R.string.pref_sftp_username),"admin"));password=field(getString(R.string.ftp_password_hint),p.getString(getString(R.string.pref_sftp_password),"admin")); + port=field(getString(R.string.ftp_port_hint),p.getString(getString(R.string.pref_sftp_port),"2222"));user=field(getString(R.string.ftp_username_hint),p.getString(getString(R.string.pref_sftp_username),"android"));password=field(getString(R.string.ftp_password_hint),p.getString(getString(R.string.pref_sftp_password),"android")); c.addView((TextInputLayout)port.getTag(),top(12));c.addView((TextInputLayout)user.getTag(),top(8));c.addView((TextInputLayout)password.getTag(),top(8)); stopNotificationSwitch = new SwitchCompat(this); stopNotificationSwitch.setText(R.string.ftp_stop_notification_title); From fee040e7f03951889da147e3daf33c6b4d9e0772 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:07:32 -0300 Subject: [PATCH 04/64] Align SFTP service credential defaults --- app/src/main/java/com/erikraft/drop/SftpServerService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/erikraft/drop/SftpServerService.java b/app/src/main/java/com/erikraft/drop/SftpServerService.java index b5d5b024f..679870616 100644 --- a/app/src/main/java/com/erikraft/drop/SftpServerService.java +++ b/app/src/main/java/com/erikraft/drop/SftpServerService.java @@ -86,9 +86,9 @@ private void startServer() { PreferenceManager.getDefaultSharedPreferences(this); int port = parsePort(prefs.getString(getString(R.string.pref_sftp_port), "" + DEFAULT_PORT)); String username = valueOrDefault( - prefs.getString(getString(R.string.pref_sftp_username), ""), "admin"); + prefs.getString(getString(R.string.pref_sftp_username), ""), "android"); String password = valueOrDefault( - prefs.getString(getString(R.string.pref_sftp_password), ""), "admin"); + prefs.getString(getString(R.string.pref_sftp_password), ""), "android"); String configuredHome = prefs.getString(getString(R.string.pref_sftp_save_location), ""); File home = new File(configuredHome); if (!home.isDirectory() || !home.canRead() || !home.canWrite()) { From 98b4c5a190da3724a4e634823267ccfdf5b6b813 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:08:03 -0300 Subject: [PATCH 05/64] Show FTP connection QR code when starting server --- .../erikraft/drop/FtpSettingsActivity.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java b/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java index 3c3aa5277..682f2a4d1 100644 --- a/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java +++ b/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java @@ -2,6 +2,13 @@ import android.Manifest; import android.app.Activity; +import android.app.AlertDialog; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.widget.ImageView; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.WriterException; +import com.google.zxing.qrcode.QRCodeWriter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -241,6 +248,7 @@ private void saveAndStart() { .apply(); ContextCompat.startForegroundService(this, FtpServerService.startIntent(this)); status.setText(R.string.ftp_starting); + showConnectionQr(buildAddress()); } private void stopServer() { @@ -285,6 +293,26 @@ private void copyAddress() { Toast.makeText(this, R.string.ftp_address_copied, Toast.LENGTH_SHORT).show(); } + private void showConnectionQr(String connectionAddress) { + try { + com.google.zxing.common.BitMatrix matrix = new QRCodeWriter().encode(connectionAddress, BarcodeFormat.QR_CODE, 480, 480); + Bitmap bitmap = Bitmap.createBitmap(480, 480, Bitmap.Config.RGB_565); + for (int y = 0; y < 480; y++) { + for (int x = 0; x < 480; x++) bitmap.setPixel(x, y, matrix.get(x, y) ? Color.BLACK : Color.WHITE); + } + ImageView image = new ImageView(this); + image.setImageBitmap(bitmap); + image.setAdjustViewBounds(true); + int padding = dp(16); + image.setPadding(padding, padding, padding, padding); + new AlertDialog.Builder(this).setTitle(R.string.ftp_settings_title) + .setMessage(connectionAddress).setView(image) + .setPositiveButton(android.R.string.ok, null).show(); + } catch (WriterException e) { + Toast.makeText(this, connectionAddress, Toast.LENGTH_LONG).show(); + } + } + private TextView text(String value, float size) { TextView view = new TextView(this); view.setText(value); From 848ad8f5a0d38ff5c5e72a1d67ca6d1f4974797b Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:08:07 -0300 Subject: [PATCH 06/64] Show SFTP connection QR code when starting server --- .../erikraft/drop/SftpSettingsActivity.java | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java b/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java index 9a07f1859..aa00d02a9 100644 --- a/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java +++ b/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java @@ -2,6 +2,13 @@ import android.Manifest; import android.app.Activity; +import android.app.AlertDialog; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.widget.ImageView; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.WriterException; +import com.google.zxing.qrcode.QRCodeWriter; import android.content.Intent; import android.content.BroadcastReceiver; import android.content.Context; @@ -143,10 +150,30 @@ private void startServer(){ if(po<1025||po>65535){Toast.makeText(this,getString(R.string.transfer_error_port_range),Toast.LENGTH_SHORT).show();return;} String u=user.getText().toString().trim(),pw=password.getText().toString();if(u.isEmpty()||pw.isEmpty()){Toast.makeText(this,getString(R.string.transfer_error_credentials_required),Toast.LENGTH_SHORT).show();return;} p.edit().putString(getString(R.string.pref_sftp_save_location),f.getAbsolutePath()).putString(getString(R.string.pref_sftp_port),String.valueOf(po)).putString(getString(R.string.pref_sftp_username),u).putString(getString(R.string.pref_sftp_password),pw).putBoolean(getString(R.string.pref_sftp_stop_notification), stopNotificationSwitch.isChecked()).apply(); - androidx.core.content.ContextCompat.startForegroundService(this, SftpServerService.startIntent(this));status.setText(R.string.ftp_starting);address.setText("sftp://"+com.erikraft.drop.utils.NetworkUtils.getIpAddress(this)+":"+po); + androidx.core.content.ContextCompat.startForegroundService(this, SftpServerService.startIntent(this));status.setText(R.string.ftp_starting);address.setText("sftp://"+com.erikraft.drop.utils.NetworkUtils.getIpAddress(this)+":"+po);showConnectionQr(address.getText().toString()); } private void stopServer(){startService(SftpServerService.stopIntent(this));} private void updateServerToggle(boolean running){if(serverToggleButton!=null)serverToggleButton.setText(running?R.string.sftp_stop:R.string.sftp_start);} + private void showConnectionQr(String connectionAddress) { + try { + com.google.zxing.common.BitMatrix matrix = new QRCodeWriter().encode(connectionAddress, BarcodeFormat.QR_CODE, 480, 480); + Bitmap bitmap = Bitmap.createBitmap(480, 480, Bitmap.Config.RGB_565); + for (int y = 0; y < 480; y++) { + for (int x = 0; x < 480; x++) bitmap.setPixel(x, y, matrix.get(x, y) ? Color.BLACK : Color.WHITE); + } + ImageView image = new ImageView(this); + image.setImageBitmap(bitmap); + image.setAdjustViewBounds(true); + int padding = dp(16); + image.setPadding(padding, padding, padding, padding); + new AlertDialog.Builder(this).setTitle(R.string.sftp_settings_title) + .setMessage(connectionAddress).setView(image) + .setPositiveButton(android.R.string.ok, null).show(); + } catch (WriterException e) { + Toast.makeText(this, connectionAddress, Toast.LENGTH_LONG).show(); + } + } + @Override protected void onDestroy(){ if(statusReceiver!=null) unregisterReceiver(statusReceiver); super.onDestroy(); } private TextInputEditText field(String h,String v){TextInputLayout l=new TextInputLayout(this);l.setHint(h);if(getString(R.string.ftp_password_hint).equals(h))l.setEndIconMode(TextInputLayout.END_ICON_PASSWORD_TOGGLE);TextInputEditText e=new TextInputEditText(this);e.setSingleLine(true);e.setText(v);l.addView(e,new LinearLayout.LayoutParams(-1,-2));e.setTag(l);return e;} private MaterialButton button(String label){MaterialButton b=new MaterialButton(this);b.setText(label);return b;} From b7cd0f28d7da90f2a3ea5019a0c3f47ba80efe13 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:08:33 -0300 Subject: [PATCH 07/64] Size connection QR codes for phone screens --- app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java b/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java index 682f2a4d1..b314a06a5 100644 --- a/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java +++ b/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java @@ -303,8 +303,10 @@ private void showConnectionQr(String connectionAddress) { ImageView image = new ImageView(this); image.setImageBitmap(bitmap); image.setAdjustViewBounds(true); - int padding = dp(16); + image.setScaleType(ImageView.ScaleType.FIT_CENTER); + int padding = dp(12); image.setPadding(padding, padding, padding, padding); + image.setLayoutParams(new android.view.ViewGroup.LayoutParams(dp(240), dp(240))); new AlertDialog.Builder(this).setTitle(R.string.ftp_settings_title) .setMessage(connectionAddress).setView(image) .setPositiveButton(android.R.string.ok, null).show(); From eb50ed39581dc850aea768deb6f4acdf0fa4d477 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:08:37 -0300 Subject: [PATCH 08/64] Size connection QR codes for phone screens --- app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java b/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java index aa00d02a9..d6b996d07 100644 --- a/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java +++ b/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java @@ -164,8 +164,10 @@ private void showConnectionQr(String connectionAddress) { ImageView image = new ImageView(this); image.setImageBitmap(bitmap); image.setAdjustViewBounds(true); - int padding = dp(16); + image.setScaleType(ImageView.ScaleType.FIT_CENTER); + int padding = dp(12); image.setPadding(padding, padding, padding, padding); + image.setLayoutParams(new android.view.ViewGroup.LayoutParams(dp(240), dp(240))); new AlertDialog.Builder(this).setTitle(R.string.sftp_settings_title) .setMessage(connectionAddress).setView(image) .setPositiveButton(android.R.string.ok, null).show(); From 19d0c77c1da6bd234449c1527f4d1aaa08df8e24 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:27:44 -0300 Subject: [PATCH 09/64] Enforce FTP read-only mode and configure FTPS explicit or implicit TLS --- .../main/java/com/erikraft/drop/FtpServerService.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/erikraft/drop/FtpServerService.java b/app/src/main/java/com/erikraft/drop/FtpServerService.java index b46ff086e..1c959acca 100644 --- a/app/src/main/java/com/erikraft/drop/FtpServerService.java +++ b/app/src/main/java/com/erikraft/drop/FtpServerService.java @@ -25,6 +25,7 @@ import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory; import org.apache.ftpserver.usermanager.SaltedPasswordEncryptor; import org.apache.ftpserver.usermanager.impl.BaseUser; +import org.apache.ftpserver.usermanager.impl.ReadPermission; import org.apache.ftpserver.usermanager.impl.WritePermission; import org.bouncycastle.asn1.x500.X500Name; import org.bouncycastle.cert.X509CertificateHolder; @@ -103,6 +104,8 @@ private void startServer(long generation) { String password = valueOrDefault(prefs.getString(getString(R.string.pref_ftp_password), ""), "android"); boolean anonymous = prefs.getBoolean(getString(R.string.pref_ftp_anonymous), true); boolean ftps = prefs.getBoolean(getString(R.string.pref_ftp_ftps), false); + boolean implicitFtps = prefs.getBoolean(getString(R.string.pref_ftp_ftps_implicit), false); + boolean readOnly = prefs.getBoolean(getString(R.string.pref_ftp_read_only), false); File home = resolveHome(prefs.getString(getString(R.string.pref_save_location), "")); if (!home.exists() && !home.mkdirs()) throw new IllegalStateException("Não foi possível criar a pasta base: " + home); @@ -120,7 +123,8 @@ private void startServer(long generation) { user.setPassword(password); user.setHomeDirectory(home.getAbsolutePath()); List authorities = new ArrayList<>(); - authorities.add(new WritePermission()); + if (readOnly) authorities.add(new ReadPermission()); + else authorities.add(new WritePermission()); user.setAuthorities(authorities); userManager.save(user); @@ -151,9 +155,9 @@ private void startServer(long generation) { sslFactory.setSslProtocol("TLS"); SslConfiguration ssl = sslFactory.createSslConfiguration(); listener.setSslConfiguration(ssl); - listener.setImplicitSsl(false); + listener.setImplicitSsl(implicitFtps); data.setSslConfiguration(ssl); - data.setImplicitSsl(false); + data.setImplicitSsl(implicitFtps); } listener.setDataConnectionConfiguration(data.createDataConnectionConfiguration()); From fac4e743ca71b3a95b2221016b13f3a4b9a42701 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:27:54 -0300 Subject: [PATCH 10/64] Enforce read-only mode at the SFTP filesystem accessor --- .../com/erikraft/drop/SftpServerService.java | 60 ++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/erikraft/drop/SftpServerService.java b/app/src/main/java/com/erikraft/drop/SftpServerService.java index 679870616..075a001c6 100644 --- a/app/src/main/java/com/erikraft/drop/SftpServerService.java +++ b/app/src/main/java/com/erikraft/drop/SftpServerService.java @@ -21,6 +21,23 @@ import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; import org.apache.sshd.server.session.ServerSession; import org.apache.sshd.sftp.server.SftpSubsystemFactory; +import org.apache.sshd.sftp.server.SftpFileSystemAccessor; +import org.apache.sshd.sftp.server.SftpSubsystemProxy; +import org.apache.sshd.sftp.server.FileHandle; +import java.io.IOException; +import java.nio.channels.SeekableByteChannel; +import java.nio.file.OpenOption; +import java.nio.file.Path; +import java.nio.file.LinkOption; +import java.nio.file.attribute.FileAttribute; +import java.nio.file.attribute.PosixFilePermission; +import java.nio.file.attribute.UserPrincipal; +import java.nio.file.attribute.GroupPrincipal; +import java.nio.file.attribute.AclEntry; +import java.security.Principal; +import java.util.Collection; +import java.util.Map; +import java.util.Set; import java.io.File; import java.util.Collections; @@ -90,6 +107,7 @@ private void startServer() { String password = valueOrDefault( prefs.getString(getString(R.string.pref_sftp_password), ""), "android"); String configuredHome = prefs.getString(getString(R.string.pref_sftp_save_location), ""); + boolean readOnly = prefs.getBoolean(getString(R.string.pref_sftp_read_only), false); File home = new File(configuredHome); if (!home.isDirectory() || !home.canRead() || !home.canWrite()) { throw new IllegalStateException("A pasta SFTP selecionada não pode ser acessada diretamente."); @@ -110,7 +128,9 @@ public boolean authenticate(String user, String pass, ServerSession session) { }); candidate.setFileSystemFactory(new VirtualFileSystemFactory(home.toPath())); candidate.setSubsystemFactories(Collections.singletonList( - new SftpSubsystemFactory.Builder().build())); + new SftpSubsystemFactory.Builder() + .withFileSystemAccessor(readOnly ? new ReadOnlySftpFileSystemAccessor() : SftpFileSystemAccessor.DEFAULT) + .build())); synchronized (LOCK) { if (server != null) { @@ -141,6 +161,44 @@ public boolean authenticate(String user, String pass, ServerSession session) { } + + /** + * Enforces read-only access at the SFTP filesystem boundary, including metadata and + * directory mutations, rather than relying on the settings UI or client behavior. + */ + private static final class ReadOnlySftpFileSystemAccessor implements SftpFileSystemAccessor { + private IOException readOnly() { + return new IOException("SFTP is configured as read-only."); + } + + @Override + public SeekableByteChannel openFile(SftpSubsystemProxy subsystem, FileHandle fileHandle, + Path file, String handle, Set options, FileAttribute... attrs) + throws IOException { + for (OpenOption option : options) { + String name = option.toString(); + if ("WRITE".equals(name) || "APPEND".equals(name) || "CREATE".equals(name) + || "CREATE_NEW".equals(name) || "TRUNCATE_EXISTING".equals(name) + || "DELETE_ON_CLOSE".equals(name)) { + throw readOnly(); + } + } + return SftpFileSystemAccessor.DEFAULT.openFile( + subsystem, fileHandle, file, handle, options, attrs); + } + + @Override public void createDirectory(SftpSubsystemProxy subsystem, Path path) throws IOException { throw readOnly(); } + @Override public void createLink(SftpSubsystemProxy subsystem, Path link, Path existing, boolean symLink) throws IOException { throw readOnly(); } + @Override public void removeFile(SftpSubsystemProxy subsystem, Path path, boolean isDirectory) throws IOException { throw readOnly(); } + @Override public void renameFile(SftpSubsystemProxy subsystem, Path oldPath, Path newPath, Collection opts) throws IOException { throw readOnly(); } + @Override public void copyFile(SftpSubsystemProxy subsystem, Path src, Path dst, Collection opts) throws IOException { throw readOnly(); } + @Override public void setFileAttribute(SftpSubsystemProxy subsystem, Path file, String view, String attribute, Object value, LinkOption... options) throws IOException { throw readOnly(); } + @Override public void setFileOwner(SftpSubsystemProxy subsystem, Path file, Principal value, LinkOption... options) throws IOException { throw readOnly(); } + @Override public void setGroupOwner(SftpSubsystemProxy subsystem, Path file, Principal value, LinkOption... options) throws IOException { throw readOnly(); } + @Override public void setFilePermissions(SftpSubsystemProxy subsystem, Path file, Set perms, LinkOption... options) throws IOException { throw readOnly(); } + @Override public void setFileAccessControl(SftpSubsystemProxy subsystem, Path file, java.util.List acl, LinkOption... options) throws IOException { throw readOnly(); } + } + private int parsePort(String value) { try { int port = Integer.parseInt(value); From 8e231e943e6046abffda7863b5255de2237936ad Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:28:03 -0300 Subject: [PATCH 11/64] Add FTPS mode selection, read-only setting and explicit network status --- .../erikraft/drop/FtpSettingsActivity.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java b/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java index b314a06a5..e5f86117e 100644 --- a/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java +++ b/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java @@ -50,6 +50,9 @@ public class FtpSettingsActivity extends DropPipActivity { private TextInputEditText passwordInput; private SwitchCompat anonymousSwitch; private SwitchCompat ftpsSwitch; + private SwitchCompat readOnlySwitch; + private MaterialButton ftpsModeButton; + private TextView networkState; private SwitchCompat stopNotificationSwitch; private TextView directorySummary; private TextView status; @@ -157,6 +160,23 @@ private void buildUi() { ftpsSwitch.setText(R.string.ftp_ftps_title); ftpsSwitch.setChecked(prefs.getBoolean(getString(R.string.pref_ftp_ftps), false)); content.addView(ftpsSwitch, lpTop(dp(4))); + ftpsModeButton = new MaterialButton(this); + content.addView(ftpsModeButton, lpTop(dp(4))); + updateFtpsModeLabel(); + ftpsModeButton.setOnClickListener(v -> { + final String[] modes = {getString(R.string.ftp_ftps_explicit), getString(R.string.ftp_ftps_implicit)}; + new AlertDialog.Builder(this).setTitle(R.string.ftp_ftps_mode_title) + .setSingleChoiceItems(modes, prefs.getBoolean(getString(R.string.pref_ftp_ftps_implicit), false) ? 1 : 0, + (dialog, which) -> { + prefs.edit().putBoolean(getString(R.string.pref_ftp_ftps_implicit), which == 1).apply(); + updateFtpsModeLabel(); + dialog.dismiss(); + }).setNegativeButton(android.R.string.cancel, null).show(); + }); + readOnlySwitch = new SwitchCompat(this); + readOnlySwitch.setText(R.string.ftp_read_only_title); + readOnlySwitch.setChecked(prefs.getBoolean(getString(R.string.pref_ftp_read_only), false)); + content.addView(readOnlySwitch, lpTop(dp(8))); stopNotificationSwitch = new SwitchCompat(this); stopNotificationSwitch.setText(R.string.ftp_stop_notification_title); stopNotificationSwitch.setChecked(prefs.getBoolean(getString(R.string.pref_ftp_stop_notification), false)); @@ -266,11 +286,11 @@ private void updateAddress() { private String buildAddress() { String port = prefs.getString(getString(R.string.pref_ftp_port), "2221"); - String scheme = prefs.getBoolean(getString(R.string.pref_ftp_ftps), true) ? "ftps" : "ftp"; + String scheme = prefs.getBoolean(getString(R.string.pref_ftp_ftps), false) ? "ftps" : "ftp"; return scheme + "://" + getWifiAddress() + ":" + port; } - private String getWifiAddress() { + private void updateFtpsModeLabel() {\n if (ftpsModeButton == null) return;\n boolean implicit = prefs.getBoolean(getString(R.string.pref_ftp_ftps_implicit), false);\n ftpsModeButton.setText(getString(R.string.ftp_ftps_mode_label, getString(implicit ? R.string.ftp_ftps_implicit : R.string.ftp_ftps_explicit)));\n ftpsModeButton.setEnabled(ftpsSwitch != null && ftpsSwitch.isChecked());\n if (ftpsSwitch != null) ftpsSwitch.setOnCheckedChangeListener((button, checked) -> { if (ftpsModeButton != null) ftpsModeButton.setEnabled(checked); });\n }\n\n private String buildNetworkStatus() {\n android.net.ConnectivityManager cm = (android.net.ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);\n android.net.NetworkInfo info = cm == null ? null : cm.getActiveNetworkInfo();\n boolean wifiConnected = info != null && info.isConnected() && info.getType() == android.net.ConnectivityManager.TYPE_WIFI;\n return getString(wifiConnected ? R.string.ftp_wifi_connected : R.string.ftp_wifi_disconnected) + "\\n" + getString(R.string.ftp_ip_address, com.erikraft.drop.utils.NetworkUtils.getIpAddress(this));\n }\n\n private String getWifiAddress() { try { for (NetworkInterface network : Collections.list(NetworkInterface.getNetworkInterfaces())) { for (java.net.InetAddress address : Collections.list(network.getInetAddresses())) { From 75c0cd095a8a47500ef30705a52d1ddedaf60585 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:28:10 -0300 Subject: [PATCH 12/64] Expose SFTP read-only option and Wi-Fi/IP status --- .../com/erikraft/drop/SftpSettingsActivity.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java b/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java index d6b996d07..019186c35 100644 --- a/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java +++ b/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java @@ -40,6 +40,8 @@ public class SftpSettingsActivity extends DropPipActivity { private ActivityResultLauncher picker; private ActivityResultLauncher notificationPermissionLauncher; private SwitchCompat stopNotificationSwitch; + private SwitchCompat readOnlySwitch; + private TextView networkState; private BroadcastReceiver statusReceiver; @Override protected void onCreate(Bundle state) { @@ -106,10 +108,11 @@ private void buildUi(){ choose.setOnClickListener(v->{Intent i=new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION|Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION|Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);picker.launch(i);}); port=field(getString(R.string.ftp_port_hint),p.getString(getString(R.string.pref_sftp_port),"2222"));user=field(getString(R.string.ftp_username_hint),p.getString(getString(R.string.pref_sftp_username),"android"));password=field(getString(R.string.ftp_password_hint),p.getString(getString(R.string.pref_sftp_password),"android")); c.addView((TextInputLayout)port.getTag(),top(12));c.addView((TextInputLayout)user.getTag(),top(8));c.addView((TextInputLayout)password.getTag(),top(8)); - stopNotificationSwitch = new SwitchCompat(this); + readOnlySwitch = new SwitchCompat(this);\n readOnlySwitch.setText(R.string.ftp_read_only_title);\n readOnlySwitch.setChecked(p.getBoolean(getString(R.string.pref_sftp_read_only), false));\n c.addView(readOnlySwitch,top(8));\n stopNotificationSwitch = new SwitchCompat(this); stopNotificationSwitch.setText(R.string.ftp_stop_notification_title); stopNotificationSwitch.setChecked(p.getBoolean(getString(R.string.pref_sftp_stop_notification), false)); c.addView(stopNotificationSwitch,top(10)); + networkState=text(buildNetworkStatus(),13);c.addView(networkState,top(12)); status=text(initialStatus == null ? getString(R.string.server_status_stopped) : initialStatus,15);c.addView(status,top(18));address=text("",14);address.setTextIsSelectable(true);c.addView(address,top(4)); serverToggleButton=button(getString(R.string.sftp_start));c.addView(serverToggleButton,top(14)); MaterialButton copy=button(getString(R.string.ftp_copy_address));c.addView(copy,top(8)); @@ -149,9 +152,15 @@ private void startServer(){ int po;try{po=Integer.parseInt(port.getText().toString());}catch(Exception e){Toast.makeText(this,getString(R.string.transfer_error_invalid_port),Toast.LENGTH_SHORT).show();return;} if(po<1025||po>65535){Toast.makeText(this,getString(R.string.transfer_error_port_range),Toast.LENGTH_SHORT).show();return;} String u=user.getText().toString().trim(),pw=password.getText().toString();if(u.isEmpty()||pw.isEmpty()){Toast.makeText(this,getString(R.string.transfer_error_credentials_required),Toast.LENGTH_SHORT).show();return;} - p.edit().putString(getString(R.string.pref_sftp_save_location),f.getAbsolutePath()).putString(getString(R.string.pref_sftp_port),String.valueOf(po)).putString(getString(R.string.pref_sftp_username),u).putString(getString(R.string.pref_sftp_password),pw).putBoolean(getString(R.string.pref_sftp_stop_notification), stopNotificationSwitch.isChecked()).apply(); + p.edit().putString(getString(R.string.pref_sftp_save_location),f.getAbsolutePath()).putString(getString(R.string.pref_sftp_port),String.valueOf(po)).putString(getString(R.string.pref_sftp_username),u).putString(getString(R.string.pref_sftp_password),pw).putBoolean(getString(R.string.pref_sftp_read_only), readOnlySwitch.isChecked()).putBoolean(getString(R.string.pref_sftp_stop_notification), stopNotificationSwitch.isChecked()).apply(); androidx.core.content.ContextCompat.startForegroundService(this, SftpServerService.startIntent(this));status.setText(R.string.ftp_starting);address.setText("sftp://"+com.erikraft.drop.utils.NetworkUtils.getIpAddress(this)+":"+po);showConnectionQr(address.getText().toString()); } + private String buildNetworkStatus() { + android.net.ConnectivityManager cm=(android.net.ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE); + android.net.NetworkInfo info=cm==null?null:cm.getActiveNetworkInfo(); + boolean wifiConnected=info!=null&&info.isConnected()&&info.getType()==android.net.ConnectivityManager.TYPE_WIFI; + return getString(wifiConnected?R.string.ftp_wifi_connected:R.string.ftp_wifi_disconnected)+"\\n"+getString(R.string.ftp_ip_address,com.erikraft.drop.utils.NetworkUtils.getIpAddress(this)); + } private void stopServer(){startService(SftpServerService.stopIntent(this));} private void updateServerToggle(boolean running){if(serverToggleButton!=null)serverToggleButton.setText(running?R.string.sftp_stop:R.string.sftp_start);} private void showConnectionQr(String connectionAddress) { From 48c5c1648db2b72314a80b561a3456d160f597af Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:28:17 -0300 Subject: [PATCH 13/64] Add strings for FTPS modes, read-only and network status --- app/src/main/res/values/strings.xml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e511f5246..22a0c6e4e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -319,4 +319,18 @@ <b>Built for file transfer and privacy</b><br/>ErikrafT Drop™ focuses on file transfer and privacy. It aims to adapt to a wide range of devices, from older and legacy systems to modern hardware, offering compatible options where possible. Availability depends on the device, operating system, and supported technologies.<br/><br/><b>Help improve ErikrafT Drop™</b><br/>Contribute a Pull Request to fix a problem or add a feature, or open an Issue with diagnostic details and steps to reproduce what happened. Clear reports and contributions help make the app more reliable for everyone. BETA Unavailable: required runtime support is missing on this device. + + + FTPS security mode + Explicit FTPS (recommended) + Implicit FTPS + FTPS mode: %1$s + Read-only access + Wi-Fi: connected + Wi-Fi: not connected (other network or offline) + Local IP address: %1$s + ftp_ftps_implicit + ftp_read_only + sftp_read_only + From ce54e2c00efca81bca57edcc4c542821ea99e8ae Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:28:29 -0300 Subject: [PATCH 14/64] Validate selected storage permissions and folder compatibility --- app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java b/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java index e5f86117e..74b9f93e5 100644 --- a/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java +++ b/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java @@ -100,7 +100,7 @@ protected void onCreate(Bundle savedInstanceState) { } } catch (SecurityException ignored) { } DocumentFile folder = DocumentFile.fromTreeUri(this, uri); - if (folder == null) return; + if (folder == null || !folder.isDirectory() || !folder.canRead() || !folder.canWrite()) {\n Toast.makeText(this, getString(R.string.transfer_error_folder_unsupported), Toast.LENGTH_LONG).show();\n return;\n } String path = DocumentFileUtils.getAbsolutePath(folder, this); if (path == null || path.trim().isEmpty()) { Toast.makeText(this, getString(R.string.transfer_error_directory_path), Toast.LENGTH_LONG).show(); From 0b8e90682e50f48e21eaee92cab4983eff05884c Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:28:33 -0300 Subject: [PATCH 15/64] Validate selected storage permissions and folder compatibility --- app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java b/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java index 019186c35..34308c883 100644 --- a/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java +++ b/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java @@ -67,7 +67,7 @@ else if((flags&Intent.FLAG_GRANT_READ_URI_PERMISSION)!=0) else if((flags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION)!=0) getContentResolver().takePersistableUriPermission(uri,Intent.FLAG_GRANT_WRITE_URI_PERMISSION);}catch(SecurityException ignored){} DocumentFile df=DocumentFile.fromTreeUri(this,uri); - if(df==null)return; + if(df==null||!df.isDirectory()||!df.canRead()||!df.canWrite()){Toast.makeText(this,getString(R.string.transfer_error_folder_unsupported),Toast.LENGTH_LONG).show();return;} String p=com.anggrayudi.storage.file.DocumentFileUtils.getAbsolutePath(df,this); File f=p==null?null:new File(p); if(f==null||!f.isDirectory()||!f.canRead()||!f.canWrite()){ From 6f1ebaf55b96fac986336b87752bc22f8d5feefb Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:40:30 -0300 Subject: [PATCH 16/64] Fix escaped newlines in FTP/SFTP settings Java --- .../erikraft/drop/FtpSettingsActivity.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java b/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java index 74b9f93e5..3e54c7a29 100644 --- a/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java +++ b/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java @@ -100,7 +100,10 @@ protected void onCreate(Bundle savedInstanceState) { } } catch (SecurityException ignored) { } DocumentFile folder = DocumentFile.fromTreeUri(this, uri); - if (folder == null || !folder.isDirectory() || !folder.canRead() || !folder.canWrite()) {\n Toast.makeText(this, getString(R.string.transfer_error_folder_unsupported), Toast.LENGTH_LONG).show();\n return;\n } + if (folder == null || !folder.isDirectory() || !folder.canRead() || !folder.canWrite()) { + Toast.makeText(this, getString(R.string.transfer_error_folder_unsupported), Toast.LENGTH_LONG).show(); + return; + } String path = DocumentFileUtils.getAbsolutePath(folder, this); if (path == null || path.trim().isEmpty()) { Toast.makeText(this, getString(R.string.transfer_error_directory_path), Toast.LENGTH_LONG).show(); @@ -290,7 +293,22 @@ private String buildAddress() { return scheme + "://" + getWifiAddress() + ":" + port; } - private void updateFtpsModeLabel() {\n if (ftpsModeButton == null) return;\n boolean implicit = prefs.getBoolean(getString(R.string.pref_ftp_ftps_implicit), false);\n ftpsModeButton.setText(getString(R.string.ftp_ftps_mode_label, getString(implicit ? R.string.ftp_ftps_implicit : R.string.ftp_ftps_explicit)));\n ftpsModeButton.setEnabled(ftpsSwitch != null && ftpsSwitch.isChecked());\n if (ftpsSwitch != null) ftpsSwitch.setOnCheckedChangeListener((button, checked) -> { if (ftpsModeButton != null) ftpsModeButton.setEnabled(checked); });\n }\n\n private String buildNetworkStatus() {\n android.net.ConnectivityManager cm = (android.net.ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);\n android.net.NetworkInfo info = cm == null ? null : cm.getActiveNetworkInfo();\n boolean wifiConnected = info != null && info.isConnected() && info.getType() == android.net.ConnectivityManager.TYPE_WIFI;\n return getString(wifiConnected ? R.string.ftp_wifi_connected : R.string.ftp_wifi_disconnected) + "\\n" + getString(R.string.ftp_ip_address, com.erikraft.drop.utils.NetworkUtils.getIpAddress(this));\n }\n\n private String getWifiAddress() { + private void updateFtpsModeLabel() { + if (ftpsModeButton == null) return; + boolean implicit = prefs.getBoolean(getString(R.string.pref_ftp_ftps_implicit), false); + ftpsModeButton.setText(getString(R.string.ftp_ftps_mode_label, getString(implicit ? R.string.ftp_ftps_implicit : R.string.ftp_ftps_explicit))); + ftpsModeButton.setEnabled(ftpsSwitch != null && ftpsSwitch.isChecked()); + if (ftpsSwitch != null) ftpsSwitch.setOnCheckedChangeListener((button, checked) -> { if (ftpsModeButton != null) ftpsModeButton.setEnabled(checked); }); + } + + private String buildNetworkStatus() { + android.net.ConnectivityManager cm = (android.net.ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); + android.net.NetworkInfo info = cm == null ? null : cm.getActiveNetworkInfo(); + boolean wifiConnected = info != null && info.isConnected() && info.getType() == android.net.ConnectivityManager.TYPE_WIFI; + return getString(wifiConnected ? R.string.ftp_wifi_connected : R.string.ftp_wifi_disconnected) + "\n" + getString(R.string.ftp_ip_address, com.erikraft.drop.utils.NetworkUtils.getIpAddress(this)); + } + + private String getWifiAddress() { try { for (NetworkInterface network : Collections.list(NetworkInterface.getNetworkInterfaces())) { for (java.net.InetAddress address : Collections.list(network.getInetAddresses())) { From d0d66647b8dd4ce49c9352b926ef83dc7a5b7555 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:40:34 -0300 Subject: [PATCH 17/64] Fix escaped newlines in FTP/SFTP settings Java --- .../main/java/com/erikraft/drop/SftpSettingsActivity.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java b/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java index 34308c883..b6910a4ef 100644 --- a/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java +++ b/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java @@ -108,7 +108,11 @@ private void buildUi(){ choose.setOnClickListener(v->{Intent i=new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION|Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION|Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);picker.launch(i);}); port=field(getString(R.string.ftp_port_hint),p.getString(getString(R.string.pref_sftp_port),"2222"));user=field(getString(R.string.ftp_username_hint),p.getString(getString(R.string.pref_sftp_username),"android"));password=field(getString(R.string.ftp_password_hint),p.getString(getString(R.string.pref_sftp_password),"android")); c.addView((TextInputLayout)port.getTag(),top(12));c.addView((TextInputLayout)user.getTag(),top(8));c.addView((TextInputLayout)password.getTag(),top(8)); - readOnlySwitch = new SwitchCompat(this);\n readOnlySwitch.setText(R.string.ftp_read_only_title);\n readOnlySwitch.setChecked(p.getBoolean(getString(R.string.pref_sftp_read_only), false));\n c.addView(readOnlySwitch,top(8));\n stopNotificationSwitch = new SwitchCompat(this); + readOnlySwitch = new SwitchCompat(this); + readOnlySwitch.setText(R.string.ftp_read_only_title); + readOnlySwitch.setChecked(p.getBoolean(getString(R.string.pref_sftp_read_only), false)); + c.addView(readOnlySwitch,top(8)); + stopNotificationSwitch = new SwitchCompat(this); stopNotificationSwitch.setText(R.string.ftp_stop_notification_title); stopNotificationSwitch.setChecked(p.getBoolean(getString(R.string.pref_sftp_stop_notification), false)); c.addView(stopNotificationSwitch,top(10)); From 6e44e68821a6b2b8ef48cbb56fcde96d05b65afd Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:43:41 -0300 Subject: [PATCH 18/64] Translate FTP/FTPS/SFTP configuration labels across locales --- app/src/main/res/values-af-rZA/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-ar-rSA/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-bg-rBG/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-ca-rES/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-cs-rCZ/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-da-rDK/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-de-rDE/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-el-rGR/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-es-rES/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-fi-rFI/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-fr-rFR/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-hi-rIN/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-hr-rHR/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-hu-rHU/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-in-rID/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-it-rIT/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-iw-rIL/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-ja-rJP/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-ko-rKR/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-mk-rMK/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-ne-rNP/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-nl-rNL/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-no-rNO/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-pl-rPL/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-pt-rBR/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-pt-rPT/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-ro-rRO/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-ru-rRU/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-sk-rSK/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-sl-rSI/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-sr-rRS/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-sr-rSP/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-sr/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-sv-rSE/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-tr-rTR/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-uk-rUA/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-vi-rVN/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-zh-rCN/ftp_sftp.xml | 10 ++++++++++ app/src/main/res/values-zh-rTW/ftp_sftp.xml | 10 ++++++++++ 39 files changed, 390 insertions(+) create mode 100644 app/src/main/res/values-af-rZA/ftp_sftp.xml create mode 100644 app/src/main/res/values-ar-rSA/ftp_sftp.xml create mode 100644 app/src/main/res/values-bg-rBG/ftp_sftp.xml create mode 100644 app/src/main/res/values-ca-rES/ftp_sftp.xml create mode 100644 app/src/main/res/values-cs-rCZ/ftp_sftp.xml create mode 100644 app/src/main/res/values-da-rDK/ftp_sftp.xml create mode 100644 app/src/main/res/values-de-rDE/ftp_sftp.xml create mode 100644 app/src/main/res/values-el-rGR/ftp_sftp.xml create mode 100644 app/src/main/res/values-es-rES/ftp_sftp.xml create mode 100644 app/src/main/res/values-fi-rFI/ftp_sftp.xml create mode 100644 app/src/main/res/values-fr-rFR/ftp_sftp.xml create mode 100644 app/src/main/res/values-hi-rIN/ftp_sftp.xml create mode 100644 app/src/main/res/values-hr-rHR/ftp_sftp.xml create mode 100644 app/src/main/res/values-hu-rHU/ftp_sftp.xml create mode 100644 app/src/main/res/values-in-rID/ftp_sftp.xml create mode 100644 app/src/main/res/values-it-rIT/ftp_sftp.xml create mode 100644 app/src/main/res/values-iw-rIL/ftp_sftp.xml create mode 100644 app/src/main/res/values-ja-rJP/ftp_sftp.xml create mode 100644 app/src/main/res/values-ko-rKR/ftp_sftp.xml create mode 100644 app/src/main/res/values-mk-rMK/ftp_sftp.xml create mode 100644 app/src/main/res/values-ne-rNP/ftp_sftp.xml create mode 100644 app/src/main/res/values-nl-rNL/ftp_sftp.xml create mode 100644 app/src/main/res/values-no-rNO/ftp_sftp.xml create mode 100644 app/src/main/res/values-pl-rPL/ftp_sftp.xml create mode 100644 app/src/main/res/values-pt-rBR/ftp_sftp.xml create mode 100644 app/src/main/res/values-pt-rPT/ftp_sftp.xml create mode 100644 app/src/main/res/values-ro-rRO/ftp_sftp.xml create mode 100644 app/src/main/res/values-ru-rRU/ftp_sftp.xml create mode 100644 app/src/main/res/values-sk-rSK/ftp_sftp.xml create mode 100644 app/src/main/res/values-sl-rSI/ftp_sftp.xml create mode 100644 app/src/main/res/values-sr-rRS/ftp_sftp.xml create mode 100644 app/src/main/res/values-sr-rSP/ftp_sftp.xml create mode 100644 app/src/main/res/values-sr/ftp_sftp.xml create mode 100644 app/src/main/res/values-sv-rSE/ftp_sftp.xml create mode 100644 app/src/main/res/values-tr-rTR/ftp_sftp.xml create mode 100644 app/src/main/res/values-uk-rUA/ftp_sftp.xml create mode 100644 app/src/main/res/values-vi-rVN/ftp_sftp.xml create mode 100644 app/src/main/res/values-zh-rCN/ftp_sftp.xml create mode 100644 app/src/main/res/values-zh-rTW/ftp_sftp.xml diff --git a/app/src/main/res/values-af-rZA/ftp_sftp.xml b/app/src/main/res/values-af-rZA/ftp_sftp.xml new file mode 100644 index 000000000..290380c80 --- /dev/null +++ b/app/src/main/res/values-af-rZA/ftp_sftp.xml @@ -0,0 +1,10 @@ + + FTPS-sekuriteitsmodus + Eksplisiete FTPS (aanbeveel) + Implisiete FTPS + FTPS-modus: %1$s + Slegs-lees-toegang + Wi-Fi: gekoppel + Wi-Fi: nie gekoppel nie (ander netwerk of vanlyn) + Plaaslike IP-adres: %1$s + diff --git a/app/src/main/res/values-ar-rSA/ftp_sftp.xml b/app/src/main/res/values-ar-rSA/ftp_sftp.xml new file mode 100644 index 000000000..46b5351bf --- /dev/null +++ b/app/src/main/res/values-ar-rSA/ftp_sftp.xml @@ -0,0 +1,10 @@ + + وضع أمان FTPS + FTPS صريح (موصى به) + FTPS ضمني + وضع FTPS: %1$s + وصول للقراءة فقط + Wi‑Fi: متصل + Wi‑Fi: غير متصل (شبكة أخرى أو دون اتصال) + عنوان IP المحلي: %1$s + diff --git a/app/src/main/res/values-bg-rBG/ftp_sftp.xml b/app/src/main/res/values-bg-rBG/ftp_sftp.xml new file mode 100644 index 000000000..6ed613767 --- /dev/null +++ b/app/src/main/res/values-bg-rBG/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Режим на защита FTPS + Изричен FTPS (препоръчително) + Неявен FTPS + Режим FTPS: %1$s + Достъп само за четене + Wi‑Fi: свързан + Wi‑Fi: няма връзка (друга мрежа или офлайн) + Локален IP адрес: %1$s + diff --git a/app/src/main/res/values-ca-rES/ftp_sftp.xml b/app/src/main/res/values-ca-rES/ftp_sftp.xml new file mode 100644 index 000000000..0abc38b78 --- /dev/null +++ b/app/src/main/res/values-ca-rES/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Mode de seguretat FTPS + FTPS explícit (recomanat) + FTPS implícit + Mode FTPS: %1$s + Accés només de lectura + Wi-Fi: connectat + Wi-Fi: no connectat (una altra xarxa o sense connexió) + Adreça IP local: %1$s + diff --git a/app/src/main/res/values-cs-rCZ/ftp_sftp.xml b/app/src/main/res/values-cs-rCZ/ftp_sftp.xml new file mode 100644 index 000000000..97488ba99 --- /dev/null +++ b/app/src/main/res/values-cs-rCZ/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Režim zabezpečení FTPS + Explicitní FTPS (doporučeno) + Implicitní FTPS + Režim FTPS: %1$s + Přístup pouze pro čtení + Wi‑Fi: připojeno + Wi‑Fi: nepřipojeno (jiná síť nebo offline) + Místní IP adresa: %1$s + diff --git a/app/src/main/res/values-da-rDK/ftp_sftp.xml b/app/src/main/res/values-da-rDK/ftp_sftp.xml new file mode 100644 index 000000000..3aef115f4 --- /dev/null +++ b/app/src/main/res/values-da-rDK/ftp_sftp.xml @@ -0,0 +1,10 @@ + + FTPS-sikkerhedstilstand + Eksplicit FTPS (anbefalet) + Implicit FTPS + FTPS-tilstand: %1$s + Skrivebeskyttet adgang + Wi-Fi: tilsluttet + Wi-Fi: ikke tilsluttet (andet netværk eller offline) + Lokal IP-adresse: %1$s + diff --git a/app/src/main/res/values-de-rDE/ftp_sftp.xml b/app/src/main/res/values-de-rDE/ftp_sftp.xml new file mode 100644 index 000000000..4edf5cad9 --- /dev/null +++ b/app/src/main/res/values-de-rDE/ftp_sftp.xml @@ -0,0 +1,10 @@ + + FTPS-Sicherheitsmodus + Explizites FTPS (empfohlen) + Implizites FTPS + FTPS-Modus: %1$s + Schreibgeschützter Zugriff + WLAN: verbunden + WLAN: nicht verbunden (anderes Netzwerk oder offline) + Lokale IP-Adresse: %1$s + diff --git a/app/src/main/res/values-el-rGR/ftp_sftp.xml b/app/src/main/res/values-el-rGR/ftp_sftp.xml new file mode 100644 index 000000000..067d6b0b9 --- /dev/null +++ b/app/src/main/res/values-el-rGR/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Λειτουργία ασφαλείας FTPS + Ρητό FTPS (συνιστάται) + Έμμεσο FTPS + Λειτουργία FTPS: %1$s + Πρόσβαση μόνο για ανάγνωση + Wi‑Fi: συνδεδεμένο + Wi‑Fi: χωρίς σύνδεση (άλλο δίκτυο ή εκτός σύνδεσης) + Τοπική διεύθυνση IP: %1$s + diff --git a/app/src/main/res/values-es-rES/ftp_sftp.xml b/app/src/main/res/values-es-rES/ftp_sftp.xml new file mode 100644 index 000000000..4b08e4d7d --- /dev/null +++ b/app/src/main/res/values-es-rES/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Modo de seguridad FTPS + FTPS explícito (recomendado) + FTPS implícito + Modo FTPS: %1$s + Acceso de solo lectura + Wi-Fi: conectado + Wi-Fi: no conectado (otra red o sin conexión) + Dirección IP local: %1$s + diff --git a/app/src/main/res/values-fi-rFI/ftp_sftp.xml b/app/src/main/res/values-fi-rFI/ftp_sftp.xml new file mode 100644 index 000000000..6be308c97 --- /dev/null +++ b/app/src/main/res/values-fi-rFI/ftp_sftp.xml @@ -0,0 +1,10 @@ + + FTPS-suojaustila + Eksplisiittinen FTPS (suositus) + Implisiittinen FTPS + FTPS-tila: %1$s + Vain luku -käyttöoikeus + Wi-Fi: yhdistetty + Wi-Fi: ei yhteyttä (toinen verkko tai offline) + Paikallinen IP-osoite: %1$s + diff --git a/app/src/main/res/values-fr-rFR/ftp_sftp.xml b/app/src/main/res/values-fr-rFR/ftp_sftp.xml new file mode 100644 index 000000000..b97bb2df0 --- /dev/null +++ b/app/src/main/res/values-fr-rFR/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Mode de sécurité FTPS + FTPS explicite (recommandé) + FTPS implicite + Mode FTPS : %1$s + Accès en lecture seule + Wi-Fi : connecté + Wi-Fi : non connecté (autre réseau ou hors ligne) + Adresse IP locale : %1$s + diff --git a/app/src/main/res/values-hi-rIN/ftp_sftp.xml b/app/src/main/res/values-hi-rIN/ftp_sftp.xml new file mode 100644 index 000000000..c1c863326 --- /dev/null +++ b/app/src/main/res/values-hi-rIN/ftp_sftp.xml @@ -0,0 +1,10 @@ + + FTPS सुरक्षा मोड + एक्सप्लिसिट FTPS (अनुशंसित) + इम्प्लिसिट FTPS + FTPS मोड: %1$s + केवल-पढ़ने की पहुँच + Wi‑Fi: कनेक्ट है + Wi‑Fi: कनेक्ट नहीं है (दूसरा नेटवर्क या ऑफ़लाइन) + स्थानीय IP पता: %1$s + diff --git a/app/src/main/res/values-hr-rHR/ftp_sftp.xml b/app/src/main/res/values-hr-rHR/ftp_sftp.xml new file mode 100644 index 000000000..5d45e7295 --- /dev/null +++ b/app/src/main/res/values-hr-rHR/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Sigurnosni način FTPS-a + Eksplicitni FTPS (preporučeno) + Implicitni FTPS + Način FTPS-a: %1$s + Pristup samo za čitanje + Wi-Fi: povezano + Wi-Fi: nije povezano (druga mreža ili izvan mreže) + Lokalna IP adresa: %1$s + diff --git a/app/src/main/res/values-hu-rHU/ftp_sftp.xml b/app/src/main/res/values-hu-rHU/ftp_sftp.xml new file mode 100644 index 000000000..1b630df65 --- /dev/null +++ b/app/src/main/res/values-hu-rHU/ftp_sftp.xml @@ -0,0 +1,10 @@ + + FTPS biztonsági mód + Explicit FTPS (ajánlott) + Implicit FTPS + FTPS mód: %1$s + Csak olvasási hozzáférés + Wi-Fi: csatlakoztatva + Wi-Fi: nincs csatlakoztatva (másik hálózat vagy offline) + Helyi IP-cím: %1$s + diff --git a/app/src/main/res/values-in-rID/ftp_sftp.xml b/app/src/main/res/values-in-rID/ftp_sftp.xml new file mode 100644 index 000000000..62182b5bf --- /dev/null +++ b/app/src/main/res/values-in-rID/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Mode keamanan FTPS + FTPS eksplisit (disarankan) + FTPS implisit + Mode FTPS: %1$s + Akses hanya-baca + Wi-Fi: terhubung + Wi-Fi: tidak terhubung (jaringan lain atau offline) + Alamat IP lokal: %1$s + diff --git a/app/src/main/res/values-it-rIT/ftp_sftp.xml b/app/src/main/res/values-it-rIT/ftp_sftp.xml new file mode 100644 index 000000000..3ba8f8c3d --- /dev/null +++ b/app/src/main/res/values-it-rIT/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Modalità di sicurezza FTPS + FTPS esplicito (consigliato) + FTPS implicito + Modalità FTPS: %1$s + Accesso in sola lettura + Wi-Fi: connesso + Wi-Fi: non connesso (altra rete o offline) + Indirizzo IP locale: %1$s + diff --git a/app/src/main/res/values-iw-rIL/ftp_sftp.xml b/app/src/main/res/values-iw-rIL/ftp_sftp.xml new file mode 100644 index 000000000..01d1d1673 --- /dev/null +++ b/app/src/main/res/values-iw-rIL/ftp_sftp.xml @@ -0,0 +1,10 @@ + + מצב אבטחת FTPS + FTPS מפורש (מומלץ) + FTPS משתמע + מצב FTPS: %1$s + גישה לקריאה בלבד + Wi‑Fi: מחובר + Wi‑Fi: לא מחובר (רשת אחרת או לא מקוון) + כתובת IP מקומית: %1$s + diff --git a/app/src/main/res/values-ja-rJP/ftp_sftp.xml b/app/src/main/res/values-ja-rJP/ftp_sftp.xml new file mode 100644 index 000000000..4438140b3 --- /dev/null +++ b/app/src/main/res/values-ja-rJP/ftp_sftp.xml @@ -0,0 +1,10 @@ + + FTPS セキュリティモード + 明示的 FTPS(推奨) + 暗黙的 FTPS + FTPS モード: %1$s + 読み取り専用アクセス + Wi‑Fi: 接続済み + Wi‑Fi: 未接続(別のネットワークまたはオフライン) + ローカル IP アドレス: %1$s + diff --git a/app/src/main/res/values-ko-rKR/ftp_sftp.xml b/app/src/main/res/values-ko-rKR/ftp_sftp.xml new file mode 100644 index 000000000..1b7746335 --- /dev/null +++ b/app/src/main/res/values-ko-rKR/ftp_sftp.xml @@ -0,0 +1,10 @@ + + FTPS 보안 모드 + 명시적 FTPS(권장) + 암시적 FTPS + FTPS 모드: %1$s + 읽기 전용 액세스 + Wi‑Fi: 연결됨 + Wi‑Fi: 연결되지 않음(다른 네트워크 또는 오프라인) + 로컬 IP 주소: %1$s + diff --git a/app/src/main/res/values-mk-rMK/ftp_sftp.xml b/app/src/main/res/values-mk-rMK/ftp_sftp.xml new file mode 100644 index 000000000..4ced5fb9e --- /dev/null +++ b/app/src/main/res/values-mk-rMK/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Безбедносен режим на FTPS + Експлицитен FTPS (препорачано) + Имплицитен FTPS + Режим на FTPS: %1$s + Пристап само за читање + Wi‑Fi: поврзано + Wi‑Fi: не е поврзано (друга мрежа или офлајн) + Локална IP-адреса: %1$s + diff --git a/app/src/main/res/values-ne-rNP/ftp_sftp.xml b/app/src/main/res/values-ne-rNP/ftp_sftp.xml new file mode 100644 index 000000000..8f092b5ea --- /dev/null +++ b/app/src/main/res/values-ne-rNP/ftp_sftp.xml @@ -0,0 +1,10 @@ + + FTPS सुरक्षा मोड + स्पष्ट FTPS (सिफारिस गरिएको) + अस्पष्ट FTPS + FTPS मोड: %1$s + पढ्ने-मात्र पहुँच + Wi‑Fi: जडान भएको + Wi‑Fi: जडान नभएको (अर्को नेटवर्क वा अफलाइन) + स्थानीय IP ठेगाना: %1$s + diff --git a/app/src/main/res/values-nl-rNL/ftp_sftp.xml b/app/src/main/res/values-nl-rNL/ftp_sftp.xml new file mode 100644 index 000000000..94c960dbe --- /dev/null +++ b/app/src/main/res/values-nl-rNL/ftp_sftp.xml @@ -0,0 +1,10 @@ + + FTPS-beveiligingsmodus + Expliciete FTPS (aanbevolen) + Impliciete FTPS + FTPS-modus: %1$s + Alleen-lezen toegang + Wifi: verbonden + Wifi: niet verbonden (ander netwerk of offline) + Lokaal IP-adres: %1$s + diff --git a/app/src/main/res/values-no-rNO/ftp_sftp.xml b/app/src/main/res/values-no-rNO/ftp_sftp.xml new file mode 100644 index 000000000..fc2db7f91 --- /dev/null +++ b/app/src/main/res/values-no-rNO/ftp_sftp.xml @@ -0,0 +1,10 @@ + + FTPS-sikkerhetsmodus + Eksplisitt FTPS (anbefalt) + Implisitt FTPS + FTPS-modus: %1$s + Skrivebeskyttet tilgang + Wi-Fi: tilkoblet + Wi-Fi: ikke tilkoblet (annet nettverk eller frakoblet) + Lokal IP-adresse: %1$s + diff --git a/app/src/main/res/values-pl-rPL/ftp_sftp.xml b/app/src/main/res/values-pl-rPL/ftp_sftp.xml new file mode 100644 index 000000000..43b10787a --- /dev/null +++ b/app/src/main/res/values-pl-rPL/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Tryb zabezpieczeń FTPS + Jawny FTPS (zalecany) + Niejawny FTPS + Tryb FTPS: %1$s + Dostęp tylko do odczytu + Wi-Fi: połączono + Wi-Fi: brak połączenia (inna sieć lub offline) + Lokalny adres IP: %1$s + diff --git a/app/src/main/res/values-pt-rBR/ftp_sftp.xml b/app/src/main/res/values-pt-rBR/ftp_sftp.xml new file mode 100644 index 000000000..d218f2dfa --- /dev/null +++ b/app/src/main/res/values-pt-rBR/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Modo de segurança FTPS + FTPS explícito (recomendado) + FTPS implícito + Modo FTPS: %1$s + Acesso somente leitura + Wi-Fi: conectado + Wi-Fi: não conectado (outra rede ou offline) + Endereço IP local: %1$s + diff --git a/app/src/main/res/values-pt-rPT/ftp_sftp.xml b/app/src/main/res/values-pt-rPT/ftp_sftp.xml new file mode 100644 index 000000000..5d0283cee --- /dev/null +++ b/app/src/main/res/values-pt-rPT/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Modo de segurança FTPS + FTPS explícito (recomendado) + FTPS implícito + Modo FTPS: %1$s + Acesso só de leitura + Wi-Fi: ligado + Wi-Fi: não ligado (outra rede ou sem ligação) + Endereço IP local: %1$s + diff --git a/app/src/main/res/values-ro-rRO/ftp_sftp.xml b/app/src/main/res/values-ro-rRO/ftp_sftp.xml new file mode 100644 index 000000000..9120bb72a --- /dev/null +++ b/app/src/main/res/values-ro-rRO/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Mod de securitate FTPS + FTPS explicit (recomandat) + FTPS implicit + Mod FTPS: %1$s + Acces doar pentru citire + Wi-Fi: conectat + Wi-Fi: neconectat (altă rețea sau offline) + Adresă IP locală: %1$s + diff --git a/app/src/main/res/values-ru-rRU/ftp_sftp.xml b/app/src/main/res/values-ru-rRU/ftp_sftp.xml new file mode 100644 index 000000000..6a5c12446 --- /dev/null +++ b/app/src/main/res/values-ru-rRU/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Режим безопасности FTPS + Явный FTPS (рекомендуется) + Неявный FTPS + Режим FTPS: %1$s + Доступ только для чтения + Wi-Fi: подключено + Wi-Fi: не подключено (другая сеть или офлайн) + Локальный IP-адрес: %1$s + diff --git a/app/src/main/res/values-sk-rSK/ftp_sftp.xml b/app/src/main/res/values-sk-rSK/ftp_sftp.xml new file mode 100644 index 000000000..3dbb349b3 --- /dev/null +++ b/app/src/main/res/values-sk-rSK/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Režim zabezpečenia FTPS + Explicitné FTPS (odporúčané) + Implicitné FTPS + Režim FTPS: %1$s + Prístup iba na čítanie + Wi‑Fi: pripojené + Wi‑Fi: nepripojené (iná sieť alebo offline) + Lokálna IP adresa: %1$s + diff --git a/app/src/main/res/values-sl-rSI/ftp_sftp.xml b/app/src/main/res/values-sl-rSI/ftp_sftp.xml new file mode 100644 index 000000000..ebee39b37 --- /dev/null +++ b/app/src/main/res/values-sl-rSI/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Varnostni način FTPS + Eksplicitni FTPS (priporočeno) + Implicitni FTPS + Način FTPS: %1$s + Dostop samo za branje + Wi‑Fi: povezano + Wi‑Fi: ni povezave (drugo omrežje ali brez povezave) + Lokalni naslov IP: %1$s + diff --git a/app/src/main/res/values-sr-rRS/ftp_sftp.xml b/app/src/main/res/values-sr-rRS/ftp_sftp.xml new file mode 100644 index 000000000..1d7779b9b --- /dev/null +++ b/app/src/main/res/values-sr-rRS/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Безбедносни режим FTPS-а + Експлицитни FTPS (препоручено) + Имплицитни FTPS + FTPS режим: %1$s + Приступ само за читање + Wi‑Fi: повезан + Wi‑Fi: није повезан (друга мрежа или ван мреже) + Локална IP адреса: %1$s + diff --git a/app/src/main/res/values-sr-rSP/ftp_sftp.xml b/app/src/main/res/values-sr-rSP/ftp_sftp.xml new file mode 100644 index 000000000..71ad1b055 --- /dev/null +++ b/app/src/main/res/values-sr-rSP/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Sigurnosni režim FTPS-a + Eksplicitni FTPS (preporučeno) + Implicitni FTPS + FTPS režim: %1$s + Pristup samo za čitanje + Wi‑Fi: povezano + Wi‑Fi: nije povezano (druga mreža ili van mreže) + Lokalna IP adresa: %1$s + diff --git a/app/src/main/res/values-sr/ftp_sftp.xml b/app/src/main/res/values-sr/ftp_sftp.xml new file mode 100644 index 000000000..1d7779b9b --- /dev/null +++ b/app/src/main/res/values-sr/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Безбедносни режим FTPS-а + Експлицитни FTPS (препоручено) + Имплицитни FTPS + FTPS режим: %1$s + Приступ само за читање + Wi‑Fi: повезан + Wi‑Fi: није повезан (друга мрежа или ван мреже) + Локална IP адреса: %1$s + diff --git a/app/src/main/res/values-sv-rSE/ftp_sftp.xml b/app/src/main/res/values-sv-rSE/ftp_sftp.xml new file mode 100644 index 000000000..6e4bab5e5 --- /dev/null +++ b/app/src/main/res/values-sv-rSE/ftp_sftp.xml @@ -0,0 +1,10 @@ + + FTPS-säkerhetsläge + Explicit FTPS (rekommenderat) + Implicit FTPS + FTPS-läge: %1$s + Skrivskyddad åtkomst + Wi-Fi: ansluten + Wi-Fi: inte ansluten (annat nätverk eller offline) + Lokal IP-adress: %1$s + diff --git a/app/src/main/res/values-tr-rTR/ftp_sftp.xml b/app/src/main/res/values-tr-rTR/ftp_sftp.xml new file mode 100644 index 000000000..9f530c725 --- /dev/null +++ b/app/src/main/res/values-tr-rTR/ftp_sftp.xml @@ -0,0 +1,10 @@ + + FTPS güvenlik modu + Açık FTPS (önerilen) + Örtük FTPS + FTPS modu: %1$s + Salt okunur erişim + Wi‑Fi: bağlı + Wi‑Fi: bağlı değil (başka ağ veya çevrimdışı) + Yerel IP adresi: %1$s + diff --git a/app/src/main/res/values-uk-rUA/ftp_sftp.xml b/app/src/main/res/values-uk-rUA/ftp_sftp.xml new file mode 100644 index 000000000..f9cefe5b9 --- /dev/null +++ b/app/src/main/res/values-uk-rUA/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Режим безпеки FTPS + Явний FTPS (рекомендовано) + Неявний FTPS + Режим FTPS: %1$s + Доступ лише для читання + Wi-Fi: підключено + Wi-Fi: не підключено (інша мережа або офлайн) + Локальна IP-адреса: %1$s + diff --git a/app/src/main/res/values-vi-rVN/ftp_sftp.xml b/app/src/main/res/values-vi-rVN/ftp_sftp.xml new file mode 100644 index 000000000..7ae04b964 --- /dev/null +++ b/app/src/main/res/values-vi-rVN/ftp_sftp.xml @@ -0,0 +1,10 @@ + + Chế độ bảo mật FTPS + FTPS tường minh (khuyên dùng) + FTPS ngầm định + Chế độ FTPS: %1$s + Quyền chỉ đọc + Wi-Fi: đã kết nối + Wi-Fi: chưa kết nối (mạng khác hoặc ngoại tuyến) + Địa chỉ IP cục bộ: %1$s + diff --git a/app/src/main/res/values-zh-rCN/ftp_sftp.xml b/app/src/main/res/values-zh-rCN/ftp_sftp.xml new file mode 100644 index 000000000..a042a020b --- /dev/null +++ b/app/src/main/res/values-zh-rCN/ftp_sftp.xml @@ -0,0 +1,10 @@ + + FTPS 安全模式 + 显式 FTPS(推荐) + 隐式 FTPS + FTPS 模式:%1$s + 只读访问 + Wi‑Fi:已连接 + Wi‑Fi:未连接(其他网络或离线) + 本地 IP 地址:%1$s + diff --git a/app/src/main/res/values-zh-rTW/ftp_sftp.xml b/app/src/main/res/values-zh-rTW/ftp_sftp.xml new file mode 100644 index 000000000..77f3f7e4e --- /dev/null +++ b/app/src/main/res/values-zh-rTW/ftp_sftp.xml @@ -0,0 +1,10 @@ + + FTPS 安全模式 + 顯式 FTPS(建議) + 隱式 FTPS + FTPS 模式:%1$s + 唯讀存取 + Wi‑Fi:已連線 + Wi‑Fi:未連線(其他網路或離線) + 本機 IP 位址:%1$s + From 13a2e6229dea13d3bb76af3de6c4f880e5a4f354 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:43:58 -0300 Subject: [PATCH 19/64] Render Wi-Fi status on separate lines in SFTP settings --- app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java b/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java index b6910a4ef..80ade0433 100644 --- a/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java +++ b/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java @@ -163,7 +163,7 @@ private String buildNetworkStatus() { android.net.ConnectivityManager cm=(android.net.ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE); android.net.NetworkInfo info=cm==null?null:cm.getActiveNetworkInfo(); boolean wifiConnected=info!=null&&info.isConnected()&&info.getType()==android.net.ConnectivityManager.TYPE_WIFI; - return getString(wifiConnected?R.string.ftp_wifi_connected:R.string.ftp_wifi_disconnected)+"\\n"+getString(R.string.ftp_ip_address,com.erikraft.drop.utils.NetworkUtils.getIpAddress(this)); + return getString(wifiConnected?R.string.ftp_wifi_connected:R.string.ftp_wifi_disconnected)+"\n"+getString(R.string.ftp_ip_address,com.erikraft.drop.utils.NetworkUtils.getIpAddress(this)); } private void stopServer(){startService(SftpServerService.stopIntent(this));} private void updateServerToggle(boolean running){if(serverToggleButton!=null)serverToggleButton.setText(running?R.string.sftp_stop:R.string.sftp_start);} From 86147743365da77fdbce62bb9b14006313f79d54 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:49:15 -0300 Subject: [PATCH 20/64] fix(ftp): use supported authorities for read-only mode --- app/src/main/java/com/erikraft/drop/FtpServerService.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/erikraft/drop/FtpServerService.java b/app/src/main/java/com/erikraft/drop/FtpServerService.java index 1c959acca..707e37685 100644 --- a/app/src/main/java/com/erikraft/drop/FtpServerService.java +++ b/app/src/main/java/com/erikraft/drop/FtpServerService.java @@ -25,7 +25,6 @@ import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory; import org.apache.ftpserver.usermanager.SaltedPasswordEncryptor; import org.apache.ftpserver.usermanager.impl.BaseUser; -import org.apache.ftpserver.usermanager.impl.ReadPermission; import org.apache.ftpserver.usermanager.impl.WritePermission; import org.bouncycastle.asn1.x500.X500Name; import org.bouncycastle.cert.X509CertificateHolder; @@ -123,8 +122,10 @@ private void startServer(long generation) { user.setPassword(password); user.setHomeDirectory(home.getAbsolutePath()); List authorities = new ArrayList<>(); - if (readOnly) authorities.add(new ReadPermission()); - else authorities.add(new WritePermission()); + // Apache FtpServer 1.2.1 has no ReadPermission authority. An empty + // authority list grants no write operations; add WritePermission only + // when the user explicitly enables write access. + if (!readOnly) authorities.add(new WritePermission()); user.setAuthorities(authorities); userManager.save(user); From 4485f65325173fbaa2b23b36c8e7a0507ecb85a1 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:59:11 -0300 Subject: [PATCH 21/64] chore(android): bump version to 10.1.10 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 44cf742cf..36c7ca36e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -41,8 +41,8 @@ android { minSdkVersion 24 targetSdkVersion 36 - versionCode 32 - versionName "10.1.9" + versionCode 33 + versionName "10.1.10" applicationVariants.all { variant -> variant.outputs.all { outputFileName = "Drop-Android.apk" From 6bb5da563c1b7fcddf76157c384e6e7986354361 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 16:59:17 -0300 Subject: [PATCH 22/64] test(android): assert version 10.1.10 code 33 --- .../test/java/com/erikraft/drop/ReleaseContractTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/test/java/com/erikraft/drop/ReleaseContractTest.java b/app/src/test/java/com/erikraft/drop/ReleaseContractTest.java index 779954748..a587edc74 100644 --- a/app/src/test/java/com/erikraft/drop/ReleaseContractTest.java +++ b/app/src/test/java/com/erikraft/drop/ReleaseContractTest.java @@ -6,8 +6,8 @@ public class ReleaseContractTest { @Test - public void androidVersionMustRemain10_1_9Code32() { - assertEquals("10.1.9", BuildConfig.VERSION_NAME); - assertEquals(32, BuildConfig.VERSION_CODE); + public void androidVersionMustBe10_1_10Code33() { + assertEquals("10.1.10", BuildConfig.VERSION_NAME); + assertEquals(33, BuildConfig.VERSION_CODE); } } From f4bb29f9b7b110d4e9e0655303440c7c31f60f9f Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:11:27 -0300 Subject: [PATCH 23/64] Add theme-adaptive ErikrafT Wi-Fi icon --- .../main/res/drawable/ic_erikraft_wifi.xml | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 app/src/main/res/drawable/ic_erikraft_wifi.xml diff --git a/app/src/main/res/drawable/ic_erikraft_wifi.xml b/app/src/main/res/drawable/ic_erikraft_wifi.xml new file mode 100644 index 000000000..99a6ffe99 --- /dev/null +++ b/app/src/main/res/drawable/ic_erikraft_wifi.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + \ No newline at end of file From 35ef87552d8470352c6baebcf3015940da629498 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:11:33 -0300 Subject: [PATCH 24/64] Add ErikrafT Wi-Fi About section strings --- app/src/main/res/values/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values/wifi_about.xml diff --git a/app/src/main/res/values/wifi_about.xml b/app/src/main/res/values/wifi_about.xml new file mode 100644 index 000000000..6b96fd465 --- /dev/null +++ b/app/src/main/res/values/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + An open-source project for Wi-Fi, Wi-Fi Direct, and mesh networking for offline communication and Internet access through compatible gateways. + Explore ErikrafT Wi-Fi™ + \ No newline at end of file From ac6c7684710c4e32c0fa856bf93a5b9fbb56660b Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:11:51 -0300 Subject: [PATCH 25/64] Add beta badge and ErikrafT Wi-Fi section to About --- .../java/com/erikraft/drop/AboutActivity.java | 60 ++++++++++++++++++- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/erikraft/drop/AboutActivity.java b/app/src/main/java/com/erikraft/drop/AboutActivity.java index 97244f5ff..96bd014d2 100644 --- a/app/src/main/java/com/erikraft/drop/AboutActivity.java +++ b/app/src/main/java/com/erikraft/drop/AboutActivity.java @@ -4,7 +4,8 @@ import android.net.Uri; import android.os.Bundle; import android.text.Html; -import android.view.View; +import android.view.Gravity; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; @@ -12,6 +13,7 @@ import com.google.android.material.appbar.MaterialToolbar; import com.google.android.material.button.MaterialButton; import com.google.android.material.card.MaterialCardView; +import com.google.android.material.chip.Chip; /** Stable, self-contained About screen with transparent dependency and attribution information. */ public class AboutActivity extends DropPipActivity { @@ -35,8 +37,20 @@ protected void onCreate(Bundle savedInstanceState) { int pad = dp(20); content.setPadding(pad, dp(18), pad, dp(32)); + LinearLayout appTitleRow = new LinearLayout(this); + appTitleRow.setOrientation(LinearLayout.HORIZONTAL); + appTitleRow.setGravity(Gravity.CENTER_VERTICAL); TextView appName = text(getString(R.string.app_name_long), 28); - content.addView(appName); + appTitleRow.addView(appName, new LinearLayout.LayoutParams(0, -2, 1f)); + + Chip betaBadge = new Chip(this); + betaBadge.setText(R.string.beta_badge_label); + betaBadge.setCheckable(false); + betaBadge.setClickable(false); + betaBadge.setFocusable(false); + betaBadge.setEnsureMinTouchTargetSize(false); + appTitleRow.addView(betaBadge, new LinearLayout.LayoutParams(-2, -2)); + content.addView(appTitleRow); TextView version = text( getString(R.string.about_version_format, BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE), @@ -60,6 +74,8 @@ protected void onCreate(Bundle savedInstanceState) { missionParams.setMargins(0, dp(18), 0, dp(8)); content.addView(missionCard, missionParams); + addWifiProjectSection(content); + addHeading(content, getString(R.string.about_dependencies_title)); addHtml(content, getString(R.string.about_dependencies_summary), 15); addHtml(content, buildAndroidDependenciesHtml(), 14); @@ -71,7 +87,6 @@ protected void onCreate(Bundle savedInstanceState) { addHtml(content, getString(R.string.about_licenses_summary), 15); addButton(content, getString(R.string.about_licenses_title), "https://github.com/erikraft/Drop-Android/blob/master/LICENSE"); - addHeading(content, getString(R.string.support_us)); addButton(content, "GitHub — ErikrafT Drop™", "https://github.com/erikraft/Drop"); addButton(content, "GitHub — Android", "https://github.com/erikraft/Drop-Android"); @@ -83,6 +98,45 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(root); } + private void addWifiProjectSection(LinearLayout parent) { + MaterialCardView card = new MaterialCardView(this); + card.setRadius(dp(14)); + card.setCardElevation(dp(1)); + card.setStrokeWidth(dp(1)); + card.setUseCompatPadding(true); + + LinearLayout section = new LinearLayout(this); + section.setOrientation(LinearLayout.VERTICAL); + section.setPadding(dp(16), dp(14), dp(16), dp(16)); + + LinearLayout headingRow = new LinearLayout(this); + headingRow.setOrientation(LinearLayout.HORIZONTAL); + headingRow.setGravity(Gravity.CENTER_VERTICAL); + + ImageView icon = new ImageView(this); + icon.setImageResource(R.drawable.ic_erikraft_wifi); + icon.setContentDescription(getString(R.string.about_wifi_title)); + icon.setScaleType(ImageView.ScaleType.FIT_CENTER); + headingRow.addView(icon, new LinearLayout.LayoutParams(dp(54), dp(58))); + + TextView title = text(getString(R.string.about_wifi_title), 20); + LinearLayout.LayoutParams titleParams = new LinearLayout.LayoutParams(0, -2, 1f); + titleParams.setMargins(dp(12), 0, 0, 0); + headingRow.addView(title, titleParams); + section.addView(headingRow); + + TextView description = text(getString(R.string.about_wifi_description), 15); + description.setPadding(0, dp(10), 0, dp(8)); + section.addView(description); + addButton(section, getString(R.string.about_wifi_open_repository), + "https://github.com/erikraft/WiFi"); + + card.addView(section); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(-1, -2); + params.setMargins(0, dp(12), 0, dp(8)); + parent.addView(card, params); + } + private String buildAndroidDependenciesHtml() { return "" + getString(R.string.about_dependencies_ui) + "
" + "AndroidX AppCompat 1.7.1
" From a36bb5c52687a15c072570b8bf21e62e484c71bf Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:12:11 -0300 Subject: [PATCH 26/64] Add localized ErikrafT Wi-Fi About strings (af-rZA) --- app/src/main/res/values-af-rZA/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-af-rZA/wifi_about.xml diff --git a/app/src/main/res/values-af-rZA/wifi_about.xml b/app/src/main/res/values-af-rZA/wifi_about.xml new file mode 100644 index 000000000..d9d074120 --- /dev/null +++ b/app/src/main/res/values-af-rZA/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + \'n Oopbronprojek vir Wi-Fi, Wi-Fi Direct en mesh-netwerke vir vanlyn kommunikasie en internettoegang deur versoenbare poorte. + Verken ErikrafT Wi-Fi™ + \ No newline at end of file From 0d3d729de2ec652942915058c4229e9eea529f1e Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:12:15 -0300 Subject: [PATCH 27/64] Add localized ErikrafT Wi-Fi About strings (ar-rSA) --- app/src/main/res/values-ar-rSA/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-ar-rSA/wifi_about.xml diff --git a/app/src/main/res/values-ar-rSA/wifi_about.xml b/app/src/main/res/values-ar-rSA/wifi_about.xml new file mode 100644 index 000000000..20634f7ba --- /dev/null +++ b/app/src/main/res/values-ar-rSA/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + مشروع مفتوح المصدر لشبكات Wi-Fi وWi-Fi Direct والشبكات المتداخلة للاتصال دون اتصال بالإنترنت والوصول إليه عبر البوابات المتوافقة. + استكشف ErikrafT Wi-Fi™ + \ No newline at end of file From 0ee1a95b8378553cae7bcc9f5b62ee283dd0e421 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:12:18 -0300 Subject: [PATCH 28/64] Add localized ErikrafT Wi-Fi About strings (bg-rBG) --- app/src/main/res/values-bg-rBG/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-bg-rBG/wifi_about.xml diff --git a/app/src/main/res/values-bg-rBG/wifi_about.xml b/app/src/main/res/values-bg-rBG/wifi_about.xml new file mode 100644 index 000000000..1119e5cde --- /dev/null +++ b/app/src/main/res/values-bg-rBG/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Проект с отворен код за Wi-Fi, Wi-Fi Direct и mesh мрежи за офлайн комуникация и достъп до интернет чрез съвместими шлюзове. + Разгледайте ErikrafT Wi-Fi™ + \ No newline at end of file From c9b076b99533e7e5683478c27615ff349ed369a2 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:12:22 -0300 Subject: [PATCH 29/64] Add localized ErikrafT Wi-Fi About strings (ca-rES) --- app/src/main/res/values-ca-rES/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-ca-rES/wifi_about.xml diff --git a/app/src/main/res/values-ca-rES/wifi_about.xml b/app/src/main/res/values-ca-rES/wifi_about.xml new file mode 100644 index 000000000..61603cef4 --- /dev/null +++ b/app/src/main/res/values-ca-rES/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Projecte de codi obert per a Wi-Fi, Wi-Fi Direct i xarxes mesh per a la comunicació sense connexió i l’accés a Internet mitjançant passarel·les compatibles. + Explora ErikrafT Wi-Fi™ + \ No newline at end of file From 9b2bee8203c4bb1ea4d9010fdcefe756e21d4f36 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:12:25 -0300 Subject: [PATCH 30/64] Add localized ErikrafT Wi-Fi About strings (cs-rCZ) --- app/src/main/res/values-cs-rCZ/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-cs-rCZ/wifi_about.xml diff --git a/app/src/main/res/values-cs-rCZ/wifi_about.xml b/app/src/main/res/values-cs-rCZ/wifi_about.xml new file mode 100644 index 000000000..9b722c06d --- /dev/null +++ b/app/src/main/res/values-cs-rCZ/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Open-source projekt pro Wi-Fi, Wi-Fi Direct a mesh sítě pro offline komunikaci a přístup k internetu přes kompatibilní brány. + Prozkoumat ErikrafT Wi-Fi™ + \ No newline at end of file From 2ef1bab248965005509cb3f99b3e2341c7c38d40 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:12:29 -0300 Subject: [PATCH 31/64] Add localized ErikrafT Wi-Fi About strings (da-rDK) --- app/src/main/res/values-da-rDK/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-da-rDK/wifi_about.xml diff --git a/app/src/main/res/values-da-rDK/wifi_about.xml b/app/src/main/res/values-da-rDK/wifi_about.xml new file mode 100644 index 000000000..2fd2e7647 --- /dev/null +++ b/app/src/main/res/values-da-rDK/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Et open source-projekt til Wi-Fi, Wi-Fi Direct og mesh-netværk til offlinekommunikation og internetadgang via kompatible gateways. + Udforsk ErikrafT Wi-Fi™ + \ No newline at end of file From 1620509eef24ef911e4022619f25e5b9f1ce0cca Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:12:34 -0300 Subject: [PATCH 32/64] Add localized ErikrafT Wi-Fi About strings (de-rDE) --- app/src/main/res/values-de-rDE/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-de-rDE/wifi_about.xml diff --git a/app/src/main/res/values-de-rDE/wifi_about.xml b/app/src/main/res/values-de-rDE/wifi_about.xml new file mode 100644 index 000000000..777e34779 --- /dev/null +++ b/app/src/main/res/values-de-rDE/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Ein Open-Source-Projekt für Wi-Fi, Wi-Fi Direct und Mesh-Netzwerke zur Offline-Kommunikation und zum Internetzugang über kompatible Gateways. + ErikrafT Wi-Fi™ entdecken + \ No newline at end of file From 412ddc5dca68f8dd43973fb959578305705226e6 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:12:38 -0300 Subject: [PATCH 33/64] Add localized ErikrafT Wi-Fi About strings (el-rGR) --- app/src/main/res/values-el-rGR/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-el-rGR/wifi_about.xml diff --git a/app/src/main/res/values-el-rGR/wifi_about.xml b/app/src/main/res/values-el-rGR/wifi_about.xml new file mode 100644 index 000000000..7ba766a61 --- /dev/null +++ b/app/src/main/res/values-el-rGR/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Ένα έργο ανοιχτού κώδικα για Wi-Fi, Wi-Fi Direct και δικτυώσεις mesh για επικοινωνία εκτός σύνδεσης και πρόσβαση στο διαδίκτυο μέσω συμβατών πυλών. + Εξερευνήστε το ErikrafT Wi-Fi™ + \ No newline at end of file From 7d5c499f2ac71d9725b84d61cb8bdf58dd606162 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:12:42 -0300 Subject: [PATCH 34/64] Add localized ErikrafT Wi-Fi About strings (es-rES) --- app/src/main/res/values-es-rES/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-es-rES/wifi_about.xml diff --git a/app/src/main/res/values-es-rES/wifi_about.xml b/app/src/main/res/values-es-rES/wifi_about.xml new file mode 100644 index 000000000..c4f53e3a2 --- /dev/null +++ b/app/src/main/res/values-es-rES/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Un proyecto de código abierto para Wi-Fi, Wi-Fi Direct y redes mesh, destinado a la comunicación sin conexión y al acceso a Internet mediante puertas de enlace compatibles. + Explorar ErikrafT Wi-Fi™ + \ No newline at end of file From 19a50a18b3fc5545dfea5cc804601d0795c858f3 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:12:45 -0300 Subject: [PATCH 35/64] Add localized ErikrafT Wi-Fi About strings (fi-rFI) --- app/src/main/res/values-fi-rFI/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-fi-rFI/wifi_about.xml diff --git a/app/src/main/res/values-fi-rFI/wifi_about.xml b/app/src/main/res/values-fi-rFI/wifi_about.xml new file mode 100644 index 000000000..71d9f938e --- /dev/null +++ b/app/src/main/res/values-fi-rFI/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Avoimen lähdekoodin projekti Wi-Fi-, Wi-Fi Direct- ja mesh-verkoille offline-viestintään ja internetyhteyteen yhteensopivien yhdyskäytävien kautta. + Tutustu ErikrafT Wi-Fi™ -projektiin + \ No newline at end of file From 76c8aee6c76b07f5973440337bbfbde5ea9ce21d Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:12:48 -0300 Subject: [PATCH 36/64] Add localized ErikrafT Wi-Fi About strings (fr-rFR) --- app/src/main/res/values-fr-rFR/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-fr-rFR/wifi_about.xml diff --git a/app/src/main/res/values-fr-rFR/wifi_about.xml b/app/src/main/res/values-fr-rFR/wifi_about.xml new file mode 100644 index 000000000..66b538be0 --- /dev/null +++ b/app/src/main/res/values-fr-rFR/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Un projet open source pour le Wi-Fi, Wi-Fi Direct et les réseaux maillés, destiné aux communications hors ligne et à l’accès à Internet via des passerelles compatibles. + Découvrir ErikrafT Wi-Fi™ + \ No newline at end of file From 239b5ab92b0a7297c8370deaf2fe4c602a7d60d7 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:12:51 -0300 Subject: [PATCH 37/64] Add localized ErikrafT Wi-Fi About strings (hi-rIN) --- app/src/main/res/values-hi-rIN/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-hi-rIN/wifi_about.xml diff --git a/app/src/main/res/values-hi-rIN/wifi_about.xml b/app/src/main/res/values-hi-rIN/wifi_about.xml new file mode 100644 index 000000000..b2eceb156 --- /dev/null +++ b/app/src/main/res/values-hi-rIN/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Wi-Fi, Wi-Fi Direct और mesh नेटवर्क के लिए एक ओपन-सोर्स प्रोजेक्ट, जो ऑफ़लाइन संचार और संगत गेटवे के माध्यम से इंटरनेट एक्सेस प्रदान करता है। + ErikrafT Wi-Fi™ देखें + \ No newline at end of file From 46bc3d8203118a778dea5e67bbee73d9000ea478 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:12:54 -0300 Subject: [PATCH 38/64] Add localized ErikrafT Wi-Fi About strings (hr-rHR) --- app/src/main/res/values-hr-rHR/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-hr-rHR/wifi_about.xml diff --git a/app/src/main/res/values-hr-rHR/wifi_about.xml b/app/src/main/res/values-hr-rHR/wifi_about.xml new file mode 100644 index 000000000..844b3c450 --- /dev/null +++ b/app/src/main/res/values-hr-rHR/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Projekt otvorenog koda za Wi-Fi, Wi-Fi Direct i mesh mreže za komunikaciju izvan mreže i pristup internetu putem kompatibilnih pristupnika. + Istraži ErikrafT Wi-Fi™ + \ No newline at end of file From e75c66f7d174cd032e464eedbac76f0ff6cf4c19 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:12:58 -0300 Subject: [PATCH 39/64] Add localized ErikrafT Wi-Fi About strings (hu-rHU) --- app/src/main/res/values-hu-rHU/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-hu-rHU/wifi_about.xml diff --git a/app/src/main/res/values-hu-rHU/wifi_about.xml b/app/src/main/res/values-hu-rHU/wifi_about.xml new file mode 100644 index 000000000..fb7957acf --- /dev/null +++ b/app/src/main/res/values-hu-rHU/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Nyílt forráskódú projekt Wi-Fi-, Wi-Fi Direct- és mesh-hálózatokhoz, offline kommunikációhoz és kompatibilis átjárókon keresztüli interneteléréshez. + ErikrafT Wi-Fi™ felfedezése + \ No newline at end of file From c7ddb482473038c0375264fbf5f988b3ba45c7a2 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:13:02 -0300 Subject: [PATCH 40/64] Add localized ErikrafT Wi-Fi About strings (in-rID) --- app/src/main/res/values-in-rID/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-in-rID/wifi_about.xml diff --git a/app/src/main/res/values-in-rID/wifi_about.xml b/app/src/main/res/values-in-rID/wifi_about.xml new file mode 100644 index 000000000..3085962b7 --- /dev/null +++ b/app/src/main/res/values-in-rID/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Proyek sumber terbuka untuk Wi-Fi, Wi-Fi Direct, dan jaringan mesh untuk komunikasi offline serta akses internet melalui gateway yang kompatibel. + Jelajahi ErikrafT Wi-Fi™ + \ No newline at end of file From 45d39cca65c05ada3f7722bb51c583ad5f7af2d2 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:13:05 -0300 Subject: [PATCH 41/64] Add localized ErikrafT Wi-Fi About strings (it-rIT) --- app/src/main/res/values-it-rIT/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-it-rIT/wifi_about.xml diff --git a/app/src/main/res/values-it-rIT/wifi_about.xml b/app/src/main/res/values-it-rIT/wifi_about.xml new file mode 100644 index 000000000..36e5bd46e --- /dev/null +++ b/app/src/main/res/values-it-rIT/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Un progetto open source per Wi-Fi, Wi-Fi Direct e reti mesh, dedicato alla comunicazione offline e all’accesso a Internet tramite gateway compatibili. + Scopri ErikrafT Wi-Fi™ + \ No newline at end of file From c6c7846530a6667eb2623c4eb0058ba797da9d7b Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:13:11 -0300 Subject: [PATCH 42/64] Add localized ErikrafT Wi-Fi About strings (iw-rIL) --- app/src/main/res/values-iw-rIL/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-iw-rIL/wifi_about.xml diff --git a/app/src/main/res/values-iw-rIL/wifi_about.xml b/app/src/main/res/values-iw-rIL/wifi_about.xml new file mode 100644 index 000000000..712e85ac7 --- /dev/null +++ b/app/src/main/res/values-iw-rIL/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + פרויקט קוד פתוח ל-Wi-Fi, ‏Wi-Fi Direct ורשתות Mesh לתקשורת לא מקוונת ולגישה לאינטרנט דרך שערים תואמים. + לגלות את ErikrafT Wi-Fi™ + \ No newline at end of file From b8ef98f4dec97d042887e8c3851aa6a25c474fcf Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:13:14 -0300 Subject: [PATCH 43/64] Add localized ErikrafT Wi-Fi About strings (ja-rJP) --- app/src/main/res/values-ja-rJP/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-ja-rJP/wifi_about.xml diff --git a/app/src/main/res/values-ja-rJP/wifi_about.xml b/app/src/main/res/values-ja-rJP/wifi_about.xml new file mode 100644 index 000000000..5896a0cf6 --- /dev/null +++ b/app/src/main/res/values-ja-rJP/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Wi-Fi、Wi-Fi Direct、メッシュネットワークを活用し、オフライン通信や対応ゲートウェイ経由のインターネット接続を実現するオープンソースプロジェクトです。 + ErikrafT Wi-Fi™ を見る + \ No newline at end of file From 33b6d89860cbae491c96cde5411b949801469026 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:13:19 -0300 Subject: [PATCH 44/64] Add localized ErikrafT Wi-Fi About strings (ko-rKR) --- app/src/main/res/values-ko-rKR/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-ko-rKR/wifi_about.xml diff --git a/app/src/main/res/values-ko-rKR/wifi_about.xml b/app/src/main/res/values-ko-rKR/wifi_about.xml new file mode 100644 index 000000000..3dc06b1c6 --- /dev/null +++ b/app/src/main/res/values-ko-rKR/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Wi-Fi, Wi-Fi Direct 및 메시 네트워크를 활용해 오프라인 통신과 호환 게이트웨이를 통한 인터넷 접속을 지원하는 오픈 소스 프로젝트입니다. + ErikrafT Wi-Fi™ 살펴보기 + \ No newline at end of file From b7c535065a75fcc6489f9f1c69174279c65a5915 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:13:22 -0300 Subject: [PATCH 45/64] Add localized ErikrafT Wi-Fi About strings (mk-rMK) --- app/src/main/res/values-mk-rMK/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-mk-rMK/wifi_about.xml diff --git a/app/src/main/res/values-mk-rMK/wifi_about.xml b/app/src/main/res/values-mk-rMK/wifi_about.xml new file mode 100644 index 000000000..e92906e16 --- /dev/null +++ b/app/src/main/res/values-mk-rMK/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Проект со отворен код за Wi-Fi, Wi-Fi Direct и mesh мрежи за офлајн комуникација и пристап до интернет преку компатибилни порти. + Истражи ErikrafT Wi-Fi™ + \ No newline at end of file From 56ea899ffcb48f5d6d112b285cdef004840e0a23 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:14:56 -0300 Subject: [PATCH 46/64] Add localized ErikrafT Wi-Fi About strings (ne-rNP) --- app/src/main/res/values-ne-rNP/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-ne-rNP/wifi_about.xml diff --git a/app/src/main/res/values-ne-rNP/wifi_about.xml b/app/src/main/res/values-ne-rNP/wifi_about.xml new file mode 100644 index 000000000..cc9cf98d9 --- /dev/null +++ b/app/src/main/res/values-ne-rNP/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Wi-Fi, Wi-Fi Direct र mesh नेटवर्कका लागि खुला स्रोत परियोजना, जसले अफलाइन सञ्चार र मिल्दो गेटवेमार्फत इन्टरनेट पहुँच प्रदान गर्छ। + ErikrafT Wi-Fi™ हेर्नुहोस् + \ No newline at end of file From 33a8778ec587d7a6a0dc7519badb8ca127ddc4d6 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:15:01 -0300 Subject: [PATCH 47/64] Add localized ErikrafT Wi-Fi About strings (nl-rNL) --- app/src/main/res/values-nl-rNL/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-nl-rNL/wifi_about.xml diff --git a/app/src/main/res/values-nl-rNL/wifi_about.xml b/app/src/main/res/values-nl-rNL/wifi_about.xml new file mode 100644 index 000000000..d7ad2a3d5 --- /dev/null +++ b/app/src/main/res/values-nl-rNL/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Een opensourceproject voor Wi-Fi, Wi-Fi Direct en meshnetwerken voor offline communicatie en internettoegang via compatibele gateways. + Ontdek ErikrafT Wi-Fi™ + \ No newline at end of file From 53d8863a76ff111ab7ea122e31d1a99fcc2e08d4 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:15:04 -0300 Subject: [PATCH 48/64] Add localized ErikrafT Wi-Fi About strings (no-rNO) --- app/src/main/res/values-no-rNO/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-no-rNO/wifi_about.xml diff --git a/app/src/main/res/values-no-rNO/wifi_about.xml b/app/src/main/res/values-no-rNO/wifi_about.xml new file mode 100644 index 000000000..9879c6ca3 --- /dev/null +++ b/app/src/main/res/values-no-rNO/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Et åpen kildekode-prosjekt for Wi-Fi, Wi-Fi Direct og mesh-nettverk for kommunikasjon uten nett og internettilgang via kompatible gatewayer. + Utforsk ErikrafT Wi-Fi™ + \ No newline at end of file From 2e7d494342f28f007ef4bfbcc90215c9d037c780 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:15:08 -0300 Subject: [PATCH 49/64] Add localized ErikrafT Wi-Fi About strings (pl-rPL) --- app/src/main/res/values-pl-rPL/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-pl-rPL/wifi_about.xml diff --git a/app/src/main/res/values-pl-rPL/wifi_about.xml b/app/src/main/res/values-pl-rPL/wifi_about.xml new file mode 100644 index 000000000..cd8f98a3b --- /dev/null +++ b/app/src/main/res/values-pl-rPL/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Projekt open source dla Wi-Fi, Wi-Fi Direct i sieci mesh, umożliwiający komunikację offline oraz dostęp do Internetu przez zgodne bramy. + Poznaj ErikrafT Wi-Fi™ + \ No newline at end of file From 5f8d1761de713b36a0148cc42c887e5f0b349e41 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:15:11 -0300 Subject: [PATCH 50/64] Add localized ErikrafT Wi-Fi About strings (pt-rBR) --- app/src/main/res/values-pt-rBR/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-pt-rBR/wifi_about.xml diff --git a/app/src/main/res/values-pt-rBR/wifi_about.xml b/app/src/main/res/values-pt-rBR/wifi_about.xml new file mode 100644 index 000000000..9f4984d1c --- /dev/null +++ b/app/src/main/res/values-pt-rBR/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Projeto de código aberto para Wi-Fi, Wi-Fi Direct e redes mesh, voltado à comunicação offline e ao acesso à Internet por gateways compatíveis. + Conhecer o ErikrafT Wi-Fi™ + \ No newline at end of file From 734c42e472b512f792cf6fc4ff603bb19ca84e10 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:15:14 -0300 Subject: [PATCH 51/64] Add localized ErikrafT Wi-Fi About strings (pt-rPT) --- app/src/main/res/values-pt-rPT/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-pt-rPT/wifi_about.xml diff --git a/app/src/main/res/values-pt-rPT/wifi_about.xml b/app/src/main/res/values-pt-rPT/wifi_about.xml new file mode 100644 index 000000000..b30fa1a70 --- /dev/null +++ b/app/src/main/res/values-pt-rPT/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Projeto de código aberto para Wi-Fi, Wi-Fi Direct e redes mesh, destinado à comunicação offline e ao acesso à Internet através de gateways compatíveis. + Explorar o ErikrafT Wi-Fi™ + \ No newline at end of file From 7a3a41e5d2335c037d0bdb8971fd70f7ced85d12 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:15:18 -0300 Subject: [PATCH 52/64] Add localized ErikrafT Wi-Fi About strings (ro-rRO) --- app/src/main/res/values-ro-rRO/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-ro-rRO/wifi_about.xml diff --git a/app/src/main/res/values-ro-rRO/wifi_about.xml b/app/src/main/res/values-ro-rRO/wifi_about.xml new file mode 100644 index 000000000..a09ba218b --- /dev/null +++ b/app/src/main/res/values-ro-rRO/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Un proiect open-source pentru Wi-Fi, Wi-Fi Direct și rețele mesh, destinat comunicării offline și accesului la internet prin gateway-uri compatibile. + Descoperă ErikrafT Wi-Fi™ + \ No newline at end of file From 886561237047e57544044a0a726d6800bbe80751 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:15:22 -0300 Subject: [PATCH 53/64] Add localized ErikrafT Wi-Fi About strings (ru-rRU) --- app/src/main/res/values-ru-rRU/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-ru-rRU/wifi_about.xml diff --git a/app/src/main/res/values-ru-rRU/wifi_about.xml b/app/src/main/res/values-ru-rRU/wifi_about.xml new file mode 100644 index 000000000..d142b8112 --- /dev/null +++ b/app/src/main/res/values-ru-rRU/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Проект с открытым исходным кодом для Wi-Fi, Wi-Fi Direct и mesh-сетей, обеспечивающий офлайн-связь и доступ к интернету через совместимые шлюзы. + О проекте ErikrafT Wi-Fi™ + \ No newline at end of file From 5bd18f1dca62484c18e88550cfbaf6619a8aa89e Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:15:29 -0300 Subject: [PATCH 54/64] Add localized ErikrafT Wi-Fi About strings (sk-rSK) --- app/src/main/res/values-sk-rSK/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-sk-rSK/wifi_about.xml diff --git a/app/src/main/res/values-sk-rSK/wifi_about.xml b/app/src/main/res/values-sk-rSK/wifi_about.xml new file mode 100644 index 000000000..3891efa7a --- /dev/null +++ b/app/src/main/res/values-sk-rSK/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Open-source projekt pre Wi-Fi, Wi-Fi Direct a mesh siete na offline komunikáciu a prístup na internet cez kompatibilné brány. + Preskúmať ErikrafT Wi-Fi™ + \ No newline at end of file From b08e512a2f722b1c95d7da27e358dcee26c53823 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:15:33 -0300 Subject: [PATCH 55/64] Add localized ErikrafT Wi-Fi About strings (sl-rSI) --- app/src/main/res/values-sl-rSI/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-sl-rSI/wifi_about.xml diff --git a/app/src/main/res/values-sl-rSI/wifi_about.xml b/app/src/main/res/values-sl-rSI/wifi_about.xml new file mode 100644 index 000000000..73ea6cf42 --- /dev/null +++ b/app/src/main/res/values-sl-rSI/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Odprtokodni projekt za Wi-Fi, Wi-Fi Direct in mrežna omrežja mesh za komunikacijo brez povezave ter dostop do interneta prek združljivih prehodov. + Razišči ErikrafT Wi-Fi™ + \ No newline at end of file From 2788c063ef4dd05c319bad28eb6dc09c0fe86689 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:15:36 -0300 Subject: [PATCH 56/64] Add localized ErikrafT Wi-Fi About strings (sr-rRS) --- app/src/main/res/values-sr-rRS/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-sr-rRS/wifi_about.xml diff --git a/app/src/main/res/values-sr-rRS/wifi_about.xml b/app/src/main/res/values-sr-rRS/wifi_about.xml new file mode 100644 index 000000000..5069efcca --- /dev/null +++ b/app/src/main/res/values-sr-rRS/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Пројекат отвореног кода за Wi-Fi, Wi-Fi Direct и mesh мреже за комуникацију ван мреже и приступ интернету преко компатибилних мрежних пролаза. + Истражи ErikrafT Wi-Fi™ + \ No newline at end of file From 900cb28befee3dc6764762e1016090e5560571da Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:15:39 -0300 Subject: [PATCH 57/64] Add localized ErikrafT Wi-Fi About strings (sr-rSP) --- app/src/main/res/values-sr-rSP/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-sr-rSP/wifi_about.xml diff --git a/app/src/main/res/values-sr-rSP/wifi_about.xml b/app/src/main/res/values-sr-rSP/wifi_about.xml new file mode 100644 index 000000000..798498c06 --- /dev/null +++ b/app/src/main/res/values-sr-rSP/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Projekat otvorenog koda za Wi-Fi, Wi-Fi Direct i mesh mreže za komunikaciju van mreže i pristup internetu preko kompatibilnih mrežnih prolaza. + Istraži ErikrafT Wi-Fi™ + \ No newline at end of file From 9009075d9863a64e98c877cbe78f941965dda013 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:15:42 -0300 Subject: [PATCH 58/64] Add localized ErikrafT Wi-Fi About strings (sr) --- app/src/main/res/values-sr/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-sr/wifi_about.xml diff --git a/app/src/main/res/values-sr/wifi_about.xml b/app/src/main/res/values-sr/wifi_about.xml new file mode 100644 index 000000000..5069efcca --- /dev/null +++ b/app/src/main/res/values-sr/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Пројекат отвореног кода за Wi-Fi, Wi-Fi Direct и mesh мреже за комуникацију ван мреже и приступ интернету преко компатибилних мрежних пролаза. + Истражи ErikrafT Wi-Fi™ + \ No newline at end of file From 25f3d861ab5c7fee236bc34cc27f0841eae0a8b8 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:15:45 -0300 Subject: [PATCH 59/64] Add localized ErikrafT Wi-Fi About strings (sv-rSE) --- app/src/main/res/values-sv-rSE/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-sv-rSE/wifi_about.xml diff --git a/app/src/main/res/values-sv-rSE/wifi_about.xml b/app/src/main/res/values-sv-rSE/wifi_about.xml new file mode 100644 index 000000000..66483b3ba --- /dev/null +++ b/app/src/main/res/values-sv-rSE/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Ett projekt med öppen källkod för Wi-Fi, Wi-Fi Direct och mesh-nätverk för offlinekommunikation och internetåtkomst via kompatibla gateways. + Utforska ErikrafT Wi-Fi™ + \ No newline at end of file From 2f771d0e7eff2f6baecd0be9baa06e3dad0e6bf1 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:15:49 -0300 Subject: [PATCH 60/64] Add localized ErikrafT Wi-Fi About strings (tr-rTR) --- app/src/main/res/values-tr-rTR/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-tr-rTR/wifi_about.xml diff --git a/app/src/main/res/values-tr-rTR/wifi_about.xml b/app/src/main/res/values-tr-rTR/wifi_about.xml new file mode 100644 index 000000000..f1d9d4f1e --- /dev/null +++ b/app/src/main/res/values-tr-rTR/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Çevrimdışı iletişim ve uyumlu ağ geçitleri üzerinden internet erişimi için Wi-Fi, Wi-Fi Direct ve mesh ağlarına yönelik açık kaynaklı proje. + ErikrafT Wi-Fi™ projesini keşfet + \ No newline at end of file From c28454e1a9e5c5676a81f6f315dded02375ebb90 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:15:53 -0300 Subject: [PATCH 61/64] Add localized ErikrafT Wi-Fi About strings (uk-rUA) --- app/src/main/res/values-uk-rUA/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-uk-rUA/wifi_about.xml diff --git a/app/src/main/res/values-uk-rUA/wifi_about.xml b/app/src/main/res/values-uk-rUA/wifi_about.xml new file mode 100644 index 000000000..38fcc6b4d --- /dev/null +++ b/app/src/main/res/values-uk-rUA/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Проєкт із відкритим кодом для Wi-Fi, Wi-Fi Direct і mesh-мереж для офлайн-зв’язку та доступу до інтернету через сумісні шлюзи. + Дізнатися про ErikrafT Wi-Fi™ + \ No newline at end of file From 3b8beffbf0b73ae8f7741619d21f6b36f03c15e9 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:16:00 -0300 Subject: [PATCH 62/64] Add localized ErikrafT Wi-Fi About strings (vi-rVN) --- app/src/main/res/values-vi-rVN/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-vi-rVN/wifi_about.xml diff --git a/app/src/main/res/values-vi-rVN/wifi_about.xml b/app/src/main/res/values-vi-rVN/wifi_about.xml new file mode 100644 index 000000000..20c33a619 --- /dev/null +++ b/app/src/main/res/values-vi-rVN/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + Dự án mã nguồn mở dành cho Wi-Fi, Wi-Fi Direct và mạng mesh, hỗ trợ liên lạc ngoại tuyến và truy cập Internet qua cổng kết nối tương thích. + Khám phá ErikrafT Wi-Fi™ + \ No newline at end of file From c3164b0870d975c0133ff3a3b9426b04c4ee190d Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:16:03 -0300 Subject: [PATCH 63/64] Add localized ErikrafT Wi-Fi About strings (zh-rCN) --- app/src/main/res/values-zh-rCN/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-zh-rCN/wifi_about.xml diff --git a/app/src/main/res/values-zh-rCN/wifi_about.xml b/app/src/main/res/values-zh-rCN/wifi_about.xml new file mode 100644 index 000000000..0f9604f1a --- /dev/null +++ b/app/src/main/res/values-zh-rCN/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + 一个面向 Wi-Fi、Wi-Fi Direct 和网状网络的开源项目,支持离线通信,并可通过兼容网关访问互联网。 + 了解 ErikrafT Wi-Fi™ + \ No newline at end of file From 12049f8ae3edccb837dbfc85d41d3c530408d726 Mon Sep 17 00:00:00 2001 From: ErikrafT Date: Fri, 16 Oct 2026 17:16:06 -0300 Subject: [PATCH 64/64] Add localized ErikrafT Wi-Fi About strings (zh-rTW) --- app/src/main/res/values-zh-rTW/wifi_about.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/values-zh-rTW/wifi_about.xml diff --git a/app/src/main/res/values-zh-rTW/wifi_about.xml b/app/src/main/res/values-zh-rTW/wifi_about.xml new file mode 100644 index 000000000..2407d078a --- /dev/null +++ b/app/src/main/res/values-zh-rTW/wifi_about.xml @@ -0,0 +1,6 @@ + + + ErikrafT Wi-Fi™ + 一個面向 Wi-Fi、Wi-Fi Direct 和網狀網路的開源專案,支援離線通訊,並可透過相容閘道器存取網際網路。 + 探索 ErikrafT Wi-Fi™ + \ No newline at end of file