package com.odoo.addons.sale; import android.app.ProgressDialog; import android.content.Intent; import android.graphics.Color; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.text.Editable; import android.text.InputType; import android.text.TextWatcher; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import com.odoo.R; import com.odoo.addons.sale.models.ProductProduct; import com.odoo.core.orm.ODataRow; import com.odoo.core.orm.ServerDataHelper; import com.odoo.core.orm.fields.OColumn; import com.odoo.core.support.OdooFields; import com.odoo.core.support.list.OListAdapter; import com.odoo.core.utils.OAlert; import com.odoo.core.utils.OControls; import com.odoo.core.utils.OResource; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import odoo.ODomain; import odoo.controls.IOnQuickRecordCreateListener; public class AddProductLineWizard extends ActionBarActivity implements AdapterView.OnItemClickListener, TextWatcher, View.OnClickListener, OListAdapter.OnSearchChange, IOnQuickRecordCreateListener, AdapterView.OnItemLongClickListener { private ProductProduct productProduct; private EditText edt_searchable_input; private ListView mList = null; private OListAdapter mAdapter; private List<Object> objects = new ArrayList<>(); private List<Object> localItems = new ArrayList<>(); private int selected_position = -1; private LiveSearch mLiveDataLoader = null; private OColumn mCol = null; private HashMap<String, Float> lineValues = new HashMap<>(); private Boolean mLongClicked = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sale_add_item); setResult(RESULT_CANCELED); productProduct = new ProductProduct(this, null); edt_searchable_input = (EditText) findViewById(R.id.edt_searchable_input); edt_searchable_input.addTextChangedListener(this); findViewById(R.id.done).setOnClickListener(this); Bundle extra = getIntent().getExtras(); if (extra != null) { mList = (ListView) findViewById(R.id.searchable_items); mList.setOnItemClickListener(this); mList.setOnItemLongClickListener(this); for (String key : extra.keySet()) { lineValues.put(key, extra.getFloat(key)); } for (Object local : productProduct.select()) { ODataRow product = (ODataRow) local; if (lineValues.containsKey(product.getString("id") + "")) { localItems.add(0, product); } else { localItems.add(product); } } objects.addAll(localItems); mAdapter = new OListAdapter(this, R.layout.sale_product_line_item, objects) { @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) v = getLayoutInflater().inflate(getResource(), parent, false); generateView(v, position); return v; } }; mAdapter.setOnSearchChange(this); mList.setAdapter(mAdapter); } else { finish(); } } private void generateView(View v, int position) { final ODataRow row = (ODataRow) objects.get(position); Float qty = (lineValues.containsKey(row.getString("id")) && lineValues.get(row.getString("id")) > 0) ? lineValues.get(row.getString("id")) : 0; if (qty <= 0) { OControls.setGone(v, R.id.productQty); OControls.setGone(v, R.id.remove_qty); } else { OControls.setVisible(v, R.id.remove_qty); v.findViewById(R.id.remove_qty).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Float lineQty = lineValues.get(row.getString("id")); lineValues.put(row.getString("id"), lineQty - 1); mAdapter.notifiyDataChange(objects); } }); OControls.setVisible(v, R.id.productQty); OControls.setText(v, R.id.productQty, qty + " "); } OControls.setText(v, R.id.productName, row.getString(productProduct.getDefaultNameColumn())); if (row.contains(OColumn.ROW_ID) && selected_position == row.getInt(OColumn.ROW_ID)) { v.setBackgroundColor(getResources().getColor( R.color.control_pressed)); } else { v.setBackgroundColor(Color.TRANSPARENT); } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ODataRow data = (ODataRow) objects.get(position); int row_id = productProduct.selectRowId(data.getInt("id")); if (row_id != -1) { data.put(OColumn.ROW_ID, row_id); } if (!data.contains(OColumn.ROW_ID)) { QuickCreateRecordProcess quickCreateRecordProcess = new QuickCreateRecordProcess(this); quickCreateRecordProcess.execute(data); } else { onRecordCreated(data); } } @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { ODataRow data = (ODataRow) objects.get(position); mLongClicked = true; int row_id = productProduct.selectRowId(data.getInt("id")); if (row_id != -1) { data.put(OColumn.ROW_ID, row_id); } if (!data.contains(OColumn.ROW_ID)) { QuickCreateRecordProcess quickCreateRecordProcess = new QuickCreateRecordProcess(this); quickCreateRecordProcess.execute(data); } else { onLongClicked(data); } return true; } private void onLongClicked(final ODataRow row) { mLongClicked = false; final Float count = ((lineValues.containsKey(row.getString("id"))) ? lineValues.get(row.getString("id")) : 0); OAlert.inputDialog(this, "Quantity", new OAlert.OnUserInputListener() { @Override public void onViewCreated(EditText inputView) { inputView.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_NUMBER_FLAG_SIGNED); inputView.setText(count + ""); } @Override public void onUserInputted(Object value) { float userData = Float.parseFloat(value.toString()); lineValues.put(row.getString("id"), userData); mAdapter.notifiyDataChange(objects); } }); } @Override public void onRecordCreated(ODataRow row) { if (!mLongClicked) { Float count = ((lineValues.containsKey(row.getString("id"))) ? lineValues.get(row.getString("id")) : 0); lineValues.put(row.getString("id"), ++count); mAdapter.notifiyDataChange(objects); } else { onLongClicked(row); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { mAdapter.getFilter().filter(s); ImageView imgView = (ImageView) findViewById(R.id.search_icon); if (s.length() > 0) { imgView.setImageResource(R.drawable.ic_action_navigation_close); imgView.setOnClickListener(this); imgView.setClickable(true); } else { imgView.setClickable(false); imgView.setImageResource(R.drawable.ic_action_search); imgView.setOnClickListener(null); } } @Override public void afterTextChanged(Editable s) { } @Override public void onClick(View v) { switch (v.getId()) { case R.id.done: Bundle data = new Bundle(); for (String key : lineValues.keySet()) { data.putFloat(key, lineValues.get(key)); } Intent intent = new Intent(); intent.putExtras(data); setResult(RESULT_OK, intent); finish(); break; default: setResult(RESULT_CANCELED); finish(); } } @Override public void onSearchChange(List<Object> newRecords) { if (newRecords.size() <= 2) { if (mLiveDataLoader != null) mLiveDataLoader.cancel(true); if (edt_searchable_input.getText().length() >= 2) { mLiveDataLoader = new LiveSearch(); mLiveDataLoader.execute(edt_searchable_input.getText() .toString()); } } } private class LiveSearch extends AsyncTask<String, Void, List<ODataRow>> { @Override protected void onPreExecute() { super.onPreExecute(); findViewById(R.id.loading_progress).setVisibility(View.VISIBLE); mList.setVisibility(View.GONE); } @Override protected List<ODataRow> doInBackground(String... params) { try { ServerDataHelper helper = productProduct.getServerDataHelper(); ODomain domain = new ODomain(); // domain.add(productProduct.getDefaultNameColumn(), "ilike", params[0]); domain.add("id", "not in", productProduct.getServerIds()); if (mCol != null) { for (String key : mCol.getDomains().keySet()) { // domain.add("sale_ok", "=", true); } } OdooFields fields = new OdooFields(productProduct.getColumns()); //return helper.searchRecords(fields, domain, 10); return helper.nameSearch(params[0], domain, 10); } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(List<ODataRow> result) { super.onPostExecute(result); findViewById(R.id.loading_progress).setVisibility(View.GONE); mList.setVisibility(View.VISIBLE); if (result != null && result.size() > 0) { objects.clear(); objects.addAll(localItems); objects.addAll(result); mAdapter.notifiyDataChange(objects); } } @Override protected void onCancelled() { super.onCancelled(); findViewById(R.id.loading_progress).setVisibility(View.GONE); mList.setVisibility(View.VISIBLE); } } private class QuickCreateRecordProcess extends AsyncTask<ODataRow, Void, ODataRow> { private ProgressDialog progressDialog; IOnQuickRecordCreateListener mOnQuickRecordCreateListener = null; public QuickCreateRecordProcess(IOnQuickRecordCreateListener listener) { mOnQuickRecordCreateListener = listener; } @Override protected void onPreExecute() { super.onPreExecute(); progressDialog = new ProgressDialog(AddProductLineWizard.this); progressDialog.setTitle(R.string.title_please_wait); progressDialog.setMessage(OResource.string(AddProductLineWizard.this, R.string.title_working)); progressDialog.setCancelable(false); progressDialog.show(); } @Override protected ODataRow doInBackground(ODataRow... params) { try { Thread.sleep(700); return productProduct.quickCreateRecord(params[0]); } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(ODataRow data) { super.onPostExecute(data); if (data != null && mOnQuickRecordCreateListener != null) { mOnQuickRecordCreateListener.onRecordCreated(data); } progressDialog.dismiss(); } } }