mirror of
https://github.com/syncthing/syncthing-android.git
synced 2024-11-22 20:31:16 +00:00
Use Dagger to inject SharedPreferences
This commit is contained in:
parent
61d1119889
commit
e184c43c3a
12 changed files with 127 additions and 45 deletions
|
@ -33,6 +33,8 @@ dependencies {
|
||||||
compile 'com.annimon:stream:1.1.8'
|
compile 'com.annimon:stream:1.1.8'
|
||||||
compile 'com.android.volley:volley:1.0.0'
|
compile 'com.android.volley:volley:1.0.0'
|
||||||
compile 'com.android.support.constraint:constraint-layout:1.0.2'
|
compile 'com.android.support.constraint:constraint-layout:1.0.2'
|
||||||
|
compile "com.google.dagger:dagger:2.11"
|
||||||
|
annotationProcessor "com.google.dagger:dagger-compiler:2.11"
|
||||||
androidTestCompile 'com.android.support.test:rules:1.0.1'
|
androidTestCompile 'com.android.support.test:rules:1.0.1'
|
||||||
androidTestCompile 'com.android.support:support-annotations:26.1.0'
|
androidTestCompile 'com.android.support:support-annotations:26.1.0'
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.nutomic.syncthingandroid;
|
||||||
|
|
||||||
|
import com.nutomic.syncthingandroid.activities.FirstStartActivity;
|
||||||
|
import com.nutomic.syncthingandroid.activities.FolderPickerActivity;
|
||||||
|
import com.nutomic.syncthingandroid.activities.MainActivity;
|
||||||
|
import com.nutomic.syncthingandroid.service.DeviceStateHolder;
|
||||||
|
import com.nutomic.syncthingandroid.service.EventProcessor;
|
||||||
|
import com.nutomic.syncthingandroid.service.SyncthingRunnable;
|
||||||
|
import com.nutomic.syncthingandroid.service.SyncthingService;
|
||||||
|
import com.nutomic.syncthingandroid.util.Languages;
|
||||||
|
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
import dagger.Component;
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
@Component(modules = {SyncthingModule.class})
|
||||||
|
public interface DaggerComponent {
|
||||||
|
|
||||||
|
void inject(SyncthingApp app);
|
||||||
|
void inject(MainActivity activity);
|
||||||
|
void inject(FirstStartActivity activity);
|
||||||
|
void inject(FolderPickerActivity activity);
|
||||||
|
void inject(Languages languages);
|
||||||
|
void inject(SyncthingService service);
|
||||||
|
void inject(DeviceStateHolder deviceStateHolder);
|
||||||
|
void inject(EventProcessor eventProcessor);
|
||||||
|
void inject(SyncthingRunnable syncthingRunnable);
|
||||||
|
}
|
|
@ -5,11 +5,21 @@ import android.os.StrictMode;
|
||||||
|
|
||||||
import com.nutomic.syncthingandroid.util.Languages;
|
import com.nutomic.syncthingandroid.util.Languages;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
public class SyncthingApp extends Application {
|
public class SyncthingApp extends Application {
|
||||||
|
|
||||||
|
@Inject DaggerComponent mComponent;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
|
|
||||||
|
DaggerDaggerComponent.builder()
|
||||||
|
.syncthingModule(new SyncthingModule(this))
|
||||||
|
.build()
|
||||||
|
.inject(this);
|
||||||
|
|
||||||
new Languages(this).setLanguage(this);
|
new Languages(this).setLanguage(this);
|
||||||
|
|
||||||
// Set VM policy to avoid crash when sending folder URI to file manager.
|
// Set VM policy to avoid crash when sending folder URI to file manager.
|
||||||
|
@ -19,4 +29,8 @@ public class SyncthingApp extends Application {
|
||||||
.build();
|
.build();
|
||||||
StrictMode.setVmPolicy(policy);
|
StrictMode.setVmPolicy(policy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DaggerComponent component() {
|
||||||
|
return mComponent;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
package com.nutomic.syncthingandroid;
|
||||||
|
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
import dagger.Module;
|
||||||
|
import dagger.Provides;
|
||||||
|
|
||||||
|
@Module
|
||||||
|
public class SyncthingModule {
|
||||||
|
|
||||||
|
private final SyncthingApp mApp;
|
||||||
|
|
||||||
|
public SyncthingModule(SyncthingApp app) {
|
||||||
|
mApp = app;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
public SharedPreferences getPreferences() {
|
||||||
|
return PreferenceManager.getDefaultSharedPreferences(mApp);
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,7 +6,6 @@ import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.v4.app.ActivityCompat;
|
import android.support.v4.app.ActivityCompat;
|
||||||
import android.support.v4.content.ContextCompat;
|
import android.support.v4.content.ContextCompat;
|
||||||
|
@ -15,13 +14,16 @@ import android.widget.Button;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.nutomic.syncthingandroid.R;
|
import com.nutomic.syncthingandroid.R;
|
||||||
|
import com.nutomic.syncthingandroid.SyncthingApp;
|
||||||
import com.nutomic.syncthingandroid.service.SyncthingService;
|
import com.nutomic.syncthingandroid.service.SyncthingService;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
public class FirstStartActivity extends Activity implements Button.OnClickListener {
|
public class FirstStartActivity extends Activity implements Button.OnClickListener {
|
||||||
|
|
||||||
private static final int REQUEST_WRITE_STORAGE = 142;
|
private static final int REQUEST_WRITE_STORAGE = 142;
|
||||||
|
|
||||||
private SharedPreferences mPreferences;
|
@Inject SharedPreferences mPreferences;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles activity behaviour depending on {@link #isFirstStart()} and {@link #haveStoragePermission()}.
|
* Handles activity behaviour depending on {@link #isFirstStart()} and {@link #haveStoragePermission()}.
|
||||||
|
@ -29,8 +31,8 @@ public class FirstStartActivity extends Activity implements Button.OnClickListen
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
((SyncthingApp) getApplication()).component().inject(this);
|
||||||
startService(new Intent(this, SyncthingService.class));
|
startService(new Intent(this, SyncthingService.class));
|
||||||
mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
|
|
||||||
|
|
||||||
if (!isFirstStart()) {
|
if (!isFirstStart()) {
|
||||||
if (haveStoragePermission()) {
|
if (haveStoragePermission()) {
|
||||||
|
|
|
@ -11,7 +11,6 @@ import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.v4.content.ContextCompat;
|
import android.support.v4.content.ContextCompat;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
@ -29,6 +28,7 @@ import android.widget.Toast;
|
||||||
|
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import com.nutomic.syncthingandroid.R;
|
import com.nutomic.syncthingandroid.R;
|
||||||
|
import com.nutomic.syncthingandroid.SyncthingApp;
|
||||||
import com.nutomic.syncthingandroid.service.SyncthingService;
|
import com.nutomic.syncthingandroid.service.SyncthingService;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
@ -37,6 +37,8 @@ import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Activity that allows selecting a directory in the local file system.
|
* Activity that allows selecting a directory in the local file system.
|
||||||
*/
|
*/
|
||||||
|
@ -52,10 +54,9 @@ public class FolderPickerActivity extends SyncthingActivity
|
||||||
public static final int DIRECTORY_REQUEST_CODE = 234;
|
public static final int DIRECTORY_REQUEST_CODE = 234;
|
||||||
|
|
||||||
private ListView mListView;
|
private ListView mListView;
|
||||||
|
|
||||||
private FileAdapter mFilesAdapter;
|
private FileAdapter mFilesAdapter;
|
||||||
|
|
||||||
private RootsAdapter mRootsAdapter;
|
private RootsAdapter mRootsAdapter;
|
||||||
|
@Inject SharedPreferences mPreferences;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Location of null means that the list of roots is displayed.
|
* Location of null means that the list of roots is displayed.
|
||||||
|
@ -75,6 +76,7 @@ public class FolderPickerActivity extends SyncthingActivity
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
((SyncthingApp) getApplication()).component().inject(this);
|
||||||
|
|
||||||
setContentView(R.layout.activity_folder_picker);
|
setContentView(R.layout.activity_folder_picker);
|
||||||
mListView = findViewById(android.R.id.list);
|
mListView = findViewById(android.R.id.list);
|
||||||
|
@ -120,8 +122,7 @@ public class FolderPickerActivity extends SyncthingActivity
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add paths that might not be accessible to Syncthing.
|
// Add paths that might not be accessible to Syncthing.
|
||||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
|
if (mPreferences.getBoolean("advanced_folder_picker", false)) {
|
||||||
if (sp.getBoolean("advanced_folder_picker", false)) {
|
|
||||||
Collections.addAll(roots, new File("/storage/").listFiles());
|
Collections.addAll(roots, new File("/storage/").listFiles());
|
||||||
roots.add(new File("/"));
|
roots.add(new File("/"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,6 @@ import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.support.design.widget.TabLayout;
|
import android.support.design.widget.TabLayout;
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
|
@ -44,6 +43,7 @@ import android.widget.Toast;
|
||||||
|
|
||||||
import com.annimon.stream.function.Consumer;
|
import com.annimon.stream.function.Consumer;
|
||||||
import com.nutomic.syncthingandroid.R;
|
import com.nutomic.syncthingandroid.R;
|
||||||
|
import com.nutomic.syncthingandroid.SyncthingApp;
|
||||||
import com.nutomic.syncthingandroid.fragments.DeviceListFragment;
|
import com.nutomic.syncthingandroid.fragments.DeviceListFragment;
|
||||||
import com.nutomic.syncthingandroid.fragments.DrawerFragment;
|
import com.nutomic.syncthingandroid.fragments.DrawerFragment;
|
||||||
import com.nutomic.syncthingandroid.fragments.FolderListFragment;
|
import com.nutomic.syncthingandroid.fragments.FolderListFragment;
|
||||||
|
@ -54,6 +54,8 @@ import com.nutomic.syncthingandroid.util.Util;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import static java.lang.Math.min;
|
import static java.lang.Math.min;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -92,6 +94,7 @@ public class MainActivity extends StateDialogActivity
|
||||||
|
|
||||||
private ActionBarDrawerToggle mDrawerToggle;
|
private ActionBarDrawerToggle mDrawerToggle;
|
||||||
private DrawerLayout mDrawerLayout;
|
private DrawerLayout mDrawerLayout;
|
||||||
|
@Inject SharedPreferences mPreferences;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles various dialogs based on current state.
|
* Handles various dialogs based on current state.
|
||||||
|
@ -121,9 +124,8 @@ public class MainActivity extends StateDialogActivity
|
||||||
private void showBatteryOptimizationDialogIfNecessary() {
|
private void showBatteryOptimizationDialogIfNecessary() {
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
|
||||||
return;
|
return;
|
||||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
|
|
||||||
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
|
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
|
||||||
boolean dontShowAgain = sp.getBoolean("battery_optimization_dont_show_again", false);
|
boolean dontShowAgain = mPreferences.getBoolean("battery_optimization_dont_show_again", false);
|
||||||
if (dontShowAgain || mBatteryOptimizationsDialog != null ||
|
if (dontShowAgain || mBatteryOptimizationsDialog != null ||
|
||||||
pm.isIgnoringBatteryOptimizations(getPackageName()) ||
|
pm.isIgnoringBatteryOptimizations(getPackageName()) ||
|
||||||
mBatteryOptimizationDialogDismissed) {
|
mBatteryOptimizationDialogDismissed) {
|
||||||
|
@ -143,12 +145,12 @@ public class MainActivity extends StateDialogActivity
|
||||||
// crash reports).
|
// crash reports).
|
||||||
Log.w(TAG, "Request ignore battery optimizations not supported", e);
|
Log.w(TAG, "Request ignore battery optimizations not supported", e);
|
||||||
Toast.makeText(this, R.string.dialog_disable_battery_optimizations_not_supported, Toast.LENGTH_LONG).show();
|
Toast.makeText(this, R.string.dialog_disable_battery_optimizations_not_supported, Toast.LENGTH_LONG).show();
|
||||||
sp.edit().putBoolean("battery_optimization_dont_show_again", true).apply();
|
mPreferences.edit().putBoolean("battery_optimization_dont_show_again", true).apply();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.setNeutralButton(R.string.dialog_disable_battery_optimization_later, (d, i) -> mBatteryOptimizationDialogDismissed = true)
|
.setNeutralButton(R.string.dialog_disable_battery_optimization_later, (d, i) -> mBatteryOptimizationDialogDismissed = true)
|
||||||
.setNegativeButton(R.string.dialog_disable_battery_optimization_dont_show_again, (d, i) ->
|
.setNegativeButton(R.string.dialog_disable_battery_optimization_dont_show_again, (d, i) ->
|
||||||
sp.edit().putBoolean("battery_optimization_dont_show_again", true).apply())
|
mPreferences.edit().putBoolean("battery_optimization_dont_show_again", true).apply())
|
||||||
.setOnCancelListener(d -> mBatteryOptimizationDialogDismissed = true)
|
.setOnCancelListener(d -> mBatteryOptimizationDialogDismissed = true)
|
||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
|
@ -205,6 +207,7 @@ public class MainActivity extends StateDialogActivity
|
||||||
*/
|
*/
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
((SyncthingApp) getApplication()).component().inject(this);
|
||||||
|
|
||||||
setContentView(R.layout.activity_main);
|
setContentView(R.layout.activity_main);
|
||||||
mDrawerLayout = findViewById(R.id.drawer_layout);
|
mDrawerLayout = findViewById(R.id.drawer_layout);
|
||||||
|
|
|
@ -7,21 +7,19 @@ import android.content.IntentFilter;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.net.wifi.WifiInfo;
|
import android.net.wifi.WifiInfo;
|
||||||
import android.net.wifi.WifiManager;
|
import android.net.wifi.WifiManager;
|
||||||
import android.os.Build;
|
|
||||||
import android.os.PowerManager;
|
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.support.v4.content.LocalBroadcastManager;
|
import android.support.v4.content.LocalBroadcastManager;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.google.common.base.Joiner;
|
import com.nutomic.syncthingandroid.SyncthingApp;
|
||||||
import com.nutomic.syncthingandroid.receiver.BatteryReceiver;
|
import com.nutomic.syncthingandroid.receiver.BatteryReceiver;
|
||||||
import com.nutomic.syncthingandroid.receiver.NetworkReceiver;
|
import com.nutomic.syncthingandroid.receiver.NetworkReceiver;
|
||||||
import com.nutomic.syncthingandroid.receiver.PowerSaveModeChangedReceiver;
|
import com.nutomic.syncthingandroid.receiver.PowerSaveModeChangedReceiver;
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Holds information about the current wifi and charging state of the device.
|
* Holds information about the current wifi and charging state of the device.
|
||||||
*
|
*
|
||||||
|
@ -56,10 +54,10 @@ public class DeviceStateHolder {
|
||||||
}
|
}
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final SharedPreferences mPreferences;
|
|
||||||
private final LocalBroadcastManager mBroadcastManager;
|
private final LocalBroadcastManager mBroadcastManager;
|
||||||
private final DeviceStateChangedReceiver mReceiver = new DeviceStateChangedReceiver();
|
private final DeviceStateChangedReceiver mReceiver = new DeviceStateChangedReceiver();
|
||||||
private final OnDeviceStateChangedListener mListener;
|
private final OnDeviceStateChangedListener mListener;
|
||||||
|
@Inject SharedPreferences mPreferences;
|
||||||
|
|
||||||
private boolean mIsAllowedNetworkConnection = false;
|
private boolean mIsAllowedNetworkConnection = false;
|
||||||
private String mWifiSsid;
|
private String mWifiSsid;
|
||||||
|
@ -67,8 +65,8 @@ public class DeviceStateHolder {
|
||||||
private boolean mIsPowerSaving = true;
|
private boolean mIsPowerSaving = true;
|
||||||
|
|
||||||
public DeviceStateHolder(Context context, OnDeviceStateChangedListener listener) {
|
public DeviceStateHolder(Context context, OnDeviceStateChangedListener listener) {
|
||||||
|
((SyncthingApp) context.getApplicationContext()).component().inject(this);
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
|
|
||||||
mBroadcastManager = LocalBroadcastManager.getInstance(mContext);
|
mBroadcastManager = LocalBroadcastManager.getInstance(mContext);
|
||||||
mBroadcastManager.registerReceiver(mReceiver, new IntentFilter(ACTION_DEVICE_STATE_CHANGED));
|
mBroadcastManager.registerReceiver(mReceiver, new IntentFilter(ACTION_DEVICE_STATE_CHANGED));
|
||||||
mListener = listener;
|
mListener = listener;
|
||||||
|
|
|
@ -15,6 +15,7 @@ import android.util.Log;
|
||||||
|
|
||||||
import com.annimon.stream.Stream;
|
import com.annimon.stream.Stream;
|
||||||
import com.nutomic.syncthingandroid.R;
|
import com.nutomic.syncthingandroid.R;
|
||||||
|
import com.nutomic.syncthingandroid.SyncthingApp;
|
||||||
import com.nutomic.syncthingandroid.activities.DeviceActivity;
|
import com.nutomic.syncthingandroid.activities.DeviceActivity;
|
||||||
import com.nutomic.syncthingandroid.activities.FolderActivity;
|
import com.nutomic.syncthingandroid.activities.FolderActivity;
|
||||||
import com.nutomic.syncthingandroid.model.Device;
|
import com.nutomic.syncthingandroid.model.Device;
|
||||||
|
@ -24,6 +25,8 @@ import com.nutomic.syncthingandroid.model.Folder;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Run by the syncthing service to convert syncthing events into local broadcasts.
|
* Run by the syncthing service to convert syncthing events into local broadcasts.
|
||||||
*
|
*
|
||||||
|
@ -52,8 +55,10 @@ public class EventProcessor implements SyncthingService.OnWebGuiAvailableListene
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final RestApi mApi;
|
private final RestApi mApi;
|
||||||
|
@Inject SharedPreferences mPreferences;
|
||||||
|
|
||||||
public EventProcessor(Context context, RestApi api) {
|
public EventProcessor(Context context, RestApi api) {
|
||||||
|
((SyncthingApp) context.getApplicationContext()).component().inject(this);
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mApi = api;
|
mApi = api;
|
||||||
}
|
}
|
||||||
|
@ -62,8 +67,7 @@ public class EventProcessor implements SyncthingService.OnWebGuiAvailableListene
|
||||||
public void run() {
|
public void run() {
|
||||||
// Restore the last event id if the event processor may have been restartet.
|
// Restore the last event id if the event processor may have been restartet.
|
||||||
if (mLastEventId == 0) {
|
if (mLastEventId == 0) {
|
||||||
mLastEventId = PreferenceManager.getDefaultSharedPreferences(mContext)
|
mLastEventId = mPreferences.getLong(PREF_LAST_SYNC_ID, 0);
|
||||||
.getLong(PREF_LAST_SYNC_ID, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// First check if the event number ran backwards.
|
// First check if the event number ran backwards.
|
||||||
|
@ -163,10 +167,7 @@ public class EventProcessor implements SyncthingService.OnWebGuiAvailableListene
|
||||||
mLastEventId = id;
|
mLastEventId = id;
|
||||||
|
|
||||||
// Store the last EventId in case we get killed
|
// Store the last EventId in case we get killed
|
||||||
final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
|
mPreferences.edit().putLong(PREF_LAST_SYNC_ID, mLastEventId).apply();
|
||||||
|
|
||||||
//noinspection CommitPrefEdits
|
|
||||||
sp.edit().putLong(PREF_LAST_SYNC_ID, mLastEventId).apply();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized (mMainThreadHandler) {
|
synchronized (mMainThreadHandler) {
|
||||||
|
|
|
@ -9,7 +9,6 @@ import android.content.SharedPreferences;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.support.v4.app.NotificationCompat;
|
import android.support.v4.app.NotificationCompat;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
@ -17,6 +16,7 @@ import android.util.Log;
|
||||||
import com.google.common.base.Charsets;
|
import com.google.common.base.Charsets;
|
||||||
import com.google.common.io.Files;
|
import com.google.common.io.Files;
|
||||||
import com.nutomic.syncthingandroid.R;
|
import com.nutomic.syncthingandroid.R;
|
||||||
|
import com.nutomic.syncthingandroid.SyncthingApp;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.BufferedWriter;
|
import java.io.BufferedWriter;
|
||||||
|
@ -33,6 +33,8 @@ import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import eu.chainfire.libsuperuser.Shell;
|
import eu.chainfire.libsuperuser.Shell;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -55,7 +57,7 @@ public class SyncthingRunnable implements Runnable {
|
||||||
private final String mSyncthingBinary;
|
private final String mSyncthingBinary;
|
||||||
private String[] mCommand;
|
private String[] mCommand;
|
||||||
private final File mLogFile;
|
private final File mLogFile;
|
||||||
private final SharedPreferences mPreferences;
|
@Inject SharedPreferences mPreferences;
|
||||||
private final boolean mUseRoot;
|
private final boolean mUseRoot;
|
||||||
|
|
||||||
public enum Command {
|
public enum Command {
|
||||||
|
@ -70,10 +72,10 @@ public class SyncthingRunnable implements Runnable {
|
||||||
* @param command Which type of Syncthing command to execute.
|
* @param command Which type of Syncthing command to execute.
|
||||||
*/
|
*/
|
||||||
public SyncthingRunnable(Context context, Command command) {
|
public SyncthingRunnable(Context context, Command command) {
|
||||||
|
((SyncthingApp) context.getApplicationContext()).component().inject(this);
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mSyncthingBinary = mContext.getApplicationInfo().nativeLibraryDir + "/" + BINARY_NAME;
|
mSyncthingBinary = mContext.getApplicationInfo().nativeLibraryDir + "/" + BINARY_NAME;
|
||||||
mLogFile = new File(mContext.getExternalFilesDir(null), "syncthing.log");
|
mLogFile = new File(mContext.getExternalFilesDir(null), "syncthing.log");
|
||||||
mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
|
|
||||||
mUseRoot = mPreferences.getBoolean(SyncthingService.PREF_USE_ROOT, false) && Shell.SU.available();
|
mUseRoot = mPreferences.getBoolean(SyncthingService.PREF_USE_ROOT, false) && Shell.SU.available();
|
||||||
switch (command) {
|
switch (command) {
|
||||||
case generate:
|
case generate:
|
||||||
|
@ -93,7 +95,6 @@ public class SyncthingRunnable implements Runnable {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
trimLogFile();
|
trimLogFile();
|
||||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
|
|
||||||
int ret;
|
int ret;
|
||||||
// Make sure Syncthing is executable
|
// Make sure Syncthing is executable
|
||||||
try {
|
try {
|
||||||
|
@ -114,7 +115,7 @@ public class SyncthingRunnable implements Runnable {
|
||||||
if (wakeLock != null)
|
if (wakeLock != null)
|
||||||
wakeLock.acquire();
|
wakeLock.acquire();
|
||||||
|
|
||||||
HashMap<String, String> targetEnv = buildEnvironment(sp);
|
HashMap<String, String> targetEnv = buildEnvironment();
|
||||||
process = setupAndLaunch(targetEnv);
|
process = setupAndLaunch(targetEnv);
|
||||||
|
|
||||||
mSyncthing.set(process);
|
mSyncthing.set(process);
|
||||||
|
@ -373,11 +374,11 @@ public class SyncthingRunnable implements Runnable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private HashMap<String, String> buildEnvironment(SharedPreferences sp) {
|
private HashMap<String, String> buildEnvironment() {
|
||||||
HashMap<String, String> targetEnv = new HashMap<String, String>();
|
HashMap<String, String> targetEnv = new HashMap<String, String>();
|
||||||
// Set home directory to data folder for web GUI folder picker.
|
// Set home directory to data folder for web GUI folder picker.
|
||||||
targetEnv.put("HOME", Environment.getExternalStorageDirectory().getAbsolutePath());
|
targetEnv.put("HOME", Environment.getExternalStorageDirectory().getAbsolutePath());
|
||||||
targetEnv.put("STTRACE", sp.getString("sttrace", ""));
|
targetEnv.put("STTRACE", mPreferences.getString("sttrace", ""));
|
||||||
File externalFilesDir = mContext.getExternalFilesDir(null);
|
File externalFilesDir = mContext.getExternalFilesDir(null);
|
||||||
if (externalFilesDir != null)
|
if (externalFilesDir != null)
|
||||||
targetEnv.put("STGUIASSETS", externalFilesDir.getAbsolutePath() + "/gui");
|
targetEnv.put("STGUIASSETS", externalFilesDir.getAbsolutePath() + "/gui");
|
||||||
|
@ -386,13 +387,13 @@ public class SyncthingRunnable implements Runnable {
|
||||||
// Disable hash benchmark for faster startup.
|
// Disable hash benchmark for faster startup.
|
||||||
// https://github.com/syncthing/syncthing/issues/4348
|
// https://github.com/syncthing/syncthing/issues/4348
|
||||||
targetEnv.put("STHASHING", "minio");
|
targetEnv.put("STHASHING", "minio");
|
||||||
if (sp.getBoolean("use_tor", false)) {
|
if (mPreferences.getBoolean("use_tor", false)) {
|
||||||
targetEnv.put("all_proxy", "socks5://localhost:9050");
|
targetEnv.put("all_proxy", "socks5://localhost:9050");
|
||||||
targetEnv.put("ALL_PROXY_NO_FALLBACK", "1");
|
targetEnv.put("ALL_PROXY_NO_FALLBACK", "1");
|
||||||
}
|
}
|
||||||
if (sp.getBoolean("use_legacy_hashing", false))
|
if (mPreferences.getBoolean("use_legacy_hashing", false))
|
||||||
targetEnv.put("STHASHING", "standard");
|
targetEnv.put("STHASHING", "standard");
|
||||||
putCustomEnvironmentVariables(targetEnv, sp);
|
putCustomEnvironmentVariables(targetEnv, mPreferences);
|
||||||
return targetEnv;
|
return targetEnv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@ import com.android.PRNGFixes;
|
||||||
import com.annimon.stream.Stream;
|
import com.annimon.stream.Stream;
|
||||||
import com.google.common.io.Files;
|
import com.google.common.io.Files;
|
||||||
import com.nutomic.syncthingandroid.R;
|
import com.nutomic.syncthingandroid.R;
|
||||||
|
import com.nutomic.syncthingandroid.SyncthingApp;
|
||||||
import com.nutomic.syncthingandroid.activities.FirstStartActivity;
|
import com.nutomic.syncthingandroid.activities.FirstStartActivity;
|
||||||
import com.nutomic.syncthingandroid.http.PollWebGuiAvailableTask;
|
import com.nutomic.syncthingandroid.http.PollWebGuiAvailableTask;
|
||||||
import com.nutomic.syncthingandroid.model.Folder;
|
import com.nutomic.syncthingandroid.model.Folder;
|
||||||
|
@ -40,6 +41,8 @@ import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Holds the native syncthing instance and provides an API to access it.
|
* Holds the native syncthing instance and provides an API to access it.
|
||||||
*/
|
*/
|
||||||
|
@ -162,6 +165,8 @@ public class SyncthingService extends Service implements
|
||||||
|
|
||||||
private SyncthingRunnable mSyncthingRunnable;
|
private SyncthingRunnable mSyncthingRunnable;
|
||||||
|
|
||||||
|
@Inject SharedPreferences mPreferences;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles intents, either {@link #ACTION_RESTART}, or intents having
|
* Handles intents, either {@link #ACTION_RESTART}, or intents having
|
||||||
* {@link DeviceStateHolder#EXTRA_IS_ALLOWED_NETWORK_CONNECTION} or
|
* {@link DeviceStateHolder#EXTRA_IS_ALLOWED_NETWORK_CONNECTION} or
|
||||||
|
@ -220,9 +225,8 @@ public class SyncthingService extends Service implements
|
||||||
* {@link #PREF_NOTIFICATION_TYPE}.
|
* {@link #PREF_NOTIFICATION_TYPE}.
|
||||||
*/
|
*/
|
||||||
private void updateNotification() {
|
private void updateNotification() {
|
||||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
|
String type = mPreferences.getString(PREF_NOTIFICATION_TYPE, "low_priority");
|
||||||
String type = sp.getString(PREF_NOTIFICATION_TYPE, "low_priority");
|
boolean foreground = mPreferences.getBoolean(PREF_FOREGROUND_SERVICE, false);
|
||||||
boolean foreground = sp.getBoolean(PREF_FOREGROUND_SERVICE, false);
|
|
||||||
if ("none".equals(type) && foreground) {
|
if ("none".equals(type) && foreground) {
|
||||||
// foreground priority requires any notification
|
// foreground priority requires any notification
|
||||||
// so this ensures that we either have a "default" or "low_priority" notification,
|
// so this ensures that we either have a "default" or "low_priority" notification,
|
||||||
|
@ -276,6 +280,7 @@ public class SyncthingService extends Service implements
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
PRNGFixes.apply();
|
PRNGFixes.apply();
|
||||||
|
((SyncthingApp) getApplication()).component().inject(this);
|
||||||
|
|
||||||
mDeviceStateHolder = new DeviceStateHolder(SyncthingService.this, this::updateState);
|
mDeviceStateHolder = new DeviceStateHolder(SyncthingService.this, this::updateState);
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
|
@ -290,8 +295,7 @@ public class SyncthingService extends Service implements
|
||||||
new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
|
new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
|
||||||
}
|
}
|
||||||
updateState();
|
updateState();
|
||||||
PreferenceManager.getDefaultSharedPreferences(this)
|
mPreferences.registerOnSharedPreferenceChangeListener(this);
|
||||||
.registerOnSharedPreferenceChangeListener(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -383,8 +387,7 @@ public class SyncthingService extends Service implements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
|
mPreferences.unregisterOnSharedPreferenceChangeListener(this);
|
||||||
sp.unregisterOnSharedPreferenceChangeListener(this);
|
|
||||||
mDeviceStateHolder.shutdown();
|
mDeviceStateHolder.shutdown();
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
|
||||||
unregisterReceiver(mPowerSaveModeChangedReceiver);
|
unregisterReceiver(mPowerSaveModeChangedReceiver);
|
||||||
|
|
|
@ -13,6 +13,7 @@ import android.preference.PreferenceManager;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import com.nutomic.syncthingandroid.R;
|
import com.nutomic.syncthingandroid.R;
|
||||||
|
import com.nutomic.syncthingandroid.SyncthingApp;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
@ -22,6 +23,8 @@ import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Based on https://gitlab.com/fdroid/fdroidclient/blob/master/app/src/main/java/org/fdroid/fdroid/Languages.java
|
* Based on https://gitlab.com/fdroid/fdroidclient/blob/master/app/src/main/java/org/fdroid/fdroid/Languages.java
|
||||||
*/
|
*/
|
||||||
|
@ -32,7 +35,7 @@ public final class Languages {
|
||||||
private static final Locale DEFAULT_LOCALE;
|
private static final Locale DEFAULT_LOCALE;
|
||||||
public static final String PREFERENCE_LANGUAGE = "pref_current_language";
|
public static final String PREFERENCE_LANGUAGE = "pref_current_language";
|
||||||
|
|
||||||
private final SharedPreferences mPreferences;
|
@Inject SharedPreferences mPreferences;
|
||||||
private static Map<String, String> mAvailableLanguages;
|
private static Map<String, String> mAvailableLanguages;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
@ -40,6 +43,7 @@ public final class Languages {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Languages(Context context) {
|
public Languages(Context context) {
|
||||||
|
((SyncthingApp) context.getApplicationContext()).component().inject(this);
|
||||||
Map<String, String> tmpMap = new TreeMap<>();
|
Map<String, String> tmpMap = new TreeMap<>();
|
||||||
List<Locale> locales = Arrays.asList(LOCALES_TO_TEST);
|
List<Locale> locales = Arrays.asList(LOCALES_TO_TEST);
|
||||||
// Capitalize language names
|
// Capitalize language names
|
||||||
|
@ -56,7 +60,6 @@ public final class Languages {
|
||||||
/* SYSTEM_DEFAULT is a fake one for displaying in a chooser menu. */
|
/* SYSTEM_DEFAULT is a fake one for displaying in a chooser menu. */
|
||||||
tmpMap.put(USE_SYSTEM_DEFAULT, context.getString(R.string.pref_language_default));
|
tmpMap.put(USE_SYSTEM_DEFAULT, context.getString(R.string.pref_language_default));
|
||||||
mAvailableLanguages = Collections.unmodifiableMap(tmpMap);
|
mAvailableLanguages = Collections.unmodifiableMap(tmpMap);
|
||||||
mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue