package com.odoo.base.login_signup; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.net.ssl.SSLPeerUnverifiedException; import odoo.OVersionException; import odoo.Odoo; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnFocusChangeListener; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.Spinner; import android.widget.Toast; import com.odoo.App; import com.odoo.auth.OdooAccountManager; import com.odoo.orm.OdooHelper; import com.odoo.support.AppScope; import com.odoo.support.OUser; import com.odoo.support.OdooServerConnection; import com.odoo.support.fragment.BaseFragment; import com.odoo.support.fragment.FragmentListener; import com.odoo.util.OControls; import com.odoo.util.drawer.DrawerItem; import com.odoo.R; public class LoginSignup extends BaseFragment implements OnClickListener, OnFocusChangeListener { private final String KEY_SELF_HOSTED_URL = "self_hosted_url"; private View mView = null; private Boolean mSelfHosted = false; private EditText edtHostedURL, edtUsername, edtPassword; private OdooURLTest mOdooURLTest = null; private Spinner dbListSpinner = null; private List<String> mDBList = new ArrayList<String>(); private Boolean mSSLForceConnect = false; private String mServerURL = null; private Context mContext; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); showActionBar(false); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { scope = new AppScope(this); scope.main().lockDrawer(true); mContext = getActivity(); mView = inflater.inflate(R.layout.base_login_signup_layout, container, false); mView.findViewById(R.id.forgot_password).setOnClickListener(this); mView.findViewById(R.id.create_account).setOnClickListener(this); init(); return mView; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { if (savedInstanceState != null && savedInstanceState.containsKey(KEY_SELF_HOSTED_URL)) { mSelfHosted = !savedInstanceState.getBoolean(KEY_SELF_HOSTED_URL); onClick(mView.findViewById(R.id.txvAddSelfHosted)); } try { String version = app().getPackageManager().getPackageInfo( app().getPackageName(), 0).versionName; String version_name = _s(R.string.label_version) + " " + version; OControls.setText(view, R.id.odoo_version, version_name); } catch (Exception e) { e.printStackTrace(); } } private void init() { initControls(); } private void initControls() { mView.findViewById(R.id.txvAddSelfHosted).setOnClickListener(this); mView.findViewById(R.id.btnLogin).setOnClickListener(this); edtUsername = (EditText) mView.findViewById(R.id.edtUserName); edtUsername.setOnFocusChangeListener(this); edtPassword = (EditText) mView.findViewById(R.id.edtPassword); } @Override public Object databaseHelper(Context context) { return null; } @Override public List<DrawerItem> drawerMenus(Context context) { return null; } @Override public void onClick(View v) { switch (v.getId()) { case R.id.txvAddSelfHosted: if (mSelfHosted) { mSelfHosted = false; OControls.setGone(mView, R.id.layoutSelfHosted); OControls.setText(mView, R.id.txvAddSelfHosted, "Add self-hosted URL"); OControls.setGone(mView, R.id.layoutBorderDB); OControls.setGone(mView, R.id.layoutDatabase); } else { mSelfHosted = true; OControls.setVisible(mView, R.id.layoutSelfHosted, true, mContext); OControls.setText(mView, R.id.txvAddSelfHosted, "Login with odoo.com"); edtHostedURL = (EditText) mView .findViewById(R.id.edtSelfHostedURL); edtHostedURL.setOnFocusChangeListener(this); edtHostedURL.requestFocus(); } break; case R.id.btnLogin: login(); break; case R.id.forgot_password: Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.odoo.com/web/reset_password")); startActivity(intent); break; case R.id.create_account: intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://accounts.odoo.com/web/signup")); startActivity(intent); break; } } private void login() { Log.v("LoginSignup", "login()"); if (mSelfHosted) { edtHostedURL.setError(null); if (TextUtils.isEmpty(edtHostedURL.getText())) { edtHostedURL.setError("Provide your server URL"); edtHostedURL.requestFocus(); return; } else { mServerURL = createServerURL(edtHostedURL.getText().toString()); } } else { mServerURL = "https://accounts.odoo.com"; } edtUsername.setError(null); edtPassword.setError(null); if (TextUtils.isEmpty(edtUsername.getText())) { edtUsername.setError("Provide username or email"); edtUsername.requestFocus(); return; } if (TextUtils.isEmpty(edtPassword.getText())) { edtPassword.setError("Provide password"); edtPassword.requestFocus(); return; } if (mDBList.size() > 0) { int db_index = (dbListSpinner == null) ? 0 : dbListSpinner .getSelectedItemPosition() - 1; if (dbListSpinner != null && db_index + 1 <= 0) { Toast.makeText(mContext, _s(R.string.toast_select_database), Toast.LENGTH_LONG).show(); return; } String database_name = mDBList.get(db_index); Bundle bundle = new Bundle(); bundle.putString("server_url", mServerURL); bundle.putString("username", edtUsername.getText().toString()); bundle.putString("password", edtPassword.getText().toString()); bundle.putString("database", database_name); bundle.putBoolean("force_connect", mSSLForceConnect); LoginProcess loginProcess = new LoginProcess(bundle); loginProcess.execute(); } else { if (mOdooURLTest != null) mOdooURLTest.cancel(true); if (edtHostedURL == null || !mSelfHosted) { mOdooURLTest = new OdooURLTest(mServerURL, false, true); mOdooURLTest.execute(); } else { if (!TextUtils.isEmpty(edtHostedURL.getText())) { mServerURL = createServerURL(edtHostedURL.getText() .toString()); mOdooURLTest = new OdooURLTest(mServerURL, false, true); mOdooURLTest.execute(); } } } } class LoginProcess extends AsyncTask<Void, Void, Boolean> { Bundle userData = null; OUser mUser = null; Odoo mOdooInstance = null; App app = null; public LoginProcess(Bundle bundle) { userData = bundle; app = (App) scope.context().getApplicationContext(); app.setOdooInstance(null); } @Override protected void onPreExecute() { super.onPreExecute(); OControls.setGone(mView, R.id.controls); OControls.setVisible(mView, R.id.loginProgress); } @Override protected Boolean doInBackground(Void... params) { OdooHelper odoo = new OdooHelper(mContext, userData.getBoolean("force_connect")); mUser = odoo.login(userData.getString("username"), userData.getString("password"), userData.getString("database"), userData.getString("server_url")); if (mUser != null) { mOdooInstance = app.getOdoo(); return true; } return false; } @Override protected void onPostExecute(Boolean success) { super.onPostExecute(success); if (success) { if (OdooAccountManager.fetchAllAccounts(mContext) != null) { if (OdooAccountManager.getAccount(mContext, mUser.getAndroidName()) == null) { if (OdooAccountManager.isAnyUser(mContext)) { OdooAccountManager.logoutUser( mContext, OdooAccountManager.currentUser( getActivity()).getAndroidName()); } } else { OControls.setGone(mView, R.id.loginProgress); OControls.setVisible(mView, R.id.controls); edtUsername .setError(_s(R.string.toast_user_already_exists)); return; } } app.setOdooInstance(mOdooInstance); AccountCreate account_create = new AccountCreate(); Bundle args = mUser.getAsBundle(); args.putBoolean("self_hosted", mSelfHosted); account_create.setArguments(args); FragmentListener frag = (FragmentListener) mContext; frag.startMainFragment(account_create, false); } else { OControls.setGone(mView, R.id.loginProgress); OControls.setVisible(mView, R.id.controls); edtPassword .setError(_s(R.string.toast_invalid_username_password)); } } } @Override public void onFocusChange(View v, boolean hasFocus) { if (v.getId() == R.id.edtSelfHostedURL && !hasFocus) { if (!TextUtils.isEmpty(edtHostedURL.getText()) && validateURL(edtHostedURL.getText().toString())) { if (mOdooURLTest != null) mOdooURLTest.cancel(true); mServerURL = createServerURL(edtHostedURL.getText().toString()); mOdooURLTest = new OdooURLTest(mServerURL, false, false); mOdooURLTest.execute(); } } if (v.getId() == R.id.edtUserName && !hasFocus) { if (edtHostedURL == null && mServerURL != null) { if (mOdooURLTest != null) mOdooURLTest.cancel(true); mOdooURLTest = new OdooURLTest(mServerURL, false, false); mOdooURLTest.execute(); } } } private boolean validateURL(String url) { return (url.contains(".")); } class OdooURLTest extends AsyncTask<Void, Void, Boolean> { Boolean mForceConnect = false; Boolean mAutoLogin = false; OdooServerConnection odooConnect = null; String errorMsg = ""; boolean mSSLError = false; String odooServerURL = ""; public OdooURLTest(String serverURL, boolean forceConnect, boolean autoLogin) { mForceConnect = forceConnect; odooServerURL = serverURL; mAutoLogin = autoLogin; } @Override protected void onPreExecute() { super.onPreExecute(); OControls.setVisible(mView, R.id.serverURLCheckProgress); OControls.setGone(mView, R.id.imgValidURL); OControls.setGone(mView, R.id.layoutBorderDB); OControls.setGone(mView, R.id.layoutDatabase); if (mAutoLogin) { OControls.setGone(mView, R.id.controls); OControls.setVisible(mView, R.id.loginProgress); } odooConnect = new OdooServerConnection(mForceConnect); } @Override protected Boolean doInBackground(Void... params) { boolean flag = false; try { flag = odooConnect.testConnection(mContext, odooServerURL); if (!flag) { errorMsg = _s(R.string.toast_unable_to_reach_odoo_server); } } catch (SSLPeerUnverifiedException ssl) { flag = false; mSSLError = true; errorMsg = ssl.getMessage(); } catch (OVersionException e) { flag = false; errorMsg = e.getMessage(); } return flag; } @Override protected void onPostExecute(Boolean success) { super.onPostExecute(success); OControls.setGone(mView, R.id.serverURLCheckProgress); if (success) { OControls.setVisible(mView, R.id.imgValidURL); mOdooURLTest.cancel(true); mOdooURLTest = null; String[] databases = odooConnect.getDatabases(); if (databases.length > 0) { initDatabaseSpinner(databases); mSSLForceConnect = mForceConnect; if (mAutoLogin) { OControls.setGone(mView, R.id.loginProgress); OControls.setVisible(mView, R.id.controls); login(); } } else { Toast.makeText(mContext, _s(R.string.toast_no_database_found), Toast.LENGTH_LONG).show(); } } else { mOdooURLTest.cancel(true); mOdooURLTest = null; if (mSSLError) { showForceConnectDialog(errorMsg); } else { if (edtHostedURL != null) { edtHostedURL.setError(errorMsg); edtHostedURL.requestFocus(); } } } } } private void initDatabaseSpinner(String[] dbs) { if (dbs.length > 1) { OControls.setVisible(mView, R.id.layoutBorderDB, true, mContext); OControls.setVisible(mView, R.id.layoutDatabase, true, mContext); dbListSpinner = (Spinner) mView .findViewById(R.id.spinnerDatabaseList); } List<String> dbLists = new ArrayList<String>(); dbLists.addAll(Arrays.asList(dbs)); mDBList.clear(); mDBList.addAll(dbLists); if (dbs.length > 1) loadDatabaseList(dbLists); } private void loadDatabaseList(List<String> dbList) { try { dbList.add(0, _s(R.string.login_select_database)); ArrayAdapter<String> dbAdapter = new ArrayAdapter<String>(mContext, R.layout.spinner_custom_layout, dbList); dbAdapter.setDropDownViewResource(R.layout.spinner_custom_layout); dbListSpinner.setAdapter(dbAdapter); } catch (Exception e) { e.printStackTrace(); } } private String createServerURL(String server_url) { StringBuffer serverURL = new StringBuffer(); if (!server_url.contains("http://") && !server_url.contains("https://")) { String http_https = "http://"; serverURL.append(http_https); } serverURL.append(server_url); return serverURL.toString(); } private void showForceConnectDialog(String message) { AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setIcon(R.drawable.ic_action_alerts_and_states_warning); builder.setTitle(R.string.title_ssl_warning); builder.setMessage(R.string.untrusted_ssl_warning); builder.setPositiveButton(R.string.label_process_anyway, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (mOdooURLTest != null) { mOdooURLTest.cancel(true); mOdooURLTest = null; } mOdooURLTest = new OdooURLTest(mServerURL, true, false); mOdooURLTest.execute((Void) null); } }); builder.setNegativeButton(R.string.label_cancel, null); builder.show(); } @Override public void onPause() { super.onPause(); if (mOdooURLTest != null) { mOdooURLTest.cancel(true); } actionbar().show(); scope.main().lockDrawer(false); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(KEY_SELF_HOSTED_URL, mSelfHosted); } }