package com.openerp.addons.purchase;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.TextView;
import com.openerp.OETouchListener;
import com.openerp.R;
import com.openerp.orm.OEDataRow;
import com.openerp.providers.purchase.PurchaseOrderProvider;
import com.openerp.receivers.DataSetChangeReceiver;
import com.openerp.receivers.SyncFinishReceiver;
import com.openerp.support.AppScope;
import com.openerp.support.BaseFragment;
import com.openerp.support.fragment.FragmentListener;
import com.openerp.support.listview.OEListAdapter;
import com.openerp.util.drawer.DrawerItem;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import static android.widget.AdapterView.OnItemLongClickListener;
/**
* 采购订单显示界面.
*/
public class PurchaseOrder extends BaseFragment implements OETouchListener.OnPullListener,
OnItemLongClickListener, AdapterView.OnItemClickListener {
public static final String TAG = "PurchaseOrder";
@Override
public Object databaseHelper(Context context) {
return new PurchaseOrderDB(context);
}
private enum MType {
INBOX, ARCHIVE
}
Integer mSelectedItemPosition = -1;
MType mType = MType.INBOX;
String mCurrentType = "inbox";
View mView = null;
SearchView mSearchView = null;
OETouchListener mTouchAttacher;
@SuppressLint("UseSparseArrays")
OEListAdapter mListViewAdapter = null;
ListView mListView = null;
List<Object> mPurchaseOrderObjects = new ArrayList<Object>();
Boolean isSynced = false;
/**
* Background data operations
*/
PurchaseOrderLoader mPurchaseOrderLoader = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (savedInstanceState != null) {
mSelectedItemPosition = savedInstanceState.getInt("mSelectedItemPosition", -1);
}
setHasOptionsMenu(true);
mView = inflater.inflate(R.layout.fragment_purchase_order, container, false);
scope = new AppScope(getActivity());
init();
return mView;
}
private void init() {
Log.d(TAG, "Purchase->init()");
mListView = (ListView) mView.findViewById(R.id.lstPurchaseOrders);
mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
mListView.setOnItemLongClickListener(this);
mListView.setOnItemClickListener(this);
mListViewAdapter = new OEListAdapter(getActivity(), R.layout.fragment_purchase_order_listview_item, mPurchaseOrderObjects) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View mView = convertView;
if (mView == null)
mView = getActivity().getLayoutInflater().inflate(getResource(), parent, false);
mView = handleRowView(mView, position);
return mView;
}
};
mListView.setAdapter(mListViewAdapter);
mTouchAttacher = scope.main().getTouchAttacher();
mTouchAttacher.setPullableView(mListView, this);
initData();
}
private void initData() {
Log.d(TAG, "PurchaseOrder->initData()");
/* if (mSelectedItemPosition > -1) {
return;
}*/
Bundle bundle = getArguments();
if (bundle != null) {
if (mPurchaseOrderLoader != null) {
mPurchaseOrderLoader.cancel(true);
mPurchaseOrderLoader = null;
}
if (bundle.containsKey("type")) {
mCurrentType = bundle.getString("type");
String title = "Archive";
if (mCurrentType.equals("inbox")) {
mPurchaseOrderLoader = new PurchaseOrderLoader(MType.INBOX);
mPurchaseOrderLoader.execute((Void) null);
title = "Inbox";
} else if (mCurrentType.equals("archive")) {
mPurchaseOrderLoader = new PurchaseOrderLoader(MType.ARCHIVE);
mPurchaseOrderLoader.execute((Void) null);
}
scope.main().setTitle(title);
} else {
scope.main().setTitle("Inbox");
mPurchaseOrderLoader = new PurchaseOrderLoader(MType.INBOX);
mPurchaseOrderLoader.execute((Void) null);
}
}
}
// Handling each row view
private View handleRowView(View mView, final int position) {
final OEDataRow row = (OEDataRow) mPurchaseOrderObjects.get(position);
TextView txvName, txvDate, txvAmountTotal, txvState;
txvName = (TextView) mView.findViewById(R.id.txvPartnerName);
txvDate = (TextView) mView.findViewById(R.id.txvDateOrder);
txvAmountTotal = (TextView) mView.findViewById(R.id.txvAmountTotal);
OEDataRow partner = row.getM2ORecord("partner_id").browse();
String name = partner.getString("name");
txvName.setText(name);
String date = row.getString("date_order");
txvDate.setText(date);
String amountTotal = row.getString("amount_total");
txvAmountTotal.setText(amountTotal);
String state = row.getString("state");
String status = getStatus(state);
txvState = (TextView) mView.findViewById(R.id.txvState);
txvState.setText(status);
return mView;
}
private String getStatus(String state) {
int id = scope.main().getResources().getIdentifier("state_purchase_order_" + state, "string", scope.main().getPackageName());
String value = id == 0 ? "" : scope.main().getResources().getString(id);
return value;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_fragment_purchase_order, menu);
mSearchView = (SearchView) menu.findItem(R.id.menu_purchase_order_search).getActionView();
Log.d(TAG, "getQueryListener:" + getQueryListener(mListViewAdapter));
mSearchView.setOnQueryTextListener(getQueryListener(mListViewAdapter));
}
@Override
public List<DrawerItem> drawerMenus(Context context) {
List<DrawerItem> drawerItems = new ArrayList<DrawerItem>();
PurchaseOrderDB db = new PurchaseOrderDB(context);
// if (db.isInstalledOnServer()) {
String purchase_order_title = context.getResources().getString(R.string.purchase_order_group_title);
String purchase_order_inbox = context.getResources().getString(R.string.purchase_order_draw_item_inbox);
String purchase_order_archives = context.getResources().getString(R.string.purchase_order_draw_item_archives);
drawerItems.add(new DrawerItem(TAG, purchase_order_title, true));
drawerItems.add(new DrawerItem(TAG, purchase_order_inbox, count(MType.INBOX, context), R.drawable.ic_action_inbox, getFragment("inbox")));
drawerItems.add(new DrawerItem(TAG, purchase_order_archives, count(MType.ARCHIVE, context), R.drawable.ic_action_archive, getFragment("archive")));
// }
return drawerItems;
}
private int count(MType type, Context context) {
int count = 0;
PurchaseOrderDB db = new PurchaseOrderDB(context);
String where = null;
String whereArgs[] = null;
HashMap<String, Object> obj = getWhere(type);
where = (String) obj.get("where");
whereArgs = (String[]) obj.get("whereArgs");
count = db.count(where, whereArgs);
return count;
}
public HashMap<String, Object> getWhere(MType type) {
HashMap<String, Object> map = new HashMap<String, Object>();
String where = null;
String[] whereArgs = null;
switch (type) {
case INBOX:
where = "processed = ? ";
whereArgs = new String[]{"false"};
break;
default:
where = "processed = ? ";
whereArgs = new String[]{"true"};
break;
}
map.put("where", where);
map.put("whereArgs", whereArgs);
return map;
}
private BaseFragment getFragment(String value) {
PurchaseOrder purchaseOrder = new PurchaseOrder();
Bundle bundle = new Bundle();
bundle.putString("type", value);
purchaseOrder.setArguments(bundle);
return purchaseOrder;
}
public class PurchaseOrderLoader extends AsyncTask<Void, Void, Boolean> {
MType purchaseOrderType = null;
public PurchaseOrderLoader(MType type) {
purchaseOrderType = type;
mView.findViewById(R.id.loadingProgress).setVisibility(View.VISIBLE);
}
@Override
protected Boolean doInBackground(Void... arg0) {
HashMap<String, Object> map = getWhere(purchaseOrderType);
String where = (String) map.get("where");
String whereArgs[] = (String[]) map.get("whereArgs");
mType = purchaseOrderType;
List<OEDataRow> result = db().select(where, whereArgs, null, null, "date_order DESC");
mPurchaseOrderObjects.clear();
if (result.size() > 0) {
for (OEDataRow row : result) {
mPurchaseOrderObjects.add(row);
}
}
return true;
}
@Override
protected void onPostExecute(final Boolean success) {
mView.findViewById(R.id.loadingProgress).setVisibility(View.GONE);
mListViewAdapter.notifiyDataChange(mPurchaseOrderObjects);
Log.d(TAG, "mSearchView:" + mSearchView);
Log.d(TAG, "mListViewAdapter:" + mListViewAdapter);
mPurchaseOrderLoader = null;
checkPurchaseOrderStatus();
}
}
private void checkPurchaseOrderStatus() {
// Fetching parent ids from Child row with order by date desc
if (mPurchaseOrderObjects.size() == 0) {
if (db().isEmptyTable() && !isSynced) {
isSynced = true;
if (mView.findViewById(R.id.waitingForSyncToStart) != null) {
mView.findViewById(R.id.waitingForSyncToStart).setVisibility(View.VISIBLE);
}
try {
//Thread.sleep(2000);
scope.main().requestSync(PurchaseOrderProvider.AUTHORITY);
} catch (Exception e) {
}
} else {
mView.findViewById(R.id.waitingForSyncToStart).setVisibility(View.GONE);
TextView txvMsg = (TextView) mView.findViewById(R.id.txvPurchaseOrderAllReadMessage);
txvMsg.setVisibility(View.VISIBLE);
//txvMsg.setText(getStatusMessage(mType));
}
}
}
/**
* On message item click
*/
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
mSelectedItemPosition = position;
OEDataRow row = (OEDataRow) mPurchaseOrderObjects.get(position);
PurchaseOrderDetail detail = new PurchaseOrderDetail();
Bundle bundle = new Bundle();
bundle.putInt("purchase_order_id", row.getInt("id"));
bundle.putInt("position", position);
detail.setArguments(bundle);
FragmentListener listener = (FragmentListener) getActivity();
listener.startDetailFragment(detail);
}
/**
* on message item long press
*/
@Override
public boolean onItemLongClick(AdapterView<?> adapter, View view, int position, long id) {
return false;
}
/**
* on pulled for sync message
*/
@Override
public void onPullStarted(View arg0) {
scope.main().requestSync(PurchaseOrderProvider.AUTHORITY);
}
@Override
public void onResume() {
super.onResume();
scope.context().registerReceiver(purchaseOrderSyncFinish, new IntentFilter(SyncFinishReceiver.SYNC_FINISH));
scope.context().registerReceiver(datasetChangeReceiver, new IntentFilter(DataSetChangeReceiver.DATA_CHANGED));
}
@Override
public void onPause() {
super.onPause();
scope.context().unregisterReceiver(purchaseOrderSyncFinish);
scope.context().unregisterReceiver(datasetChangeReceiver);
Bundle outState = new Bundle();
outState.putInt("mSelectedItemPosition", mSelectedItemPosition);
onSaveInstanceState(outState);
}
/*
* Used for Synchronization : Register receiver and unregister receiver
*
* SyncFinishReceiver
*/
private SyncFinishReceiver purchaseOrderSyncFinish = new SyncFinishReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
mTouchAttacher.setPullComplete();
scope.main().refreshDrawer(TAG);
mListViewAdapter.clear();
mPurchaseOrderObjects.clear();
mListViewAdapter.notifiyDataChange(mPurchaseOrderObjects);
new PurchaseOrderLoader(mType).execute();
}
};
private DataSetChangeReceiver datasetChangeReceiver = new DataSetChangeReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
try {
Log.d(TAG, "PurchaseOrder->datasetChangeReceiver@onReceive");
mView.findViewById(R.id.waitingForSyncToStart).setVisibility(View.GONE);
String id = intent.getExtras().getString("id");
String model = intent.getExtras().getString("model");
if (model.equals("purchase.order")) {
OEDataRow row = db().select(Integer.parseInt(id));
mPurchaseOrderObjects.add(0, row);
mListViewAdapter.notifiyDataChange(mPurchaseOrderObjects);
}
} catch (Exception e) {
}
}
};
}