package com.odoo.base.login_signup;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import odoo.ODomain;
import odoo.OdooAccountExpireException;
import odoo.OdooInstance;
import org.json.JSONArray;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import com.odoo.App;
import com.odoo.auth.OdooAccountManager;
import com.odoo.base.ir.IrModel;
import com.odoo.orm.OdooHelper;
import com.odoo.support.OExceptionDialog;
import com.odoo.support.OUser;
import com.odoo.support.fragment.BaseFragment;
import com.odoo.support.fragment.FragmentListener;
import com.odoo.support.listview.OListAdapter;
import com.odoo.util.OControls;
import com.odoo.util.PreferenceManager;
import com.odoo.util.controls.ExpandableHeightGridView;
import com.odoo.util.drawer.DrawerItem;
import com.odoo.R;
public class AccountCreate extends BaseFragment implements OnItemClickListener {
View mView = null;
OUser mUser = null;
AccountCreate mSelf = null;
Boolean loadConfigWizard = true, mSelfHosted = false;
OListAdapter mListAdapter = null;
List<Object> mInstanceList = new ArrayList<Object>();
ExpandableHeightGridView mGridView = null;
App mApp = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
showActionBar(false);
mView = inflater.inflate(
R.layout.base_login_signup_account_create_layout, container,
false);
mApp = (App) getActivity().getApplicationContext();
mSelf = this;
initArgs();
init();
return mView;
}
private void init() {
mListAdapter = new OListAdapter(getActivity(),
R.layout.base_login_signup_instance_view, mInstanceList) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View mView = convertView;
if (mView == null)
mView = getActivity().getLayoutInflater().inflate(
getResource(), parent, false);
OdooInstance row = (OdooInstance) mInstanceList.get(position);
String image_url = row.getInstanceUrl()
+ "/web/binary/company_logo?dbname="
+ row.getDatabaseName();
ImageLoader imgLoader = new ImageLoader(position, image_url,
R.id.imgInstance);
imgLoader.execute();
OControls.setText(mView, R.id.txvInstanceName,
row.getCompanyName());
OControls.setText(mView, R.id.txvInstanceUrl,
row.getInstanceUrl());
return mView;
}
};
}
private void initArgs() {
if (getArguments() != null
&& getArguments().containsKey("no_config_wizard")) {
loadConfigWizard = !getArguments().getBoolean("no_config_wizard");
}
mUser = new OUser();
mUser.setFromBundle(getArguments());
if (loadConfigWizard) {
GetInstances instances = new GetInstances(getArguments()
.getBoolean("self_hosted"));
instances.execute();
} else {
// Create database
DatabaseCreate databaseCreate = new DatabaseCreate();
databaseCreate.execute();
}
}
// Step 1
// Load Instances
class GetInstances extends AsyncTask<Void, Void, List<OdooInstance>> {
Boolean mSelfHosted = false;
public GetInstances(Boolean selfHosted) {
mSelfHosted = selfHosted;
}
@Override
protected void onPreExecute() {
OControls.setText(mView, R.id.progressStatus, getResources()
.getString(R.string.title_getting_instances));
}
@Override
protected List<OdooInstance> doInBackground(Void... params) {
try {
if (!mSelfHosted) {
OdooHelper odoo = new OdooHelper(getActivity());
return odoo.getUserInstances(mUser);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(List<OdooInstance> result) {
super.onPostExecute(result);
if (result != null) {
if (result.size() > 1) {
// More than one instance
LoadInstances instances = new LoadInstances(result);
instances.execute();
} else {
loginToOdoo();
}
} else {
CreateAccount createAccount = new CreateAccount(null,
mSelfHosted);
createAccount.execute();
}
}
}
// Step 2 : only if there are more than one instance
class LoadInstances extends AsyncTask<Void, Void, Void> {
List<OdooInstance> mInstances = new ArrayList<OdooInstance>();
public LoadInstances(List<OdooInstance> instances) {
mInstances.addAll(instances);
OControls.setGone(mView, R.id.progressLoader);
OControls.setVisible(mView, R.id.instanceList);
mGridView = (ExpandableHeightGridView) mView
.findViewById(R.id.gridInstances);
mGridView.setExpanded(true);
mGridView.setAdapter(mListAdapter);
}
@Override
protected Void doInBackground(Void... params) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
mInstanceList.clear();
mInstanceList.addAll(mInstances);
}
});
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
mListAdapter.notifiyDataChange(mInstanceList);
mGridView.setOnItemClickListener(mSelf);
}
}
class ImageLoader extends AsyncTask<Void, Void, Void> {
String image_url = "";
int image_view = -1;
int view_pos = -1;
Bitmap bmp = null;
public ImageLoader(int pos, String url, int image_view) {
view_pos = pos;
this.image_view = image_view;
image_url = url;
}
@Override
protected Void doInBackground(Void... params) {
try {
URL url = new URL(image_url);
bmp = BitmapFactory.decodeStream(url.openConnection()
.getInputStream());
} catch (Exception e) {
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if (bmp != null) {
View mView = mGridView.getChildAt(view_pos);
OControls.setImage(mView, image_view, bmp);
}
}
}
// Step 2 : only if there are any instance found or self hosted
class CreateAccount extends AsyncTask<Void, Void, Boolean> {
OdooInstance mOdooInstance = null;
String mOdooException = null;
Boolean mSelfHosted = false;
public CreateAccount(OdooInstance instance, Boolean selfHosted) {
mOdooInstance = instance;
mSelfHosted = selfHosted;
OControls.setGone(mView, R.id.instanceList);
OControls.setVisible(mView, R.id.progressLoader);
OControls.setText(mView, R.id.progressStatus, getActivity()
.getResources().getString(R.string.title_account_create));
}
@Override
protected Boolean doInBackground(Void... params) {
try {
OdooHelper odoo = new OdooHelper(getActivity(),
mUser.isAllowSelfSignedSSL());
OUser user = null;
if (mSelfHosted) {
user = odoo.login(mUser.getUsername(), mUser.getPassword(),
mUser.getDatabase(), mUser.getHost());
} else {
user = odoo.instance_login(mOdooInstance,
mUser.getUsername(), mUser.getPassword());
}
if (OdooAccountManager.createAccount(getActivity(), user)) {
mApp.createInstance();
return true;
}
} catch (OdooAccountExpireException e) {
mOdooException = e.getMessage();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if (result) {
DatabaseCreate databaseCreate = new DatabaseCreate();
databaseCreate.execute();
} else {
if (mOdooException != null) {
OExceptionDialog dialog = new OExceptionDialog(
getActivity(), true, mOdooException);
dialog.show();
OControls.setVisible(mView, R.id.instanceList);
OControls.setGone(mView, R.id.progressLoader);
}
}
}
}
class DatabaseCreate extends AsyncTask<Void, Void, Void> {
App mApp = null;
IrModel mIRModel = null;
public DatabaseCreate() {
mApp = (App) getActivity().getApplicationContext();
mIRModel = new IrModel(getActivity().getApplicationContext());
}
@Override
protected void onPreExecute() {
OControls.setText(mView, R.id.progressStatus, getResources()
.getString(R.string.title_database_create));
}
@Override
protected Void doInBackground(Void... params) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
PreferenceManager pref = new PreferenceManager(
getActivity());
List<String> model_list = new ArrayList<String>();
for (String m : pref.getStringSet("models"))
model_list.add(m);
try {
ODomain domain = new ODomain();
domain.add("model", "in",
new JSONArray(model_list.toString()));
mIRModel.getSyncHelper().syncWithServer(domain);
} catch (Exception e) {
e.printStackTrace();
}
}
});
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if (mIRModel.isEmptyTable()) {
DatabaseCreate databaseCreate = new DatabaseCreate();
databaseCreate.execute();
} else {
if (loadConfigWizard) {
SyncWizard syncWizard = new SyncWizard();
FragmentListener mFragment = (FragmentListener) getActivity();
mFragment.startMainFragment(syncWizard, false);
}
}
}
}
@Override
public Object databaseHelper(Context context) {
return null;
}
@Override
public List<DrawerItem> drawerMenus(Context context) {
return null;
}
// On instance click
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
OdooInstance instance = (OdooInstance) mInstanceList.get(position);
String server_url = instance.getInstanceUrl();
if (!server_url.equals(OdooHelper.ODOO_SERVER_URL)) {
loginWithInstance(instance);
} else {
loginToOdoo();
}
}
private void loginToOdoo() {
mUser.setHost(OdooHelper.ODOO_SERVER_URL);
CreateAccount createAccount = new CreateAccount(null, true);
createAccount.execute();
}
private void loginWithInstance(OdooInstance instance) {
CreateAccount account = new CreateAccount(instance, false);
account.execute();
}
@Override
public void onResume() {
super.onResume();
// getActivity().getActionBar().hide();
}
}