package com.aptoide.amethyst.fragments.timeline; import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AccountManagerCallback; import android.accounts.AccountManagerFuture; import android.app.Activity; import android.content.ContentResolver; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.provider.Settings; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.aptoide.amethyst.Aptoide; import com.aptoide.amethyst.LoginActivity; import com.aptoide.amethyst.R; import com.aptoide.amethyst.analytics.Analytics; import com.aptoide.amethyst.configuration.AptoideConfiguration; import com.aptoide.amethyst.model.json.CheckUserCredentialsJson; import com.aptoide.amethyst.model.json.OAuth; import com.aptoide.amethyst.services.RabbitMqService; import com.aptoide.amethyst.utils.AptoideUtils; import com.aptoide.amethyst.utils.Filters; import com.aptoide.amethyst.webservices.CheckUserCredentialsRequest; import com.aptoide.amethyst.webservices.OAuth2AuthenticationRequest; import com.aptoide.dataprovider.AptoideSpiceHttpService; import com.aptoide.dataprovider.webservices.Errors; import com.aptoide.dataprovider.webservices.models.ErrorResponse; import com.facebook.Session; import com.octo.android.robospice.SpiceManager; import com.octo.android.robospice.persistence.exception.SpiceException; import com.octo.android.robospice.request.listener.RequestListener; import java.util.HashMap; import java.util.Locale; import com.aptoide.amethyst.webservices.exceptions.InvalidGrantSpiceException; /** * Created by fabio on 13-10-2015. */ public class FragmentSignIn extends Fragment { public static final String LOGIN_MODE_ARG = "loginMode"; public static final String LOGIN_USERNAME_ARG = "loginUsername"; public static final String LOGIN_PASSWORD_OR_TOKEN_ARG = "loginPasswordOrToken"; SpiceManager spiceManager = new SpiceManager(AptoideSpiceHttpService.class); LoginActivity.Mode mode; private String username; private String password; private CheckUserCredentialsRequest request; private SignInCallback callback; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mode = LoginActivity.Mode.values()[getArguments().getInt(LOGIN_MODE_ARG, 0)]; username = getArguments().getString(LOGIN_USERNAME_ARG); password = getArguments().getString(LOGIN_PASSWORD_OR_TOKEN_ARG); } @Override public void onResume() { super.onResume(); submit(mode, username, password, ""); } @Override public void onStart() { super.onStart(); spiceManager.start(getActivity()); } @Override public void onStop() { super.onStop(); spiceManager.shouldStop(); } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.page_signing_in, container, false); } public void submit(final LoginActivity.Mode mode, final String username, final String passwordOrToken, final String nameForGoogle) { //final String userName = ((EditText) findViewById(R.id.username)).getAvatar().toString(); //final String userPass = ((EditText) findViewById(R.id.password)).getAvatar().toString(); final String accountType = Aptoide.getConfiguration().getAccountType(); OAuth2AuthenticationRequest oAuth2AuthenticationRequest = new OAuth2AuthenticationRequest(); oAuth2AuthenticationRequest.setPassword(passwordOrToken); oAuth2AuthenticationRequest.setUsername(username); oAuth2AuthenticationRequest.setMode(mode); oAuth2AuthenticationRequest.setNameForGoogle(nameForGoogle); spiceManager.execute(oAuth2AuthenticationRequest, new RequestListener<OAuth>() { @Override public void onRequestFailure(SpiceException spiceException) { String error; if(spiceException.getCause() instanceof InvalidGrantSpiceException && spiceException.getCause().getMessage().equals("Invalid username and password combination")){ error = getString(R.string.error_AUTH_1); } else { error = getString(R.string.error_occured); } Session session = Session.getActiveSession(); if (session != null && session.isOpened()) { session.closeAndClearTokenInformation(); } Toast.makeText(Aptoide.getContext(), error, Toast.LENGTH_SHORT).show(); onError(); android.support.v4.app.DialogFragment pd = (android.support.v4.app.DialogFragment) getFragmentManager().findFragmentByTag("pleaseWaitDialog"); if (pd != null) { pd.dismissAllowingStateLoss(); } } @Override public void onRequestSuccess(final OAuth oAuth) { if(oAuth.getStatus() != null && oAuth.getStatus().equals("FAIL")){ AptoideUtils.UI.toastError(oAuth.getError()); Session session = Session.getActiveSession(); if (session != null && session.isOpened()) { session.closeAndClearTokenInformation(); } onError(); }else{ getUserInfo(oAuth, username, mode, accountType, passwordOrToken); Analytics.Login.login(username, mode); } } }); } private void getUserInfo(final OAuth oAuth, final String username, final LoginActivity.Mode mode, final String accountType, final String passwordOrToken) { request = new CheckUserCredentialsRequest(); String deviceId = Settings.Secure.getString(getActivity().getContentResolver(), Settings.Secure.ANDROID_ID); request.setRegisterDevice(true); request.setSdk(String.valueOf(AptoideUtils.HWSpecifications.getSdkVer())); request.setDeviceId(deviceId); request.setCpu(AptoideUtils.HWSpecifications.getAbis()); request.setDensity(String.valueOf(AptoideUtils.HWSpecifications.getNumericScreenSize(getActivity()))); request.setOpenGl(String.valueOf(AptoideUtils.HWSpecifications.getGlEsVer(getActivity()))); request.setModel(Build.MODEL); request.setScreenSize(Filters.Screen.values()[AptoideUtils.HWSpecifications.getScreenSize(getActivity())].name().toLowerCase(Locale.ENGLISH)); request.setToken(oAuth.getAccess_token()); spiceManager.execute(request, new RequestListener<CheckUserCredentialsJson>() { @Override public void onRequestFailure(SpiceException e) { Session session = Session.getActiveSession(); if (session != null && session.isOpened()) { session.closeAndClearTokenInformation(); } Toast.makeText(Aptoide.getContext(), R.string.error_occured, Toast.LENGTH_SHORT).show(); onError(); android.support.v4.app.DialogFragment pd = (android.support.v4.app.DialogFragment) getFragmentManager().findFragmentByTag("pleaseWaitDialog"); if (pd != null) { pd.dismissAllowingStateLoss(); } } @Override public void onRequestSuccess(CheckUserCredentialsJson checkUserCredentialsJson) { android.support.v4.app.DialogFragment pd = (android.support.v4.app.DialogFragment) getFragmentManager().findFragmentByTag("pleaseWaitDialog"); if (pd != null) { pd.dismissAllowingStateLoss(); } if ("OK".equals(checkUserCredentialsJson.getStatus())) { LoginActivity.updatePreferences(checkUserCredentialsJson, username, mode.name(), oAuth.getAccess_token()); Bundle data = new Bundle(); data.putString(AccountManager.KEY_ACCOUNT_NAME, username); data.putString(AccountManager.KEY_ACCOUNT_TYPE, accountType); data.putString(AccountManager.KEY_AUTHTOKEN, oAuth.getRefreshToken()); data.putString(AccountManager.KEY_PASSWORD, passwordOrToken); final Intent res = new Intent(); res.putExtras(data); finishLogin(res); } else { final HashMap<String, Integer> errorsMapConversion = Errors.getErrorsMap(); Integer stringId; String message; for (ErrorResponse error : checkUserCredentialsJson.getErrors()) { stringId = errorsMapConversion.get( error.code ); if(stringId != null) { message = getString( stringId ); } else { message = error.msg; } onError(); Toast.makeText(Aptoide.getContext(), message, Toast.LENGTH_SHORT).show(); } } } }); } private void onError() { callback = (SignInCallback) getParentFragment(); callback.loginError(); } private void finishLogin(Intent intent) { String accountName = intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); String accountPassword = intent.getStringExtra(AccountManager.KEY_PASSWORD); String token = intent.getStringExtra(AccountManager.KEY_AUTHTOKEN); final Account account = new Account(accountName, intent.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE)); String accountType = Aptoide.getConfiguration().getAccountType(); String authTokenType = AptoideConfiguration.AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS; final Activity activity = getActivity(); AccountManager.get(getActivity()).addAccount(accountType, authTokenType, new String[]{"timelineLogin"}, intent.getExtras(), getActivity(), new AccountManagerCallback<Bundle>() { @Override public void run(AccountManagerFuture<Bundle> future) { if (activity != null) { activity.startService(new Intent(activity, RabbitMqService.class)); } ContentResolver.setSyncAutomatically(account, Aptoide.getConfiguration().getUpdatesSyncAdapterAuthority(), true); ContentResolver.addPeriodicSync(account, Aptoide.getConfiguration().getUpdatesSyncAdapterAuthority(), new Bundle(), 43200); ContentResolver.setSyncAutomatically(account, Aptoide.getConfiguration(). getAutoUpdatesSyncAdapterAuthority(), true); callback = (SignInCallback) getParentFragment(); if (callback != null) callback.loginEnded(); } }, new Handler(Looper.getMainLooper())); } public interface SignInCallback { void loginEnded(); void loginError(); } }