mirror of
https://github.com/syncthing/syncthing-android.git
synced 2024-11-23 04:41:16 +00:00
Fixed various lint issues
This commit is contained in:
parent
1cce70986b
commit
d8a05ed392
67 changed files with 246 additions and 485 deletions
|
@ -47,6 +47,10 @@ android {
|
||||||
testInstrumentationRunner 'android.test.InstrumentationTestRunner'
|
testInstrumentationRunner 'android.test.InstrumentationTestRunner'
|
||||||
testHandleProfiling true
|
testHandleProfiling true
|
||||||
testFunctionalTest true
|
testFunctionalTest true
|
||||||
|
jackOptions {
|
||||||
|
enabled true
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
// Without this parameter, all builds fail with error:
|
// Without this parameter, all builds fail with error:
|
||||||
// Execution failed for task ':mergeArmeabiDebugResources'.
|
// Execution failed for task ':mergeArmeabiDebugResources'.
|
||||||
|
@ -99,6 +103,10 @@ android {
|
||||||
versionCode Integer.parseInt("0" + defaultConfig.versionCode)
|
versionCode Integer.parseInt("0" + defaultConfig.versionCode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
task buildNative(type: Exec) {
|
task buildNative(type: Exec) {
|
||||||
|
|
|
@ -15,8 +15,8 @@ import java.util.List;
|
||||||
*/
|
*/
|
||||||
public class MockContext extends ContextWrapper {
|
public class MockContext extends ContextWrapper {
|
||||||
|
|
||||||
private ArrayList<Intent> mReceivedIntents = new ArrayList<>();
|
private final ArrayList<Intent> mReceivedIntents = new ArrayList<>();
|
||||||
private ArrayList<Intent> mStopServiceIntents = new ArrayList<>();
|
private final ArrayList<Intent> mStopServiceIntents = new ArrayList<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Use the actual context for calls that aren't easily mocked. May be null if those
|
* Use the actual context for calls that aren't easily mocked. May be null if those
|
||||||
|
|
|
@ -3,6 +3,7 @@ package com.nutomic.syncthingandroid.test;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
import com.nutomic.syncthingandroid.syncthing.RestApi;
|
import com.nutomic.syncthingandroid.syncthing.RestApi;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -65,7 +66,7 @@ public class MockRestApi extends RestApi {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void editDevice(Device device, Activity activity, OnDeviceIdNormalizedListener listener) {
|
public void editDevice(@NonNull Device device, Activity activity, OnDeviceIdNormalizedListener listener) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ import java.util.LinkedList;
|
||||||
|
|
||||||
public class MockSyncthingService extends SyncthingService {
|
public class MockSyncthingService extends SyncthingService {
|
||||||
|
|
||||||
private LinkedList<OnApiChangeListener> mOnApiChangedListeners = new LinkedList<>();
|
private final LinkedList<OnApiChangeListener> mOnApiChangedListeners = new LinkedList<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||||
|
|
|
@ -10,7 +10,7 @@ import com.nutomic.syncthingandroid.test.MockSyncthingService;
|
||||||
|
|
||||||
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
|
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
|
||||||
|
|
||||||
private MockSyncthingService mService = new MockSyncthingService();
|
private final MockSyncthingService mService = new MockSyncthingService();
|
||||||
|
|
||||||
public MainActivityTest() {
|
public MainActivityTest() {
|
||||||
super(MainActivity.class);
|
super(MainActivity.class);
|
||||||
|
|
|
@ -3,7 +3,6 @@ package com.nutomic.syncthingandroid.test.syncthing;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.test.AndroidTestCase;
|
import android.test.AndroidTestCase;
|
||||||
import android.test.suitebuilder.annotation.MediumTest;
|
|
||||||
|
|
||||||
import com.nutomic.syncthingandroid.syncthing.BatteryReceiver;
|
import com.nutomic.syncthingandroid.syncthing.BatteryReceiver;
|
||||||
import com.nutomic.syncthingandroid.syncthing.DeviceStateHolder;
|
import com.nutomic.syncthingandroid.syncthing.DeviceStateHolder;
|
||||||
|
|
|
@ -3,7 +3,6 @@ package com.nutomic.syncthingandroid.test.syncthing;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.test.AndroidTestCase;
|
import android.test.AndroidTestCase;
|
||||||
import android.test.suitebuilder.annotation.MediumTest;
|
|
||||||
|
|
||||||
import com.nutomic.syncthingandroid.syncthing.BootReceiver;
|
import com.nutomic.syncthingandroid.syncthing.BootReceiver;
|
||||||
import com.nutomic.syncthingandroid.syncthing.SyncthingService;
|
import com.nutomic.syncthingandroid.syncthing.SyncthingService;
|
||||||
|
|
|
@ -3,7 +3,6 @@ package com.nutomic.syncthingandroid.test.syncthing;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.BatteryManager;
|
import android.os.BatteryManager;
|
||||||
import android.test.AndroidTestCase;
|
import android.test.AndroidTestCase;
|
||||||
import android.test.suitebuilder.annotation.MediumTest;
|
|
||||||
|
|
||||||
import com.nutomic.syncthingandroid.syncthing.DeviceStateHolder;
|
import com.nutomic.syncthingandroid.syncthing.DeviceStateHolder;
|
||||||
import com.nutomic.syncthingandroid.test.MockContext;
|
import com.nutomic.syncthingandroid.test.MockContext;
|
||||||
|
|
|
@ -2,7 +2,6 @@ package com.nutomic.syncthingandroid.test.syncthing;
|
||||||
|
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.test.AndroidTestCase;
|
import android.test.AndroidTestCase;
|
||||||
import android.test.suitebuilder.annotation.MediumTest;
|
|
||||||
|
|
||||||
import com.nutomic.syncthingandroid.syncthing.GetTask;
|
import com.nutomic.syncthingandroid.syncthing.GetTask;
|
||||||
import com.nutomic.syncthingandroid.syncthing.RestApi;
|
import com.nutomic.syncthingandroid.syncthing.RestApi;
|
||||||
|
|
|
@ -4,7 +4,6 @@ import android.content.Intent;
|
||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.test.AndroidTestCase;
|
import android.test.AndroidTestCase;
|
||||||
import android.test.suitebuilder.annotation.MediumTest;
|
|
||||||
|
|
||||||
import com.nutomic.syncthingandroid.syncthing.DeviceStateHolder;
|
import com.nutomic.syncthingandroid.syncthing.DeviceStateHolder;
|
||||||
import com.nutomic.syncthingandroid.syncthing.NetworkReceiver;
|
import com.nutomic.syncthingandroid.syncthing.NetworkReceiver;
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
package com.nutomic.syncthingandroid.test.syncthing;
|
package com.nutomic.syncthingandroid.test.syncthing;
|
||||||
|
|
||||||
import android.test.AndroidTestCase;
|
import android.test.AndroidTestCase;
|
||||||
import android.test.suitebuilder.annotation.MediumTest;
|
|
||||||
import android.test.suitebuilder.annotation.SmallTest;
|
|
||||||
|
|
||||||
import com.nutomic.syncthingandroid.syncthing.PollWebGuiAvailableTask;
|
import com.nutomic.syncthingandroid.syncthing.PollWebGuiAvailableTask;
|
||||||
import com.nutomic.syncthingandroid.syncthing.RestApi;
|
import com.nutomic.syncthingandroid.syncthing.RestApi;
|
||||||
|
@ -38,12 +36,7 @@ public class RestApiTest extends AndroidTestCase {
|
||||||
}
|
}
|
||||||
}.execute(config.getWebGuiUrl());
|
}.execute(config.getWebGuiUrl());
|
||||||
mApi = new RestApi(getContext(), config.getWebGuiUrl(), config.getApiKey(),
|
mApi = new RestApi(getContext(), config.getWebGuiUrl(), config.getApiKey(),
|
||||||
new RestApi.OnApiAvailableListener() {
|
latch::countDown, null);
|
||||||
@Override
|
|
||||||
public void onApiAvailable() {
|
|
||||||
latch.countDown();
|
|
||||||
}
|
|
||||||
}, null);
|
|
||||||
latch.await(1, TimeUnit.SECONDS);
|
latch.await(1, TimeUnit.SECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package com.nutomic.syncthingandroid.test.syncthing;
|
package com.nutomic.syncthingandroid.test.syncthing;
|
||||||
|
|
||||||
import android.test.AndroidTestCase;
|
import android.test.AndroidTestCase;
|
||||||
import android.test.suitebuilder.annotation.SmallTest;
|
|
||||||
|
|
||||||
import com.nutomic.syncthingandroid.syncthing.SyncthingRunnable;
|
import com.nutomic.syncthingandroid.syncthing.SyncthingRunnable;
|
||||||
import com.nutomic.syncthingandroid.test.MockContext;
|
import com.nutomic.syncthingandroid.test.MockContext;
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package com.nutomic.syncthingandroid.test.syncthing;
|
package com.nutomic.syncthingandroid.test.syncthing;
|
||||||
|
|
||||||
import android.test.AndroidTestCase;
|
import android.test.AndroidTestCase;
|
||||||
import android.test.suitebuilder.annotation.SmallTest;
|
|
||||||
|
|
||||||
import com.nutomic.syncthingandroid.syncthing.SyncthingService;
|
import com.nutomic.syncthingandroid.syncthing.SyncthingService;
|
||||||
import com.nutomic.syncthingandroid.syncthing.SyncthingServiceBinder;
|
import com.nutomic.syncthingandroid.syncthing.SyncthingServiceBinder;
|
||||||
|
|
|
@ -1,16 +1,10 @@
|
||||||
package com.nutomic.syncthingandroid.test.util;
|
package com.nutomic.syncthingandroid.test.util;
|
||||||
|
|
||||||
import android.test.AndroidTestCase;
|
import android.test.AndroidTestCase;
|
||||||
import android.test.suitebuilder.annotation.MediumTest;
|
|
||||||
import android.test.suitebuilder.annotation.SmallTest;
|
|
||||||
|
|
||||||
import com.nutomic.syncthingandroid.syncthing.SyncthingService;
|
|
||||||
import com.nutomic.syncthingandroid.test.MockContext;
|
import com.nutomic.syncthingandroid.test.MockContext;
|
||||||
import com.nutomic.syncthingandroid.util.ConfigXml;
|
import com.nutomic.syncthingandroid.util.ConfigXml;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
public class ConfigXmlTest extends AndroidTestCase {
|
public class ConfigXmlTest extends AndroidTestCase {
|
||||||
|
|
||||||
private MockContext mContext;
|
private MockContext mContext;
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package com.nutomic.syncthingandroid.test.util;
|
package com.nutomic.syncthingandroid.test.util;
|
||||||
|
|
||||||
import android.test.AndroidTestCase;
|
import android.test.AndroidTestCase;
|
||||||
import android.test.suitebuilder.annotation.MediumTest;
|
|
||||||
|
|
||||||
import com.nutomic.syncthingandroid.syncthing.RestApi;
|
import com.nutomic.syncthingandroid.syncthing.RestApi;
|
||||||
import com.nutomic.syncthingandroid.test.MockContext;
|
import com.nutomic.syncthingandroid.test.MockContext;
|
||||||
|
|
|
@ -17,8 +17,6 @@ import com.nutomic.syncthingandroid.R;
|
||||||
|
|
||||||
public class FirstStartActivity extends Activity implements Button.OnClickListener {
|
public class FirstStartActivity extends Activity implements Button.OnClickListener {
|
||||||
|
|
||||||
private static final String TAG = "FirstStartActivity";
|
|
||||||
|
|
||||||
private static final int REQUEST_WRITE_STORAGE = 142;
|
private static final int REQUEST_WRITE_STORAGE = 142;
|
||||||
|
|
||||||
private SharedPreferences mPreferences;
|
private SharedPreferences mPreferences;
|
||||||
|
|
|
@ -5,7 +5,6 @@ import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
@ -31,7 +30,6 @@ import com.nutomic.syncthingandroid.syncthing.SyncthingService;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -90,13 +88,10 @@ public class FolderPickerActivity extends SyncthingActivity
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
private void populateRoots() {
|
private void populateRoots() {
|
||||||
// Use own comparator to handle null values.
|
// Use own comparator to handle null values.
|
||||||
TreeSet<File> roots = new TreeSet<>(new Comparator<File>() {
|
TreeSet<File> roots = new TreeSet<>((lhs, rhs) -> {
|
||||||
@Override
|
|
||||||
public int compare(File lhs, File rhs) {
|
|
||||||
if (lhs == null | rhs == null)
|
if (lhs == null | rhs == null)
|
||||||
return 0;
|
return 0;
|
||||||
return lhs.compareTo(rhs);
|
return lhs.compareTo(rhs);
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||||
|
@ -152,22 +147,12 @@ public class FolderPickerActivity extends SyncthingActivity
|
||||||
.setTitle(R.string.create_folder)
|
.setTitle(R.string.create_folder)
|
||||||
.setView(et)
|
.setView(et)
|
||||||
.setPositiveButton(android.R.string.ok,
|
.setPositiveButton(android.R.string.ok,
|
||||||
new DialogInterface.OnClickListener() {
|
(dialogInterface, i) -> createFolder(et.getText().toString())
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
|
||||||
createFolder(et.getText().toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
.setNegativeButton(android.R.string.cancel, null)
|
.setNegativeButton(android.R.string.cancel, null)
|
||||||
.create();
|
.create();
|
||||||
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
|
dialog.setOnShowListener(dialogInterface -> ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE))
|
||||||
@Override
|
.showSoftInput(et, InputMethodManager.SHOW_IMPLICIT));
|
||||||
public void onShow(DialogInterface dialogInterface) {
|
|
||||||
((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE))
|
|
||||||
.showSoftInput(et, InputMethodManager.SHOW_IMPLICIT);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
dialog.show();
|
dialog.show();
|
||||||
return true;
|
return true;
|
||||||
case R.id.select:
|
case R.id.select:
|
||||||
|
@ -207,14 +192,12 @@ public class FolderPickerActivity extends SyncthingActivity
|
||||||
if (contents == null)
|
if (contents == null)
|
||||||
contents = new File[]{};
|
contents = new File[]{};
|
||||||
|
|
||||||
Arrays.sort(contents, new Comparator<File>() {
|
Arrays.sort(contents, (f1, f2) -> {
|
||||||
public int compare(File f1, File f2) {
|
|
||||||
if (f1.isDirectory() && f2.isFile())
|
if (f1.isDirectory() && f2.isFile())
|
||||||
return -1;
|
return -1;
|
||||||
if (f1.isFile() && f2.isDirectory())
|
if (f1.isFile() && f2.isDirectory())
|
||||||
return 1;
|
return 1;
|
||||||
return f1.getName().compareTo(f2.getName());
|
return f1.getName().compareTo(f2.getName());
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
for (File f : contents) {
|
for (File f : contents) {
|
||||||
|
|
|
@ -91,18 +91,13 @@ public class LogActivity extends SyncthingActivity {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void scrollToBottom() {
|
private void scrollToBottom() {
|
||||||
mScrollView.post(new Runnable() {
|
mScrollView.post(() -> mScrollView.scrollTo(0, mLog.getBottom()));
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
mScrollView.scrollTo(0, mLog.getBottom());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateLog() {
|
private void updateLog() {
|
||||||
if (mFetchLogTask != null)
|
if (mFetchLogTask != null)
|
||||||
mFetchLogTask.cancel(true);
|
mFetchLogTask.cancel(true);
|
||||||
mLog.setText("Retrieving logs...");
|
mLog.setText(R.string.retrieving_logs);
|
||||||
mFetchLogTask = new AsyncTask<Void, Void, String>() {
|
mFetchLogTask = new AsyncTask<Void, Void, String>() {
|
||||||
@Override
|
@Override
|
||||||
protected String doInBackground(Void... params) {
|
protected String doInBackground(Void... params) {
|
||||||
|
@ -137,7 +132,7 @@ public class LogActivity extends SyncthingActivity {
|
||||||
BufferedReader bufferedReader = new BufferedReader(
|
BufferedReader bufferedReader = new BufferedReader(
|
||||||
new InputStreamReader(process.getInputStream(), "UTF-8"), 8192);
|
new InputStreamReader(process.getInputStream(), "UTF-8"), 8192);
|
||||||
StringBuilder log = new StringBuilder();
|
StringBuilder log = new StringBuilder();
|
||||||
String line = "";
|
String line;
|
||||||
String sep = System.getProperty("line.separator");
|
String sep = System.getProperty("line.separator");
|
||||||
while ((line = bufferedReader.readLine()) != null) {
|
while ((line = bufferedReader.readLine()) != null) {
|
||||||
log.append(line);
|
log.append(line);
|
||||||
|
|
|
@ -286,30 +286,17 @@ public class MainActivity extends SyncthingActivity
|
||||||
.setTitle(R.string.syncthing_disabled_title)
|
.setTitle(R.string.syncthing_disabled_title)
|
||||||
.setMessage(R.string.syncthing_disabled_message)
|
.setMessage(R.string.syncthing_disabled_message)
|
||||||
.setPositiveButton(R.string.syncthing_disabled_change_settings,
|
.setPositiveButton(R.string.syncthing_disabled_change_settings,
|
||||||
new DialogInterface.OnClickListener() {
|
(dialogInterface, i) -> {
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
|
||||||
finish();
|
finish();
|
||||||
Intent intent = new Intent(MainActivity.this, SettingsActivity.class)
|
Intent intent = new Intent(MainActivity.this, SettingsActivity.class)
|
||||||
.setAction(SettingsActivity.ACTION_APP_SETTINGS);
|
.setAction(SettingsActivity.ACTION_APP_SETTINGS);
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
)
|
)
|
||||||
.setNegativeButton(R.string.exit,
|
.setNegativeButton(R.string.exit,
|
||||||
new DialogInterface.OnClickListener() {
|
(dialogInterface, i) -> finish()
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
.setOnCancelListener(new DialogInterface.OnCancelListener() {
|
.setOnCancelListener(dialogInterface -> finish())
|
||||||
@Override
|
|
||||||
public void onCancel(DialogInterface dialogInterface) {
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.show();
|
.show();
|
||||||
mDisabledDialog.setCanceledOnTouchOutside(false);
|
mDisabledDialog.setCanceledOnTouchOutside(false);
|
||||||
}
|
}
|
||||||
|
@ -402,9 +389,7 @@ public class MainActivity extends SyncthingActivity
|
||||||
* Displays dialog asking user to accept/deny usage reporting.
|
* Displays dialog asking user to accept/deny usage reporting.
|
||||||
*/
|
*/
|
||||||
private void showUsageReportingDialog() {
|
private void showUsageReportingDialog() {
|
||||||
final DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
|
final DialogInterface.OnClickListener listener = (dialog, which) -> {
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
switch (which) {
|
switch (which) {
|
||||||
case DialogInterface.BUTTON_POSITIVE:
|
case DialogInterface.BUTTON_POSITIVE:
|
||||||
getApi().setUsageReportAccepted(RestApi.USAGE_REPORTING_ACCEPTED,
|
getApi().setUsageReportAccepted(RestApi.USAGE_REPORTING_ACCEPTED,
|
||||||
|
@ -420,12 +405,9 @@ public class MainActivity extends SyncthingActivity
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
getApi().getUsageReport(new RestApi.OnReceiveUsageReportListener() {
|
getApi().getUsageReport(report -> {
|
||||||
@Override
|
|
||||||
public void onReceiveUsageReport(String report) {
|
|
||||||
@SuppressLint("InflateParams")
|
@SuppressLint("InflateParams")
|
||||||
View v = LayoutInflater.from(MainActivity.this)
|
View v = LayoutInflater.from(MainActivity.this)
|
||||||
.inflate(R.layout.dialog_usage_reporting, null);
|
.inflate(R.layout.dialog_usage_reporting, null);
|
||||||
|
@ -438,7 +420,6 @@ public class MainActivity extends SyncthingActivity
|
||||||
.setNegativeButton(R.string.no, listener)
|
.setNegativeButton(R.string.no, listener)
|
||||||
.setNeutralButton(R.string.open_website, listener)
|
.setNeutralButton(R.string.open_website, listener)
|
||||||
.show();
|
.show();
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ import android.app.Notification;
|
||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.app.NotificationCompat;
|
import android.support.v4.app.NotificationCompat;
|
||||||
|
@ -30,26 +29,17 @@ public class RestartActivity extends SyncthingActivity {
|
||||||
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||||
builder.setMessage(R.string.restart_title)
|
builder.setMessage(R.string.restart_title)
|
||||||
.setPositiveButton(R.string.restart_now, new DialogInterface.OnClickListener() {
|
.setPositiveButton(R.string.restart_now, (dialogInterface, i) -> {
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
|
||||||
getService().getApi().updateConfig();
|
getService().getApi().updateConfig();
|
||||||
finish();
|
finish();
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.setNegativeButton(R.string.restart_later, new DialogInterface.OnClickListener() {
|
.setNegativeButton(R.string.restart_later, (dialogInterface, i) -> {
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
|
||||||
createRestartNotification();
|
createRestartNotification();
|
||||||
finish();
|
finish();
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.setOnCancelListener(new DialogInterface.OnCancelListener() {
|
.setOnCancelListener(dialog -> {
|
||||||
@Override
|
|
||||||
public void onCancel(DialogInterface dialog) {
|
|
||||||
createRestartNotification();
|
createRestartNotification();
|
||||||
finish();
|
finish();
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,6 @@ package com.nutomic.syncthingandroid.activities;
|
||||||
|
|
||||||
import android.app.Fragment;
|
import android.app.Fragment;
|
||||||
import android.app.FragmentManager;
|
import android.app.FragmentManager;
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v7.app.AlertDialog;
|
import android.support.v7.app.AlertDialog;
|
||||||
import com.nutomic.syncthingandroid.R;
|
import com.nutomic.syncthingandroid.R;
|
||||||
|
@ -96,12 +95,7 @@ public class SettingsActivity extends SyncthingActivity {
|
||||||
if (getIsCreate() && (mFragment instanceof DeviceFragment || mFragment instanceof FolderFragment)) {
|
if (getIsCreate() && (mFragment instanceof DeviceFragment || mFragment instanceof FolderFragment)) {
|
||||||
new AlertDialog.Builder(this)
|
new AlertDialog.Builder(this)
|
||||||
.setMessage(R.string.dialog_discard_changes)
|
.setMessage(R.string.dialog_discard_changes)
|
||||||
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
.setPositiveButton(android.R.string.ok, (dialog, which) -> finish())
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.setNegativeButton(android.R.string.cancel, null)
|
.setNegativeButton(android.R.string.cancel, null)
|
||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ public abstract class SyncthingActivity extends ToolbarBindingActivity implement
|
||||||
|
|
||||||
private SyncthingService mSyncthingService;
|
private SyncthingService mSyncthingService;
|
||||||
|
|
||||||
private LinkedList<OnServiceConnectedListener> mServiceConnectedListeners = new LinkedList<>();
|
private final LinkedList<OnServiceConnectedListener> mServiceConnectedListeners = new LinkedList<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To be used for Fragments.
|
* To be used for Fragments.
|
||||||
|
|
|
@ -83,7 +83,7 @@ public class DeviceFragment extends Fragment implements
|
||||||
|
|
||||||
private boolean mDeviceNeedsToUpdate;
|
private boolean mDeviceNeedsToUpdate;
|
||||||
|
|
||||||
private DialogInterface.OnClickListener mCompressionEntrySelectedListener = new DialogInterface.OnClickListener() {
|
private final DialogInterface.OnClickListener mCompressionEntrySelectedListener = new DialogInterface.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
|
@ -99,7 +99,7 @@ public class DeviceFragment extends Fragment implements
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private TextWatcher mIdTextWatcher = new TextWatcherAdapter() {
|
private final TextWatcher mIdTextWatcher = new TextWatcherAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void afterTextChanged(Editable s) {
|
public void afterTextChanged(Editable s) {
|
||||||
if (!s.toString().equals(mDevice.deviceID)) {
|
if (!s.toString().equals(mDevice.deviceID)) {
|
||||||
|
@ -110,7 +110,7 @@ public class DeviceFragment extends Fragment implements
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private TextWatcher mNameTextWatcher = new TextWatcherAdapter() {
|
private final TextWatcher mNameTextWatcher = new TextWatcherAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void afterTextChanged(Editable s) {
|
public void afterTextChanged(Editable s) {
|
||||||
if (!s.toString().equals(mDevice.name)) {
|
if (!s.toString().equals(mDevice.name)) {
|
||||||
|
@ -121,7 +121,7 @@ public class DeviceFragment extends Fragment implements
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private TextWatcher mAddressesTextWatcher = new TextWatcherAdapter() {
|
private final TextWatcher mAddressesTextWatcher = new TextWatcherAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void afterTextChanged(Editable s) {
|
public void afterTextChanged(Editable s) {
|
||||||
if (!s.toString().equals(displayableAddresses())) {
|
if (!s.toString().equals(displayableAddresses())) {
|
||||||
|
@ -132,7 +132,7 @@ public class DeviceFragment extends Fragment implements
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private CompoundButton.OnCheckedChangeListener mIntroducerCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() {
|
private final CompoundButton.OnCheckedChangeListener mIntroducerCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||||
if (mDevice.introducer != isChecked) {
|
if (mDevice.introducer != isChecked) {
|
||||||
|
@ -262,10 +262,10 @@ public class DeviceFragment extends Fragment implements
|
||||||
if (!mIsCreateMode) {
|
if (!mIsCreateMode) {
|
||||||
List<RestApi.Device> devices = mSyncthingService.getApi().getDevices(false);
|
List<RestApi.Device> devices = mSyncthingService.getApi().getDevices(false);
|
||||||
mDevice = null;
|
mDevice = null;
|
||||||
for (int i = 0; i < devices.size(); i++) {
|
for (RestApi.Device device : devices) {
|
||||||
if (devices.get(i).deviceID.equals(
|
if (device.deviceID.equals(
|
||||||
getActivity().getIntent().getStringExtra(EXTRA_DEVICE_ID))) {
|
getActivity().getIntent().getStringExtra(EXTRA_DEVICE_ID))) {
|
||||||
mDevice = devices.get(i);
|
mDevice = device;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -327,12 +327,7 @@ public class DeviceFragment extends Fragment implements
|
||||||
case R.id.remove:
|
case R.id.remove:
|
||||||
new AlertDialog.Builder(getActivity())
|
new AlertDialog.Builder(getActivity())
|
||||||
.setMessage(R.string.remove_device_confirm)
|
.setMessage(R.string.remove_device_confirm)
|
||||||
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
|
.setPositiveButton(android.R.string.yes, (dialogInterface, i) -> mSyncthingService.getApi().deleteDevice(mDevice, getActivity()))
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
|
||||||
mSyncthingService.getApi().deleteDevice(mDevice, getActivity());
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.setNegativeButton(android.R.string.no, null)
|
.setNegativeButton(android.R.string.no, null)
|
||||||
.show();
|
.show();
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -29,12 +29,7 @@ import java.util.TimerTask;
|
||||||
public class DeviceListFragment extends ListFragment implements SyncthingService.OnApiChangeListener,
|
public class DeviceListFragment extends ListFragment implements SyncthingService.OnApiChangeListener,
|
||||||
ListView.OnItemClickListener {
|
ListView.OnItemClickListener {
|
||||||
|
|
||||||
private final static Comparator<RestApi.Device> DEVICES_COMPARATOR = new Comparator<RestApi.Device>() {
|
private final static Comparator<RestApi.Device> DEVICES_COMPARATOR = (lhs, rhs) -> lhs.name.compareTo(rhs.name);
|
||||||
@Override
|
|
||||||
public int compare(RestApi.Device lhs, RestApi.Device rhs) {
|
|
||||||
return lhs.name.compareTo(rhs.name);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private DevicesAdapter mAdapter;
|
private DevicesAdapter mAdapter;
|
||||||
|
|
||||||
|
@ -47,12 +42,7 @@ public class DeviceListFragment extends ListFragment implements SyncthingService
|
||||||
mTimer.schedule(new TimerTask() {
|
mTimer.schedule(new TimerTask() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
getActivity().runOnUiThread(new Runnable() {
|
getActivity().runOnUiThread(DeviceListFragment.this::updateList);
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
updateList();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}, 0, SyncthingService.GUI_UPDATE_INTERVAL);
|
}, 0, SyncthingService.GUI_UPDATE_INTERVAL);
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package com.nutomic.syncthingandroid.fragments;
|
package com.nutomic.syncthingandroid.fragments;
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
|
@ -156,12 +155,7 @@ public class DrawerFragment extends Fragment implements RestApi.OnReceiveSystemI
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mDeviceId.setText(info.myID);
|
mDeviceId.setText(info.myID);
|
||||||
mDeviceId.setOnClickListener(new View.OnClickListener() {
|
mDeviceId.setOnClickListener(v -> mActivity.getApi().copyDeviceId(mDeviceId.getText().toString()));
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
mActivity.getApi().copyDeviceId(mDeviceId.getText().toString());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
mCpuUsage.setText(new DecimalFormat("0.00").format(info.cpuPercent) + "%");
|
mCpuUsage.setText(new DecimalFormat("0.00").format(info.cpuPercent) + "%");
|
||||||
mRamUsage.setText(RestApi.readableFileSize(mActivity, info.sys));
|
mRamUsage.setText(RestApi.readableFileSize(mActivity, info.sys));
|
||||||
mAnnounceServer.setText(Integer.toString(info.extAnnounceConnected) + "/" +
|
mAnnounceServer.setText(Integer.toString(info.extAnnounceConnected) + "/" +
|
||||||
|
@ -217,13 +211,8 @@ public class DrawerFragment extends Fragment implements RestApi.OnReceiveSystemI
|
||||||
mActivity.closeDrawer();
|
mActivity.closeDrawer();
|
||||||
new AlertDialog.Builder(getContext())
|
new AlertDialog.Builder(getContext())
|
||||||
.setMessage(R.string.dialog_confirm_restart)
|
.setMessage(R.string.dialog_confirm_restart)
|
||||||
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
|
.setPositiveButton(android.R.string.yes, (dialogInterface, i1) -> getContext().startService(new Intent(getContext(), SyncthingService.class)
|
||||||
@Override
|
.setAction(SyncthingService.ACTION_RESTART)))
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
|
||||||
getContext().startService(new Intent(getContext(), SyncthingService.class)
|
|
||||||
.setAction(SyncthingService.ACTION_RESTART));
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.setNegativeButton(android.R.string.no, null)
|
.setNegativeButton(android.R.string.no, null)
|
||||||
.show();
|
.show();
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -3,7 +3,6 @@ package com.nutomic.syncthingandroid.fragments;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.Fragment;
|
import android.app.Fragment;
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
@ -71,9 +70,9 @@ public class FolderFragment extends Fragment
|
||||||
private boolean mIsCreateMode;
|
private boolean mIsCreateMode;
|
||||||
private boolean mFolderNeedsToUpdate;
|
private boolean mFolderNeedsToUpdate;
|
||||||
|
|
||||||
private KeepVersionsDialogFragment mKeepVersionsDialogFragment = new KeepVersionsDialogFragment();
|
private final KeepVersionsDialogFragment mKeepVersionsDialogFragment = new KeepVersionsDialogFragment();
|
||||||
|
|
||||||
private TextWatcher mTextWatcher = new TextWatcherAdapter() {
|
private final TextWatcher mTextWatcher = new TextWatcherAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void afterTextChanged(Editable s) {
|
public void afterTextChanged(Editable s) {
|
||||||
mFolder.label = mLabelView.getText().toString();
|
mFolder.label = mLabelView.getText().toString();
|
||||||
|
@ -83,7 +82,7 @@ public class FolderFragment extends Fragment
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private CompoundButton.OnCheckedChangeListener mCheckedListener =
|
private final CompoundButton.OnCheckedChangeListener mCheckedListener =
|
||||||
new CompoundButton.OnCheckedChangeListener() {
|
new CompoundButton.OnCheckedChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onCheckedChanged(CompoundButton view, boolean isChecked) {
|
public void onCheckedChanged(CompoundButton view, boolean isChecked) {
|
||||||
|
@ -105,7 +104,7 @@ public class FolderFragment extends Fragment
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private KeepVersionsDialogFragment.OnValueChangeListener mOnValueChangeListener =
|
private final KeepVersionsDialogFragment.OnValueChangeListener mOnValueChangeListener =
|
||||||
new KeepVersionsDialogFragment.OnValueChangeListener() {
|
new KeepVersionsDialogFragment.OnValueChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onValueChange(int intValue) {
|
public void onValueChange(int intValue) {
|
||||||
|
@ -121,7 +120,7 @@ public class FolderFragment extends Fragment
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private View.OnClickListener mPathViewClickListener = new View.OnClickListener() {
|
private final View.OnClickListener mPathViewClickListener = new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
Intent intent = new Intent(getActivity(), FolderPickerActivity.class);
|
Intent intent = new Intent(getActivity(), FolderPickerActivity.class);
|
||||||
|
@ -197,12 +196,7 @@ public class FolderFragment extends Fragment
|
||||||
mDevicesContainer = (ViewGroup) view.findViewById(R.id.devicesContainer);
|
mDevicesContainer = (ViewGroup) view.findViewById(R.id.devicesContainer);
|
||||||
|
|
||||||
mPathView.setOnClickListener(mPathViewClickListener);
|
mPathView.setOnClickListener(mPathViewClickListener);
|
||||||
view.findViewById(R.id.versioningContainer).setOnClickListener(new View.OnClickListener() {
|
view.findViewById(R.id.versioningContainer).setOnClickListener(v -> mKeepVersionsDialogFragment.show(getFragmentManager(), KEEP_VERSIONS_DIALOG_TAG));
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
mKeepVersionsDialogFragment.show(getFragmentManager(), KEEP_VERSIONS_DIALOG_TAG);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (mIsCreateMode) {
|
if (mIsCreateMode) {
|
||||||
// Open keyboard on label view in edit mode.
|
// Open keyboard on label view in edit mode.
|
||||||
|
@ -326,12 +320,7 @@ public class FolderFragment extends Fragment
|
||||||
case R.id.remove:
|
case R.id.remove:
|
||||||
new AlertDialog.Builder(getActivity())
|
new AlertDialog.Builder(getActivity())
|
||||||
.setMessage(R.string.remove_folder_confirm)
|
.setMessage(R.string.remove_folder_confirm)
|
||||||
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
|
.setPositiveButton(android.R.string.yes, (dialogInterface, i) -> mSyncthingService.getApi().deleteFolder(mFolder, getActivity()))
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
|
||||||
mSyncthingService.getApi().deleteFolder(mFolder, getActivity());
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.setNegativeButton(android.R.string.no, null)
|
.setNegativeButton(android.R.string.no, null)
|
||||||
.show();
|
.show();
|
||||||
return true;
|
return true;
|
||||||
|
@ -355,7 +344,7 @@ public class FolderFragment extends Fragment
|
||||||
private void initFolder() {
|
private void initFolder() {
|
||||||
mFolder = new RestApi.Folder();
|
mFolder = new RestApi.Folder();
|
||||||
mFolder.id = getActivity().getIntent().getStringExtra(EXTRA_FOLDER_ID);
|
mFolder.id = getActivity().getIntent().getStringExtra(EXTRA_FOLDER_ID);
|
||||||
mFolder.label = getActivity().getIntent().getStringExtra(EXTRA_FOLDER_LABEL);;
|
mFolder.label = getActivity().getIntent().getStringExtra(EXTRA_FOLDER_LABEL);
|
||||||
mFolder.path = "";
|
mFolder.path = "";
|
||||||
mFolder.rescanIntervalS = 259200; // Scan every 3 days (in case inotify dropped some changes)
|
mFolder.rescanIntervalS = 259200; // Scan every 3 days (in case inotify dropped some changes)
|
||||||
mFolder.deviceIds = new ArrayList<>();
|
mFolder.deviceIds = new ArrayList<>();
|
||||||
|
|
|
@ -32,14 +32,11 @@ public class FolderListFragment extends ListFragment implements SyncthingService
|
||||||
/**
|
/**
|
||||||
* Compares folders by labels, uses the folder ID as fallback if the label is empty
|
* Compares folders by labels, uses the folder ID as fallback if the label is empty
|
||||||
*/
|
*/
|
||||||
private final static Comparator<RestApi.Folder> FOLDERS_COMPARATOR = new Comparator<RestApi.Folder>() {
|
private final static Comparator<RestApi.Folder> FOLDERS_COMPARATOR = (lhs, rhs) -> {
|
||||||
@Override
|
|
||||||
public int compare(RestApi.Folder lhs, RestApi.Folder rhs) {
|
|
||||||
String lhsLabel = lhs.label != null && !lhs.label.isEmpty() ? lhs.label : lhs.id;
|
String lhsLabel = lhs.label != null && !lhs.label.isEmpty() ? lhs.label : lhs.id;
|
||||||
String rhsLabel = rhs.label != null && !rhs.label.isEmpty() ? rhs.label : rhs.id;
|
String rhsLabel = rhs.label != null && !rhs.label.isEmpty() ? rhs.label : rhs.id;
|
||||||
|
|
||||||
return lhsLabel.compareTo(rhsLabel);
|
return lhsLabel.compareTo(rhsLabel);
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
private FoldersAdapter mAdapter;
|
private FoldersAdapter mAdapter;
|
||||||
|
@ -53,12 +50,7 @@ public class FolderListFragment extends ListFragment implements SyncthingService
|
||||||
mTimer.schedule(new TimerTask() {
|
mTimer.schedule(new TimerTask() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
getActivity().runOnUiThread(new Runnable() {
|
getActivity().runOnUiThread(FolderListFragment.this::updateList);
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
updateList();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}, 0, SyncthingService.GUI_UPDATE_INTERVAL);
|
}, 0, SyncthingService.GUI_UPDATE_INTERVAL);
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
package com.nutomic.syncthingandroid.fragments;
|
package com.nutomic.syncthingandroid.fragments;
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
@ -11,11 +9,8 @@ import android.preference.CheckBoxPreference;
|
||||||
import android.preference.EditTextPreference;
|
import android.preference.EditTextPreference;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.PreferenceFragment;
|
import android.preference.PreferenceFragment;
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.preference.PreferenceScreen;
|
import android.preference.PreferenceScreen;
|
||||||
import android.support.v4.app.NavUtils;
|
import android.support.v4.app.NavUtils;
|
||||||
import android.text.InputType;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
@ -27,7 +22,6 @@ import com.nutomic.syncthingandroid.syncthing.RestApi;
|
||||||
import com.nutomic.syncthingandroid.syncthing.SyncthingService;
|
import com.nutomic.syncthingandroid.syncthing.SyncthingService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
|
|
||||||
import eu.chainfire.libsuperuser.Shell;
|
import eu.chainfire.libsuperuser.Shell;
|
||||||
|
@ -284,14 +278,6 @@ public class SettingsFragment extends PreferenceFragment
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String formatWifiNameList(Set<String> ssids) {
|
|
||||||
Set<String> formatted = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
|
|
||||||
for (String ssid : ssids) {
|
|
||||||
formatted.add(ssid.replaceFirst("^\"", "").replaceFirst("\"$", ""));
|
|
||||||
}
|
|
||||||
return TextUtils.join(", ", formatted);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Changes the owner of syncthing files so they can be accessed without root.
|
* Changes the owner of syncthing files so they can be accessed without root.
|
||||||
*/
|
*/
|
||||||
|
@ -324,14 +310,11 @@ public class SettingsFragment extends PreferenceFragment
|
||||||
new AlertDialog.Builder(getActivity())
|
new AlertDialog.Builder(getActivity())
|
||||||
.setMessage(R.string.dialog_confirm_export)
|
.setMessage(R.string.dialog_confirm_export)
|
||||||
.setPositiveButton(android.R.string.yes,
|
.setPositiveButton(android.R.string.yes,
|
||||||
new DialogInterface.OnClickListener() {
|
(dialog, which) -> {
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
mSyncthingService.exportConfig();
|
mSyncthingService.exportConfig();
|
||||||
Toast.makeText(getActivity(),
|
Toast.makeText(getActivity(),
|
||||||
getString(R.string.config_export_successful,
|
getString(R.string.config_export_successful,
|
||||||
SyncthingService.EXPORT_PATH), Toast.LENGTH_LONG).show();
|
SyncthingService.EXPORT_PATH), Toast.LENGTH_LONG).show();
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.setNegativeButton(android.R.string.no, null)
|
.setNegativeButton(android.R.string.no, null)
|
||||||
.show();
|
.show();
|
||||||
|
@ -340,9 +323,7 @@ public class SettingsFragment extends PreferenceFragment
|
||||||
new AlertDialog.Builder(getActivity())
|
new AlertDialog.Builder(getActivity())
|
||||||
.setMessage(R.string.dialog_confirm_import)
|
.setMessage(R.string.dialog_confirm_import)
|
||||||
.setPositiveButton(android.R.string.yes,
|
.setPositiveButton(android.R.string.yes,
|
||||||
new DialogInterface.OnClickListener() {
|
(dialog, which) -> {
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
if (mSyncthingService.importConfig()) {
|
if (mSyncthingService.importConfig()) {
|
||||||
Toast.makeText(getActivity(),
|
Toast.makeText(getActivity(),
|
||||||
getString(R.string.config_imported_successful),
|
getString(R.string.config_imported_successful),
|
||||||
|
@ -354,7 +335,6 @@ public class SettingsFragment extends PreferenceFragment
|
||||||
getString(R.string.config_import_failed,
|
getString(R.string.config_import_failed,
|
||||||
SyncthingService.EXPORT_PATH), Toast.LENGTH_LONG).show();
|
SyncthingService.EXPORT_PATH), Toast.LENGTH_LONG).show();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.setNegativeButton(android.R.string.no, null)
|
.setNegativeButton(android.R.string.no, null)
|
||||||
.show();
|
.show();
|
||||||
|
@ -366,17 +346,11 @@ public class SettingsFragment extends PreferenceFragment
|
||||||
new AlertDialog.Builder(getActivity())
|
new AlertDialog.Builder(getActivity())
|
||||||
.setTitle(R.string.streset_title)
|
.setTitle(R.string.streset_title)
|
||||||
.setMessage(R.string.streset_question)
|
.setMessage(R.string.streset_question)
|
||||||
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> {
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
|
||||||
getActivity().startService(intent);
|
getActivity().startService(intent);
|
||||||
Toast.makeText(getActivity(), R.string.streset_done, Toast.LENGTH_LONG).show();
|
Toast.makeText(getActivity(), R.string.streset_done, Toast.LENGTH_LONG).show();
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
|
.setNegativeButton(android.R.string.no, (dialogInterface, i) -> {
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.show();
|
.show();
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -16,7 +16,7 @@ import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
|
||||||
|
|
||||||
public class KeepVersionsDialogFragment extends DialogFragment {
|
public class KeepVersionsDialogFragment extends DialogFragment {
|
||||||
|
|
||||||
private OnValueChangeListener mOnValueChangeListener = OnValueChangeListener.NO_OP;
|
private OnValueChangeListener mOnValueChangeListener;
|
||||||
|
|
||||||
private NumberPicker mNumberPickerView;
|
private NumberPicker mNumberPickerView;
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@ public class KeepVersionsDialogFragment extends DialogFragment {
|
||||||
switch (which) {
|
switch (which) {
|
||||||
case DialogInterface.BUTTON_POSITIVE:
|
case DialogInterface.BUTTON_POSITIVE:
|
||||||
mValue = mNumberPickerView.getValue();
|
mValue = mNumberPickerView.getValue();
|
||||||
|
if (mOnValueChangeListener != null)
|
||||||
mOnValueChangeListener.onValueChange(mValue);
|
mOnValueChangeListener.onValueChange(mValue);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -47,10 +48,6 @@ public class KeepVersionsDialogFragment extends DialogFragment {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setOnValueChangeListener(OnValueChangeListener onValueChangeListener) {
|
public void setOnValueChangeListener(OnValueChangeListener onValueChangeListener) {
|
||||||
if (onValueChangeListener == null) {
|
|
||||||
onValueChangeListener = OnValueChangeListener.NO_OP;
|
|
||||||
}
|
|
||||||
|
|
||||||
mOnValueChangeListener = onValueChangeListener;
|
mOnValueChangeListener = onValueChangeListener;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,11 +70,6 @@ public class KeepVersionsDialogFragment extends DialogFragment {
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface OnValueChangeListener {
|
public interface OnValueChangeListener {
|
||||||
OnValueChangeListener NO_OP = new OnValueChangeListener() {
|
|
||||||
@Override
|
|
||||||
public void onValueChange(int value) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
void onValueChange(int value);
|
void onValueChange(int value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,6 @@ import android.widget.Toast;
|
||||||
import com.nutomic.syncthingandroid.R;
|
import com.nutomic.syncthingandroid.R;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
@ -53,7 +52,7 @@ public class WifiSsidPreference extends MultiSelectListPreference {
|
||||||
protected void showDialog(Bundle state) {
|
protected void showDialog(Bundle state) {
|
||||||
WifiConfiguration[] networks = loadConfiguredNetworksSorted();
|
WifiConfiguration[] networks = loadConfiguredNetworksSorted();
|
||||||
if (networks != null) {
|
if (networks != null) {
|
||||||
Set<String> selected = getSharedPreferences().getStringSet(getKey(), new HashSet<String>());
|
Set<String> selected = getSharedPreferences().getStringSet(getKey(), new HashSet<>());
|
||||||
// from JavaDoc: Note that you must not modify the set instance returned by this call.
|
// from JavaDoc: Note that you must not modify the set instance returned by this call.
|
||||||
// therefore required to make a defensive copy of the elements
|
// therefore required to make a defensive copy of the elements
|
||||||
selected = new HashSet<>(selected);
|
selected = new HashSet<>(selected);
|
||||||
|
@ -114,14 +113,11 @@ public class WifiSsidPreference extends MultiSelectListPreference {
|
||||||
// if WiFi is turned off, getConfiguredNetworks returns null on many devices
|
// if WiFi is turned off, getConfiguredNetworks returns null on many devices
|
||||||
if (configuredNetworks != null) {
|
if (configuredNetworks != null) {
|
||||||
WifiConfiguration[] result = configuredNetworks.toArray(new WifiConfiguration[configuredNetworks.size()]);
|
WifiConfiguration[] result = configuredNetworks.toArray(new WifiConfiguration[configuredNetworks.size()]);
|
||||||
Arrays.sort(result, new Comparator<WifiConfiguration>() {
|
Arrays.sort(result, (lhs, rhs) -> {
|
||||||
@Override
|
|
||||||
public int compare(WifiConfiguration lhs, WifiConfiguration rhs) {
|
|
||||||
// See #620: There may be null-SSIDs
|
// See #620: There may be null-SSIDs
|
||||||
String l = lhs.SSID != null ? lhs.SSID : "";
|
String l = lhs.SSID != null ? lhs.SSID : "";
|
||||||
String r = rhs.SSID != null ? rhs.SSID : "";
|
String r = rhs.SSID != null ? rhs.SSID : "";
|
||||||
return l.compareToIgnoreCase(r);
|
return l.compareToIgnoreCase(r);
|
||||||
}
|
|
||||||
});
|
});
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ public class DeviceStateHolder extends BroadcastReceiver {
|
||||||
public static final String EXTRA_IS_CHARGING =
|
public static final String EXTRA_IS_CHARGING =
|
||||||
"com.nutomic.syncthingandroid.syncthing.DeviceStateHolder.IS_CHARGING";
|
"com.nutomic.syncthingandroid.syncthing.DeviceStateHolder.IS_CHARGING";
|
||||||
|
|
||||||
private Context mContext;
|
private final Context mContext;
|
||||||
|
|
||||||
private boolean mIsWifiConnected = false;
|
private boolean mIsWifiConnected = false;
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ public class DeviceStateHolder extends BroadcastReceiver {
|
||||||
boolean wifiConnected = isWifiConnected();
|
boolean wifiConnected = isWifiConnected();
|
||||||
if (wifiConnected) {
|
if (wifiConnected) {
|
||||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
|
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
|
||||||
Set<String> ssids = sp.getStringSet(SyncthingService.PREF_SYNC_ONLY_WIFI_SSIDS, new HashSet<String>());
|
Set<String> ssids = sp.getStringSet(SyncthingService.PREF_SYNC_ONLY_WIFI_SSIDS, new HashSet<>());
|
||||||
if (ssids.isEmpty()) {
|
if (ssids.isEmpty()) {
|
||||||
Log.d(TAG, "All SSIDs allowed for syncing");
|
Log.d(TAG, "All SSIDs allowed for syncing");
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -70,7 +70,7 @@ public class EventProcessor implements SyncthingService.OnWebGuiAvailableListene
|
||||||
// If that's the case we've to start at zero because syncthing was restarted.
|
// If that's the case we've to start at zero because syncthing was restarted.
|
||||||
mApi.getEvents(0, 1, new RestApi.OnReceiveEventListener() {
|
mApi.getEvents(0, 1, new RestApi.OnReceiveEventListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onEvent(long id, String eventType, JSONObject data) throws JSONException {
|
public void onEvent(String eventType, JSONObject data) throws JSONException {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ public class EventProcessor implements SyncthingService.OnWebGuiAvailableListene
|
||||||
* Performs the actual event handling.
|
* Performs the actual event handling.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void onEvent(long id, String type, JSONObject data) throws JSONException {
|
public void onEvent(String type, JSONObject data) throws JSONException {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case "DeviceRejected":
|
case "DeviceRejected":
|
||||||
String deviceId = data.getString("device");
|
String deviceId = data.getString("device");
|
||||||
|
@ -159,7 +159,7 @@ public class EventProcessor implements SyncthingService.OnWebGuiAvailableListene
|
||||||
final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
|
final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
|
||||||
|
|
||||||
//noinspection CommitPrefEdits
|
//noinspection CommitPrefEdits
|
||||||
sp.edit().putLong(PREF_LAST_SYNC_ID, mLastEventId).commit();
|
sp.edit().putLong(PREF_LAST_SYNC_ID, mLastEventId).apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized (mMainThreadHandler) {
|
synchronized (mMainThreadHandler) {
|
||||||
|
|
|
@ -38,7 +38,7 @@ public class GetTask extends AsyncTask<String, Void, String> {
|
||||||
public static final String URI_REPORT = "/rest/svc/report";
|
public static final String URI_REPORT = "/rest/svc/report";
|
||||||
public static final String URI_EVENTS = "/rest/events";
|
public static final String URI_EVENTS = "/rest/events";
|
||||||
|
|
||||||
private String mHttpsCertPath;
|
private final String mHttpsCertPath;
|
||||||
|
|
||||||
public GetTask(String httpsCertPath) {
|
public GetTask(String httpsCertPath) {
|
||||||
mHttpsCertPath = httpsCertPath;
|
mHttpsCertPath = httpsCertPath;
|
||||||
|
|
|
@ -28,14 +28,14 @@ public abstract class PollWebGuiAvailableTask extends AsyncTask<String, Void, Vo
|
||||||
*/
|
*/
|
||||||
private static final long WEB_GUI_POLL_INTERVAL = 100;
|
private static final long WEB_GUI_POLL_INTERVAL = 100;
|
||||||
|
|
||||||
private String mHttpsCertPath;
|
private final String mHttpsCertPath;
|
||||||
|
|
||||||
public PollWebGuiAvailableTask(String httpsCertPath) {
|
public PollWebGuiAvailableTask(String httpsCertPath) {
|
||||||
mHttpsCertPath = httpsCertPath;
|
mHttpsCertPath = httpsCertPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param @url The URL of the web GUI (eg 127.0.0.1:8384).
|
* @param url The URL of the web GUI (eg 127.0.0.1:8384).
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected Void doInBackground(String... url) {
|
protected Void doInBackground(String... url) {
|
||||||
|
|
|
@ -22,7 +22,7 @@ public class PostConfigTask extends AsyncTask<String, Void, Boolean> {
|
||||||
|
|
||||||
public static final String URI_CONFIG = "/rest/system/config";
|
public static final String URI_CONFIG = "/rest/system/config";
|
||||||
|
|
||||||
private String mHttpsCertPath;
|
private final String mHttpsCertPath;
|
||||||
|
|
||||||
public PostConfigTask(String httpsCertPath) {
|
public PostConfigTask(String httpsCertPath) {
|
||||||
mHttpsCertPath = httpsCertPath;
|
mHttpsCertPath = httpsCertPath;
|
||||||
|
|
|
@ -26,7 +26,7 @@ public class PostScanTask extends AsyncTask<String, Void, Void> {
|
||||||
|
|
||||||
public static final String URI_SCAN = "/rest/db/scan";
|
public static final String URI_SCAN = "/rest/db/scan";
|
||||||
|
|
||||||
private String mHttpsCertPath;
|
private final String mHttpsCertPath;
|
||||||
|
|
||||||
public PostScanTask(String httpsCertPath) {
|
public PostScanTask(String httpsCertPath) {
|
||||||
mHttpsCertPath = httpsCertPath;
|
mHttpsCertPath = httpsCertPath;
|
||||||
|
|
|
@ -13,7 +13,6 @@ import android.util.Log;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
|
||||||
import com.google.gson.JsonSyntaxException;
|
import com.google.gson.JsonSyntaxException;
|
||||||
import com.google.gson.annotations.SerializedName;
|
import com.google.gson.annotations.SerializedName;
|
||||||
import com.nutomic.syncthingandroid.BuildConfig;
|
import com.nutomic.syncthingandroid.BuildConfig;
|
||||||
|
@ -170,7 +169,7 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener,
|
||||||
|
|
||||||
private String mVersion;
|
private String mVersion;
|
||||||
|
|
||||||
private String mUrl;
|
private final String mUrl;
|
||||||
|
|
||||||
private final String mApiKey;
|
private final String mApiKey;
|
||||||
|
|
||||||
|
@ -197,12 +196,12 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener,
|
||||||
* Stores the latest result of {@link #getModel(String, OnReceiveModelListener)} for each folder,
|
* Stores the latest result of {@link #getModel(String, OnReceiveModelListener)} for each folder,
|
||||||
* for calculating device percentage in {@link #getConnections(OnReceiveConnectionsListener)}.
|
* for calculating device percentage in {@link #getConnections(OnReceiveConnectionsListener)}.
|
||||||
*/
|
*/
|
||||||
private HashMap<String, Model> mCachedModelInfo = new HashMap<>();
|
private final HashMap<String, Model> mCachedModelInfo = new HashMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stores a hash map to resolve folders to paths for events.
|
* Stores a hash map to resolve folders to paths for events.
|
||||||
*/
|
*/
|
||||||
private final Map<String, String> mCacheFolderPathLookup = new HashMap<String, String>();
|
private final Map<String, String> mCacheFolderPathLookup = new HashMap<>();
|
||||||
|
|
||||||
public RestApi(Context context, String url, String apiKey, OnApiAvailableListener apiListener,
|
public RestApi(Context context, String url, String apiKey, OnApiAvailableListener apiListener,
|
||||||
OnConfigChangedListener configListener) {
|
OnConfigChangedListener configListener) {
|
||||||
|
@ -214,14 +213,10 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener,
|
||||||
mOnConfigChangedListener = configListener;
|
mOnConfigChangedListener = configListener;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setWebGuiUrl(String newUrl) {
|
|
||||||
mUrl = newUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Number of previous calls to {@link #tryIsAvailable()}.
|
* Number of previous calls to {@link #tryIsAvailable()}.
|
||||||
*/
|
*/
|
||||||
private AtomicInteger mAvailableCount = new AtomicInteger(0);
|
private final AtomicInteger mAvailableCount = new AtomicInteger(0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Number of asynchronous calls performed in {@link #onWebGuiAvailable()}.
|
* Number of asynchronous calls performed in {@link #onWebGuiAvailable()}.
|
||||||
|
@ -270,12 +265,9 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.execute(mUrl, GetTask.URI_CONFIG, mApiKey);
|
}.execute(mUrl, GetTask.URI_CONFIG, mApiKey);
|
||||||
getSystemInfo(new OnReceiveSystemInfoListener() {
|
getSystemInfo(info -> {
|
||||||
@Override
|
|
||||||
public void onReceiveSystemInfo(SystemInfo info) {
|
|
||||||
mLocalDeviceId = info.myID;
|
mLocalDeviceId = info.myID;
|
||||||
tryIsAvailable();
|
tryIsAvailable();
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -712,12 +704,10 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener,
|
||||||
* Called for each event.
|
* Called for each event.
|
||||||
*
|
*
|
||||||
* Events with a "folder" field in the data have an extra "folderpath" element added.
|
* Events with a "folder" field in the data have an extra "folderpath" element added.
|
||||||
*
|
|
||||||
* @param id ID of the event. Monotonously increasing.
|
|
||||||
* @param eventType Name of the event. (See Syncthing documentation)
|
* @param eventType Name of the event. (See Syncthing documentation)
|
||||||
* @param data Contains the data fields of the event.
|
* @param data Contains the data fields of the event.
|
||||||
*/
|
*/
|
||||||
void onEvent(long id, String eventType, JSONObject data) throws JSONException;
|
void onEvent(String eventType, JSONObject data) throws JSONException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called after all available events have been processed.
|
* Called after all available events have been processed.
|
||||||
|
@ -816,7 +806,7 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener,
|
||||||
data.put("folderpath", folderPath);
|
data.put("folderpath", folderPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
listener.onEvent(id, type, data);
|
listener.onEvent(type, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
listener.onDone(lastId);
|
listener.onDone(lastId);
|
||||||
|
@ -838,9 +828,7 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener,
|
||||||
public void editDevice(@NonNull final Device device, final Activity activity,
|
public void editDevice(@NonNull final Device device, final Activity activity,
|
||||||
final OnDeviceIdNormalizedListener listener) {
|
final OnDeviceIdNormalizedListener listener) {
|
||||||
normalizeDeviceId(device.deviceID,
|
normalizeDeviceId(device.deviceID,
|
||||||
new RestApi.OnDeviceIdNormalizedListener() {
|
(normalizedId, error) -> {
|
||||||
@Override
|
|
||||||
public void onDeviceIdNormalized(String normalizedId, String error) {
|
|
||||||
if (listener != null) listener.onDeviceIdNormalized(normalizedId, error);
|
if (listener != null) listener.onDeviceIdNormalized(normalizedId, error);
|
||||||
if (normalizedId == null)
|
if (normalizedId == null)
|
||||||
return;
|
return;
|
||||||
|
@ -848,7 +836,7 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener,
|
||||||
device.deviceID = normalizedId;
|
device.deviceID = normalizedId;
|
||||||
// If the device already exists, just update it.
|
// If the device already exists, just update it.
|
||||||
boolean create = true;
|
boolean create = true;
|
||||||
for (RestApi.Device n : getDevices(true)) {
|
for (Device n : getDevices(true)) {
|
||||||
if (n.deviceID.equals(device.deviceID)) {
|
if (n.deviceID.equals(device.deviceID)) {
|
||||||
create = false;
|
create = false;
|
||||||
}
|
}
|
||||||
|
@ -879,7 +867,6 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener,
|
||||||
Log.w(TAG, "Failed to read devices", e);
|
Log.w(TAG, "Failed to read devices", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -909,7 +896,7 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener,
|
||||||
/**
|
/**
|
||||||
* Updates or creates the given device.
|
* Updates or creates the given device.
|
||||||
*/
|
*/
|
||||||
public boolean editFolder(Folder folder, boolean create, Activity activity) {
|
public void editFolder(Folder folder, boolean create, Activity activity) {
|
||||||
try {
|
try {
|
||||||
JSONArray folders = mConfig.getJSONArray("folders");
|
JSONArray folders = mConfig.getJSONArray("folders");
|
||||||
JSONObject r = null;
|
JSONObject r = null;
|
||||||
|
@ -950,11 +937,10 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener,
|
||||||
requireRestart(activity);
|
requireRestart(activity);
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
Log.w(TAG, "Failed to edit folder " + folder.id + " at " + folder.path, e);
|
Log.w(TAG, "Failed to edit folder " + folder.id + " at " + folder.path, e);
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
clearFolderCache();
|
clearFolderCache();
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -42,7 +42,7 @@ public class SyncthingRunnable implements Runnable {
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
|
|
||||||
private String mSyncthingBinary;
|
private final String mSyncthingBinary;
|
||||||
|
|
||||||
private String[] mCommand;
|
private String[] mCommand;
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ public class SyncthingRunnable implements Runnable {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
|
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
|
||||||
int ret = 1;
|
int ret;
|
||||||
// Make sure Syncthing is executable
|
// Make sure Syncthing is executable
|
||||||
try {
|
try {
|
||||||
ProcessBuilder pb = new ProcessBuilder("chmod", "500", mSyncthingBinary);
|
ProcessBuilder pb = new ProcessBuilder("chmod", "500", mSyncthingBinary);
|
||||||
|
@ -313,9 +313,7 @@ public class SyncthingRunnable implements Runnable {
|
||||||
* @param saveLog True if the log should be stored to {@link #mErrorLog}.
|
* @param saveLog True if the log should be stored to {@link #mErrorLog}.
|
||||||
*/
|
*/
|
||||||
private Thread log(final InputStream is, final int priority, final boolean saveLog) {
|
private Thread log(final InputStream is, final int priority, final boolean saveLog) {
|
||||||
Thread t = new Thread(new Runnable() {
|
Thread t = new Thread(() -> {
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
try {
|
try {
|
||||||
InputStreamReader isr = new InputStreamReader(is, "UTF-8");
|
InputStreamReader isr = new InputStreamReader(is, "UTF-8");
|
||||||
BufferedReader br = new BufferedReader(isr);
|
BufferedReader br = new BufferedReader(isr);
|
||||||
|
@ -329,7 +327,6 @@ public class SyncthingRunnable implements Runnable {
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.w(TAG, "Failed to read Syncthing's command line output", e);
|
Log.w(TAG, "Failed to read Syncthing's command line output", e);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
t.start();
|
t.start();
|
||||||
return t;
|
return t;
|
||||||
|
|
|
@ -5,7 +5,6 @@ import android.app.NotificationManager;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.app.Service;
|
import android.app.Service;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.ContentResolver;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
|
@ -32,11 +31,9 @@ import java.io.FileInputStream;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.channels.FileChannel;
|
import java.nio.channels.FileChannel;
|
||||||
import java.security.SecureRandom;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.Set;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -107,7 +104,7 @@ public class SyncthingService extends Service implements
|
||||||
|
|
||||||
private EventProcessor mEventProcessor;
|
private EventProcessor mEventProcessor;
|
||||||
|
|
||||||
private LinkedList<FolderObserver> mObservers = new LinkedList<>();
|
private final LinkedList<FolderObserver> mObservers = new LinkedList<>();
|
||||||
|
|
||||||
private final SyncthingServiceBinder mBinder = new SyncthingServiceBinder(this);
|
private final SyncthingServiceBinder mBinder = new SyncthingServiceBinder(this);
|
||||||
|
|
||||||
|
@ -347,14 +344,10 @@ public class SyncthingService extends Service implements
|
||||||
}
|
}
|
||||||
|
|
||||||
mApi = new RestApi(SyncthingService.this, urlAndKey.first, urlAndKey.second,
|
mApi = new RestApi(SyncthingService.this, urlAndKey.first, urlAndKey.second,
|
||||||
new RestApi.OnApiAvailableListener() {
|
() -> {
|
||||||
@Override
|
|
||||||
public void onApiAvailable() {
|
|
||||||
mCurrentState = State.ACTIVE;
|
mCurrentState = State.ACTIVE;
|
||||||
onApiChange();
|
onApiChange();
|
||||||
new Thread(new Runnable() {
|
new Thread(() -> {
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
for (RestApi.Folder r : mApi.getFolders()) {
|
for (RestApi.Folder r : mApi.getFolders()) {
|
||||||
try {
|
try {
|
||||||
mObservers.add(new FolderObserver(mApi, r));
|
mObservers.add(new FolderObserver(mApi, r));
|
||||||
|
@ -368,15 +361,8 @@ public class SyncthingService extends Service implements
|
||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}).start();
|
}).start();
|
||||||
}
|
}, SyncthingService.this::onApiChange);
|
||||||
}, new RestApi.OnConfigChangedListener() {
|
|
||||||
@Override
|
|
||||||
public void onConfigChanged() {
|
|
||||||
onApiChange();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
mEventProcessor = new EventProcessor(SyncthingService.this, mApi);
|
mEventProcessor = new EventProcessor(SyncthingService.this, mApi);
|
||||||
|
|
||||||
|
@ -472,7 +458,7 @@ public class SyncthingService extends Service implements
|
||||||
* The listener is called immediately with the current state, and again whenever the state
|
* The listener is called immediately with the current state, and again whenever the state
|
||||||
* changes. The call is always from the GUI thread.
|
* changes. The call is always from the GUI thread.
|
||||||
*
|
*
|
||||||
* @see {@link #unregisterOnApiChangeListener}
|
* @see #unregisterOnApiChangeListener
|
||||||
*/
|
*/
|
||||||
public void registerOnApiChangeListener(OnApiChangeListener listener) {
|
public void registerOnApiChangeListener(OnApiChangeListener listener) {
|
||||||
// Make sure we don't send an invalid state or syncthing might show a "disabled" message
|
// Make sure we don't send an invalid state or syncthing might show a "disabled" message
|
||||||
|
@ -484,7 +470,7 @@ public class SyncthingService extends Service implements
|
||||||
/**
|
/**
|
||||||
* Unregisters a previously registered listener.
|
* Unregisters a previously registered listener.
|
||||||
*
|
*
|
||||||
* @see {@link #registerOnApiChangeListener}
|
* @see #registerOnApiChangeListener
|
||||||
*/
|
*/
|
||||||
public void unregisterOnApiChangeListener(OnApiChangeListener listener) {
|
public void unregisterOnApiChangeListener(OnApiChangeListener listener) {
|
||||||
mOnApiChangeListeners.remove(listener);
|
mOnApiChangeListeners.remove(listener);
|
||||||
|
|
|
@ -63,7 +63,7 @@ public class ConfigXml {
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
|
|
||||||
private File mConfigFile;
|
private final File mConfigFile;
|
||||||
|
|
||||||
private Document mConfig;
|
private Document mConfig;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.nutomic.syncthingandroid.util;
|
package com.nutomic.syncthingandroid.util;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import org.apache.http.conn.ssl.SSLSocketFactory;
|
import org.apache.http.conn.ssl.SSLSocketFactory;
|
||||||
|
@ -61,13 +62,14 @@ public class CustomX509TrustManager implements X509TrustManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String mHttpsCertPath;
|
private final String mHttpsCertPath;
|
||||||
|
|
||||||
public CustomX509TrustManager(String httpsCertPath) {
|
public CustomX509TrustManager(String httpsCertPath) {
|
||||||
mHttpsCertPath = httpsCertPath;
|
mHttpsCertPath = httpsCertPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressLint("TrustAllX509TrustManager")
|
||||||
public void checkClientTrusted(X509Certificate[] chain, String authType)
|
public void checkClientTrusted(X509Certificate[] chain, String authType)
|
||||||
throws CertificateException {
|
throws CertificateException {
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@ import android.util.Log;
|
||||||
import com.nutomic.syncthingandroid.syncthing.RestApi;
|
import com.nutomic.syncthingandroid.syncthing.RestApi;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FilenameFilter;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -35,7 +34,7 @@ public class FolderObserver extends FileObserver {
|
||||||
|
|
||||||
public class FolderNotExistingException extends Exception {
|
public class FolderNotExistingException extends Exception {
|
||||||
|
|
||||||
private String mPath;
|
private final String mPath;
|
||||||
|
|
||||||
public FolderNotExistingException(String path) {
|
public FolderNotExistingException(String path) {
|
||||||
mPath = path;
|
mPath = path;
|
||||||
|
@ -69,12 +68,7 @@ public class FolderObserver extends FileObserver {
|
||||||
if (!currentFolder.exists()) {
|
if (!currentFolder.exists()) {
|
||||||
throw new FolderNotExistingException(currentFolder.getAbsolutePath());
|
throw new FolderNotExistingException(currentFolder.getAbsolutePath());
|
||||||
}
|
}
|
||||||
File[] directories = currentFolder.listFiles(new FilenameFilter() {
|
File[] directories = currentFolder.listFiles((current, name) -> new File(current, name).isDirectory());
|
||||||
@Override
|
|
||||||
public boolean accept(File current, String name) {
|
|
||||||
return new File(current, name).isDirectory();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (directories != null) {
|
if (directories != null) {
|
||||||
for (File f : directories) {
|
for (File f : directories) {
|
||||||
|
|
|
@ -24,8 +24,8 @@ import static com.nutomic.syncthingandroid.syncthing.RestApi.readableFileSize;
|
||||||
public class FoldersAdapter extends ArrayAdapter<RestApi.Folder>
|
public class FoldersAdapter extends ArrayAdapter<RestApi.Folder>
|
||||||
implements RestApi.OnReceiveModelListener {
|
implements RestApi.OnReceiveModelListener {
|
||||||
|
|
||||||
private HashMap<String, RestApi.Model> mModels = new HashMap<>();
|
private final HashMap<String, RestApi.Model> mModels = new HashMap<>();
|
||||||
private LayoutInflater mInflater;
|
private final LayoutInflater mInflater;
|
||||||
|
|
||||||
public FoldersAdapter(Context context) {
|
public FoldersAdapter(Context context) {
|
||||||
super(context, R.layout.item_folder_list);
|
super(context, R.layout.item_folder_list);
|
||||||
|
|
|
@ -34,11 +34,9 @@ public class EnhancedEditText extends EditText {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onTouchEvent(MotionEvent event) {
|
public boolean onTouchEvent(MotionEvent event) {
|
||||||
if (isEnabled()) {
|
return (isEnabled())
|
||||||
return super.onTouchEvent(event);
|
? super.onTouchEvent(event)
|
||||||
} else {
|
: false;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -141,8 +141,6 @@
|
||||||
<string name="sync_only_charging">Само по време на зареждане</string>
|
<string name="sync_only_charging">Само по време на зареждане</string>
|
||||||
<string name="sync_only_wifi">Само чрез WiFi</string>
|
<string name="sync_only_wifi">Само чрез WiFi</string>
|
||||||
<string name="sync_only_wifi_ssids">Ограничаване до определени WiFi мрежи</string>
|
<string name="sync_only_wifi_ssids">Ограничаване до определени WiFi мрежи</string>
|
||||||
<string name="sync_only_wifi_ssids_all">Синхронизиране чрез всяка WiFi мрежа</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">Синхронизиране само чрез: %1$s</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">За да изберете мрежа, моля включете WiFi</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">За да изберете мрежа, моля включете WiFi</string>
|
||||||
<string name="advanced_folder_picker">Избор на папка, за напреднали</string>
|
<string name="advanced_folder_picker">Избор на папка, за напреднали</string>
|
||||||
<string name="advanced_folder_picker_summary">Изберете папка, от устройството, за синхронизиране</string>
|
<string name="advanced_folder_picker_summary">Изберете папка, от устройството, за синхронизиране</string>
|
||||||
|
|
|
@ -144,8 +144,6 @@ Všechny problémy, se kterými se setkáte, nahlašte prosím přes Github.</st
|
||||||
<string name="sync_only_charging">Synchronizovat pouze při nabíjení</string>
|
<string name="sync_only_charging">Synchronizovat pouze při nabíjení</string>
|
||||||
<string name="sync_only_wifi">Synchronizovat pouze přes wifi</string>
|
<string name="sync_only_wifi">Synchronizovat pouze přes wifi</string>
|
||||||
<string name="sync_only_wifi_ssids">Omezit na vybrané sítě wifi</string>
|
<string name="sync_only_wifi_ssids">Omezit na vybrané sítě wifi</string>
|
||||||
<string name="sync_only_wifi_ssids_all">Synchronizovat na všech wifi sítích</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">Synchronizovat pouze při připojení k: %1$s</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Pro výběr sítí prosím zapněte WiFi.</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Pro výběr sítí prosím zapněte WiFi.</string>
|
||||||
<string name="advanced_folder_picker">Použít rozšířený výběr adresáře</string>
|
<string name="advanced_folder_picker">Použít rozšířený výběr adresáře</string>
|
||||||
<string name="advanced_folder_picker_summary">Vyberte jakýkoliv adresář v přístroji pro synchronizaci</string>
|
<string name="advanced_folder_picker_summary">Vyberte jakýkoliv adresář v přístroji pro synchronizaci</string>
|
||||||
|
|
|
@ -142,8 +142,6 @@ Bitte auftretenden Probleme via Github melden.</string>
|
||||||
<string name="sync_only_charging">Sync nur mit Ladegerät</string>
|
<string name="sync_only_charging">Sync nur mit Ladegerät</string>
|
||||||
<string name="sync_only_wifi">Sync nur im WLAN</string>
|
<string name="sync_only_wifi">Sync nur im WLAN</string>
|
||||||
<string name="sync_only_wifi_ssids">Nur in bestimmten WLAN Netzwerken</string>
|
<string name="sync_only_wifi_ssids">Nur in bestimmten WLAN Netzwerken</string>
|
||||||
<string name="sync_only_wifi_ssids_all">Synchronisiere in allen WLAN Netzwerken</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">Synchronisiere nur in folgendem WLAN: %1$s</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Bitte WLAN aktivieren, um eines zu wählen.</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Bitte WLAN aktivieren, um eines zu wählen.</string>
|
||||||
<string name="advanced_folder_picker">Erweiterte Verzeichnisauswahl benutzen</string>
|
<string name="advanced_folder_picker">Erweiterte Verzeichnisauswahl benutzen</string>
|
||||||
<string name="advanced_folder_picker_summary">Alle Verzeichnisse auf dem Gerät für Synchronisation auswählbar</string>
|
<string name="advanced_folder_picker_summary">Alle Verzeichnisse auf dem Gerät für Synchronisation auswählbar</string>
|
||||||
|
|
|
@ -142,8 +142,6 @@ Por favor reporte cualquier problema que encuentre por medio de Github.</string>
|
||||||
<string name="sync_only_charging">Sincronizar sólo cuando se está cargando</string>
|
<string name="sync_only_charging">Sincronizar sólo cuando se está cargando</string>
|
||||||
<string name="sync_only_wifi">Sincronizar sólo por wifi</string>
|
<string name="sync_only_wifi">Sincronizar sólo por wifi</string>
|
||||||
<string name="sync_only_wifi_ssids">Restringir a ciertas redes wifi</string>
|
<string name="sync_only_wifi_ssids">Restringir a ciertas redes wifi</string>
|
||||||
<string name="sync_only_wifi_ssids_all">Sincronizar en todas las redes wifi</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">Sincronizar sólo cuando esté conectado a: %1$s</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Por favor encienda el WiFi para seleccionar redes.</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Por favor encienda el WiFi para seleccionar redes.</string>
|
||||||
<string name="advanced_folder_picker">Usar el avanzado Seleccionador de Carpetas</string>
|
<string name="advanced_folder_picker">Usar el avanzado Seleccionador de Carpetas</string>
|
||||||
<string name="advanced_folder_picker_summary">Seleccionar cualquier carpeta en el dispositivo para sincronizar</string>
|
<string name="advanced_folder_picker_summary">Seleccionar cualquier carpeta en el dispositivo para sincronizar</string>
|
||||||
|
|
|
@ -137,8 +137,6 @@ Por favor informe de qualquier problema que encuentres via Github.</string>
|
||||||
<string name="sync_only_charging">Sincronizar solo cuando esté cargando</string>
|
<string name="sync_only_charging">Sincronizar solo cuando esté cargando</string>
|
||||||
<string name="sync_only_wifi">Sincronizar sólo en wifi</string>
|
<string name="sync_only_wifi">Sincronizar sólo en wifi</string>
|
||||||
<string name="sync_only_wifi_ssids">Restringir a algunas redes wifi</string>
|
<string name="sync_only_wifi_ssids">Restringir a algunas redes wifi</string>
|
||||||
<string name="sync_only_wifi_ssids_all">Sincronizar en todas las redes wifi</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">Sincronizar solo cuando se está conectado a: %1$s</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Por favor enciende el WIFI en las redes seleccionadas.</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Por favor enciende el WIFI en las redes seleccionadas.</string>
|
||||||
<string name="advanced_folder_picker">Usar Selección Avanzada de carpeta</string>
|
<string name="advanced_folder_picker">Usar Selección Avanzada de carpeta</string>
|
||||||
<string name="advanced_folder_picker_summary">Escoja una carpeta del dispositivo para sincronizar</string>
|
<string name="advanced_folder_picker_summary">Escoja una carpeta del dispositivo para sincronizar</string>
|
||||||
|
|
|
@ -144,8 +144,6 @@ S\'il vous plait, signalez les problèmes que vous rencontrez via Gihub.</string
|
||||||
<string name="sync_only_charging">Synchro uniquement sur chargeur</string>
|
<string name="sync_only_charging">Synchro uniquement sur chargeur</string>
|
||||||
<string name="sync_only_wifi">Synchro uniquement en WiFi</string>
|
<string name="sync_only_wifi">Synchro uniquement en WiFi</string>
|
||||||
<string name="sync_only_wifi_ssids">Limiter à certains réseaux WiFi</string>
|
<string name="sync_only_wifi_ssids">Limiter à certains réseaux WiFi</string>
|
||||||
<string name="sync_only_wifi_ssids_all">Synchroniser sur tous réseaux WiFi</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">Synchroniser seulement si connecté à: %1$s</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">S\'il vous plait, activer le WiFi pour sélectionner un réseau</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">S\'il vous plait, activer le WiFi pour sélectionner un réseau</string>
|
||||||
<string name="advanced_folder_picker">Choix étendu des dossiers</string>
|
<string name="advanced_folder_picker">Choix étendu des dossiers</string>
|
||||||
<string name="advanced_folder_picker_summary">Autorise la sélection n\'importe quel dossier de cette machine pour la synchronisation</string>
|
<string name="advanced_folder_picker_summary">Autorise la sélection n\'importe quel dossier de cette machine pour la synchronisation</string>
|
||||||
|
|
|
@ -120,7 +120,6 @@
|
||||||
<string name="sync_only_charging">Csak töltés közbeni szinkronizálás</string>
|
<string name="sync_only_charging">Csak töltés közbeni szinkronizálás</string>
|
||||||
<string name="sync_only_wifi">Szinkronizálás csak WiFi-n keresztül</string>
|
<string name="sync_only_wifi">Szinkronizálás csak WiFi-n keresztül</string>
|
||||||
<string name="sync_only_wifi_ssids">Korlátozás bizonyos wifi hálózatokra</string>
|
<string name="sync_only_wifi_ssids">Korlátozás bizonyos wifi hálózatokra</string>
|
||||||
<string name="sync_only_wifi_ssids_all">Szinkronizálás minden wifi hálózaton</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Hálózat választásához kapcsold be a wifit.</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Hálózat választásához kapcsold be a wifit.</string>
|
||||||
<string name="use_root_title">Syncthing futtatása Superuser-ként</string>
|
<string name="use_root_title">Syncthing futtatása Superuser-ként</string>
|
||||||
<string name="notification_type_title">Értesítés</string>
|
<string name="notification_type_title">Értesítés</string>
|
||||||
|
|
|
@ -144,8 +144,6 @@ Riferisci tramite Github i problemi che incontri.</string>
|
||||||
<string name="sync_only_charging">Sincr. solo in Ricarica</string>
|
<string name="sync_only_charging">Sincr. solo in Ricarica</string>
|
||||||
<string name="sync_only_wifi">Sincr. solo in Wifi</string>
|
<string name="sync_only_wifi">Sincr. solo in Wifi</string>
|
||||||
<string name="sync_only_wifi_ssids">Solo determinate reti wifi</string>
|
<string name="sync_only_wifi_ssids">Solo determinate reti wifi</string>
|
||||||
<string name="sync_only_wifi_ssids_all">Sincronizzazione su tutte le reti wifi</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">Sincronizzazione solo quando connessi a: %1$s</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Prego accendere wifi per selezionare reti.</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Prego accendere wifi per selezionare reti.</string>
|
||||||
<string name="advanced_folder_picker">Selettore Cartella Avanzato</string>
|
<string name="advanced_folder_picker">Selettore Cartella Avanzato</string>
|
||||||
<string name="advanced_folder_picker_summary">Selezionare una cartella sul dispositivo per la sincronizzazione</string>
|
<string name="advanced_folder_picker_summary">Selezionare una cartella sul dispositivo per la sincronizzazione</string>
|
||||||
|
|
|
@ -144,8 +144,6 @@
|
||||||
<string name="sync_only_charging">充電中のみ同期</string>
|
<string name="sync_only_charging">充電中のみ同期</string>
|
||||||
<string name="sync_only_wifi">Wifi 時のみ同期</string>
|
<string name="sync_only_wifi">Wifi 時のみ同期</string>
|
||||||
<string name="sync_only_wifi_ssids">特定の WiFi ネットワークに制限する</string>
|
<string name="sync_only_wifi_ssids">特定の WiFi ネットワークに制限する</string>
|
||||||
<string name="sync_only_wifi_ssids_all">すべての WiFi ネットワークで共有する</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">%1$s に接続時のみ同期する</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">ネットワークを選択するために WiFi をオンにしてください。</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">ネットワークを選択するために WiFi をオンにしてください。</string>
|
||||||
<string name="advanced_folder_picker">高度なフォルダー選択を使用する</string>
|
<string name="advanced_folder_picker">高度なフォルダー選択を使用する</string>
|
||||||
<string name="advanced_folder_picker_summary">同期するデバイスのフォルダーを選択してください</string>
|
<string name="advanced_folder_picker_summary">同期するデバイスのフォルダーを選択してください</string>
|
||||||
|
|
|
@ -144,8 +144,6 @@
|
||||||
<string name="sync_only_charging">충전 중일 때만 동기화</string>
|
<string name="sync_only_charging">충전 중일 때만 동기화</string>
|
||||||
<string name="sync_only_wifi">Wi-Fi에서만 동기화</string>
|
<string name="sync_only_wifi">Wi-Fi에서만 동기화</string>
|
||||||
<string name="sync_only_wifi_ssids">특정 WI-FI 네트워크로 제한하기</string>
|
<string name="sync_only_wifi_ssids">특정 WI-FI 네트워크로 제한하기</string>
|
||||||
<string name="sync_only_wifi_ssids_all">모든 WI-FI 네트워크에서 동기화</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">%1$s에 연결되어 있을 때만 동기화</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">WI-FI를 활성화하고 네트워크를 선택해주세요.</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">WI-FI를 활성화하고 네트워크를 선택해주세요.</string>
|
||||||
<string name="advanced_folder_picker">고급 폴더 선택기 사용</string>
|
<string name="advanced_folder_picker">고급 폴더 선택기 사용</string>
|
||||||
<string name="advanced_folder_picker_summary">기기에서 동기화에 사용할 폴더를 골라 주세요</string>
|
<string name="advanced_folder_picker_summary">기기에서 동기화에 사용할 폴더를 골라 주세요</string>
|
||||||
|
|
|
@ -144,8 +144,6 @@ Vennligst rapporter eventuelle problemer som oppstår via GitHub.</string>
|
||||||
<string name="sync_only_charging">Synkroniser kun ved lading</string>
|
<string name="sync_only_charging">Synkroniser kun ved lading</string>
|
||||||
<string name="sync_only_wifi">Synkroniser kun over WiFi</string>
|
<string name="sync_only_wifi">Synkroniser kun over WiFi</string>
|
||||||
<string name="sync_only_wifi_ssids">Begrens til visse wifi-nettverk</string>
|
<string name="sync_only_wifi_ssids">Begrens til visse wifi-nettverk</string>
|
||||||
<string name="sync_only_wifi_ssids_all">Synkroniser på alle wifi-nettverk</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">Synkroniser bare når koblet til: %1$s</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Vennligst skru på WiFi for å velge nettverk.</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Vennligst skru på WiFi for å velge nettverk.</string>
|
||||||
<string name="advanced_folder_picker">Bruk avansert mappevelger</string>
|
<string name="advanced_folder_picker">Bruk avansert mappevelger</string>
|
||||||
<string name="advanced_folder_picker_summary">Velg en mappe på enheten for synkronisering</string>
|
<string name="advanced_folder_picker_summary">Velg en mappe på enheten for synkronisering</string>
|
||||||
|
|
|
@ -144,8 +144,6 @@ Gelieve alle problemen die je tegenkomt via GitHub te melden.</string>
|
||||||
<string name="sync_only_charging">Synchroniseer alleen tijdens opladen</string>
|
<string name="sync_only_charging">Synchroniseer alleen tijdens opladen</string>
|
||||||
<string name="sync_only_wifi">Synchroniseer alleen via Wi-Fi</string>
|
<string name="sync_only_wifi">Synchroniseer alleen via Wi-Fi</string>
|
||||||
<string name="sync_only_wifi_ssids">Tot bepaalde Wi-Fi-netwerken beperken</string>
|
<string name="sync_only_wifi_ssids">Tot bepaalde Wi-Fi-netwerken beperken</string>
|
||||||
<string name="sync_only_wifi_ssids_all">Synchroniseer op alle Wi-Fi-netwerken</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">Louter synchroniseren terwijl verbonden met: %1$s</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Wi-Fi aanzetten t.b.v. netwerkselectie.</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Wi-Fi aanzetten t.b.v. netwerkselectie.</string>
|
||||||
<string name="advanced_folder_picker">Gebruik geavanceerd map-kiezer</string>
|
<string name="advanced_folder_picker">Gebruik geavanceerd map-kiezer</string>
|
||||||
<string name="advanced_folder_picker_summary">Selecteer een map op het toestel om te synchroniseren</string>
|
<string name="advanced_folder_picker_summary">Selecteer een map op het toestel om te synchroniseren</string>
|
||||||
|
|
|
@ -144,8 +144,6 @@ Om du skulle støyte på problem, ver snill å rapportere dei via Github.</strin
|
||||||
<string name="sync_only_charging">Synkroniser berre mens eg laddar</string>
|
<string name="sync_only_charging">Synkroniser berre mens eg laddar</string>
|
||||||
<string name="sync_only_wifi">Synkroniser berre over WiFi</string>
|
<string name="sync_only_wifi">Synkroniser berre over WiFi</string>
|
||||||
<string name="sync_only_wifi_ssids">Avgrens til visse WiFi-nettverk</string>
|
<string name="sync_only_wifi_ssids">Avgrens til visse WiFi-nettverk</string>
|
||||||
<string name="sync_only_wifi_ssids_all">Synkroniser på alle WiFi-nettverk</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">Synkroniser berre på: %1$s</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Skru på WiFi for å velje nettverk.</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Skru på WiFi for å velje nettverk.</string>
|
||||||
<string name="advanced_folder_picker">Bruk avansert mappeveljar</string>
|
<string name="advanced_folder_picker">Bruk avansert mappeveljar</string>
|
||||||
<string name="advanced_folder_picker_summary">Vel kva mappe som helst for synkronisering</string>
|
<string name="advanced_folder_picker_summary">Vel kva mappe som helst for synkronisering</string>
|
||||||
|
|
|
@ -143,8 +143,6 @@ Proszę zgłaszać błędy programu w serwisie Github.</string>
|
||||||
<string name="sync_only_charging">Synchronizowanie tylko podczas ładowania</string>
|
<string name="sync_only_charging">Synchronizowanie tylko podczas ładowania</string>
|
||||||
<string name="sync_only_wifi">Synchronizowanie tylko przy użyciu Wi-Fi</string>
|
<string name="sync_only_wifi">Synchronizowanie tylko przy użyciu Wi-Fi</string>
|
||||||
<string name="sync_only_wifi_ssids">Ogranicz do określonych sieci WiFi</string>
|
<string name="sync_only_wifi_ssids">Ogranicz do określonych sieci WiFi</string>
|
||||||
<string name="sync_only_wifi_ssids_all">Synchronizowanie przy użyciu wszystkich sieci wifi</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">Synchronizuj jedynie gdy połączono z: %1$s</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Proszę włącz WiFi dla wybranych sieci</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Proszę włącz WiFi dla wybranych sieci</string>
|
||||||
<string name="advanced_folder_picker">Zaawansowane wybieranie katalogów</string>
|
<string name="advanced_folder_picker">Zaawansowane wybieranie katalogów</string>
|
||||||
<string name="advanced_folder_picker_summary">Wskazuje dowolny katalog na urządzeniu do zsynchronizowania</string>
|
<string name="advanced_folder_picker_summary">Wskazuje dowolny katalog na urządzeniu do zsynchronizowania</string>
|
||||||
|
|
|
@ -144,8 +144,6 @@ Por favor, informe-nos sobre quaisquer problemas via Github.</string>
|
||||||
<string name="sync_only_charging">Somente durante o carregamento</string>
|
<string name="sync_only_charging">Somente durante o carregamento</string>
|
||||||
<string name="sync_only_wifi">Somente conectado ao WiFi</string>
|
<string name="sync_only_wifi">Somente conectado ao WiFi</string>
|
||||||
<string name="sync_only_wifi_ssids">Limitar a certas redes WiFi</string>
|
<string name="sync_only_wifi_ssids">Limitar a certas redes WiFi</string>
|
||||||
<string name="sync_only_wifi_ssids_all">Sincronizar em todas as redes WiFi</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">Sincronizar somente quando conectado a %1$s</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Ligue o WiFi para selecionar as redes</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Ligue o WiFi para selecionar as redes</string>
|
||||||
<string name="advanced_folder_picker">Usar seletor de pasta avançado</string>
|
<string name="advanced_folder_picker">Usar seletor de pasta avançado</string>
|
||||||
<string name="advanced_folder_picker_summary">Selecione qualquer pasta do dispositivo para sincronização</string>
|
<string name="advanced_folder_picker_summary">Selecione qualquer pasta do dispositivo para sincronização</string>
|
||||||
|
|
|
@ -143,8 +143,6 @@
|
||||||
<string name="sync_only_charging">Синхронизация только во время зарядки</string>
|
<string name="sync_only_charging">Синхронизация только во время зарядки</string>
|
||||||
<string name="sync_only_wifi">Синхронизация только по WIFI</string>
|
<string name="sync_only_wifi">Синхронизация только по WIFI</string>
|
||||||
<string name="sync_only_wifi_ssids">Ограничить определёнными wifi сетями</string>
|
<string name="sync_only_wifi_ssids">Ограничить определёнными wifi сетями</string>
|
||||||
<string name="sync_only_wifi_ssids_all">Синхронизировать в любых wifi сетях</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">Синхронизировать только в: %1$s</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Включите WiFi, чтобы выбрать сети</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Включите WiFi, чтобы выбрать сети</string>
|
||||||
<string name="advanced_folder_picker">Использовать продвинутый выбор папок</string>
|
<string name="advanced_folder_picker">Использовать продвинутый выбор папок</string>
|
||||||
<string name="advanced_folder_picker_summary">Выберите любую папку на устройстве для синхронизации</string>
|
<string name="advanced_folder_picker_summary">Выберите любую папку на устройстве для синхронизации</string>
|
||||||
|
|
|
@ -144,8 +144,6 @@ Vänligen rapportera eventuella problem du stöter på via Github.</string>
|
||||||
<string name="sync_only_charging">Synkronisera endast vid laddning</string>
|
<string name="sync_only_charging">Synkronisera endast vid laddning</string>
|
||||||
<string name="sync_only_wifi">Synkronisera endast trådlöst</string>
|
<string name="sync_only_wifi">Synkronisera endast trådlöst</string>
|
||||||
<string name="sync_only_wifi_ssids">Begränsa till vissa WiFi-nätverk</string>
|
<string name="sync_only_wifi_ssids">Begränsa till vissa WiFi-nätverk</string>
|
||||||
<string name="sync_only_wifi_ssids_all">Synkronisera på alla WiFi-nätverk</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">Synkronisera endast när den är ansluten till: %1$s</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Sätt på WiFi för att välja nätverk.</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Sätt på WiFi för att välja nätverk.</string>
|
||||||
<string name="advanced_folder_picker">Använd avancerad katalogväljare</string>
|
<string name="advanced_folder_picker">Använd avancerad katalogväljare</string>
|
||||||
<string name="advanced_folder_picker_summary">Välj någon katalog på enheten för synkronisering</string>
|
<string name="advanced_folder_picker_summary">Välj någon katalog på enheten för synkronisering</string>
|
||||||
|
|
|
@ -144,8 +144,6 @@ Vänligen rapportera eventuella problem du stöter på via Github.</string>
|
||||||
<string name="sync_only_charging">Synkronisera endast vid laddning</string>
|
<string name="sync_only_charging">Synkronisera endast vid laddning</string>
|
||||||
<string name="sync_only_wifi">Synkronisera endast trådlöst</string>
|
<string name="sync_only_wifi">Synkronisera endast trådlöst</string>
|
||||||
<string name="sync_only_wifi_ssids">Begränsa till vissa WiFi-nätverk</string>
|
<string name="sync_only_wifi_ssids">Begränsa till vissa WiFi-nätverk</string>
|
||||||
<string name="sync_only_wifi_ssids_all">Synkronisera på alla WiFi-nätverk</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">Synkronisera endast när den är ansluten till: %1$s</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Slå på WiFi för att välja nätverk.</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Slå på WiFi för att välja nätverk.</string>
|
||||||
<string name="advanced_folder_picker">Använd avancerade katalogväljaren</string>
|
<string name="advanced_folder_picker">Använd avancerade katalogväljaren</string>
|
||||||
<string name="advanced_folder_picker_summary">Välj någon katalog på enheten för synkronisering</string>
|
<string name="advanced_folder_picker_summary">Välj någon katalog på enheten för synkronisering</string>
|
||||||
|
|
|
@ -137,8 +137,6 @@ Lütfen, herhangi bir sorunla karşılaştığınızda Github üzerinden bildiri
|
||||||
<string name="sync_only_charging">Sadece şarj edilirken eşzamanlama yap</string>
|
<string name="sync_only_charging">Sadece şarj edilirken eşzamanlama yap</string>
|
||||||
<string name="sync_only_wifi">Sadece kablosuz ağ üzerindeyken eşzamanlama yap</string>
|
<string name="sync_only_wifi">Sadece kablosuz ağ üzerindeyken eşzamanlama yap</string>
|
||||||
<string name="sync_only_wifi_ssids">Belirlenmiş kablosuz ağlarla sınırlandır.</string>
|
<string name="sync_only_wifi_ssids">Belirlenmiş kablosuz ağlarla sınırlandır.</string>
|
||||||
<string name="sync_only_wifi_ssids_all">Herhangi bir kablosuz ağ üzerindeyken eşzamanlama yap</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">Sadece %1$s\'e bağlıyken eşzamanlama yap</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Ağ seçmek için lütfen kablosuz bağlantınızı açın.</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Ağ seçmek için lütfen kablosuz bağlantınızı açın.</string>
|
||||||
<string name="advanced_folder_picker">Gelişmiş Klasör Seçici Kullan</string>
|
<string name="advanced_folder_picker">Gelişmiş Klasör Seçici Kullan</string>
|
||||||
<string name="advanced_folder_picker_summary">Eşzamanlama yapmak için cihazdan herhangi bir klasör seçin</string>
|
<string name="advanced_folder_picker_summary">Eşzamanlama yapmak için cihazdan herhangi bir klasör seçin</string>
|
||||||
|
|
|
@ -142,8 +142,6 @@ Xin báo cáo mọi vấn đề phát sinh thông qua Github.</string>
|
||||||
<string name="sync_only_charging">Chỉ đ.bộ khi sạc pin</string>
|
<string name="sync_only_charging">Chỉ đ.bộ khi sạc pin</string>
|
||||||
<string name="sync_only_wifi">Chỉ đ.bộ khi dùng wifi</string>
|
<string name="sync_only_wifi">Chỉ đ.bộ khi dùng wifi</string>
|
||||||
<string name="sync_only_wifi_ssids">Hạn chế với vài mạng wifi nhất định</string>
|
<string name="sync_only_wifi_ssids">Hạn chế với vài mạng wifi nhất định</string>
|
||||||
<string name="sync_only_wifi_ssids_all">Đồng bộ trên t.cả mạng wifi</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">Chỉ đồng bộ khi kết nối đến: %1$s</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Hãy bật WiFi để lựa chọn mạng.</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Hãy bật WiFi để lựa chọn mạng.</string>
|
||||||
<string name="advanced_folder_picker">S.dụng trình chọn th.mục nâng cao</string>
|
<string name="advanced_folder_picker">S.dụng trình chọn th.mục nâng cao</string>
|
||||||
<string name="advanced_folder_picker_summary">Chọn bất kỳ th.mục nào trên th.bị để đồng bộ</string>
|
<string name="advanced_folder_picker_summary">Chọn bất kỳ th.mục nào trên th.bị để đồng bộ</string>
|
||||||
|
|
|
@ -144,8 +144,6 @@
|
||||||
<string name="sync_only_charging">仅在充电时同步</string>
|
<string name="sync_only_charging">仅在充电时同步</string>
|
||||||
<string name="sync_only_wifi">仅在无线网络下同步</string>
|
<string name="sync_only_wifi">仅在无线网络下同步</string>
|
||||||
<string name="sync_only_wifi_ssids">对某些无线网络下限制同步</string>
|
<string name="sync_only_wifi_ssids">对某些无线网络下限制同步</string>
|
||||||
<string name="sync_only_wifi_ssids_all">在所有网络环境下同步</string>
|
|
||||||
<string name="sync_only_wifi_ssids_values">仅当连接到 %1$s 网络中才进行同步</string>
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">请打开无线网络连接并选择网络</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">请打开无线网络连接并选择网络</string>
|
||||||
<string name="advanced_folder_picker">使用高级文件夹选择器</string>
|
<string name="advanced_folder_picker">使用高级文件夹选择器</string>
|
||||||
<string name="advanced_folder_picker_summary">可以选择设备上任何文件夹</string>
|
<string name="advanced_folder_picker_summary">可以选择设备上任何文件夹</string>
|
||||||
|
|
|
@ -237,10 +237,6 @@ Please report any problems you encounter via Github.</string>
|
||||||
|
|
||||||
<string name="sync_only_wifi_ssids">Restrict to certain wifi networks</string>
|
<string name="sync_only_wifi_ssids">Restrict to certain wifi networks</string>
|
||||||
|
|
||||||
<string name="sync_only_wifi_ssids_all">Sync on all wifi networks</string>
|
|
||||||
|
|
||||||
<string name="sync_only_wifi_ssids_values">Sync only while connected to: %1$s</string>
|
|
||||||
|
|
||||||
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Please turn on WiFi to select networks.</string>
|
<string name="sync_only_wifi_ssids_wifi_turn_on_wifi">Please turn on WiFi to select networks.</string>
|
||||||
|
|
||||||
<string name="advanced_folder_picker">Use advanced Folder Picker</string>
|
<string name="advanced_folder_picker">Use advanced Folder Picker</string>
|
||||||
|
@ -406,6 +402,8 @@ Please report any problems you encounter via Github.</string>
|
||||||
<!-- Title of the "log Syncthing" menu button -->
|
<!-- Title of the "log Syncthing" menu button -->
|
||||||
<string name="log_syncthing_title">View Syncthing Log</string>
|
<string name="log_syncthing_title">View Syncthing Log</string>
|
||||||
|
|
||||||
|
<string name="retrieving_logs">Retrieving logs…</string>
|
||||||
|
|
||||||
<!-- Title of the "share log" menu button -->
|
<!-- Title of the "share log" menu button -->
|
||||||
<string name="share_title">Share</string>
|
<string name="share_title">Share</string>
|
||||||
|
|
||||||
|
|
|
@ -49,12 +49,7 @@ public class SyncthingServiceTest {
|
||||||
@Test
|
@Test
|
||||||
public void testBindService() throws InterruptedException {
|
public void testBindService() throws InterruptedException {
|
||||||
final CountDownLatch latch = new CountDownLatch(2);
|
final CountDownLatch latch = new CountDownLatch(2);
|
||||||
mService.registerOnWebGuiAvailableListener(new SyncthingService.OnWebGuiAvailableListener() {
|
mService.registerOnWebGuiAvailableListener(latch::countDown);
|
||||||
@Override
|
|
||||||
public void onWebGuiAvailable() {
|
|
||||||
latch.countDown();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
mService.registerOnApiChangeListener(new SyncthingService.OnApiChangeListener() {
|
mService.registerOnApiChangeListener(new SyncthingService.OnApiChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onApiChange(SyncthingService.State currentState) {
|
public void onApiChange(SyncthingService.State currentState) {
|
||||||
|
|
Loading…
Reference in a new issue