/*
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.os.Bundle;
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.google.i18n.phonenumbers.PhoneNumberUtil;
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
import com.swisscom.safeconnect.R;
import com.swisscom.safeconnect.activity.RegistrationActivity;
import com.swisscom.safeconnect.backend.BackendConnector;
import com.swisscom.safeconnect.model.PlumberAuthResponse;
import com.swisscom.safeconnect.utils.Config;
import com.swisscom.safeconnect.view.PipeEditTextWithStatus;
import java.util.Locale;
/**
* Created by cianci on 17.04.14.
*/
public class RegisterFragment extends LogoFragment implements
PhoneCodesDialogFragment.PhoneCodesInterface {
private PipeEditTextWithStatus etPhoneNumber;
private Button btnRegisterPhone;
private TextView tvCountryCode;
private TextView tvRegInfo;
private BackendConnector backendConnector;
private int countryCode = 41;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View v = inflater.inflate(R.layout.reg_phone, container, false);
etPhoneNumber = (PipeEditTextWithStatus) v.findViewById(R.id.txt_phone);
btnRegisterPhone = (Button) v.findViewById(R.id.btn_register);
imgLogo = (ImageView) v.findViewById(R.id.img_logo);
tvCountryCode = (TextView) v.findViewById(R.id.tv_country_code);
tvRegInfo = (TextView) v.findViewById(R.id.tv_reg_info);
adjustLogoOnKeyboardShow(v);
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
backendConnector = new BackendConnector(getActivity());
btnRegisterPhone.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(etPhoneNumber.getWindowToken(), 0);
PhoneNumber phoneNumber = new PhoneNumber();
phoneNumber.setCountryCode(countryCode);
String enteredPhone = etPhoneNumber.getText().toString().replaceAll("\\s+","");
long phoneLong = 0;
try {
phoneLong = Long.parseLong(enteredPhone);
} catch (NumberFormatException e) {
etPhoneNumber.showErrorStatus();
tvRegInfo.setText(R.string.lab_registration_wrong_phone);
return;
}
phoneNumber.setNationalNumber(phoneLong);
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
if (!phoneUtil.isValidNumber(phoneNumber)) {
etPhoneNumber.showErrorStatus();
tvRegInfo.setText(R.string.lab_registration_wrong_phone);
return;
}
runBackendConnection(phoneNumber);
}
});
tvCountryCode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PhoneCodesDialogFragment phoneCodeDlg = new PhoneCodesDialogFragment();
phoneCodeDlg.setPhoneCodeListener(RegisterFragment.this);
phoneCodeDlg.show(getFragmentManager(), "phone_codes");
}
});
}
public void runBackendConnection(final PhoneNumber phoneNumber) {
etPhoneNumber.showWaitingIndicator();
final String phoneE164 = PhoneNumberUtil.getInstance().format(phoneNumber,
PhoneNumberUtil.PhoneNumberFormat.E164);
final String phoneInt = PhoneNumberUtil.getInstance().format(phoneNumber,
PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL);
backendConnector.registerUser(phoneE164, Config.getInstance().getDeviceId(),
Locale.getDefault().getLanguage(),
new BackendConnector.ResponseCallback<PlumberAuthResponse>() {
@Override
public void onRequestComplete(int statusCode, PlumberAuthResponse response) {
etPhoneNumber.resetStatus();
if (statusCode == 200) {
//successful -> load next view
switch (response.getStatus()) {
case MAX_DEVICES_REACHED:
etPhoneNumber.showWaitingIndicator();
registerForDeviceRemoval(phoneE164, phoneInt,
Config.getInstance().getDeviceId(),
Locale.getDefault().getLanguage());
break;
case DEVICE_REGISTERED_WITH_ANOTHER_NUMBER:
tvRegInfo.setText(R.string.lab_registration_dev_already_exists);
etPhoneNumber.showErrorStatus();
break;
case MAX_SMS:
tvRegInfo.setText(R.string.lab_registration_max_sms);
etPhoneNumber.showErrorStatus();
break;
default:
Config.getInstance().savePhoneNumber(phoneE164);
Config.getInstance().saveAuthToken("");
etPhoneNumber.showOkStatus();
if (getActivity() != null) {
((RegistrationActivity) getActivity())
.loadSmsTokenFragment(phoneInt);
}
break;
}
} else {
etPhoneNumber.showErrorStatus();
if (statusCode == 0) {
tvRegInfo.setText(R.string.lab_registration_network_error);
} else {
tvRegInfo.setText(R.string.lab_registration_service_unavail);
}
}
}
});
}
private void registerForDeviceRemoval(final String phoneE164, final String phoneInt, String deviceId, String language) {
backendConnector.registerForDeviceRemoval(phoneE164, deviceId, language,
new BackendConnector.ResponseCallback<PlumberAuthResponse>() {
@Override
public void onRequestComplete(int statusCode, PlumberAuthResponse response) {
if (statusCode == 200) {
//successful -> load next view
switch (response.getStatus()) {
case MAX_SMS:
tvRegInfo.setText(R.string.lab_registration_max_sms);
etPhoneNumber.showErrorStatus();
break;
default:
Config.getInstance().savePhoneNumber(phoneE164);
Config.getInstance().saveAuthToken("");
etPhoneNumber.showOkStatus();
if (getActivity() != null) {
((RegistrationActivity) getActivity())
.loadSmsTokenFragment(phoneInt);
}
break;
}
} else {
etPhoneNumber.showErrorStatus();
if (statusCode == 0) {
tvRegInfo.setText(R.string.lab_registration_network_error);
} else {
tvRegInfo.setText(R.string.lab_registration_service_unavail);
}
}
}
});
}
@Override
public void onPhoneCodeSelected(int code) {
countryCode = code;
tvCountryCode.setText("+"+code);
}
}