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"
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
"
diff --git a/app/src/main/java/com/erikraft/drop/FtpServerService.java b/app/src/main/java/com/erikraft/drop/FtpServerService.java
index b793b5c83..707e37685 100644
--- a/app/src/main/java/com/erikraft/drop/FtpServerService.java
+++ b/app/src/main/java/com/erikraft/drop/FtpServerService.java
@@ -99,10 +99,12 @@ 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);
+ 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 +122,10 @@ private void startServer(long generation) {
user.setPassword(password);
user.setHomeDirectory(home.getAbsolutePath());
List authorities = new ArrayList<>();
- 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);
@@ -151,9 +156,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());
diff --git a/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java b/app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java
index e30e04396..3e54c7a29 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;
@@ -43,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;
@@ -90,7 +100,10 @@ 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()) {
+ 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();
@@ -138,18 +151,35 @@ 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)));
+ 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));
@@ -241,6 +271,7 @@ private void saveAndStart() {
.apply();
ContextCompat.startForegroundService(this, FtpServerService.startIntent(this));
status.setText(R.string.ftp_starting);
+ showConnectionQr(buildAddress());
}
private void stopServer() {
@@ -258,10 +289,25 @@ 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 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())) {
@@ -285,6 +331,28 @@ 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);
+ 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();
+ } 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);
diff --git a/app/src/main/java/com/erikraft/drop/SftpServerService.java b/app/src/main/java/com/erikraft/drop/SftpServerService.java
index b5d5b024f..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;
@@ -86,10 +103,11 @@ 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), "");
+ 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 extends OpenOption> 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);
diff --git a/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java b/app/src/main/java/com/erikraft/drop/SftpSettingsActivity.java
index 012e84aa0..80ade0433 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;
@@ -33,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) {
@@ -58,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()){
@@ -97,12 +106,17 @@ 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));
+ 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));
+ 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));
@@ -142,11 +156,39 @@ 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();
- 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);
+ 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) {
+ 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);
+ 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();
+ } 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;}
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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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-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
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
+
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
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
+
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
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);
}
}