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