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