/* 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(); } } }