/*
* Copyright (C) 2015 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.digits.sdk.android;
import android.content.Context;
import android.net.Uri;
import android.os.ResultReceiver;
import android.widget.EditText;
import com.twitter.sdk.android.core.Result;
import com.twitter.sdk.android.core.SessionManager;
import io.fabric.sdk.android.services.common.CommonUtils;
class PinCodeController extends DigitsControllerImpl {
private final String requestId;
private final long userId;
private final String phoneNumber;
private final Boolean isEmailCollection;
PinCodeController(ResultReceiver resultReceiver, StateButton stateButton,
EditText phoneEditText, String requestId, long userId,
String phoneNumber, DigitsEventCollector digitsEventCollector,
Boolean isEmailCollection, DigitsEventDetailsBuilder details) {
this(resultReceiver, stateButton, phoneEditText, Digits.getSessionManager(),
Digits.getInstance().getDigitsClient(), requestId, userId, phoneNumber,
new ConfirmationErrorCodes(stateButton.getContext().getResources()),
Digits.getInstance().getActivityClassManager(), digitsEventCollector,
isEmailCollection, details);
}
PinCodeController(ResultReceiver resultReceiver, StateButton stateButton,
EditText phoneEditText, SessionManager<DigitsSession> sessionManager,
DigitsClient digitsClient, String requestId, long userId,
String phoneNumber, ErrorCodes errors,
ActivityClassManager activityClassManager,
DigitsEventCollector digitsEventCollector, Boolean isEmailCollection,
DigitsEventDetailsBuilder details) {
super(resultReceiver, stateButton, phoneEditText, digitsClient, errors,
activityClassManager, sessionManager, digitsEventCollector, details);
this.requestId = requestId;
this.userId = userId;
this.phoneNumber = phoneNumber;
this.isEmailCollection = isEmailCollection;
}
@Override
public void scribeControllerFailure() {
digitsEventCollector.twoFactorPinVerificationFailure();
}
@Override
void scribeControllerException(DigitsException exception) {
digitsEventCollector.twoFactorPinVerificationException(exception);
}
@Override
Uri getTosUri() {
return null;
}
@Override
public void executeRequest(final Context context) {
digitsEventCollector.submitClickOnPinScreen(eventDetailsBuilder
.withCurrentTime(System.currentTimeMillis()).build());
if (validateInput(editText.getText())) {
sendButton.showProgress();
CommonUtils.hideKeyboard(context, editText);
final String code = editText.getText().toString();
digitsClient.verifyPin(requestId, userId, code,
new DigitsCallback<DigitsSessionResponse>(context, this, sessionManager) {
@Override
public void success(Result<DigitsSessionResponse> result) {
digitsEventCollector.twoFactorPinVerificationSuccess(eventDetailsBuilder
.withCurrentTime(System.currentTimeMillis()).build());
final DigitsSession session = DigitsSession.create(result.data,
phoneNumber);
sessionManager.setActiveSession(session);
if (isEmailCollection) {
emailRequest(context, session);
} else {
loginSuccess(context, session, phoneNumber,
eventDetailsBuilder);
}
}
});
}
}
private boolean canRequestEmail(DigitsSession newSession, DigitsSession session) {
return isEmailCollection && newSession.getEmail().equals(DigitsSession.DEFAULT_EMAIL)
&& newSession.getId() == session.getId();
}
private void emailRequest(final Context context, final DigitsSession session) {
getAccountService().verifyAccount
(new DigitsCallback<VerifyAccountResponse>(context, this, sessionManager) {
@Override
public void success(Result<VerifyAccountResponse>
result) {
final DigitsSession newSession =
DigitsSession.create(result.data);
if (canRequestEmail(newSession, session)) {
startEmailRequest(context, phoneNumber, eventDetailsBuilder);
} else {
loginSuccess(context, newSession, phoneNumber,
eventDetailsBuilder);
}
}
});
}
ApiInterface getAccountService() {
return Digits.getInstance().getApiClientManager().getService();
}
}