/*
Swisscom Safe Connect
Copyright (C) 2014 Swisscom
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 com.swisscom.safeconnect.activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceCategory;
import android.preference.PreferenceFragment;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import com.swisscom.safeconnect.BuildConfig;
import com.swisscom.safeconnect.R;
import com.swisscom.safeconnect.backend.BackendConnector;
import com.swisscom.safeconnect.fragment.VoucherDlgFragment;
import com.swisscom.safeconnect.model.PlumberAuthResponse;
import com.swisscom.safeconnect.model.PlumberDeviceResponse;
import com.swisscom.safeconnect.model.PlumberDevicesResponseList;
import com.swisscom.safeconnect.model.PlumberResponse;
import com.swisscom.safeconnect.utils.Config;
import com.swisscom.safeconnect.utils.DateProvider;
import com.swisscom.safeconnect.view.PipeListPreference;
import com.swisscom.safeconnect.view.PipePreference;
/**
* Created by cianci on 9/23/14.
*/
public class SettingsActivity extends PipeActivity {
public static class SettingsFragment extends PreferenceFragment
implements Preference.OnPreferenceClickListener, SharedPreferences.OnSharedPreferenceChangeListener {
private final static String KEY_REMOVE_ALL_DEVICES = "pref_key_remove_all";
private final static String KEY_DEVICE = "pref_key_device";
private final static String KEY_ABOUT = "pref_key_about";
private final static String KEY_TUTORIAL = "pref_key_tutorial";
private final static String KEY_VERSION = "pref_key_version";
private final static String KEY_WHATSNEW = "pref_key_whatsnew";
private final static String KEY_TERMS = "pref_key_termscond";
private final static String KEY_VOUCHER = "pref_key_voucher";
private final static String KEY_OTHER_APPS = "pref_key_other_apps";
private final static String KEY_OPEN_SOURCE = "pref_key_open_source";
private final static String KEY_SOURCE_CODE = "pref_key_source_code";
private final static String KEY_LOGOUT = "pref_key_logout";
private final static String KEY_TOOLBAR = "pref_toolbar";
private BackendConnector backendConnector;
private PipePreference prRemoveAll;
private PipeListPreference lprTrafficView;
private PipePreference prAbout;
private PipePreference prVersion;
private PipePreference prTutorial;
private PipePreference prWhatsnew;
private PipePreference prTermsCond;
private PipePreference prVoucher;
private PipePreference prOtherApps;
private PipePreference prOpenSource;
private PipePreference prSourceCode;
private PipePreference prLogout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
prRemoveAll = (PipePreference) findPreference(KEY_REMOVE_ALL_DEVICES);
prRemoveAll.setOnPreferenceClickListener(this);
lprTrafficView = (PipeListPreference) findPreference(Config.KEY_TRAFFIC_VIEW);
String summary = getResources().getStringArray(R.array.traffic_entries)
[Config.getInstance().getStatPeriod().ordinal()];
lprTrafficView.setSummary(summary);
prTutorial = (PipePreference) findPreference(KEY_TUTORIAL);
prTutorial.setOnPreferenceClickListener(this);
prAbout = (PipePreference) findPreference(KEY_ABOUT);
prAbout.setOnPreferenceClickListener(this);
prWhatsnew = (PipePreference) findPreference(KEY_WHATSNEW);
prWhatsnew.setOnPreferenceClickListener(this);
prTermsCond = (PipePreference) findPreference(KEY_TERMS);
prTermsCond.setOnPreferenceClickListener(this);
prVoucher = (PipePreference) findPreference(KEY_VOUCHER);
prVoucher.setOnPreferenceClickListener(this);
prOtherApps = (PipePreference) findPreference(KEY_OTHER_APPS);
prOtherApps.setOnPreferenceClickListener(this);
prOpenSource = (PipePreference) findPreference(KEY_OPEN_SOURCE);
prOpenSource.setOnPreferenceClickListener(this);
prSourceCode = (PipePreference) findPreference(KEY_SOURCE_CODE);
prSourceCode.setOnPreferenceClickListener(this);
prLogout = (PipePreference) findPreference(KEY_LOGOUT);
prLogout.setLogoutPref(true);
prLogout.setOnPreferenceClickListener(this);
prVersion = (PipePreference) findPreference(KEY_VERSION);
String version = "";
try {
PackageInfo info = getActivity().getPackageManager().getPackageInfo(getActivity().getPackageName(), 0);
version = info.versionName + " build " + info.versionCode;
} catch (PackageManager.NameNotFoundException e) {}
prVersion.setSummary(version);
backendConnector = new BackendConnector(getActivity());
}
@Override
public void onResume() {
super.onResume();
updateDevices();
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public boolean onPreferenceClick(Preference preference) {
String key = preference.getKey();
switch (preference.getKey()) {
case KEY_REMOVE_ALL_DEVICES:
showAlertDialog("");
return true;
case KEY_DEVICE:
showAlertDialog(((PipePreference) preference).getDeviceId());
return true;
case KEY_ABOUT:
startActivity(new Intent(getActivity(), AboutActivity.class));
return true;
case KEY_TUTORIAL:
Intent intent = new Intent(getActivity(), TutorialActivity.class);
intent.putExtra(TutorialActivity.KEY_INVOKED_FROM_MENU, true);
startActivity(intent);
return true;
case KEY_WHATSNEW:
startActivity(new Intent(getActivity(), WhatsnewActivity.class));
return true;
case KEY_TERMS:
startActivity(new Intent(getActivity(), TermsActivity.class));
return true;
case KEY_VOUCHER:
VoucherDlgFragment voucherDlg = new VoucherDlgFragment();
voucherDlg.show(getChildFragmentManager(), "vpn_dlg");
return true;
case KEY_OTHER_APPS:
startActivity(new Intent(getActivity(), OtherAppsActivity.class));
return true;
case KEY_OPEN_SOURCE:
startActivity(new Intent(getActivity(), OpenSourceActivity.class));
return true;
case KEY_SOURCE_CODE:
startActivity(new Intent(getActivity(), SourceCodeActivity.class));
return true;
case KEY_LOGOUT:
removeDevice(Config.getInstance().getDeviceId());
return true;
}
return false;
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Config.getInstance().onPreferencesUpdated();
String summary = getResources().getStringArray(R.array.traffic_entries)
[Config.getInstance().getStatPeriod().ordinal()];
lprTrafficView.setSummary(summary);
}
private void backToRegistrationActivity() {
SettingsFragment.this.getActivity().finish();
Intent mainIntent = new Intent(SettingsFragment.this.getActivity(), RegistrationActivity.class);
mainIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(mainIntent);
}
private void showAlertDialog(final String deviceId) {
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
if (!deviceId.equals(""))
removeDevice(deviceId);
else
removeAllDevices();
break;
case DialogInterface.BUTTON_NEGATIVE:
//No button clicked
break;
}
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity(), R.style.AppCompat_Pipe_Dialog_Alert);
builder.setMessage(R.string.pref_remove_devs_alert_title)
.setPositiveButton(android.R.string.yes, dialogClickListener)
.setNegativeButton(android.R.string.no, dialogClickListener)
.show();
}
private void removeAllDevices() {
backendConnector.removeAllDevices(Config.getInstance().getPhoneNumber(),
Config.getInstance().getDeviceId(), Config.getInstance().getAuthToken(),
new BackendConnector.ResponseCallback<PlumberResponse>() {
@Override
public void onRequestComplete(int statusCode, PlumberResponse response) {
//0 is handled like it worked, as the device gets disconnected and the response might not reach the client
if (statusCode == 200 || statusCode == 0) {
Config.getInstance().removeAuthToken();
//own device was removed, so go back to main activity
backToRegistrationActivity();
} else {
if (BuildConfig.DEBUG) Log.e(Config.TAG, "error removing all devices: " + statusCode);
}
}
});
}
private void removeDevice(final String targetDeviceId) {
backendConnector.removeDevice(Config.getInstance().getPhoneNumber(),
Config.getInstance().getDeviceId(), Config.getInstance().getAuthToken(), targetDeviceId,
new BackendConnector.ResponseCallback<PlumberAuthResponse>() {
@Override
public void onRequestComplete(int statusCode, PlumberAuthResponse response) {
//Worked && removed device was this one
//0 is handled like it worked, as the device gets disconnected and the response might not reach the client
if (targetDeviceId.equals(Config.getInstance().getDeviceId()) &&
(statusCode == 200 || statusCode == 0)) {
Config.getInstance().removeAuthToken();
backToRegistrationActivity();
}
//Error
else if (statusCode != 200 || response == null) {
if (BuildConfig.DEBUG) Log.e(Config.TAG, "error removing a device: " + statusCode);
}
//Worked && removed device was not this one
else {
Config.getInstance().saveAuthToken(response.getUserToken());
updateDevices();
}
}
});
}
private void updateDevices() {
final PreferenceCategory deviceCat = (PreferenceCategory) findPreference("pref_key_vpn_devices");
deviceCat.removeAll();
deviceCat.addPreference(prRemoveAll);
backendConnector.listRegisteredDevices(Config.getInstance().getPhoneNumber(),
Config.getInstance().getDeviceId(),
new BackendConnector.ResponseCallback<PlumberDevicesResponseList>() {
@Override
public void onRequestComplete(int statusCode, PlumberDevicesResponseList response) {
if (getActivity() == null) return;
if (statusCode != 200 || response == null) {
if (BuildConfig.DEBUG) Log.e(Config.TAG, "error listing all devices: " + statusCode);
} else {
for (int i = 0; i < response.getDevices().length; i++){
PlumberDeviceResponse device = response.getDevices()[i];
PipePreference devicePreference = new PipePreference(SettingsFragment.this.getActivity());
String title;
String deviceId = device.getDeviceId();
String summary;
if (deviceId.equals(Config.getInstance().getDeviceId())) {
summary = getString(R.string.lab_this_device);
} else {
summary = DateProvider.getFormattedDate(getActivity(), device.getLastSessionTime());
}
switch (device.getDeviceType()) {
case IOS:
title = "iOS ";
break;
case ANDROID:
title = "Android ";
break;
default:
title = "";
break;
}
if (device.isTablet()) {
title += getString(R.string.pref_tablet);
} else {
title += getString(R.string.pref_phone);
}
devicePreference.setKey(KEY_DEVICE);
devicePreference.setDeviceId(deviceId);
devicePreference.setTitle(title);
devicePreference.setSummary(summary);
devicePreference.setOrder(i);
devicePreference.setIcon(R.drawable.ic_list_delete);
devicePreference.setOnPreferenceClickListener(SettingsFragment.this);
deviceCat.addPreference(devicePreference);
}
prRemoveAll.setOrder(response.getDevices().length);
deviceCat.addPreference(prRemoveAll);
}
}
}
);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.one_fragment_and_toolbar, false);
initActionBar(this, R.string.settings, true);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.replace(R.id.content, new SettingsFragment(), "settings_fragment" )
.commit();
} else {
getFragmentManager().beginTransaction()
.replace(R.id.content, getFragmentManager().findFragmentByTag("settings_fragment"))
.commit();
}
}
}