├── .gitignore
├── LICENSE
├── PRIVACY_POLICY.md
├── README.md
├── app
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── ic_launcher-playstore.png
│ ├── java
│ └── slowscript
│ │ └── warpinator
│ │ ├── AboutActivity.java
│ │ ├── Authenticator.java
│ │ ├── Autostart.java
│ │ ├── CertServer.java
│ │ ├── GrpcService.java
│ │ ├── LocalBroadcasts.java
│ │ ├── MainActivity.java
│ │ ├── MainService.java
│ │ ├── MainServiceBinder.java
│ │ ├── Remote.java
│ │ ├── RemotesAdapter.java
│ │ ├── Server.java
│ │ ├── SettingsActivity.java
│ │ ├── ShareActivity.java
│ │ ├── TileMainService.java
│ │ ├── Transfer.java
│ │ ├── TransfersActivity.java
│ │ ├── TransfersAdapter.java
│ │ ├── Utils.java
│ │ ├── WarpinatorApp.java
│ │ ├── ZlibCompressor.java
│ │ └── preferences
│ │ ├── EditTextPreference.java
│ │ ├── ListPreference.java
│ │ ├── ProfilePicturePreference.java
│ │ └── ResetablePreference.java
│ ├── proto
│ └── warp.proto
│ └── res
│ ├── anim
│ ├── anim_null.xml
│ ├── anim_push_down.xml
│ └── anim_push_up.xml
│ ├── drawable-hdpi
│ └── ic_notification.png
│ ├── drawable-mdpi
│ └── ic_notification.png
│ ├── drawable-night
│ └── transfers_background.xml
│ ├── drawable-v31
│ └── ic_launcher_foreground.xml
│ ├── drawable-xhdpi
│ └── ic_notification.png
│ ├── drawable-xxhdpi
│ └── ic_notification.png
│ ├── drawable-xxxhdpi
│ └── ic_notification.png
│ ├── drawable
│ ├── ic_accept.xml
│ ├── ic_decline.xml
│ ├── ic_download.xml
│ ├── ic_error.xml
│ ├── ic_file.xml
│ ├── ic_folder.xml
│ ├── ic_launcher_foreground.xml
│ ├── ic_meh.xml
│ ├── ic_reconnect.xml
│ ├── ic_remove_items.xml
│ ├── ic_star_empty.xml
│ ├── ic_star_full.xml
│ ├── ic_star_toggle.xml
│ ├── ic_status_awaiting_duplex.xml
│ ├── ic_status_connected.xml
│ ├── ic_status_connecting.xml
│ ├── ic_stop.xml
│ ├── ic_unavailable.xml
│ ├── ic_upload.xml
│ ├── ic_user.xml
│ ├── ic_warpinator.xml
│ ├── rounded_corners.xml
│ └── transfers_background.xml
│ ├── layout
│ ├── activity_about.xml
│ ├── activity_main.xml
│ ├── activity_share.xml
│ ├── activity_transfers.xml
│ ├── dialog_manual_connect.xml
│ ├── profile_chooser_view.xml
│ ├── remote_view.xml
│ ├── resetable_preference.xml
│ ├── settings_activity.xml
│ ├── simple_list_item.xml
│ └── transfer_view.xml
│ ├── menu
│ └── menu_main.xml
│ ├── mipmap-anydpi-v26
│ ├── ic_launcher.xml
│ └── ic_launcher_round.xml
│ ├── mipmap-hdpi
│ ├── ic_launcher.png
│ └── ic_launcher_round.png
│ ├── mipmap-mdpi
│ ├── ic_launcher.png
│ └── ic_launcher_round.png
│ ├── mipmap-xhdpi
│ ├── ic_launcher.png
│ └── ic_launcher_round.png
│ ├── mipmap-xxhdpi
│ ├── ic_launcher.png
│ └── ic_launcher_round.png
│ ├── mipmap-xxxhdpi
│ ├── ic_launcher.png
│ └── ic_launcher_round.png
│ ├── values-ca
│ └── strings.xml
│ ├── values-cs
│ └── strings.xml
│ ├── values-de
│ └── strings.xml
│ ├── values-es
│ └── strings.xml
│ ├── values-fa
│ └── strings.xml
│ ├── values-fr
│ └── strings.xml
│ ├── values-hi
│ └── strings.xml
│ ├── values-hr
│ └── strings.xml
│ ├── values-hu
│ └── strings.xml
│ ├── values-id
│ └── strings.xml
│ ├── values-it
│ └── strings.xml
│ ├── values-kab
│ └── strings.xml
│ ├── values-lv
│ └── strings.xml
│ ├── values-ml
│ └── strings.xml
│ ├── values-nb-rNO
│ └── strings.xml
│ ├── values-nl
│ └── strings.xml
│ ├── values-pl
│ └── strings.xml
│ ├── values-pt-rBR
│ └── strings.xml
│ ├── values-pt
│ └── strings.xml
│ ├── values-ro
│ └── strings.xml
│ ├── values-ru
│ └── strings.xml
│ ├── values-sl
│ └── strings.xml
│ ├── values-sv
│ └── strings.xml
│ ├── values-ta
│ └── strings.xml
│ ├── values-tr
│ └── strings.xml
│ ├── values-v31
│ └── ic_launcher_background.xml
│ ├── values-zh-rCN
│ └── strings.xml
│ ├── values
│ ├── arrays.xml
│ ├── dimens.xml
│ ├── ic_launcher_background.xml
│ ├── strings.xml
│ └── styles.xml
│ └── xml
│ ├── provider_paths.xml
│ └── root_preferences.xml
├── build.gradle
├── connection-issues-ptbr.md
├── connection-issues.md
├── fastlane
└── metadata
│ └── android
│ ├── ca-ES
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── cs-CZ
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── de-DE
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── en-US
│ ├── changelogs
│ │ ├── 1050.txt
│ │ ├── 1051.txt
│ │ ├── 1052.txt
│ │ ├── 1053.txt
│ │ ├── 1060.txt
│ │ ├── 1061.txt
│ │ ├── 1070.txt
│ │ ├── 1071.txt
│ │ ├── 1080.txt
│ │ ├── 1081.txt
│ │ └── 1082.txt
│ ├── full_description.txt
│ ├── images
│ │ ├── icon.png
│ │ └── phoneScreenshots
│ │ │ ├── 1.jpg
│ │ │ └── 2.jpg
│ ├── short_description.txt
│ └── title.txt
│ ├── es-ES
│ ├── full_description.txt
│ ├── images
│ │ └── phoneScreenshots
│ │ │ ├── 1.png
│ │ │ ├── 2.png
│ │ │ └── 3.png
│ ├── short_description.txt
│ └── title.txt
│ ├── fr-FR
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── hu-HU
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── nl-NL
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── pl-PL
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── pt-BR
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── ta-IN
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ └── tr-TR
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/*
5 | .DS_Store
6 | /build
7 | /captures
8 | .externalNativeBuild
9 | .cxx
10 | app/release/*
11 |
12 |
--------------------------------------------------------------------------------
/PRIVACY_POLICY.md:
--------------------------------------------------------------------------------
1 | # Privacy policy
2 |
3 | Warpinator for Android is a free and open source project that respects your privacy. As such, it collects no personal data.
4 | That being said, you may still want to know which information the application has access to and how it is handled.
5 |
6 | To allow device discovery, we use the mDNS protocol. It works by sending the information that a Warpinator service is running on a certain IP address
7 | and port to everyone on the local network. It also discloses the phone's name to allow other users identify the device.
8 |
9 | The devices then make an encrypted connection. All subsequent communication (transfers, transfer requests, profile picture and
10 | username, ...) goes through this channel. Only users with the same group code are able to connect.
11 | No personal files are accessed unless instructed by the user to be tranferred to a selected device.
12 |
13 | The application can also log debug information if enabled in the settings. The log file is kept in a location that can be accessed by some other apps
14 | with sufficient permissions (eg. file managers, but also others). As the log may contain sensitive information (transferred file names,
15 | connected devices, ...), do not keep this option enabled unless needed for troubleshooting.
16 |
17 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Warpinator for Android (unofficial)
2 |
3 | This is an unofficial reimplementation of Linux Mint's file sharing tool [Warpinator](https://github.com/linuxmint/warpinator) for Android.
4 |
5 | ## Download
6 | Get the APK from the [Releases](https://github.com/slowscript/warpinator-android/releases) page
7 |
8 | Also available on F-Droid and Google Play
9 |
10 |
11 |
12 | ## Building
13 |
14 | Build with Android Studio or with this command (you will need to install Android SDK yourself though):
15 |
16 | ```
17 | export ANDROID_SDK_ROOT=$HOME/Android/Sdk
18 | ./gradlew :app:assembleDebug
19 | ```
20 |
21 | ## Translations
22 |
23 | Translations are now being done through [Weblate](https://hosted.weblate.org/projects/warpinator-android/)
24 |
25 | [](https://hosted.weblate.org/engage/warpinator-android/)
26 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 | apply plugin: 'com.google.protobuf'
3 |
4 | android {
5 | compileSdk 34
6 |
7 | defaultConfig {
8 | applicationId 'slowscript.warpinator'
9 | minSdkVersion 21 //Required by NSD (attributes)
10 | targetSdkVersion 34
11 | versionCode 1082
12 | versionName "1.8.2"
13 |
14 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
15 | }
16 |
17 | buildTypes {
18 | release {
19 | minifyEnabled true
20 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
21 | }
22 | }
23 | compileOptions {
24 | sourceCompatibility = 17
25 | targetCompatibility = 17
26 | }
27 | packagingOptions {
28 | resources {
29 | excludes += ['META-INF/INDEX.LIST', 'META-INF/io.netty.versions.properties']
30 | }
31 | }
32 | namespace 'slowscript.warpinator'
33 | }
34 |
35 | dependencies {
36 | implementation fileTree(dir: 'libs', include: ['*.jar'])
37 |
38 | implementation 'androidx.appcompat:appcompat:1.7.0'
39 | implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
40 | implementation 'androidx.documentfile:documentfile:1.0.1'
41 | implementation 'com.google.android.material:material:1.12.0'
42 | implementation 'androidx.recyclerview:recyclerview:1.3.2' //1.4 needs SDK 35
43 | implementation 'androidx.cardview:cardview:1.0.0'
44 |
45 | implementation 'org.openjax.security:nacl:0.3.2' //Update available, but API is weird now
46 | implementation 'org.bouncycastle:bcpkix-jdk14:1.80'
47 | implementation 'io.grpc:grpc-netty:1.49.0' //Updating gRPC caused a problem with connecting, must investigate
48 | implementation 'io.grpc:grpc-okhttp:1.49.0'
49 | implementation ('io.grpc:grpc-protobuf:1.49.0') {
50 | exclude group: 'com.google.api.grpc', module: 'proto-google-common-protos'
51 | }
52 | implementation 'io.grpc:grpc-stub:1.49.0'
53 | implementation 'javax.annotation:javax.annotation-api:1.3.2'
54 | implementation 'org.conscrypt:conscrypt-android:2.5.3'
55 |
56 | implementation 'com.github.tony19:logback-android:3.0.0'
57 | implementation 'androidx.preference:preference:1.2.1'
58 | implementation 'com.google.guava:guava:33.4.0-android' //This was included by gRPC anyway, so why not use it
59 | implementation 'org.jmdns:jmdns:3.5.8' //Device discovery worsened after update, let's see if this was the problem
60 | // Also, new versions require desugaring on Android 5 and 6
61 | implementation 'org.slf4j:slf4j-api:2.0.17' // For jmdns, it declares a too old dependency
62 | implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.1.0'
63 | implementation 'com.google.zxing:core:3.5.3'
64 | }
65 |
66 | protobuf {
67 | protoc {
68 | artifact = 'com.google.protobuf:protoc:3.21.5'
69 | }
70 | plugins {
71 | grpc {
72 | artifact = 'io.grpc:protoc-gen-grpc-java:1.57.0'
73 | }
74 | }
75 | generateProtoTasks {
76 | all().each { task ->
77 | task.builtins {
78 | java { }
79 | }
80 | task.plugins {
81 | grpc { }
82 | }
83 | }
84 | }
85 | }
86 |
87 | //If there is a better way to get rid of Netty logging, let me know
88 | configurations.all {
89 | resolutionStrategy {
90 | dependencySubstitution {
91 | substitute module('ch.qos.logback:logback-classic') using module('com.github.tony19:logback-android:3.0.0')
92 | }
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | -keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
23 | -dontobfuscate
24 |
25 | # Netty
26 | -keep public class io.netty.util.ReferenceCountUtil {
27 | *;
28 | }
29 | -keep public interface io.netty.channel.ChannelOutboundInvoker {
30 | *;
31 | }
32 | # These should not be needed
33 | -dontwarn com.android.org.conscrypt.SSLParametersImpl
34 | -dontwarn org.apache.harmony.xnet.provider.jsse.SSLParametersImpl
35 | -dontwarn reactor.blockhound.integration.BlockHoundIntegration
36 | -dontwarn io.netty.internal.tcnative.*
37 | -dontwarn org.jetbrains.annotations.*
38 | # ??
39 | -dontwarn org.apache.log4j.Level
40 | -dontwarn org.apache.log4j.Logger
41 | -dontwarn org.apache.log4j.Priority
42 | -dontwarn org.apache.logging.log4j.Level
43 | -dontwarn org.apache.logging.log4j.LogManager
44 | -dontwarn org.apache.logging.log4j.Logger
45 | -dontwarn org.apache.logging.log4j.message.MessageFactory
46 | -dontwarn org.apache.logging.log4j.spi.ExtendedLogger
47 | -dontwarn org.apache.logging.log4j.spi.ExtendedLoggerWrapper
48 | -dontwarn org.eclipse.jetty.alpn.ALPN$ClientProvider
49 | -dontwarn org.eclipse.jetty.alpn.ALPN$Provider
50 | -dontwarn org.eclipse.jetty.alpn.ALPN$ServerProvider
51 | -dontwarn org.eclipse.jetty.alpn.ALPN
52 | -dontwarn org.eclipse.jetty.npn.NextProtoNego$ClientProvider
53 | -dontwarn org.eclipse.jetty.npn.NextProtoNego$Provider
54 | -dontwarn org.eclipse.jetty.npn.NextProtoNego$ServerProvider
55 | -dontwarn org.eclipse.jetty.npn.NextProtoNego
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
28 |
29 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
46 |
47 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
61 |
62 |
64 |
65 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
86 |
87 |
88 |
89 |
90 |
91 |
93 |
94 |
100 |
101 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
114 |
117 |
118 |
119 |
120 |
121 |
--------------------------------------------------------------------------------
/app/src/main/ic_launcher-playstore.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/app/src/main/ic_launcher-playstore.png
--------------------------------------------------------------------------------
/app/src/main/java/slowscript/warpinator/AboutActivity.java:
--------------------------------------------------------------------------------
1 | package slowscript.warpinator;
2 |
3 | import androidx.appcompat.app.ActionBar;
4 | import androidx.appcompat.app.AppCompatActivity;
5 |
6 | import android.os.Bundle;
7 | import android.text.Html;
8 | import android.text.method.LinkMovementMethod;
9 | import android.view.MenuItem;
10 | import android.widget.TextView;
11 |
12 | public class AboutActivity extends AppCompatActivity {
13 |
14 | TextView versionView, warrantyView;
15 |
16 | @Override
17 | protected void onCreate(Bundle savedInstanceState) {
18 | super.onCreate(savedInstanceState);
19 | setContentView(R.layout.activity_about);
20 | ActionBar actionBar = getSupportActionBar();
21 | if (actionBar != null) {
22 | actionBar.setDisplayHomeAsUpEnabled(true);
23 | }
24 |
25 | versionView = findViewById(R.id.versionText);
26 | warrantyView = findViewById(R.id.warrantyText);
27 |
28 | versionView.setText(getString(R.string.version, BuildConfig.VERSION_NAME));
29 | warrantyView.setMovementMethod(LinkMovementMethod.getInstance());
30 | warrantyView.setText(Html.fromHtml(getResources().getString(R.string.warranty_html)));
31 |
32 | }
33 |
34 | @Override
35 | public boolean onOptionsItemSelected(MenuItem item) {
36 | // Respond to the action bar's Up/Home button
37 | if (item.getItemId() == android.R.id.home) {
38 | super.onBackPressed();
39 | return true;
40 | }
41 | return super.onOptionsItemSelected(item);
42 | }
43 | }
--------------------------------------------------------------------------------
/app/src/main/java/slowscript/warpinator/Autostart.java:
--------------------------------------------------------------------------------
1 | package slowscript.warpinator;
2 |
3 | import android.content.BroadcastReceiver;
4 | import android.content.Context;
5 | import android.content.Intent;
6 | import android.content.SharedPreferences;
7 | import android.os.Build;
8 | import androidx.preference.PreferenceManager;
9 |
10 | public class Autostart extends BroadcastReceiver {
11 |
12 | @Override
13 | public void onReceive(Context context, Intent intent) {
14 | SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
15 |
16 | if ((
17 | Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction()) ||
18 | Intent.ACTION_REBOOT.equals(intent.getAction()) ||
19 | Intent.ACTION_MY_PACKAGE_REPLACED.equals(intent.getAction())
20 | ) && prefs.getBoolean("bootStart", false)
21 | ) {
22 | Intent i = new Intent(context, MainService.class);
23 | i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
24 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
25 | context.startForegroundService(i);
26 | } else {
27 | context.startService(i);
28 | }
29 | }
30 | }
31 | }
--------------------------------------------------------------------------------
/app/src/main/java/slowscript/warpinator/CertServer.java:
--------------------------------------------------------------------------------
1 | package slowscript.warpinator;
2 |
3 | import android.util.Base64;
4 | import android.util.Log;
5 |
6 | import java.net.DatagramPacket;
7 | import java.net.DatagramSocket;
8 | import java.net.InetAddress;
9 | import java.net.SocketException;
10 | import java.util.Arrays;
11 |
12 | public class CertServer implements Runnable{
13 | static String TAG = "CertServer";
14 | static int PORT;
15 | public static String REQUEST = "REQUEST";
16 |
17 | static Thread serverThread;
18 | static DatagramSocket serverSocket;
19 | static boolean running = false;
20 |
21 | public static void Start(int port) {
22 | PORT = port;
23 | if (serverSocket != null)
24 | serverSocket.close();
25 | running = true;
26 | serverThread = new Thread(new CertServer());
27 | serverThread.start();
28 | }
29 |
30 | public static void Stop() {
31 | //It's a UDP server, it doesn't lock anything so this shouldn't matter
32 | //Close should cancel the receive method
33 | running = false;
34 | if (serverSocket != null)
35 | serverSocket.close();
36 | }
37 |
38 | public void run() {
39 | try {
40 | serverSocket = new DatagramSocket(PORT);
41 | } catch (Exception e){
42 | Log.e(TAG, "Failed to start certificate server", e);
43 | return;
44 | }
45 | byte[] receiveData = new byte[1024];
46 | byte[] cert = Authenticator.getBoxedCertificate();
47 | byte[] sendData = Base64.encode(cert, Base64.DEFAULT);
48 | while(running)
49 | {
50 | try {
51 | DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
52 | serverSocket.receive(receivePacket);
53 | byte[] received = Arrays.copyOfRange(receivePacket.getData(), 0, receivePacket.getLength());
54 | String request = new String(received);
55 | if (request.equals(REQUEST))
56 | {
57 | InetAddress IPAddress = receivePacket.getAddress();
58 | int port = receivePacket.getPort();
59 | DatagramPacket sendPacket =
60 | new DatagramPacket(sendData, sendData.length, IPAddress, port);
61 | serverSocket.send(sendPacket);
62 | Log.d(TAG, "Certificate sent");
63 | }
64 | } catch (Exception e) {
65 | if (running) {
66 | Log.w(TAG, "Error while running CertServer. Restarting. || " + e.getMessage());
67 | }
68 | }
69 | }
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/app/src/main/java/slowscript/warpinator/LocalBroadcasts.java:
--------------------------------------------------------------------------------
1 | package slowscript.warpinator;
2 |
3 | import android.content.Context;
4 | import android.content.Intent;
5 |
6 | import androidx.localbroadcastmanager.content.LocalBroadcastManager;
7 |
8 | public class LocalBroadcasts {
9 | public static final String ACTION_UPDATE_REMOTES = "update_remotes";
10 | public static final String ACTION_UPDATE_TRANSFERS = "update_transfers";
11 | public static final String ACTION_UPDATE_TRANSFER = "update_transfer";
12 | public static final String ACTION_UPDATE_NETWORK = "update_network";
13 | public static final String ACTION_DISPLAY_MESSAGE = "display_message";
14 | public static final String ACTION_DISPLAY_TOAST = "display_toast";
15 | public static final String ACTION_CLOSE_ALL = "close_all";
16 |
17 | public static void updateRemotes(Context ctx) {
18 | LocalBroadcastManager.getInstance(ctx).sendBroadcast(new Intent(ACTION_UPDATE_REMOTES));
19 | }
20 |
21 | public static void updateNetworkState(Context ctx) {
22 | LocalBroadcastManager.getInstance(ctx).sendBroadcast(new Intent(ACTION_UPDATE_NETWORK));
23 | }
24 |
25 | public static void updateTransfers(Context ctx, String remote) {
26 | Intent intent = new Intent(ACTION_UPDATE_TRANSFERS);
27 | intent.putExtra("remote", remote);
28 | LocalBroadcastManager.getInstance(ctx).sendBroadcast(intent);
29 | }
30 |
31 | public static void updateTransfer(Context ctx, String remote, int id) {
32 | Intent intent = new Intent(ACTION_UPDATE_TRANSFER);
33 | intent.putExtra("remote", remote);
34 | intent.putExtra("id", id);
35 | LocalBroadcastManager.getInstance(ctx).sendBroadcast(intent);
36 | }
37 |
38 | public static void displayMessage(Context ctx, String title, String msg) {
39 | Intent intent = new Intent(ACTION_DISPLAY_MESSAGE);
40 | intent.putExtra("title", title);
41 | intent.putExtra("msg", msg);
42 | LocalBroadcastManager.getInstance(ctx).sendBroadcast(intent);
43 | }
44 |
45 | public static void displayToast(Context ctx, String msg, int length) {
46 | Intent intent = new Intent(ACTION_DISPLAY_TOAST);
47 | intent.putExtra("msg", msg);
48 | intent.putExtra("length", length);
49 | LocalBroadcastManager.getInstance(ctx).sendBroadcast(intent);
50 | }
51 |
52 | public static void closeAll(Context ctx) {
53 | LocalBroadcastManager.getInstance(ctx).sendBroadcast(new Intent(ACTION_CLOSE_ALL));
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/app/src/main/java/slowscript/warpinator/MainServiceBinder.java:
--------------------------------------------------------------------------------
1 | package slowscript.warpinator;
2 |
3 | import android.os.Binder;
4 |
5 | public class MainServiceBinder extends Binder {
6 |
7 | private final MainService service;
8 |
9 | public MainServiceBinder(MainService service) {
10 | this.service = service;
11 | }
12 |
13 | public MainService getService() {
14 | return service;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/app/src/main/java/slowscript/warpinator/RemotesAdapter.java:
--------------------------------------------------------------------------------
1 | package slowscript.warpinator;
2 |
3 | import android.app.Activity;
4 | import android.content.Context;
5 | import android.content.Intent;
6 | import android.content.res.ColorStateList;
7 | import android.view.LayoutInflater;
8 | import android.view.View;
9 | import android.view.ViewGroup;
10 | import android.widget.ImageView;
11 | import android.widget.TextView;
12 |
13 | import androidx.annotation.NonNull;
14 | import androidx.cardview.widget.CardView;
15 | import androidx.recyclerview.widget.RecyclerView;
16 |
17 | public class RemotesAdapter extends RecyclerView.Adapter {
18 |
19 | Activity app;
20 |
21 | public RemotesAdapter(Activity _app) {
22 | app = _app;
23 | }
24 |
25 | @NonNull
26 | @Override
27 | public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
28 | LayoutInflater inflater = LayoutInflater.from(app);
29 | View view = inflater.inflate(R.layout.remote_view, parent, false);
30 | return new ViewHolder(view);
31 | }
32 |
33 | @Override
34 | public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
35 | Remote r = MainService.remotes.get(MainService.remotesOrder.get(position));
36 | setupViewHolder(holder, r);
37 |
38 | holder.cardView.setOnClickListener((view) -> {
39 | Intent i = new Intent(app, TransfersActivity.class);
40 | i.putExtra("remote", r.uuid);
41 | app.startActivity(i);
42 | });
43 | }
44 |
45 | void setupViewHolder(ViewHolder holder, Remote r) {
46 | holder.txtName.setText(r.displayName);
47 | holder.txtUsername.setText(r.userName + "@" + r.hostname);
48 | holder.txtIP.setText(r.address.getHostAddress() + ":" + r.port);
49 |
50 | Context context = holder.imgProfile.getContext();
51 |
52 | int color = Utils.getAndroidAttributeColor(context, android.R.attr.textColorSecondary);
53 |
54 | if(r.picture != null) {
55 | holder.imgProfile.setImageTintList(null);
56 | holder.imgProfile.setImageBitmap(r.picture);
57 | } else {
58 | holder.imgProfile.setImageTintList(ColorStateList.valueOf(color));
59 | }
60 | holder.imgStatus.setImageResource(Utils.getIconForRemoteStatus(r.status));
61 | if (r.status == Remote.RemoteStatus.ERROR || r.status == Remote.RemoteStatus.DISCONNECTED) {
62 | if (!r.serviceAvailable)
63 | holder.imgStatus.setImageResource(R.drawable.ic_unavailable);
64 | else
65 | color = Utils.getAttributeColor(context.getTheme(), androidx.appcompat.R.attr.colorError);
66 | }
67 | holder.imgStatus.setImageTintList(ColorStateList.valueOf(color));
68 | holder.imgFav.setVisibility(r.isFavorite() ? View.VISIBLE : View.INVISIBLE);
69 |
70 | holder.cardView.setVisibility(r.errorGroupCode ? View.GONE : View.VISIBLE);
71 | if (r.errorGroupCode)
72 | holder.cardView.setLayoutParams(new ViewGroup.LayoutParams(0, 0));
73 | else holder.cardView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
74 | }
75 |
76 | @Override
77 | public int getItemCount() {
78 | return MainService.remotes.size();
79 | }
80 |
81 | public class ViewHolder extends RecyclerView.ViewHolder{
82 |
83 | CardView cardView;
84 | TextView txtName;
85 | TextView txtUsername;
86 | TextView txtIP;
87 | ImageView imgProfile;
88 | ImageView imgStatus;
89 | ImageView imgFav;
90 |
91 | public ViewHolder(@NonNull View itemView) {
92 | super(itemView);
93 | cardView = itemView.findViewById(R.id.cardView);
94 | txtName = itemView.findViewById(R.id.txtName);
95 | txtUsername = itemView.findViewById(R.id.txtUsername);
96 | txtIP = itemView.findViewById(R.id.txtIP);
97 | imgProfile = itemView.findViewById(R.id.imgProfile);
98 | imgStatus = itemView.findViewById(R.id.imgStatus);
99 | imgFav = itemView.findViewById(R.id.imgFav);
100 | }
101 | }
102 | }
103 |
--------------------------------------------------------------------------------
/app/src/main/java/slowscript/warpinator/TileMainService.java:
--------------------------------------------------------------------------------
1 | package slowscript.warpinator;
2 |
3 | import android.content.ComponentName;
4 | import android.content.Context;
5 | import android.content.Intent;
6 | import android.content.ServiceConnection;
7 | import android.os.Build;
8 | import android.os.IBinder;
9 | import android.service.quicksettings.Tile;
10 | import android.service.quicksettings.TileService;
11 | import android.util.Log;
12 | import android.widget.Toast;
13 |
14 | import androidx.annotation.RequiresApi;
15 |
16 | @RequiresApi(api = Build.VERSION_CODES.N)
17 | public class TileMainService extends TileService implements MainService.RemoteCountObserver {
18 | private Intent serviceIntent;
19 | private ServiceConnection serviceConnection;
20 | private MainServiceBinder binder;
21 | private MainService.DisposableRemoteCountObserver unregisterObserver = null;
22 |
23 | @Override
24 | public void onCreate() {
25 | super.onCreate();
26 | serviceIntent = new Intent(this, MainService.class);
27 | }
28 |
29 | @Override
30 | public void onStartListening() {
31 | super.onStartListening();
32 | boolean isRunning = Utils.isMyServiceRunning(this, MainService.class);
33 | updateTile(isRunning);
34 | if (isRunning && binder == null) {
35 | joinService();
36 | }
37 | }
38 |
39 | @Override
40 | public void onDestroy() {
41 | if (serviceConnection != null) {
42 | unbindService(serviceConnection);
43 | serviceConnection = null;
44 | }
45 | if (unregisterObserver != null) {
46 | unregisterObserver.dispose();
47 | unregisterObserver = null;
48 | }
49 | binder = null;
50 | super.onDestroy();
51 | }
52 |
53 | @Override
54 | public void onClick() {
55 | super.onClick();
56 | switch (getQsTile().getState()) {
57 | case Tile.STATE_ACTIVE:
58 | stopService();
59 | break;
60 | case Tile.STATE_INACTIVE:
61 | // Activating Warpinator requires unlocking the device first
62 | unlockAndRun(this::startService);
63 | break;
64 | }
65 | }
66 |
67 | void updateTile(boolean active) {
68 | Tile tile = getQsTile();
69 | if (active) {
70 | tile.setState(Tile.STATE_ACTIVE);
71 | } else {
72 | tile.setState(Tile.STATE_INACTIVE);
73 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
74 | tile.setSubtitle(null);
75 | }
76 | }
77 | tile.updateTile();
78 | }
79 |
80 | private void updateBoundService(MainServiceBinder binder) {
81 | this.binder = binder;
82 | if (binder == null) {
83 | serviceConnection = null;
84 | if (unregisterObserver != null) {
85 | unregisterObserver.dispose();
86 | unregisterObserver = null;
87 | }
88 | updateTile(false);
89 | } else {
90 | unregisterObserver = this.binder.getService().observeDeviceCount(this);
91 | updateTile(true);
92 | }
93 | }
94 |
95 | private void startService() {
96 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
97 | try {
98 | startForegroundService(serviceIntent);
99 | } catch (Exception e) {
100 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
101 | Log.e("Tile", "Cannot start main service from background on Android 14+", e);
102 | Toast.makeText(this, "Cannot Warpinator from tile on Android 14+", Toast.LENGTH_LONG).show();
103 | }
104 | else Log.e("Tile", "Cannot start main service (Android <14)", e);
105 | return;
106 | }
107 | } else {
108 | startService(serviceIntent);
109 | }
110 | joinService();
111 | }
112 |
113 | private void joinService() {
114 | bindService(serviceIntent, serviceConnection = new ServiceConnection() {
115 | @Override
116 | public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
117 | updateBoundService((MainServiceBinder) iBinder);
118 | }
119 |
120 | @Override
121 | public void onServiceDisconnected(ComponentName componentName) {
122 | updateBoundService(null);
123 | }
124 | }, 0);
125 | }
126 |
127 | private void stopService() {
128 | updateTile(false);
129 | updateBoundService(null);
130 | Intent stopIntent = new Intent(this, MainService.StopSvcReceiver.class);
131 | stopIntent.setAction(MainService.ACTION_STOP);
132 | sendBroadcast(stopIntent);
133 | }
134 |
135 | @Override
136 | public void onDeviceCountChange(int newCount) {
137 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
138 | Tile tile = getQsTile();
139 | if (newCount > 0 && tile.getState() == Tile.STATE_ACTIVE) {
140 | tile.setSubtitle(getString(R.string.qs_discovered_count, newCount));
141 | } else {
142 | // If there are no discovered remotes, don't mention them.
143 | // This should fall back to displaying the state of the tile ("On").
144 | tile.setSubtitle(null);
145 | }
146 | tile.updateTile();
147 | }
148 | }
149 |
150 | public static void requestListeningState(Context context) {
151 | requestListeningState(context, new ComponentName(context, TileMainService.class));
152 | }
153 | }
154 |
--------------------------------------------------------------------------------
/app/src/main/java/slowscript/warpinator/WarpinatorApp.java:
--------------------------------------------------------------------------------
1 | package slowscript.warpinator;
2 |
3 | import android.app.Activity;
4 | import android.app.Application;
5 | import android.content.Intent;
6 | import android.os.Bundle;
7 | import android.util.Log;
8 |
9 | import androidx.annotation.NonNull;
10 | import androidx.annotation.Nullable;
11 | import androidx.preference.PreferenceManager;
12 |
13 | import com.google.android.material.color.DynamicColors;
14 |
15 | public class WarpinatorApp extends Application implements Application.ActivityLifecycleCallbacks {
16 | static int activitiesRunning = 0;
17 | static final String TAG = "APP";
18 |
19 | @Override
20 | public void onCreate() {
21 | super.onCreate();
22 | DynamicColors.applyToActivitiesIfAvailable(this);
23 | registerActivityLifecycleCallbacks(this);
24 | activitiesRunning = 0;
25 |
26 | // Clear old persisted URI permissions (except profile picture)
27 | String picture = PreferenceManager.getDefaultSharedPreferences(this).getString("profile", "0");
28 | for (var u : getContentResolver().getPersistedUriPermissions()) {
29 | if (u.getUri().toString().equals(picture)) {
30 | Log.v(TAG, "keeping permission for " + u);
31 | continue;
32 | }
33 | Log.v(TAG, "releasing uri permission " + u);
34 | getContentResolver().releasePersistableUriPermission(u.getUri(), Intent.FLAG_GRANT_READ_URI_PERMISSION);
35 | }
36 | }
37 |
38 | @Override
39 | public void onActivityStarted(@NonNull Activity activity) {
40 | Log.d(TAG, "Started activity");
41 | activitiesRunning++;
42 | MainService.cancelAutoStop();
43 | }
44 |
45 | @Override
46 | public void onActivityStopped(@NonNull Activity activity) {
47 | activitiesRunning--;
48 | Log.d(TAG, "Stopped activity -> " + activitiesRunning);
49 | if (activitiesRunning < 1)
50 | MainService.scheduleAutoStop();
51 | }
52 |
53 | @Override public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle bundle) { }
54 | @Override public void onActivityResumed(@NonNull Activity activity) {}
55 | @Override public void onActivityPaused(@NonNull Activity activity) {}
56 | @Override public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle bundle) { }
57 | @Override public void onActivityDestroyed(@NonNull Activity activity) { }
58 | }
59 |
--------------------------------------------------------------------------------
/app/src/main/java/slowscript/warpinator/ZlibCompressor.java:
--------------------------------------------------------------------------------
1 | package slowscript.warpinator;
2 |
3 | import java.io.ByteArrayOutputStream;
4 | import java.io.IOException;
5 | import java.util.zip.Deflater;
6 | import java.util.zip.Inflater;
7 |
8 | public class ZlibCompressor {
9 | private static final int BUFFER_SIZE = 1024;
10 |
11 | public static byte[] compress(final byte[] input, int length, int level) throws IOException
12 | {
13 | final Deflater deflater = new Deflater();
14 | deflater.setLevel(level);
15 | deflater.setInput(input, 0, length);
16 | deflater.finish();
17 |
18 | try (final ByteArrayOutputStream output = new ByteArrayOutputStream(length))
19 | {
20 | final byte[] buffer = new byte[1024];
21 | while (!deflater.finished())
22 | {
23 | final int count = deflater.deflate(buffer);
24 | output.write(buffer, 0, count);
25 | }
26 |
27 | return output.toByteArray();
28 | }
29 | }
30 |
31 | public static byte[] decompress(final byte[] input) throws Exception
32 | {
33 | final Inflater inflater = new Inflater();
34 | inflater.setInput(input);
35 |
36 | try (final ByteArrayOutputStream output = new ByteArrayOutputStream(input.length))
37 | {
38 | byte[] buffer = new byte[BUFFER_SIZE];
39 | while (!inflater.finished())
40 | {
41 | final int count = inflater.inflate(buffer);
42 | output.write(buffer, 0, count);
43 | }
44 |
45 | return output.toByteArray();
46 | }
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/app/src/main/java/slowscript/warpinator/preferences/EditTextPreference.java:
--------------------------------------------------------------------------------
1 | package slowscript.warpinator.preferences;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.widget.EditText;
6 | import android.widget.FrameLayout;
7 |
8 | import androidx.annotation.Nullable;
9 |
10 | import com.google.android.material.dialog.MaterialAlertDialogBuilder;
11 |
12 | @SuppressWarnings("unused")
13 | public class EditTextPreference extends androidx.preference.EditTextPreference {
14 |
15 | @Nullable private OnBindEditTextListener mOnBindEditTextListener;
16 |
17 | public EditTextPreference(Context context) {
18 | super(context);
19 | }
20 |
21 | public EditTextPreference(Context context, AttributeSet attrs, int defStyle) {
22 | super(context, attrs, defStyle);
23 | }
24 |
25 | public EditTextPreference(Context context, AttributeSet attrs) {
26 | super(context, attrs);
27 | }
28 |
29 | @Override
30 | public void setOnBindEditTextListener(@Nullable OnBindEditTextListener onBindEditTextListener) {
31 | mOnBindEditTextListener = onBindEditTextListener;
32 | }
33 |
34 | @Override
35 | protected void onClick() {
36 | FrameLayout frameLayout = new FrameLayout(getContext());
37 | EditText editText = new EditText(getContext());
38 |
39 | editText.setText(getText());
40 |
41 | frameLayout.setPaddingRelative(40, 30, 40, 0);
42 | frameLayout.addView(editText);
43 | if (mOnBindEditTextListener != null) {
44 | mOnBindEditTextListener.onBindEditText(editText);
45 | }
46 |
47 | new MaterialAlertDialogBuilder(getContext()).setPositiveButton(android.R.string.ok, (dialog, which) -> {
48 | String newVal = editText.getText().toString();
49 | if (callChangeListener(newVal))
50 | setText(newVal);
51 | dialog.dismiss();
52 | }).setNegativeButton(android.R.string.cancel, null).setTitle(getDialogTitle()).setView(frameLayout).show();
53 | editText.requestFocus();
54 | }
55 |
56 | @Override
57 | public CharSequence getSummary() {
58 | return super.getText();
59 | }
60 |
61 | @Override
62 | public void setText(String text) {
63 | super.setText(text);
64 | this.setSummary(text);
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/app/src/main/java/slowscript/warpinator/preferences/ListPreference.java:
--------------------------------------------------------------------------------
1 | package slowscript.warpinator.preferences;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 |
6 | import com.google.android.material.dialog.MaterialAlertDialogBuilder;
7 |
8 | public class ListPreference extends androidx.preference.ListPreference {
9 | public ListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
10 | super(context, attrs, defStyleAttr, defStyleRes);
11 | }
12 |
13 | public ListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
14 | super(context, attrs, defStyleAttr);
15 | }
16 |
17 | public ListPreference(Context context, AttributeSet attrs) {
18 | super(context, attrs);
19 | }
20 |
21 | public ListPreference(Context context) {
22 | super(context);
23 | }
24 |
25 | @Override
26 | protected void onClick() {
27 | int selected = super.findIndexOfValue((String) super.getValue());
28 |
29 | new MaterialAlertDialogBuilder(getContext())
30 | .setNegativeButton(android.R.string.cancel, null)
31 | .setTitle(getDialogTitle()).setSingleChoiceItems(
32 | getEntries(),
33 | selected,
34 | (dialog, which) -> {
35 | super.setValueIndex(which);
36 | getOnPreferenceChangeListener().onPreferenceChange(this, super.getValue());
37 | dialog.dismiss();
38 | }
39 | ).show();
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/app/src/main/java/slowscript/warpinator/preferences/ProfilePicturePreference.java:
--------------------------------------------------------------------------------
1 | package slowscript.warpinator.preferences;
2 |
3 | import android.app.Activity;
4 | import android.content.Context;
5 | import android.content.Intent;
6 | import android.graphics.Bitmap;
7 | import android.graphics.BitmapFactory;
8 | import android.net.Uri;
9 | import android.util.AttributeSet;
10 | import android.util.Log;
11 | import android.view.View;
12 | import android.widget.GridLayout;
13 | import android.widget.ImageButton;
14 | import android.widget.ImageView;
15 | import android.widget.Toast;
16 |
17 | import androidx.activity.result.ActivityResultLauncher;
18 | import androidx.activity.result.contract.ActivityResultContracts;
19 | import androidx.preference.Preference;
20 |
21 | import com.google.android.material.dialog.MaterialAlertDialogBuilder;
22 |
23 | import slowscript.warpinator.R;
24 | import slowscript.warpinator.Server;
25 | import slowscript.warpinator.SettingsActivity;
26 |
27 | public class ProfilePicturePreference extends Preference {
28 |
29 | ActivityResultLauncher customImageActivityResultLauncher;
30 | private final Context mContext;
31 |
32 | public ProfilePicturePreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
33 | super(context, attrs, defStyleAttr, defStyleRes);
34 | mContext = context;
35 | registerForResult();
36 | }
37 |
38 | public ProfilePicturePreference(Context context, AttributeSet attrs, int defStyleAttr) {
39 | super(context, attrs, defStyleAttr);
40 | mContext = context;
41 | registerForResult();
42 | }
43 |
44 | public ProfilePicturePreference(Context context, AttributeSet attrs) {
45 | super(context, attrs);
46 | mContext = context;
47 | registerForResult();
48 | }
49 |
50 | public ProfilePicturePreference(Context context) {
51 | super(context);
52 | mContext = context;
53 | registerForResult();
54 | }
55 |
56 | @Override
57 | protected void onClick() {
58 | View view = View.inflate(mContext, R.layout.profile_chooser_view, null);
59 |
60 | GridLayout layout = view.findViewById(R.id.layout1);
61 | ImageView imgCurrent = view.findViewById(R.id.imgCurrent);
62 |
63 | String picture = getSharedPreferences().getString("profile", "0");
64 | imgCurrent.setImageBitmap(Server.getProfilePicture(picture, mContext));
65 |
66 | for (int i = 0; i < 12; i++) {
67 | final int idx = i;
68 | ImageButton btn = new ImageButton(mContext);
69 | btn.setImageBitmap(Server.getProfilePicture(String.valueOf(idx), mContext));
70 | btn.setOnClickListener((v) -> {
71 | getSharedPreferences().edit().putString("profile", String.valueOf(idx)).apply();
72 | imgCurrent.setImageBitmap(Server.getProfilePicture(String.valueOf(idx), mContext));
73 | });
74 | layout.addView(btn);
75 | }
76 |
77 | MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(mContext)
78 | .setTitle(R.string.picture_settings_title)
79 | .setNegativeButton(android.R.string.cancel, null)
80 | .setPositiveButton(android.R.string.ok, null)
81 | .setNeutralButton(R.string.custom, (dialog, which) -> {
82 | Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT);
83 | i.addCategory(Intent.CATEGORY_OPENABLE);
84 | i.setType("image/*");
85 | i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
86 | i.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false);
87 |
88 | customImageActivityResultLauncher.launch(i);
89 | dialog.dismiss();
90 | }).setView(view);
91 | materialAlertDialogBuilder.show();
92 | }
93 |
94 | private void registerForResult() {
95 | customImageActivityResultLauncher = getActivity().registerForActivityResult(
96 | new ActivityResultContracts.StartActivityForResult(),
97 | result -> {
98 | if (result.getResultCode() == Activity.RESULT_OK) {
99 | Intent data = result.getData();
100 | if (data != null) {
101 | Uri u = data.getData();
102 | if (u != null) {
103 | try (var is = mContext.getContentResolver().openInputStream(u)) {
104 | var bmp = BitmapFactory.decodeStream(is);
105 | // Save "profilePic" to private app storage in reduced resolution
106 | int outW, outH;
107 | int maxDim = Math.min(512, Math.max(bmp.getWidth(), bmp.getHeight()));
108 | if(bmp.getWidth() > bmp.getHeight()){
109 | outW = maxDim;
110 | outH = (bmp.getHeight() * maxDim) / bmp.getWidth();
111 | } else {
112 | outH = maxDim;
113 | outW = (bmp.getWidth() * maxDim) / bmp.getHeight();
114 | }
115 | Bitmap resized = Bitmap.createScaledBitmap(bmp, outW, outH, true);
116 | try (var os = mContext.openFileOutput("profilePic.png", Context.MODE_PRIVATE)) {
117 | //quality is irrelevant for PNG
118 | resized.compress(Bitmap.CompressFormat.PNG, 100, os);
119 | }
120 | getSharedPreferences().edit().putString("profile", "profilePic.png").apply();
121 | } catch (Exception e) {
122 | Log.e("ProfilePic", "Failed to save profile picture: " + u, e);
123 | Toast.makeText(mContext, "Failed to save profile picture: " + e, Toast.LENGTH_LONG).show();
124 | }
125 | }
126 | }
127 | }
128 | });
129 | }
130 |
131 | private SettingsActivity getActivity() {
132 | return (SettingsActivity) mContext;
133 | }
134 | }
135 |
--------------------------------------------------------------------------------
/app/src/main/java/slowscript/warpinator/preferences/ResetablePreference.java:
--------------------------------------------------------------------------------
1 | package slowscript.warpinator.preferences;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.view.View;
6 | import android.widget.Button;
7 |
8 | import androidx.annotation.NonNull;
9 | import androidx.annotation.Nullable;
10 | import androidx.preference.PreferenceViewHolder;
11 |
12 | import slowscript.warpinator.R;
13 |
14 | public class ResetablePreference extends androidx.preference.Preference {
15 | private Button resetBtn;
16 | private boolean resetEnabled = true;
17 | private View.OnClickListener onResetListener;
18 |
19 | public ResetablePreference(@NonNull Context context, @Nullable AttributeSet attrs) {
20 | super(context, attrs);
21 | setLayoutResource(R.layout.resetable_preference);
22 | }
23 |
24 | public void setOnResetListener(View.OnClickListener listener) {
25 | onResetListener = listener;
26 | if (resetBtn != null)
27 | resetBtn.setOnClickListener(listener);
28 | }
29 |
30 | public void setResetEnabled(boolean enabled) {
31 | resetEnabled = enabled;
32 | if (resetBtn != null)
33 | resetBtn.setEnabled(enabled);
34 | }
35 |
36 | @Override
37 | public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
38 | super.onBindViewHolder(holder);
39 | resetBtn = (Button)holder.itemView.findViewById(R.id.resetButton);
40 | resetBtn.setOnClickListener(onResetListener);
41 | resetBtn.setEnabled(resetEnabled);
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/app/src/main/proto/warp.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto3";
2 |
3 | option java_package = "slowscript.warpinator";
4 | option java_outer_classname = "WarpProto";
5 |
6 | // ************ Important! ***************
7 | //
8 | // If you change anything here, you *must* run 'generate-protobuf' to update the
9 | // generated stub files.
10 | //
11 | // Never change the existing members and member values of messages, only add new ones.
12 |
13 | service Warp {
14 | // Sender methods
15 | // api v1 duplex method (ping style)
16 | rpc CheckDuplexConnection(LookupName) returns (HaveDuplex) {}
17 | // api v2 duplex method (block/future)
18 | rpc WaitingForDuplex(LookupName) returns (HaveDuplex) {}
19 |
20 | rpc GetRemoteMachineInfo(LookupName) returns (RemoteMachineInfo) {}
21 | rpc GetRemoteMachineAvatar(LookupName) returns (stream RemoteMachineAvatar) {}
22 | rpc ProcessTransferOpRequest(TransferOpRequest) returns (VoidType) {}
23 | rpc PauseTransferOp(OpInfo) returns (VoidType) {}
24 |
25 | // Receiver methods
26 | rpc StartTransfer(OpInfo) returns (stream FileChunk) {}
27 |
28 | // Both
29 | rpc CancelTransferOpRequest(OpInfo) returns (VoidType) {}
30 | rpc StopTransfer(StopInfo) returns (VoidType) {}
31 |
32 | rpc Ping(LookupName) returns (VoidType) {}
33 | }
34 |
35 | message RemoteMachineInfo {
36 | string display_name = 1;
37 | string user_name = 2;
38 | }
39 |
40 | message RemoteMachineAvatar {
41 | bytes avatar_chunk = 1;
42 | }
43 |
44 | message LookupName {
45 | string id = 1;
46 | string readable_name = 2;
47 | }
48 |
49 | message HaveDuplex {
50 | bool response = 2;
51 | }
52 |
53 | message VoidType {
54 | int32 dummy = 1;
55 | }
56 |
57 | message OpInfo {
58 | string ident = 1;
59 | uint64 timestamp = 2;
60 | string readable_name = 3;
61 | bool use_compression = 4;
62 | }
63 |
64 | message StopInfo {
65 | OpInfo info = 1;
66 | bool error = 2;
67 | }
68 |
69 | message TransferOpRequest {
70 | OpInfo info = 1;
71 | string sender_name = 2;
72 | string receiver_name = 3;
73 | string receiver = 4; // don't need for now
74 | uint64 size = 5;
75 | uint64 count = 6;
76 | string name_if_single = 7;
77 | string mime_if_single = 8;
78 | repeated string top_dir_basenames = 9;
79 | }
80 |
81 | message FileChunk {
82 | string relative_path = 1;
83 | int32 file_type = 2;
84 | string symlink_target = 3;
85 | bytes chunk = 4;
86 | uint32 file_mode = 5;
87 | FileTime time = 6;
88 | }
89 |
90 | message FileTime {
91 | uint64 mtime = 1;
92 | uint32 mtime_usec = 2;
93 | }
94 |
95 | service WarpRegistration {
96 | rpc RequestCertificate(RegRequest) returns (RegResponse) {}
97 | rpc RegisterService(ServiceRegistration) returns (ServiceRegistration) {}
98 | }
99 |
100 | message RegRequest {
101 | string ip = 1;
102 | string hostname = 2;
103 | }
104 |
105 | message RegResponse {
106 | string locked_cert = 1;
107 | }
108 |
109 | message ServiceRegistration {
110 | string service_id = 1;
111 | string ip = 2;
112 | uint32 port = 3;
113 | string hostname = 4;
114 | uint32 api_version = 5;
115 | uint32 auth_port = 6;
116 | }
117 |
118 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/anim_null.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/anim_push_down.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/anim_push_up.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/app/src/main/res/drawable-hdpi/ic_notification.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/app/src/main/res/drawable-mdpi/ic_notification.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-night/transfers_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v31/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
6 |
10 |
17 |
24 |
31 |
38 |
45 |
52 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/app/src/main/res/drawable-xhdpi/ic_notification.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/app/src/main/res/drawable-xxhdpi/ic_notification.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/app/src/main/res/drawable-xxxhdpi/ic_notification.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_accept.xml:
--------------------------------------------------------------------------------
1 |
6 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_decline.xml:
--------------------------------------------------------------------------------
1 |
6 |
13 |
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_download.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_error.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_file.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_folder.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
6 |
10 |
17 |
24 |
31 |
38 |
45 |
52 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_meh.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
12 |
15 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_reconnect.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_remove_items.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_star_empty.xml:
--------------------------------------------------------------------------------
1 |
6 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_star_full.xml:
--------------------------------------------------------------------------------
1 |
6 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_star_toggle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_status_awaiting_duplex.xml:
--------------------------------------------------------------------------------
1 |
6 |
13 |
20 |
24 |
28 |
32 |
33 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_status_connected.xml:
--------------------------------------------------------------------------------
1 |
6 |
13 |
20 |
27 |
34 |
35 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_status_connecting.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
12 |
15 |
16 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_stop.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_unavailable.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_upload.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_user.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_warpinator.xml:
--------------------------------------------------------------------------------
1 |
6 |
13 |
20 |
27 |
34 |
41 |
48 |
55 |
56 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/rounded_corners.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/transfers_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_about.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
13 |
14 |
26 |
27 |
39 |
40 |
50 |
51 |
63 |
64 |
78 |
79 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
23 |
24 |
38 |
39 |
48 |
49 |
59 |
60 |
69 |
70 |
77 |
78 |
88 |
89 |
90 |
91 |
100 |
101 |
110 |
111 |
120 |
121 |
122 |
130 |
131 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_share.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
26 |
27 |
36 |
37 |
47 |
48 |
57 |
58 |
59 |
68 |
69 |
78 |
79 |
88 |
89 |
90 |
107 |
108 |
109 |
110 |
111 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_transfers.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
15 |
27 |
28 |
38 |
39 |
50 |
51 |
65 |
66 |
75 |
76 |
90 |
91 |
107 |
108 |
109 |
110 |
125 |
126 |
127 |
128 |
139 |
140 |
151 |
152 |
163 |
164 |
177 |
178 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_manual_connect.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
13 |
14 |
21 |
22 |
29 |
30 |
38 |
39 |
46 |
47 |
53 |
54 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/profile_chooser_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
27 |
28 |
39 |
40 |
49 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/remote_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
12 |
13 |
16 |
17 |
27 |
28 |
38 |
39 |
53 |
54 |
70 |
71 |
81 |
82 |
90 |
91 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/resetable_preference.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
20 |
21 |
29 |
30 |
41 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/settings_activity.xml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/simple_list_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/transfer_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
13 |
14 |
17 |
18 |
31 |
32 |
44 |
45 |
58 |
59 |
71 |
72 |
73 |
87 |
88 |
103 |
104 |
117 |
118 |
131 |
132 |
133 |
134 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/values-fa/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | ارسال پرونده ها
4 | خروج
5 | مشکلات ارتباط
6 | ذخیره گزارش
7 | تنظیمات
8 | اشتراک گذاری با
9 | دستگاههای موجود
10 | جستجو دوباره برای دستگاهها
11 | دستگاه دیگری یافت نشد
12 | خطا در ارتباط
13 | دستگاه خارج از گروه شماست: %1$d
14 | تلاش برای بازکردن فایل دریافتی ناموفق بود
15 | چند ثانیه
16 | ، خدمات در دسترس نیست
17 | خطا حین انتقال:
18 | بستن این فعالیت حین اشتراک گذاری ممکن است باعث عدم موفقیت انتقال شود
19 | پرونده های ارسال شده:
20 | شبکه تغییر کرد - راهاندازی دوباره سامانه…
21 | دستگاه هایی که با آنها به اشتراک می گذارید
22 | دستگاهی برای به اشتراک گذاری پرونده ها در دسترس نیست
23 | ما یک اقدام پشتیبانی نشده دریافت کردیم
24 | هویت
25 | تنظیمات انتقال
26 | جلوه
27 | تصویر نمایه
28 | پوشه بارگیری ها
29 | برای پرونده های ورودی آگاهساز بفرست
30 | اجازه بازنویسی
31 | انتقالات به طور خودکار پذیرفته میشود
32 | تمام انتقالات نیاز به موافقت شما دارند
33 | بستن برنامه هنگامی که از آن خارج میشوید
34 | نوشتن گزارش عیبیابی در یک پرونده متنی
35 | شناسه گروه
36 | پورت ثبتنام
37 | پوسته
38 | این ممکن است تحت تأثیر تنظیمات اعلان اندروید باشد
39 | پورت باید بین ۱۰۲۴ تا ۶۵۵۳۵ باشد
40 | عرضه کننده دستگاه شما مکالمه مورد نیاز را اجرا نکرد. این عمل در نسخه آینده کار خواهد کرد.
41 | پس از آغاز ، سامانه تا زمانی که به صورت دستی متوقف شود ادامه خواهد یافت
42 | سفارشی
43 | شما یک ارائه دهنده محتوای پشتیبانی نشده را انتخاب کرده اید. لطفاً پوشه ای در حافظه داخلی تان را انتخاب کنید.
44 | استفاده از پیشفرض سیستم
45 | روشن
46 | تیره
47 | Warpinator در حال اجراست
48 | توقف سامانه
49 | تمام انتقالات به اتمام رسیدند
50 | %1$.1f%%, %2$d انتقالات, %3$s/s
51 | آگاهسازی مداوم سامانه
52 | انتقالات دریافتی
53 | پیشرفت انتقال
54 | وضعیت ارتباط
55 | تصویر نمایه
56 | نماد ناامید چهره
57 | تصویر انتخاب شده
58 | رد کردن انتقال
59 | موافقت با انتقال
60 | انتقال مجدد
61 | بازگشت به مقدار پیشفرض
62 | شما باید در تنظیمات یک پوشه بارگیری را انتخاب کنید
63 | شبکه در دسترس نیست - از نقظه اتصال استفاده شود؟
64 | سامانه در حال اجرا نیست
65 | دریافت گواهی از %1$s انجام نشد. حتماً اجازه ترافیک UDP (و همچنین TCP) را در پورت %2$d در فایروال از راه دور اجازه دهید.
66 | پاکسازی انتقالات پایان یافته
67 | آغاز ارتباط
68 | انتقال
69 | ارتباط دستی
70 | دوباره
71 | درباره
72 | ارتباط ناموفق: نام گروه اشتباه است
73 | شما به WiFi یا LAN متصل نیستید. اگر در دسترس نیست از نقطه اتصال خود استفاده کنید. پس از اتصال، برنامه را مجدداً راه اندازی کنید.
74 | در انتظار دسترسی…
75 | (پرونده ها ممکن است بازنویسی شده باشند!)
76 | باقیمانده
77 | پوشه ای را برای ارسال انتخاب کنید
78 | نسخه: %1$s
79 | به طور خودکار نقل و انتقالات را بپذیرید
80 | این یک نسخه غیر رسمی از Warpinator است.
81 | \nارسال و دریافت پرونده در شبکه محلی.
82 | این برنامه نرم متن باز با مجوز <a href=\"https://www.gnu.org/licenses/gpl-3.0.html\">GNU General Public License</a>.<br> شما میتوانید سورس کد این برنامه را از <a href=\"https://github.com/slowscript/warpinator-android/\">GitHub</a>.<br> <br> بیابید. این نرمافزار بدون هیچگونه ضمانتی عرضه میگردد.<br>برای جزئیات بیشتر به شرایط مجوز مراجعه کنید .
83 | چیزی برای به اشتراک گذاشتن نیست
84 | شبکه
85 | نام نمایشی
86 | تلاش برای فسرده سازی
87 | اجرا در پسزمینه
88 | آغاز خودکار
89 | پورت انتقالات
90 | تغییر این گزینه نیازمند راهاندازی مجدد میباشد
91 | پرونده های ورودی با نامی که از قبل وجود دارد موارد موجود را رونویسی می کند
92 | پرونده های ورودی با نامی که از قبل وجود دارد تغییر نام خواهند یافت
93 | مکان های غیر پیش فرض از حفظ آخرین زمان بندی های اصلاح شده پشتیبانی نمی کنند. با دکمه تنظیم مجدد می توانید به پیش فرض برگردید.
94 | این احتمالاً اولین بار است که شما این برنامه را راه اندازی می کنید. لطفاً پوشه ای که می خواهید Warpinator برای ذخیره پرونده ها از آن استفاده کند را انتخاب کنید.
95 | انتقالات دریافتی از %s
96 | %d پرونده
97 | سامانه در حال اجرا
98 | ارتباط دوباره
99 | نماد برنامه
100 | توقف انتقال
101 | رمزینه بالا را با دوربین کاوش کنید و پیوند را باز کنید یا از آدرس زیر برای شروع اتصال از دستگاه دیگر استفاده کنید:
102 | سامانه هنگام پاکسازی از برنامه های اخیر یا پس از مدتی عدم فعالیت به طور خودکار متوقف می شود
103 |
--------------------------------------------------------------------------------
/app/src/main/res/values-kab/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Tuffɣa
4 | d-yegran
5 | Tamagit
6 | Ales tuqqna
7 | Sekles aɣmis
8 | Iɣewwaṛen
9 | Azen ifuyla
10 | Tuqqna s ufus
11 | Bḍu d
12 | Ibenkan i yellan
13 | Anadi ɣef ibenkan imaynuten
14 | kra n tasinin kan
15 | Tuccḍa n tuqqna
16 | Fren akaram akken ad tazneḍ
17 | Ibenkan akked wara tebḍuḍ d yifuyla-k·m
18 | Aẓeṭṭa
19 | Lqem: %1$s
20 | Ulac d acu ara tebḍuḍ
21 | Tugna n umaɣnu
22 | Akaram n isidar
23 | Asentel
24 | Sekker s wudem awurman
25 | Tangalt n wegraw
26 | Udmawan
27 | Asentel aceɛlal
28 | Asentel ubrik
29 | %d n yifuyla
30 | Seqdec imezwura n unagraw
31 | Tugna n umaɣnu
32 | Tignit n wesnas
33 | Ɛreḍ tuqqna s ufus seg wumuɣ
34 | %d i yettwaqqnen
35 | Qqen ɣer \'%s\'?
36 | Ɣef
37 | Udem
38 | Sekcem tansa akked tawwurt
39 | Ulac ibenkan d wara tebḍuḍ
40 |
--------------------------------------------------------------------------------
/app/src/main/res/values-lv/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Nav savienojuma ar Wi-Fi vai LAN. Izmantojiet savu tīklāju, ja neviens no iepriekš minētajiem nav pieejams. Pēc savienojuma izveides restartējiet lietojumprogrammu.
4 | Tīkls
5 | Pārsūtījumi
6 | Sūtīt failus
7 | Iziet
8 | Atkārtot ierīces meklēšanu
9 | Dalīties ar
10 | Pieejamās ierīces
11 | Nav atrasta neviena ierīce
12 | Savienojums neizdevās: Nepareizs grupas kods
13 | Savienojuma kļūda
14 | Gaida apstiprinājumu…
15 | (Faili var tikt pārrakstīti!)
16 | atlikuši
17 | Neizdevās atvērt saņemto failu
18 | vēl dažas sekundes
19 | , pakalpojums nav pieejams
20 | Pārsūtīšanas kļūdas:
21 | Šīs darbības aizvēršana koplietošanas laikā var izraisīt pārsūtīšanas neveiksmi
22 | Failu skaits: %d
23 | Identitāte
24 | Saņemta neatbalstīta darbība
25 | Nosūtīto failu saraksts:
26 | Atlasiet mapi, kuru vēlaties nosūtīt
27 | Versija: %1$s
28 | Šīs ir neoficiālais Warpinator ports.
29 | \nSūtiet un saņemiet failus lokālajā tīklā.
30 | Koplietošanas ierīces
31 | Nav pieejama neviena koplietošanas ierīce
32 | Nav ar ko dalīties
33 | Pārsūtīšanas iestatījumi
34 | Izskats
35 | Parādāmais vārds
36 | Profila attēls
37 | Lejupielādes mape
38 | Rādīt ienākošo failu paziņojumu
39 | Atļaut pārrakstīt
40 | Automātiski pieņemt pārsūtījumus
41 | Katrs pārsūtījums ir jāapstiprina
42 | Palaist fona režīmā
43 | Palaist automātiski
44 | Apturēt pakalpojumu, kad iziet no lietotnes
45 | Pēc palaišanas pakalpojums turpinās darboties, līdz tas tiks manuāli apturēts
46 | Rakstīt žurnālu failā
47 | Grupas kods
48 | Ports
49 | Tēma
50 | Iestatījumu var ietekmēt Android paziņojumu iestatījumi
51 | Lai mainītu šo iestatījumu, lietojumprogramma ir jārestartē
52 | Ienākošie faili ar tādu pašu nosaukumu, kas jau pastāv, pārrakstīs esošos
53 | Ienākošie faili ar tādu pašu nosaukumu, kas jau pastāv, tiks pārdēvēti
54 | Atrašanās vietas, kas nav noklusējuma, neatbalsta pēdējo izmaiņu laikspiedolu saglabāšanu. Varat atgriezties pie noklusējuma iestatījumiem, izmantojot atiestatīšanas pogu.
55 | Visi pārsūtījumi pabeigti
56 | %1$.1f%%, %2$d pārsūtījumi, %3$s/sek
57 | Pakalpojums darbojas
58 | Paziņojums par pakalpojuma statusu
59 | Ienākošais pārsūtījums
60 | Pārsūtīšanas progress
61 | Savienojuma statuss
62 | Profila attēls
63 | Programmas ikona
64 | Neapmierinātas sejas ikona
65 | Noraidīt pārsūtījumu
66 | Pieņemt pārsūtījumu
67 | Apturēt pārsūtījumu
68 | Atkārtoti pārsūtīt
69 | Visticamāk, jūs pirmo reizi palaižat šo lietojumprogrammu. Lūdzu, atlasiet mapi, kurā programma Warpinator saglabās failus.
70 | Jums ir janorāda lejupielādes mape iestatījumos
71 | Atiestatīt uz noklusējuma vērtību
72 | Notīrīt pabeigtos pārsūtījumus
73 | Tīkls nav pieejams - mēģināt tīklāju\?
74 | Pakalpojums nedarbojas
75 | Neizdevās iegūt sertifikātu no %1$s. Pārliecinieties, ka ir atļauts UDP (kā arī TCP) trafiks %2$d attālā ugunsmūra portā.
76 | Iestatījumi
77 | Šī programma ir atvērtā koda programmatūra, kas licencēta saskaņā ar <a href=\"https://www.gnu.org/licenses/gpl-3.0.html\">GNU vispārējo publisko licenci</a>.<br>Avota kodu varat lejupielādēt no <a href=\"https://github.com/slowscript/warpinator-android\">GitHub</a> vietnes.<br> <br> Programmai netiek sniegta nekāda veida garantija.<br>Sīkāku informāciju skatiet licences noteikumos.
78 | Savienojuma problēmas
79 | Par
80 | Ierīces atkārtota reģistrēšana
81 | Pārsūtījumi tiek pieņemti automātiski
82 | Pakalpojums tiks automātiski apturēts, kad lietojumprogramma tiks notīrīta no pēdējām, kā arī pēc noteikta neaktivitātes perioda
83 | Gaiša tēma
84 | Porta numuram ir jābūt no 1024 līdz 65535
85 | Jūsu tālruņa ražotājs neieviesa nepieciešamo dialoglogu. Tas tiks atrisināts nākamajā laidiena versijā.
86 | Pielāgots
87 | Jūs esat izvēlējušies neatbalstītu satura nodrošinātāju. Lūdzu, atlasiet mapi savā iekšējā (lokālajā) krātuvē.
88 | Warpinator pakalpojums darbojas
89 | Izmantot sistēmas noklusējuma iestatījumus
90 | Tumša tēma
91 | Apturēt pakalpojumu
92 | Tīkls mainīts - pakalpojuma restartēšana…
93 | Ienākošais pārsūtījums no %s
94 | Izvēlētais attēls
95 | Atkārtoti izveidot savienojumu
96 |
--------------------------------------------------------------------------------
/app/src/main/res/values-nb-rNO/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Om
4 | Lys drakt
5 | Overføringer
6 | Send filer
7 | Avslutt
8 | Tilkobling mislyktes: Feil gruppekode
9 | Tilkoblingsfeil
10 | Venter på tilgang …
11 | (Filer kan bli overskrevet!)
12 | et par sekunder
13 | Feil under overføring:
14 | Port
15 | Drakt
16 | Portnummer må være mellom 1024 og 65535
17 | Egendefinert
18 | Bruk systemforvalg
19 | Alle overføringer er fullført
20 | %1$.1f%%, %2$d overføringer, %3$s/s
21 | %d filer
22 | Tjenesten kjører
23 | Vedvarende tjenestemerknad
24 | Innkommende overføring
25 | Tilkoblingsstatus
26 | Profilbilde
27 | Programikon
28 | Valgt bilde
29 | Avslå overføringen
30 | Godta overføringen
31 | Stopp overføringen
32 | Prøv å overføre igjen
33 | Tjenesten kjører ikke
34 | Tilkoblingsproblemer
35 | Se etter enheter igjen
36 | Reannonser
37 | Innstillinger
38 | Del med
39 | Tilgjengelige enheter
40 | Fant ingen andre enheter
41 | Start automatisk
42 | Versjon: %1$s
43 | Tillat overskriving
44 | Kjør i bakgrunnen
45 | Mørk drakt
46 | Stopp tjenesten
47 | Warpinator-tjenesten kjører
48 | Innkommende overføring fra %s
49 | Overføringsfremdrift
50 | Koble til igjen
51 |
--------------------------------------------------------------------------------
/app/src/main/res/values-nl/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Stuur bestanden
4 | Beëindigen
5 | Heraankondiging
6 | Over (...?)
7 | Instellingen
8 | Beschikbare apparaten
9 | Geen andere apparaten gevonden
10 | Verbinding mislukt: Foute groepscode
11 | Verbindingsfout
12 | Apparaten buiten jouw groep: %1$d
13 | Wachtend op toestemming…
14 | Niets om te delen
15 | We ontvingen een niet ondersteunde actie
16 | Toon notificatie van binnenkomende bestanden
17 | Licht kleurthema
18 | Stop de service
19 | Alle verzendingen zijn afgerond
20 | Dit is een onofficiële \'port\' van Warpinator. \nVerstuur en ontvang bestanden via het lokale netwerk.
21 | Verzending
22 | Verbindingsproblemen
23 | Bewaar logging
24 | Handmatige verbinding
25 | Scan opnieuw voor apparaten
26 | Deel met
27 | Je bent niet verbonden met wifi of een lokaal netwerk. Gebruik je hotspot als beide niet beschikbaar zijn. Herstart de applicatie als je verbinding hebt.
28 | Fouten tijdens verzending:
29 | Netwerk is veranderd - service wordt herstart…
30 | (Bestanden kunnen overschreven worden)
31 | Weergavenaam
32 | Downloadfolder
33 | Profielafbeelding
34 | Gebruik systeemdefault
35 | %1$.1f%%, %2$d verzendingen, %3$s/s
36 | Aanhoudende/Blijvende? servicenotificatie
37 | Adres is naar klipbord gekopieerd
38 | resterend(e)?
39 | Openen van ontvangen bestand is mislukt
40 | een paar seconden
41 | , service niet beschikbaar
42 | Het sluiten van deze activiteit tijdens het delen van een bestand, kan er toe leiden dat het verzenden fout gaat
43 | Bestanden die verzonden worden:
44 | Kies een map om te verzenden
45 | Versie: %1$s
46 | Apparaten om mee te delen
47 | Geen beschikbare apparaten om mee te delen
48 | Identiteit
49 | Verzendinstellingen
50 | Netwerk
51 | Aspect?
52 | Maatwerk?
53 | Donker kleurthema
54 | Warpinatorservice draait
55 | Binnenkomende verzending van %s
56 | %d bestanden
57 | Service draait?
58 | Binnenkomende verzending
59 | Voortgang verzending
60 | Opnieuw verbinden
61 | Verbindingsstatus
62 | Profielafbeelding
63 | Applicatie-icon
64 | Icon teleurgesteld gezicht
65 | Stop de verzending
66 | Gekozen afbeelding
67 | Wijs de verzending af
68 | Accepteer de verzending
69 | Probeer de verzending opnieuw
70 | Zet terug naar standaard waarde
71 | Service draait niet
72 | QR-code
73 | Vul adres en poort in
74 | Netwerk niet beschikbaar - wil je een hotspot proberen?
75 | Verbind met \'%s\'?
76 | %d verbonden
77 | Verwijder afgeronde verzendingen
78 | Bereid opzetten verbinding voor
79 | Je moet een downloaddirectory selecteren bij de instellingen
80 | Verzendingen worden automatisch geaccepteerd
81 | Als de service eenmaal gestart is, blijft die draaien totdat ze handmatig gestopt wordt
82 | Sta overschrijven toe
83 | Verzending automatisch accepteren
84 | Probeer compressie te gebruiken
85 | Elke verzending moet door jou geaccepteerd worden
86 | De service wordt automatisch gestopt wanneer deze wordt verwijderd uit ?recents? of na een periode van inactiviteit.
87 | Dit programma is open source software met licentie onder <a href=\"https://www.gnu.org/licenses/gpl-3.0.html\">GNU General Public License</a>.<br> De broncode is beschikbaar oo <a href=\"https://github.com/slowscript/warpinator-android/\">GitHub</a>.<br> <br> Dit programma geeft absoluut geen garanties.<br>Zie de licentievoorwaarden voor meer informatie.
88 |
89 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sl/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Pošlji datoteke
4 | Po meri
5 | Počisti končane prenose
6 | Prenosi
7 | Težave s povezavo
8 | Odpiranje prejete datoteke ni uspelo
9 | Ponovno iskanje naprav
10 | Ponovna prijava
11 | Izhod
12 | Niste povezani v omrežje WiFi ali LAN. Če nobena od teh možnosti ni na voljo, uporabite dostopno točko. Ko boste vzpostavili povezavo, znova zaženite aplikacijo.
13 | Omrežje spremenjeno – ponovni zagon storitve…
14 | preostalo
15 | Razpoložljive naprave
16 | (Datoteke se lahko prepišejo!)
17 | O Warpinatorju
18 | Druge naprave niso bile najdene
19 | Povezava ni uspela: Napačna koda skupine
20 | Napaka povezave
21 | Čakanje na dovoljenje…
22 | Nastavitve
23 | Napake med prenosom:
24 | , storitev ni na voljo
25 | Pošiljanje datotek:
26 | Različica: %1$s
27 | nekaj sekund
28 | Zapiranje te dejavnosti med deljenjem lahko povzroči, da prenos ne bo uspešen
29 | Izberite mapo za pošiljanje
30 | Warpinator za Android je neuradna različica istoimenskega orodja za skupno rabo datotek Linux Mint.
31 | \nPošiljajte in prejemajte datoteke preko lokalnega omrežja.
32 | Ta program je odprtokodna programska oprema, licencirana pod <a href=\"https://www.gnu.org/licenses/gpl-3.0.html\">GNU General Public License</a>.<br> Izvorno kodo si lahko ogledate na <a href=\"https://github.com/slowscript/warpinator-android/\">GitHub</a>.<br> <br> Uporaba programa je brez kakršnega koli jamstva .<br>Za več podrobnosti si oglejte licenčne pogoje.
33 | Ni razpoložljivih naprav za uporabo medsebojnega deljenja
34 | Prejeli smo nepodprto namero dejanja
35 | Naprave z možnostjo medsebojnega deljenja
36 | Nastavitve prenosa
37 | Ničesar ni za skupno deljenje
38 | Identiteta
39 | Omrežje
40 | Tema
41 | Prikazno ime
42 | Slika profila
43 | Ustavi storitev po izhodu iz aplikacije
44 | Imenik prenosov
45 | Storitev se bo samodejno ustavila, ko je naprava izbrisana iz seznama nedavnih ali po nekem obdobju neaktivnosti
46 | Prenosi bodo sprejeti samodejno
47 | Dovoli prepisovanje
48 | Pokaži obvestilo o dohodnih datotekah
49 | Vsak prenos je potrebno odobriti ročno
50 | Samodejno sprejemanje prenosov
51 | Samodejno zaženi aplikacijo
52 | Delovanje aplikacije v ozadju
53 | Ponovno poskusite s prenosom
54 | Ponastavi na privzeto vrednost
55 | To je verjetno prvi zagon aplikacije Warpinator. Prosim izberite imenik, v katerega želite, da Warpinator shranjuje datoteke.
56 | V nastavitvah morate izbrati imenik za prenos datotek
57 | Omrežje ni na voljo – poskusite dostopno točko\?
58 | Po zagonu storitve bo le ta delovala, dokler je ročno ne ustavimo
59 | V datoteko zapiši zaznamek odprave napak
60 | Koda skupine
61 | Vrata za prenose
62 | Zaustavitev prenosa
63 | Tema
64 | Izbrali ste nepodprtega ponudnika vsebine. Prosim izberite imenik v svojem notranjem pomnilniku.
65 | Ikona aplikacije
66 | Prodajalec vašega telefona ni implementiral zahtevanega pogovornega okna. Napako bomo poskušali rešiti v prihodnjih različicah.
67 | Številka vrat mora biti nastavljena med 1024 in 65535
68 | Na to lahko vplivajo nastavitve obvestil v sistemu Android
69 | Spreminjanje te nastavitve zahteva ponovni zagon aplikacije
70 | Dohodne datoteke z imenom, ki že obstaja v imeniku prenosov, bodo prepisale obstoječe
71 | Dohodne datoteke z imenom, ki že obstaja v imeniku prenosov, bodo preimenovane
72 | Deli skupno rabo z
73 | Uporabi privzete sistemske nastavitve
74 | Svetla tema
75 | Neprivzete lokacije ne podpirajo ohranjanja časovnih žigov zadnjih sprememb. Na privzete nastavitve se lahko vrnete z pritiskom na gumb \"Ponastavi\".
76 | %1$.1f%%, %2$d prenosi, %3$s/s
77 | Storitev Warpinator deluje v ozadju
78 | Vsi prenosi so končani
79 | Temna tema
80 | Ustavi storitev v ozadju
81 | Dohodni prenos iz naprave %s
82 | %d datoteke
83 | Storitev se izvaja
84 | Status povezave
85 | Slika profila
86 | Trajno obvestilo o storitvi
87 | Dohodni prenos
88 | Ponovno vzpostavi povezavo
89 | Napredek prenosa
90 | Ikona razočaranega obraza
91 | Izbrana slika
92 | Zavrni prenos
93 | Sprejmi zahtevo prenosa
94 | Storitev v ozadju se ne izvaja
95 | Prejem potrdila od %1$s ni uspela. Prepričajte se, da je v oddaljenem požarnem zidu promet UDP (kot tudi TCP) na varatih %2$d dovoljen.
96 | Poskusite uporabiti stiskanje
97 | Vrata za registracijo
98 | Naprave izven vaše skupine: %1$d
99 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v31/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | @android:color/system_accent1_200
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values-zh-rCN/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 传输
6 | 发送文件
7 | 退出
8 | 连接问题
9 | 重新宣告
10 | 重新扫描设备
11 | 关于
12 | 设置
13 | 分享给
14 | 可用设备
15 | 没有发现其他设备
16 | 连接失败: 错误的分组代码
17 | 连接错误
18 | 您没有连接到 WiFi 或 LAN。如果两者都不可用,请使用您的热点。
19 | 连接后重新启动应用。
20 | 网络已更改 - 正在重新启动服务…
21 |
22 | 正在等待批准……
23 | (文件可能会被覆盖!)
24 | 剩余时间
25 | 无法打开收到的文件
26 | 马上就好
27 | ,服务不可用
28 | 传输过程中的错误:
29 | 分享时关闭此 Activity 可能会导致转移失败
30 | 发送的文件:
31 |
32 | 版本: %1$s
33 | 这是 Warpinator 的非官方移植版本。\n通过本地网络发送和接收文件。
34 | 此程序是在 <a href=\"https://www.gnu.org/licenses/gpl-3.0.html\">GNU General Public License</a> 许可下的开源软件。<br> 您可以从 <a href=\"https://github.com/slowscript/warpinator-android/\">GitHub</a> 获取源代码。<br> <br> 此程序绝对不提供任何担保。<br>有关更多详细信息,请参阅许可条款。
35 |
36 | 与之分享的设备
37 | 没有可以与之分享的设备
38 | 我们收到了不受支持的 Intent 操作
39 | 没有什么可分享的
40 |
41 | 身份识别
42 | 传输设置
43 | 网络
44 | 外观
45 | 显示名称
46 | 设备头像
47 | 下载目录
48 | 有文件传入时显示通知
49 | 允许覆盖
50 | 自动接受传输
51 | 会自动接受传输
52 | 每次传输都需要您确认
53 | 后台运行
54 | 自动启动
55 | 将调试日志写入文件
56 | 分组代码
57 | 传输端口
58 | 主题
59 | 这可能会受到 Android 的通知设置的影响
60 | 端口号必须介于 1024 和 65535 之间
61 | 更改此设置需要重新启动应用
62 | 您手机的系统没有实现所需的对话框。这将在未来的版本中解决。
63 | 传入文件重名时,传入文件会覆盖现有文件
64 | 传入文件重名时,传入文件会被重命名
65 | 自定义
66 | 你选择了不受支持的内容提供商。 请在内部存储上选择一个目录。
67 |
68 | 跟随系统
69 | 浅色模式
70 | 深色模式
71 |
72 | Warpinator 服务正在运行
73 | 停止服务
74 | 已完成所有的传输
75 | %1$.1f%%, %2$d 传输, %3$s/s
76 | 来自 %s 的传输
77 | %d 文件
78 | 服务正在运行
79 | 服务通知常驻
80 | 传入的传输
81 | 传输进度
82 |
83 | 重新连接
84 | 连接状态
85 | 设备头像
86 | 应用图标
87 | 失望样子的图标
88 | 选中的图片
89 | 拒绝传输
90 | 接受传输
91 | 停止传输
92 | 重试传输
93 |
94 | 这可能是您第一次启动此应用。
95 | 请选择您希望 Warpinator 保存文件的目录。
96 | 您必须在设置中选择下载目录
97 | 网络不可用 - 开热点试试?
98 | 服务未运行
99 | 未能从 %1$s 接收证书。请确保远程防火墙允许 %2$d 端口上的 UDP(以及 TCP)流量。
100 |
101 | - 已连接
102 | - 已断开连接
103 | - 正在连接
104 | - 连接失败
105 | - 等待双工
106 |
107 |
108 | - 正在初始化
109 | - 正在等待批准……
110 | - 已拒绝
111 | - 正在传输
112 | - 已暂停
113 | - 已停止
114 | - 已失败(点击查看)
115 | - 不可恢复的故障
116 | - 未找到文件
117 | - 已完成
118 | - 已完成但有错误(点击查看)
119 |
120 | 一启动就一直运行,停止需手动操作
121 | 退出应用后停止服务
122 | 从最近使用的应用被清除或一段时间不活动后,该服务将自动停止
123 | 选择要发送的文件夹
124 | 非默认位置不支持保留上次修改的时间戳。 你可以使用重置按钮恢复默认。
125 | 重置为默认值
126 | 清除已完成的传输
127 | 尝试使用压缩
128 | 注册用端口
129 | 你的群组之外的设备:%1$d
130 | 发起连接
131 | 用相机应用扫描上方二维码并打开链接或使用下列地址从其他设备发起连接:
132 | 手动连接
133 | 保存日志
134 | 输入地址和端口
135 | 尝试菜单中的手动连接
136 | 连接到“%s“?
137 | %d 已连接
138 | 地址已复制到剪贴板
139 | 二维码
140 |
141 |
--------------------------------------------------------------------------------
/app/src/main/res/values/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - sysDefault
5 | - lightTheme
6 | - darkTheme
7 |
8 |
9 | - @string/sysDefault
10 | - @string/lightTheme
11 | - @string/darkTheme
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 | 16dp
3 |
--------------------------------------------------------------------------------
/app/src/main/res/values/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #B3A4CF
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
9 |
10 |
11 |
15 |
16 |
17 |
18 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/provider_paths.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/root_preferences.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
10 |
11 |
14 |
15 |
16 |
17 |
19 |
20 |
24 |
25 |
30 |
31 |
37 |
38 |
44 |
45 |
49 |
50 |
51 |
52 |
53 |
58 |
65 |
70 |
71 |
72 |
73 |
75 |
76 |
80 |
81 |
85 |
89 |
90 |
91 |
92 |
93 |
99 |
100 |
101 |
102 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 |
5 | repositories {
6 | google()
7 | mavenCentral()
8 | }
9 | dependencies {
10 | classpath 'com.android.tools.build:gradle:8.8.0'
11 | classpath 'com.google.protobuf:protobuf-gradle-plugin:0.9.4'
12 |
13 | // NOTE: Do not place your application dependencies here; they belong
14 | // in the individual module build.gradle files
15 | }
16 | }
17 |
18 | allprojects {
19 | repositories {
20 | google()
21 | mavenCentral()
22 | }
23 | }
24 |
25 | task clean(type: Delete) {
26 | delete rootProject.buildDir
27 | }
28 |
--------------------------------------------------------------------------------
/connection-issues-ptbr.md:
--------------------------------------------------------------------------------
1 | ## O que fazer quando o Warpinator não consegue encontrar ou conectar-se ao outro dispositivo
2 |
3 | Este documento será atualizado quando for descoberto algum problema comum.
4 |
5 | - Certifique-se de que você tem a [versão mais recente do App](https://github.com/slowscript/warpinator-android/releases). A mínima versão requerida para a variante original do Linux é 1.0.9
6 |
7 | - Certifique-se de que ambos os dispositivos estejam na mesma rede (mesmo ponto de acesso WiFi e roteador)
8 |
9 | - Se você mudar qualquer coisa na sua rede (ou alterar qualquer coisa com a intenção de resolver algum problema), reinicie o Software em ambos dispositivos para garantir que as modificações entrem em vigor.
10 |
11 | - Tente usar o Hotspot no seu celular para descobrir se o problema é causado pelas configurações no seu roteador. (Não se esqueça de reiniciar o App e conectar outros dispositivos ao Hotspot)
12 |
13 | - Não use uma VPN (a menos que você saiba o que está fazendo).
14 |
15 | - Certifique-se de que o Firewall no seu computador/celular e roteador permitam o tráfego tanto para o protocolo de descoberta (mDNS, a Porta 5353 de UDP) quanto para o protocolo de transferência de arquivos (UDP e TCP, a Porta que está nas configurações - o padrão é 42000, você não deveria alterá-la a menos que causa problemas).
16 | Desabilite temporariamente o Firewall, se for necessário.
17 |
18 | - Seu roteador pode separar a rede entre WiFi e ethernet LAN ou mesmo entre todos os clientes.
19 | Certifique-se de que isto esteja desativado.
20 |
21 | - Você deveria ser capaz de executar um Ping entre os dois dispositivos.
22 | Caso contrário, é um problema com a sua rede.
23 |
24 | - Verifique o endereço de IP na versão Desktop do Warpinator (canto inferior direito da janela).
25 | Às vezes ele obtém o IP de uma interface de rede errada.
26 |
27 | - Executando `nc -zvu 192.168.xxx.xxx 5353` com o IP do seu celular enquanto o Warpinator estiver funcionando deveria resultar em `192.168.xxx.xxx 5353 port [udp/mdns] succeeded!`.
28 | Caso contrário, verifique no registro de depuração (instruções abaixo) se ele contém algo tipo `Failed to init JmDNS`.
29 | Se for assim, então por favor abra um [Issue](https://github.com/slowscript/warpinator-android/issues/new) e anexe o registro de depuração.
30 |
31 | - Se os dispositivos se descobrem mas não conseguem conectar, tente reconectar algumas vezes (usando o botão ao lado do ícone de status).
32 | A versão do Linux tenta reconectar-se automaticamente a cada 30 segundos.
33 | Se isto também falhar, abra um 'Issue' com o registro e a descrição sobre o que você tentou até agora.
34 |
35 | **Como obter o registro de depuração:**
36 |
37 | Vá às configurações, ative o "Exportar o registro de depuração" e reinicie o App.
38 | Em seguida você o encontrará em `Android/data/slowscript.warpinator/files`
39 |
--------------------------------------------------------------------------------
/connection-issues.md:
--------------------------------------------------------------------------------
1 | ## What to do when Warpinator cannot find / connect to other devices
2 |
3 | This document will be updated whenever we discover any common issues.
4 |
5 | - Make sure you have the [latest version](https://github.com/slowscript/warpinator-android/releases).
6 | Minimum required version for the original Linux variant is 1.0.9.
7 |
8 | - Make sure both devices are on the same network (same WiFi access point, same router)
9 |
10 | - When you change anything on your network (or anything that you do with the intention to solve the problem), restart the application on both sides to make sure it reinitializes itself.
11 |
12 | - Try using your mobile hotspot. This is an easy test whether the problem is caused by the configuration of your router. (Don't forget to restart the app and connect other devices to the hotspot)
13 |
14 | - Do not use a VPN (unless you know what you are doing).
15 |
16 | - Make sure the firewalls on your computer/phone and router all allow traffic for both the discovery protocol (mDNS, UDP port 5353) and file transfer protocol (UDP and TCP, port is in the settings - default is 42000, you should not change it unless it causes issues).
17 | Temporarily disable the firewall if necessary.
18 | **Recently introduced bug:** *Linux Warpinator adds exception only for TCP and not UDP. You must add an exception for UDP on port 42000 manually otherwise you'll get a connection error.*
19 |
20 | - Your router might isolate the networks between WiFi and ethernet LAN or even between all clients.
21 | Make sure this is turned off.
22 |
23 | - You should be able to ping both ways.
24 | If not, it is a problem with your network.
25 |
26 | - Check the IP address the desktop version of Warpinator thinks it has (lower right corner of the window).
27 | Sometimes it gets the IP from a wrong network interface.
28 |
29 | - Running `nc -zvu 192.168.xxx.xxx 5353` with the IP of your phone while Warpinator is running should print `192.168.xxx.xxx 5353 port [udp/mdns] succeeded!`.
30 | If it doesn't, please look into the debug log (instructions below) whether it contains something like `Failed to init JmDNS`.
31 | If it is there, then please submit an [issue](https://github.com/slowscript/warpinator-android/issues/new) with the log attached.
32 |
33 | - If the devices see each other but cannot connect, try reconnecting a few times (using the button next to the status icon).
34 | Linux version attempts to reconnect automatically every 30 seconds.
35 | If this fails too, please submit an issue with the log and description of what you have tried so far.
36 |
37 | **Getting the debug log:**
38 |
39 | Go to setting, turn on "Export debug log" and restart the application.
40 | You will then find it in `Android/data/slowscript.warpinator/files`
41 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ca-ES/full_description.txt:
--------------------------------------------------------------------------------
1 | Warpinator per a Android és una adaptació no oficial de l'aplicació homònima del LinuxMint per a trametre fitxers. És totalment compatible amb el protocol original i permet transferir fàcilment fitxers entre dispositius Android i GNU/Linux.
2 |
3 | Característiques:
4 | - Cerca automàtica de serveis compatibles dins la xarxa local.
5 | - Funciona amb connexió WiFi o punts d'accés (hotspot), no cal connexió a la Internet.
6 | - Tramesa de tota mena de fitxers, ràpidament i amb facilitat.
7 | - Tramet carpetes senceres.
8 | - Múltiples transferències en paral·lel.
9 | - Comparteix fitxers des d'altres aplicacions.
10 | - Codi de grup per a controlar qui es pot connectar.
11 | - Es pot iniciar amb el sistema.
12 | - No requereix cap permís innecessari, com ara la vostra ubicació.
13 |
14 | Aquesta aplicació és programari lliure amb llicència GNU General Public License v3.
15 | Podeu accedir al codi font a https://github.com/slowscript/warpinator-android
16 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ca-ES/short_description.txt:
--------------------------------------------------------------------------------
1 | Trameteu fitxers dins una xarxa local
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ca-ES/title.txt:
--------------------------------------------------------------------------------
1 | Warpinator per a Android (no oficial)
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/cs-CZ/full_description.txt:
--------------------------------------------------------------------------------
1 | Warpinator pro Android je neoficiální port stejnojmenného nástroje pro sdílení souborů od vývojářů Linux Mintu. Je plně kompatibilní s originálním protokolem a umožňuje snadný přenos souborů mezi zařízeními s Androidem a Linuxem.
2 |
3 | Vlastnosti:
4 | - Automatické nalezení kompatibilních zařízení v místní síti
5 | - Funguje na WiFi nebo hotspotu, není potřeba připojení k internetu
6 | - Přenese jakýkoliv typ souboru rychle a jednoduše
7 | - Umí přijímat celé složky
8 | - Zvládne více přenosů souběžně
9 | - Sdílení souborů z jiných aplikací
10 | - Umožňuje omezit která zařízení se mohou připojit pomocí kódu skupiny
11 | - Možnost spustit při startu systému
12 | - Nevyžaduje informace o pozici ani jiná zbytečná oprávnění
13 |
14 | Tato aplikace je svobodný software licencovaný pod GNU General Public License v3.
15 | Zdrojový kód můžete získat na https://github.com/slowscript/warpinator-android
16 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/cs-CZ/short_description.txt:
--------------------------------------------------------------------------------
1 | Sdílení souborů v místní síti
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/cs-CZ/title.txt:
--------------------------------------------------------------------------------
1 | Warpinator pro Android (neoficiální)
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/de-DE/full_description.txt:
--------------------------------------------------------------------------------
1 | Warpinator für Android ist eine inoffizielle Portierung des Werkzeugs von Linux Mint für den Datenaustausch. Es ist vollständig mit dem originalen Protokoll kompatibel und ermöglicht den Transfer von Dateien zwischen Geräten mit Android und Linux.
2 |
3 | Funktionen:
4 | - Automatisches Auffinden von kompatiblen Diensten im lokalen Netzwerk
5 | - Funktioniert im WiFi (WLAN) oder Hotspot, keine Internetverbindung erforderlich
6 | - Übertragen von Dateien jeglicher Art auf schellem und einfachem Wege
7 | - Empfangen von ganzen Verzeichnissen
8 | - Mehrer Transfers gleichzeitig ausführen
9 | - Dateien aus anderen Anwendung heraus teilen
10 | - Verbindung anhand eines Gruppenschlüssels einschränken, Sie bestimmen wer sich verbinden darf
11 | - Option zum Starten der Anwendung beim Einschalten
12 | - Erfordert keinen Zugriff auf Ihren Standort oder andere unnötige Berechtigungen
13 |
14 | Diese Anwendung ist freie Software, lizenziert unter der GNU General Public License v3.
15 | Sie erhalten den Quelltext unter: https://github.com/slowscript/warpinator-android
16 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/de-DE/short_description.txt:
--------------------------------------------------------------------------------
1 | Dateien im lokalen Netzwerk teilen
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/de-DE/title.txt:
--------------------------------------------------------------------------------
1 | Warpinator für Android (inoffiziell)
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/1050.txt:
--------------------------------------------------------------------------------
1 | - Send entire folders by long pressing send button
2 | - Option to reset download folder
3 | - Show names of files that are being shared
4 | - Implement favorite (star) feature - starred remotes show at the top
5 | - Button to clear finished transfers
6 | - Translation updates
7 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/1051.txt:
--------------------------------------------------------------------------------
1 | - Bugfixes (hopefully will no longer crash when opening some files)
2 | - Under the hood improvements
3 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/1052.txt:
--------------------------------------------------------------------------------
1 | - Fixed (again) a crash when sending some files
2 | - Translation updates
3 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/1053.txt:
--------------------------------------------------------------------------------
1 | - Fixed (again) a crash when sending files from some providers
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/1060.txt:
--------------------------------------------------------------------------------
1 | - Implemented V2 connection API
2 | - Implemented compression
3 | - Made sending folders more intuitive
4 | - Fixed handling of the group code
5 | - Improved handling of lost network
6 | - Fixed some bugs and crashes
7 | - Updated translations
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/1061.txt:
--------------------------------------------------------------------------------
1 | - Significantly improved transfer speed
2 | - Updated translations
3 | - Minor fixes
4 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/1070.txt:
--------------------------------------------------------------------------------
1 | - Option to connect manually when mDNS is blocked by network
2 | - Updated translations
3 | - Bug fixes
4 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/1071.txt:
--------------------------------------------------------------------------------
1 | - New Quick Settings tile to toggle Warpinator service
2 | - UI improvements
3 | - Fixed certificate error on some locales
4 | - Updated translations
5 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/1080.txt:
--------------------------------------------------------------------------------
1 | - Use a wake lock during transfer to prevent it being interrupted
2 | - Manual connection dialog is now scrollable on small screens
3 | - Added option to copy address for manual connection by tapping on it
4 | - Fixed file permissions expiring before transfer completes
5 | - Make a resized copy of profile picture in app storage in case original is deleted
6 | - Always start service in foreground
7 | - Target Android 14
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/1081.txt:
--------------------------------------------------------------------------------
1 | - Improved transfer speed calculation
2 | - Fixed crash when sharing
3 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/1082.txt:
--------------------------------------------------------------------------------
1 | - Attempts to improve device discovery and connection
2 | - Received files are now added to Media Store
3 | - Fixed crash on Android 5-6
4 | - Show recently used addresses in Manual Connection dialog
5 | - Bug fixes
6 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/full_description.txt:
--------------------------------------------------------------------------------
1 | Warpinator for Android is an unofficial port of Linux Mint's file sharing tool of the same name. It is fully compatible with the original protocol and allows for easy transfer of files between Android and Linux devices.
2 |
3 | Features:
4 | - Automatic discovery of compatible services on local network
5 | - Works on WiFi or hotspot, no internet connection needed
6 | - Transfer any type of files quickly and easily
7 | - Receive entire directories
8 | - Run multiple transfers in parallel
9 | - Share files from other applications
10 | - Limit who can connect using a group code
11 | - Option to start on boot
12 | - Does not require your location or any other unnecessary permissions
13 |
14 | This application is free software licensed under GNU General Public License v3.
15 | You can obtain the source code at https://github.com/slowscript/warpinator-android
16 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/fastlane/metadata/android/en-US/images/icon.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/fastlane/metadata/android/en-US/images/phoneScreenshots/1.jpg
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/short_description.txt:
--------------------------------------------------------------------------------
1 | Share files across local network
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/title.txt:
--------------------------------------------------------------------------------
1 | Warpinator for Android (unofficial)
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es-ES/full_description.txt:
--------------------------------------------------------------------------------
1 | Warpinator para Android es una adaptación no oficial de la aplicación homónima de LinuxMint para transferir archivos. Es completamente compatible con el protocolo original y permite enviar y recibir archivos fácilmente entre dispositivos Android y GNU/Linux.
2 |
3 | Características:
4 | - Búsqueda automática de servicios compatibles en la red local.
5 | - Funciona con conexión WiFi o a un punto de acceso. No se requiere conexión a la Internet.
6 | - Transfiere archivos de cualquier tipo de forma fácil y rápida.
7 | - Puede enviar o recibir carpetas enteras.
8 | - Múltiples transferencias en paralelo.
9 | - Comparte archivos desde otras aplicaciones.
10 | - Código de grupo para controlar quién puede conectarse.
11 | - Puede iniciarse con el sistema.
12 | - No requiere permisos innecesarios.
13 |
14 | Esta aplicación es software libre con licencia GNU General Public License v3.
15 | Puede acceder al código fuente en https://github.com/slowscript/warpinator-android
16 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es-ES/images/phoneScreenshots/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/fastlane/metadata/android/es-ES/images/phoneScreenshots/1.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/es-ES/images/phoneScreenshots/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/fastlane/metadata/android/es-ES/images/phoneScreenshots/2.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/es-ES/images/phoneScreenshots/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/fastlane/metadata/android/es-ES/images/phoneScreenshots/3.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/es-ES/short_description.txt:
--------------------------------------------------------------------------------
1 | Envía y recibe archivos dentro de una red local
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es-ES/title.txt:
--------------------------------------------------------------------------------
1 | Warpinator para Android (no oficial)
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fr-FR/full_description.txt:
--------------------------------------------------------------------------------
1 | Warpinator pour Android est un portage non officiel de l'outil du même nom pour le partage de fichiers de Linux Mint. Il est entièrement compatible avec le protocole d'origine et permet de transférer facilement des fichiers entre des appareils Android et Linux.
2 |
3 | Caractéristiques :
4 | - Découverte automatique des services compatibles sur le réseau local
5 | - Fonctionne avec le Wi-Fi ou les points d'accès Wi-Fi, connexion Internet non requise
6 | - Transférer tout type de fichier rapidement et facilement
7 | - Réception de répertoires entiers
8 | - Exécution de multiples transferts en parallèle
9 | - Partager des fichiers depuis d'autres applications
10 | - Limiter qui peut se connecter avec un code de groupe
11 | - Option pour se lancer au démarrage de l'appareil
12 | - Ne requiert pas votre localisation ou d'autres permissions non nécessaires
13 |
14 | Cette application est un logiciel libre publié sous la licence publique générale GNU v3.
15 | Vous pouvez obtenir le code source sur https://github.com/slowscript/warpinator-android
16 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fr-FR/short_description.txt:
--------------------------------------------------------------------------------
1 | Partager des fichiers sur le réseau local
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fr-FR/title.txt:
--------------------------------------------------------------------------------
1 | Warpinator pour Android (non officiel)
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/hu-HU/full_description.txt:
--------------------------------------------------------------------------------
1 | A Warpinator Androidhoz a Linux Mint azonos nevű fájlmegosztó eszközének nem hivatalos portja. Teljes mértékben kompatibilis az eredeti protokollal, és lehetővé teszi a fájlok egyszerű átvitelét Android és Linux eszközök között.
2 |
3 | Jellemzők:
4 | - Önműködő felfedezés a helyi hálózaton
5 | - A WiFi vagy az elérési pont működik, nincs szükség internetkapcsolatra
6 | - Bármilyen típusú fájlt gyorsan és egyszerűen továbbíthat
7 | - Teljes címtárok fogadása
8 | - Futtasson több adatátvitelt párhuzamosan
9 | - Más alkalmazásokból származó fájlok megosztása
10 | - Korlátozza, hogy ki tud csatlakozni egy csoportkód használatával
11 | - Indítási lehetőség indításkor
12 | - Nem igényli az Ön tartózkodási helyét vagy egyéb felesleges engedélyeket
13 |
14 | Ez az alkalmazás ingyenes szoftver, amelyet a GNU általános nyilvános licenc 3. verziója licencelt.
15 | A forráskódot a https://github.com/slowscript/warpinator-android oldalon szerezheti be
16 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/hu-HU/short_description.txt:
--------------------------------------------------------------------------------
1 | Fájlok megosztása a helyi hálózaton keresztül
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/hu-HU/title.txt:
--------------------------------------------------------------------------------
1 | Warpinator Androidhoz (nem hivatalos)
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/nl-NL/full_description.txt:
--------------------------------------------------------------------------------
1 | Warpinator voor Android is een onofficiele 'port' van Linux Mint's tool Warpinator om bestanden uit te wisselen. Het is volledig compatibel met het oorspronkelijke protocol en maakt het eenvoudig uitwisselen van bestand tussen Android en Linux machines.
2 |
3 | Eigenschappen:
4 | - Automatische herkenning van compatible services op lokaal network
5 | - Werkt op wifi of hotspot, geen internetverbinding nodig
6 | - Verzend elk bestandstype snel en eenvoudig
7 | - Ontvang volledige bestandsdirectory's
8 | - Verzend meerdere bestanden of directory's tegelijk
9 | - Deel bestanden van andere applicaties
10 | - Hou met een groepscode controle over wie verbinding kan maken
11 | - Mogelijkheid om mee op te starten bij booten
12 | - locatie of andere onnodige toestemming niet vereist
13 |
14 | Deze applicatie is vrije software onder GNU General Public License v3.
15 | De broncode is beschikbaar op https://github.com/slowscript/warpinator-android.
16 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/nl-NL/short_description.txt:
--------------------------------------------------------------------------------
1 | Deel bestanden over lokaal netwerk
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/nl-NL/title.txt:
--------------------------------------------------------------------------------
1 | Warpinator vr. Android (onof.)
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pl-PL/full_description.txt:
--------------------------------------------------------------------------------
1 | Warpinator dla Androida jest nieoficjalną wersją programu do udostępniania plików dla systemu Linux Mint. Jest w pełni kompatybilny z oryginalnym protokołem i pozwala na łatwe przesyłanie plików pomiędzy urządzeniami z systemem Android i Linux.
2 |
3 | Funkcje:
4 | - Automatyczne wykrywanie urządzeń w sieci lokalnej
5 | - Działa w sieci Wi-Fi lub z wykorzystaniem hotspotu, nie wymaga połączenia z internetem
6 | - Przesyłaj dowolne pliki szybko i wygodnie
7 | - Odbieraj całe foldery plików
8 | - Przesyłaj wiele plików na raz
9 | - Udostępniaj pliki z innych aplikacji
10 | - Ogranicz dostęp, używając kodu grupy
11 | - Możliwość uruchamiania po włączeniu urządzenia
12 | - Nie wymaga Twojej lokalizacji, ani innych niepotrzebnych uprawnień
13 |
14 | Ta aplikacja jest otwartym oprogramowaniem, dostępnym na licencji GNU General Public License v3.
15 | Możesz pobrać kod źródłowy ze strony https://github.com/slowscript/warpinator-android
16 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pl-PL/short_description.txt:
--------------------------------------------------------------------------------
1 | Udostępnianie plików w sieci lokalnej
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pl-PL/title.txt:
--------------------------------------------------------------------------------
1 | Warpinator dla Androida (nieoficjalny)
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt-BR/full_description.txt:
--------------------------------------------------------------------------------
1 | Warpinator para Android é um porte não-oficial da ferramenta de compartilhamento de arquivos (com o mesmo nome) criado pela equipe de Linux Mint. É completamente compatível com o protocolo original e permite as transferências descomplicadas de arquivos entre os dispositivos de Android e Linux.
2 |
3 | Funcionalidades:
4 | - Descoberta automática de serviços compatíveis na rede local
5 | - Funciona via WiFi ou hotspot, sem necessidade de conexão à internet
6 | - Transferência de qualquer tipo de arquivos de forma rápida e fácil
7 | - Transferência de pastas inteiras
8 | - Possibilidade de transferências paralelas
9 | - Compartilhamento de arquivos via outros Apps
10 | - Controle sobre quem pode conectar-se via um código de grupo
11 | - Opção de executar o App ao iniciar
12 | - Não precisa da sua localização ou qualquer outra permissão desnecessária
13 |
14 | Este é um App de software livre, licenciado sob a Licença Pública Geral GNU v3.
15 | Você pode obter o código fonte em
16 | https://github.com/slowscript/warpinator-android
17 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt-BR/short_description.txt:
--------------------------------------------------------------------------------
1 | Compartilhe arquivos via rede local
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt-BR/title.txt:
--------------------------------------------------------------------------------
1 | Warpinator para Android (não-oficial)
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ta-IN/full_description.txt:
--------------------------------------------------------------------------------
1 | ஆண்ட்ராய்டுக்கான வார்பினேட்டர் என்பது லினக்ஸ் மிண்டின் அதே பெயரில் உள்ள கோப்புப் பகிர்வு கருவியின் அதிகாரப்பூர்வமற்ற போர்ட் ஆகும். இது அசல் நெறிமுறையுடன் முழுமையாக இணக்கமானது மற்றும் ஆண்ட்ராய்டு மற்றும் லினக்ஸ் சாதனங்களுக்கு இடையில் கோப்புகளை எளிதாக மாற்ற அனுமதிக்கிறது.
2 |
3 | நற்பண்புகள்:
4 | - உள்ளக பிணையத்தில் இணக்கமான சேவைகளின் தானியங்கி கண்டுபிடிப்பு
5 | - வைஃபை அல்லது ஆட்சுபாட்டில் வேலை செய்கிறது, இணைய இணைப்பு தேவையில்லை
6 | - எந்த வகையான கோப்புகளையும் விரைவாகவும் எளிதாகவும் மாற்றவும்
7 | - முழு கோப்பகங்களையும் பெறவும்
8 | - பல பரிமாற்றங்களை இணையாக இயக்கவும்
9 | - பிற பயன்பாடுகளிலிருந்து கோப்புகளைப் பகிரவும்
10 | - குழு குறியீட்டைப் பயன்படுத்தி யார் இணைக்க முடியும் என்பதைக் கட்டுப்படுத்தவும்
11 | - துவக்கத்தில் தொடங்க விருப்பம்
12 | - உங்கள் இருப்பிடம் அல்லது வேறு எந்தத் தேவையற்ற அனுமதிகளும் தேவையில்லை
13 |
14 | இந்தப் பயன்பாடு குனு பொது பொதுமக்கள் உரிமம் ப3 இன் கீழ் உரிமம் பெற்ற இலவச மென்பொருள்.
15 | நீங்கள் மூலக் குறியீட்டை https://github.com/slowscript/warpinator-android இல் பெறலாம்
16 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ta-IN/short_description.txt:
--------------------------------------------------------------------------------
1 | உள்ளக பிணையம் முழுவதும் கோப்புகளைப் பகிர்
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ta-IN/title.txt:
--------------------------------------------------------------------------------
1 | ஆண்ட்ராய்டுக்கான வார்பினேட்டர் (அதிகாரப்பூர்வமற்றது)
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/tr-TR/full_description.txt:
--------------------------------------------------------------------------------
1 | Android için Warpinator, Linux Mint'in aynı adı taşıyan dosya paylaşım aracının resmi olmayan bir bağlantı noktasıdır. Orijinal protokolle tamamen uyumludur ve dosyaların Android ve Linux cihazlar arasında kolayca aktarılmasına olanak tanır.
2 |
3 | Özellikler:
4 | - Yerel ağda uyumlu servislerin otomatik keşfi
5 | - WiFi veya hotspot üzerinde çalışır, internet bağlantısı gerekmez
6 | - Her tür dosyayı hızlı ve kolay bir şekilde aktarın
7 | - Tüm dizinleri al
8 | - Paralel olarak birden fazla aktarımı çalıştırın
9 | - Diğer uygulamalardan dosya paylaşın
10 | - Grup kodu kullanarak kimlerin bağlanabileceğini sınırlayın
11 | - Önyüklemede başlatma seçeneği
12 | - Konumunuzu veya diğer gereksiz izinleri gerektirmez
13 |
14 | Bu uygulama, GNU Genel Kamu Lisansı v3 kapsamında lisanslanmış ücretsiz bir yazılımdır.
15 | Kaynak kodunu https://github.com/slowscript/warpinator-android adresinden edinebilirsiniz.
16 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/tr-TR/short_description.txt:
--------------------------------------------------------------------------------
1 | Dosyaları yerel ağ üzerinden paylaşın
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/tr-TR/title.txt:
--------------------------------------------------------------------------------
1 | Android için Warpinator (resmi olmayan)
2 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx1536m
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. More details, visit
12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 | # org.gradle.parallel=true
14 | # AndroidX package structure to make it clearer which packages are bundled with the
15 | # Android operating system, and which are packaged with your app's APK
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
17 | android.useAndroidX=true
18 | android.defaults.buildfeatures.buildconfig=true
19 | android.nonTransitiveRClass=true
20 | android.nonFinalResIds=false
21 |
22 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slowscript/warpinator-android/3a13e402f1f547a9737478297656c6688614d05c/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Thu Feb 06 18:22:02 CET 2025
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
5 | zipStoreBase=GRADLE_USER_HOME
6 | zipStorePath=wrapper/dists
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Attempt to set APP_HOME
10 | # Resolve links: $0 may be a link
11 | PRG="$0"
12 | # Need this for relative symlinks.
13 | while [ -h "$PRG" ] ; do
14 | ls=`ls -ld "$PRG"`
15 | link=`expr "$ls" : '.*-> \(.*\)$'`
16 | if expr "$link" : '/.*' > /dev/null; then
17 | PRG="$link"
18 | else
19 | PRG=`dirname "$PRG"`"/$link"
20 | fi
21 | done
22 | SAVED="`pwd`"
23 | cd "`dirname \"$PRG\"`/" >/dev/null
24 | APP_HOME="`pwd -P`"
25 | cd "$SAVED" >/dev/null
26 |
27 | APP_NAME="Gradle"
28 | APP_BASE_NAME=`basename "$0"`
29 |
30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31 | DEFAULT_JVM_OPTS=""
32 |
33 | # Use the maximum available, or set MAX_FD != -1 to use that value.
34 | MAX_FD="maximum"
35 |
36 | warn () {
37 | echo "$*"
38 | }
39 |
40 | die () {
41 | echo
42 | echo "$*"
43 | echo
44 | exit 1
45 | }
46 |
47 | # OS specific support (must be 'true' or 'false').
48 | cygwin=false
49 | msys=false
50 | darwin=false
51 | nonstop=false
52 | case "`uname`" in
53 | CYGWIN* )
54 | cygwin=true
55 | ;;
56 | Darwin* )
57 | darwin=true
58 | ;;
59 | MINGW* )
60 | msys=true
61 | ;;
62 | NONSTOP* )
63 | nonstop=true
64 | ;;
65 | esac
66 |
67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68 |
69 | # Determine the Java command to use to start the JVM.
70 | if [ -n "$JAVA_HOME" ] ; then
71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72 | # IBM's JDK on AIX uses strange locations for the executables
73 | JAVACMD="$JAVA_HOME/jre/sh/java"
74 | else
75 | JAVACMD="$JAVA_HOME/bin/java"
76 | fi
77 | if [ ! -x "$JAVACMD" ] ; then
78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79 |
80 | Please set the JAVA_HOME variable in your environment to match the
81 | location of your Java installation."
82 | fi
83 | else
84 | JAVACMD="java"
85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86 |
87 | Please set the JAVA_HOME variable in your environment to match the
88 | location of your Java installation."
89 | fi
90 |
91 | # Increase the maximum file descriptors if we can.
92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93 | MAX_FD_LIMIT=`ulimit -H -n`
94 | if [ $? -eq 0 ] ; then
95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96 | MAX_FD="$MAX_FD_LIMIT"
97 | fi
98 | ulimit -n $MAX_FD
99 | if [ $? -ne 0 ] ; then
100 | warn "Could not set maximum file descriptor limit: $MAX_FD"
101 | fi
102 | else
103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104 | fi
105 | fi
106 |
107 | # For Darwin, add options to specify how the application appears in the dock
108 | if $darwin; then
109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110 | fi
111 |
112 | # For Cygwin, switch paths to Windows format before running java
113 | if $cygwin ; then
114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116 | JAVACMD=`cygpath --unix "$JAVACMD"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Escape application args
158 | save () {
159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160 | echo " "
161 | }
162 | APP_ARGS=$(save "$@")
163 |
164 | # Collect all arguments for the java command, following the shell quoting and substitution rules
165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166 |
167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169 | cd "$(dirname "$0")"
170 | fi
171 |
172 | exec "$JAVACMD" "$@"
173 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | set DIRNAME=%~dp0
12 | if "%DIRNAME%" == "" set DIRNAME=.
13 | set APP_BASE_NAME=%~n0
14 | set APP_HOME=%DIRNAME%
15 |
16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 | set DEFAULT_JVM_OPTS=
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 |
53 | :win9xME_args
54 | @rem Slurp the command line arguments.
55 | set CMD_LINE_ARGS=
56 | set _SKIP=2
57 |
58 | :win9xME_args_slurp
59 | if "x%~1" == "x" goto execute
60 |
61 | set CMD_LINE_ARGS=%*
62 |
63 | :execute
64 | @rem Setup the command line
65 |
66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67 |
68 | @rem Execute Gradle
69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70 |
71 | :end
72 | @rem End local scope for the variables with windows NT shell
73 | if "%ERRORLEVEL%"=="0" goto mainEnd
74 |
75 | :fail
76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77 | rem the _cmd.exe /c_ return code!
78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79 | exit /b 1
80 |
81 | :mainEnd
82 | if "%OS%"=="Windows_NT" endlocal
83 |
84 | :omega
85 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | rootProject.name='Warp'
2 | include ':app'
3 |
--------------------------------------------------------------------------------