/*
* Copyright (c) 2015 OpenSilk Productions LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package syncthing.android.ui.settings;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.MultiSelectListPreference;
import android.preference.Preference;
import android.preference.PreferenceCategory;
import android.preference.PreferenceFragment;
import android.view.Menu;
import android.view.MenuInflater;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.Toast;
import org.opensilk.common.core.mortar.DaggerService;
import org.opensilk.common.core.util.VersionUtils;
import java.io.File;
import java.util.List;
import java.util.Set;
import javax.inject.Inject;
import butterknife.ButterKnife;
import syncthing.android.R;
import syncthing.android.service.ConfigXml;
import syncthing.android.service.ReceiverHelper;
import syncthing.android.service.ServiceSettings;
import syncthing.android.service.SyncthingInstance;
import syncthing.android.service.SyncthingUtils;
import syncthing.android.ui.common.ActivityRequestCodes;
/**
* Created by drew on 3/21/15.
*/
public class ServiceSettingsFragment extends PreferenceFragment implements
Preference.OnPreferenceClickListener,
Preference.OnPreferenceChangeListener {
ListPreference runWhen;
CheckBoxPreference onlyOnWifi;
MultiSelectListPreference wifiNetwork;
CheckBoxPreference onlyCharging;
TimePreference scheduleStart;
TimePreference scheduleEnd;
PreferenceCategory catBetween;
Preference exportConfig;
Preference importConfig;
@Inject WifiManager mWifimanager;
@Inject ServiceSettings mSettings;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SettingsActivityComponent cmp = DaggerService.getDaggerComponent(getActivity());
cmp.inject(this);
mSettings.setCached(true);
addPreferencesFromResource(R.xml.prefs_service);
runWhen = (ListPreference) findPreference(ServiceSettings.RUN_WHEN);
runWhen.setPersistent(false);
runWhen.setValue(mSettings.runWhen());
runWhen.setOnPreferenceChangeListener(this);
onlyOnWifi = (CheckBoxPreference) findPreference(ServiceSettings.ONLY_WIFI);
onlyOnWifi.setPersistent(false);
onlyOnWifi.setChecked(mSettings.onlyOnWifi());
onlyOnWifi.setOnPreferenceChangeListener(this);
wifiNetwork = (MultiSelectListPreference) findPreference(ServiceSettings.WIFI_NETWORKS);
wifiNetwork.setPersistent(false);
String[] ssids = getWifiNetworks();
wifiNetwork.setEntries(ssids);
wifiNetwork.setEntryValues(ssids);
wifiNetwork.setValues(mSettings.allowedWifiNetworks());
wifiNetwork.setOnPreferenceChangeListener(this);
onlyCharging = (CheckBoxPreference) findPreference(ServiceSettings.ONLY_CHARGING);
onlyCharging.setPersistent(false);
onlyCharging.setChecked(mSettings.onlyWhenCharging());
onlyCharging.setOnPreferenceChangeListener(this);
catBetween = (PreferenceCategory) findPreference("cat_between");
hideShowRunWhenCategories(mSettings.runWhen());
scheduleStart = (TimePreference) findPreference(ServiceSettings.RANGE_START);
scheduleStart.setPersistent(false);
scheduleStart.setValue(mSettings.getScheduledStartTime());
scheduleStart.setOnPreferenceChangeListener(this);
scheduleEnd = (TimePreference) findPreference(ServiceSettings.RANGE_END);
scheduleEnd.setPersistent(false);
scheduleEnd.setValue(mSettings.getScheduledEndTime());
scheduleEnd.setOnPreferenceChangeListener(this);
exportConfig = findPreference("export");
exportConfig.setOnPreferenceClickListener(this);
importConfig = findPreference("import");
importConfig.setOnPreferenceClickListener(this);
}
@Override
public void onDestroy() {
super.onDestroy();
mSettings.release();
getActivity().startService(new Intent(getActivity(), SyncthingInstance.class).setAction(SyncthingInstance.REEVALUATE));
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.service_settings, menu);
boolean enabled = isEnabled();
getPreferenceScreen().setEnabled(enabled);
Switch enableSwitch = ButterKnife.findById(
menu.findItem(R.id.menu_enable_switch).getActionView(), R.id.action_widget_switch);
enableSwitch.setChecked(enabled);
enableSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
setEnabled(isChecked);
getPreferenceScreen().setEnabled(isChecked);
}
});
}
@TargetApi(Build.VERSION_CODES.KITKAT)
@Override
public boolean onPreferenceClick(Preference preference) {
if (preference == exportConfig) {
SyncthingUtils.exportConfig(getActivity());
return true;
} else if (preference == importConfig) {
final File[] availableExports = SyncthingUtils.listExportedConfigs(getActivity());
if (availableExports == null || availableExports.length == 0) {
showFilePicker();
} else {
String[] items = new String[availableExports.length];
for (int ii=0; ii<items.length; ii++) {
items[ii] = availableExports[ii].getName();
}
AlertDialog.Builder bob = new AlertDialog.Builder(getActivity())
.setTitle(R.string.import_config)
.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
File file = availableExports[which];
if(file.exists()) {
SyncthingUtils.importConfig(getActivity(), Uri.fromFile(file), false);
mSettings.setInitialized(ConfigXml.get(getActivity()) != null);
}
}
})
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(R.string.show_file_picker, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showFilePicker();
}
});
bob.show();
}
return true;
}
return false;
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (preference == runWhen) {
hideShowRunWhenCategories((String) newValue);
mSettings.setRunWhen((String) newValue);
} else if (preference == onlyOnWifi) {
mSettings.setOnlyOnWifi((Boolean) newValue);
} else if (preference == wifiNetwork) {
mSettings.setAllowedWifiNetworks((Set<String>) newValue);
} else if (preference == onlyCharging) {
mSettings.setOnlyWhenCharging((Boolean) newValue);
} else if (preference == scheduleStart) {
mSettings.setScheduledStartTime((String) newValue);
} else if (preference == scheduleEnd) {
mSettings.setScheduledEndTime((String) newValue);
}
return true;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == ActivityRequestCodes.IMPORT_CONFIG && resultCode == Activity.RESULT_OK) {
SyncthingUtils.importConfig(getActivity(), data.getData(), false);
mSettings.setInitialized(ConfigXml.get(getActivity()) != null);
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
void hideShowRunWhenCategories(String runwhen) {
switch (runwhen) {
case ServiceSettings.SCHEDULED:
catBetween.setEnabled(true);
break;
default:
catBetween.setEnabled(false);
break;
}
}
boolean isEnabled() {
return !mSettings.isDisabled();
}
void setEnabled(boolean enabled) {
mSettings.setEnabled(enabled);
getActivity().startService(new Intent(getActivity(), SyncthingInstance.class).setAction(SyncthingInstance.REEVALUATE));
}
String[] getWifiNetworks() {
List<WifiConfiguration> networks = mWifimanager.getConfiguredNetworks();
if (networks == null) {
return new String[0];
}
String[] ssids = new String[networks.size()];
for (int ii=0 ; ii<networks.size(); ii++) {
ssids[ii] = networks.get(ii).SSID;
}
return ssids;
}
void showFilePicker() {
Intent intent = new Intent();
intent.setType("application/zip");
intent.addCategory(Intent.CATEGORY_OPENABLE);
if (VersionUtils.hasKitkat()) {
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
} else {
intent = Intent.createChooser(
intent.setAction(Intent.ACTION_GET_CONTENT), "");
}
try {
startActivityForResult(intent, ActivityRequestCodes.IMPORT_CONFIG);
} catch (ActivityNotFoundException e) {
Toast.makeText(getActivity(), R.string.no_file_picker_found, Toast.LENGTH_LONG).show();
}
}
}