/*
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.fragment;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import com.swisscom.safeconnect.BuildConfig;
import com.swisscom.safeconnect.R;
import com.swisscom.safeconnect.activity.RegistrationActivity;
import com.swisscom.safeconnect.adapter.DeviceListAdapter;
import com.swisscom.safeconnect.backend.BackendConnector;
import com.swisscom.safeconnect.model.PlumberAuthResponse;
import com.swisscom.safeconnect.model.PlumberDevicesResponseList;
import com.swisscom.safeconnect.utils.Config;
import com.swisscom.safeconnect.utils.gcm.GcmManager;
import com.swisscom.safeconnect.view.PipeEditTextWithStatus;
import java.util.Locale;
/**
* Created by cianci on 17.04.14.
*/
public class SmsTokenFragment extends LogoFragment {
public static final String ARG_PHONE = "SmsTokenFragment.phone";
private PipeEditTextWithStatus etToken;
private Button btnSubmitToken;
private TextView tvHint;
private TextView tvPhoneNumberVerification;
private BackendConnector backendConnector;
private String authToken;
private int selectedIndexInDevicesDialog = 0;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.reg_sms_code, container, false);
etToken = (PipeEditTextWithStatus) v.findViewById(R.id.txt_sms_code);
btnSubmitToken = (Button) v.findViewById(R.id.btn_submit_code);
tvHint = (TextView) v.findViewById(R.id.tv_code_hint);
imgLogo = (ImageView) v.findViewById(R.id.img_logo);
tvPhoneNumberVerification = (TextView) v.findViewById(R.id.tv_phone_number_verification);
adjustLogoOnKeyboardShow(v);
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
backendConnector = new BackendConnector(getActivity());
btnSubmitToken.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(etToken.getWindowToken(), 0);
final String token = etToken.getText().toString();
if (isValidEntry(token)) {
runBackendConnection(token);
} else {
reportWrongToken();
}
}
});
tvPhoneNumberVerification.setText(Html.fromHtml(String.format(
getString(R.string.lab_sms_code_sent1), getArguments().getString(ARG_PHONE, ""))));
}
private void reportWrongToken() {
etToken.showErrorStatus();
tvHint.setText(R.string.lab_sms_code_hint_wrong);
tvPhoneNumberVerification.setText(R.string.lab_sms_code_sent_wrong);
}
public void runBackendConnection(final String token) {
etToken.showWaitingIndicator();
btnSubmitToken.setEnabled(false);
int tablet = (getResources().getBoolean(R.bool.isTablet) ? 1 : 0);
backendConnector.validateUser(Config.getInstance().getPhoneNumber(),
Config.getInstance().getDeviceId(), token, tablet, Locale.getDefault().getLanguage(),
new BackendConnector.ResponseCallback<PlumberAuthResponse>() {
@Override
public void onRequestComplete(int statusCode, PlumberAuthResponse response) {
btnSubmitToken.setEnabled(true);
etToken.resetStatus();
if (statusCode != 200 || response == null) {
if (statusCode == 401) {
reportWrongToken();
} else if (statusCode == 0) {
// connection fail
tvHint.setText(R.string.lab_sms_code_hint_no_conn);
tvPhoneNumberVerification.setText(R.string.lab_sms_code_no_connection);
}
} else {
switch (response.getStatus()) {
case SUCCESS:
finishRegistration(response);
break;
case MAX_DEVICES_REACHED:
etToken.showOkStatus();
// user must remove one device
authToken = response.getUserToken();
PipeDialogFragment dlg = new PipeDialogFragment();
dlg.setTitle(getString(R.string.auth_removal_dlg_info_title));
dlg.setMessage(getString(R.string.auth_removal_dlg_info_message));
dlg.setOnPositiveClickListener(new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showRemoveDeviceDlg();
}
});
dlg.show(getChildFragmentManager(), "dlg_remove_device_info");
break;
default:
reportWrongToken();
break;
}
}
}
}
);
}
private void finishRegistration(PlumberAuthResponse response) {
Config.getInstance().saveAuthToken(response.getUserToken());
new GcmManager(getActivity()).registerPlayServices();
etToken.showOkStatus();
((RegistrationActivity) getActivity()).loadDashboard();
}
private void showRemoveDeviceDlg() {
backendConnector.listRegisteredDevices(Config.getInstance().getPhoneNumber(),
Config.getInstance().getDeviceId(), new BackendConnector.ResponseCallback<PlumberDevicesResponseList>() {
@Override
public void onRequestComplete(int statusCode, final PlumberDevicesResponseList response) {
if (statusCode == 200) {
PipeDialogFragment dialog = new PipeDialogFragment();
dialog.setTitle(getString(R.string.auth_removal_dlg_rem_title));
dialog.setSelectionListener(new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
selectedIndexInDevicesDialog = which;
}
});
dialog.setListAdapter(new DeviceListAdapter(getActivity(), 0, response.getDevices()));
dialog.setCancelButton(true);
dialog.setOnPositiveClickListener(new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
final String targetDeviceId = response.getDevices()[selectedIndexInDevicesDialog].getDeviceId();
backendConnector.removeDevice(Config.getInstance().getPhoneNumber(),
Config.getInstance().getDeviceId(), authToken, targetDeviceId,
new BackendConnector.ResponseCallback<PlumberAuthResponse>() {
@Override
public void onRequestComplete(int statusCode, PlumberAuthResponse response) {
if (statusCode != 200 || response == null) {
if (BuildConfig.DEBUG) Log.e(Config.TAG, "error removing a device: " + statusCode);
tvHint.setText(R.string.lab_sms_code_hint_no_conn);
tvPhoneNumberVerification.setText(R.string.lab_sms_code_no_connection);
} else {
finishRegistration(response);
}
}
});
}
});
dialog.show(getChildFragmentManager(), "dlg_remove_device_list");
} else {
tvHint.setText(R.string.lab_sms_code_hint_no_conn);
tvPhoneNumberVerification.setText(R.string.lab_sms_code_no_connection);
}
}
});
}
public boolean isValidEntry(String token) {
try {
Integer.parseInt(token);
} catch (NumberFormatException e) {
return false;
}
if (token.length() != 5) {
return false;
}
return true;
}
}