/**
* Odoo, Open Source Management Solution
* Copyright (C) 2012-today Odoo SA (<http:www.odoo.com>)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http:www.gnu.org/licenses/>
*
* Created on 13/2/15 11:56 AM
*/
package com.odoo.addons.crm;
import android.annotation.SuppressLint;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Parcelable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.odoo.R;
import com.odoo.addons.crm.models.CRMCaseStage;
import com.odoo.addons.crm.models.CRMLead;
import com.odoo.addons.customers.Customers;
import com.odoo.core.orm.ODataRow;
import com.odoo.core.orm.fields.OColumn;
import com.odoo.core.support.addons.fragment.BaseFragment;
import com.odoo.core.support.drawer.ODrawerItem;
import com.odoo.core.support.list.OListAdapter;
import com.odoo.core.utils.OControls;
import com.odoo.core.utils.OResource;
import com.odoo.core.utils.sys.IOnBackPressListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import odoo.controls.OControlHelper;
public class CRMOpportunitiesPager extends BaseFragment implements ViewPager.OnPageChangeListener, AdapterView.OnItemSelectedListener, IOnBackPressListener, SwipeRefreshLayout.OnRefreshListener {
public static final String TAG = CRMOpportunitiesPager.class.getSimpleName();
public static final String KEY_MENU = "key_menu_item";
private CRMLeads.Type mType = CRMLeads.Type.Opportunities;
private Context mContext;
private Handler handler;
private DataObserver observer;
private Cursor cursor = null;
private String[] projection = new String[]{"name"};
private CRMCaseStage crmStage;
public static final String KEY_STAGE_ID = "stage_id";
public static final String KEY_FILTER = "key_filter";
private ViewPager mPager;
private PagerTabStrip mTabStrip;
private HashMap<String, Fragment> mFragments = new HashMap<>();
private StagePagerAdapter mAdapter;
private Boolean filterCustomerOpp = false;
private int customer_id = -1;
private Spinner mNavSpinner = null;
private OListAdapter mNavSpinnerAdapter = null;
private List<Object> spinnerItems = new ArrayList<>();
private int selectedPagerPosition = 0;
private View mView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.crm_opportunity_pagger, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mView = view;
mContext = getActivity();
parent().setOnBackPressListener(this);
Bundle extra = getArguments();
if (extra.containsKey(Customers.KEY_FILTER_REQUEST)) {
filterCustomerOpp = true;
customer_id = extra.getInt(Customers.KEY_CUSTOMER_ID);
}
crmStage = new CRMCaseStage(getActivity(), null);
handler = new Handler();
observer = new DataObserver(handler);
parent().setHasActionBarSpinner(true);
mNavSpinner = parent().getActionBarSpinner();
initPager(view);
initSpinner();
}
private void initSpinner() {
if (getActivity() == null) {
return;
}
spinnerItems.clear();
spinnerItems.addAll(crmStage.select(null, "type!=?", new String[]{"lead"}, "sequence"));
if (spinnerItems.isEmpty()) {
parent().setHasActionBarSpinner(false);
mPager.setVisibility(View.GONE);
setHasSwipeRefreshView(mView, R.id.no_items_found, this);
OControls.setVisible(mView, R.id.no_items_found);
OControls.setVisible(mView, R.id.dashboard_no_item_view);
OControls.setText(mView, R.id.title, OResource.string(getActivity(),
R.string.label_no_opportunity_found));
OControls.setText(mView, R.id.subTitle, "");
OControls.setImage(mView, R.id.icon, R.drawable.ic_action_opportunities);
return;
} else {
mPager.setVisibility(View.VISIBLE);
OControls.setGone(mView, R.id.no_items_found);
OControls.setGone(mView, R.id.dashboard_no_item_view);
}
mNavSpinnerAdapter = new OListAdapter(getActivity(), R.layout.base_simple_list_item_1, spinnerItems) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getActivity()).inflate(R.layout.base_simple_list_item_1_selected
, parent, false);
}
return getSpinnerView(getItem(position), position, convertView, parent);
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getActivity()).inflate(getResource(), parent, false);
}
return getSpinnerView(getItem(position), position, convertView, parent);
}
};
mNavSpinner.setAdapter(mNavSpinnerAdapter);
mNavSpinner.setOnItemSelectedListener(this);
}
private View getSpinnerView(Object row, int pos, View view, ViewGroup parent) {
ODataRow r = (ODataRow) row;
OControls.setText(view, android.R.id.text1, r.getString("name"));
return view;
}
private void initPager(View view) {
getActivity().getContentResolver().registerContentObserver(
crmStage.uri(), true, observer);
initCR();
mPager = (ViewPager) view.findViewById(R.id.pager);
mPager.setOnPageChangeListener(this);
mTabStrip = (PagerTabStrip) view.findViewById(R.id.pager_title_strip);
mTabStrip.setTabIndicatorColor(Color.WHITE);
mPager.setOffscreenPageLimit(2);
mAdapter = new StagePagerAdapter(cursor, getChildFragmentManager());
mPager.setAdapter(mAdapter);
for (int i = 0; i < mTabStrip.getChildCount(); ++i) {
View nextChild = mTabStrip.getChildAt(i);
if (nextChild instanceof TextView) {
TextView textViewToConvert = (TextView) nextChild;
textViewToConvert.setAllCaps(true);
textViewToConvert.setTextColor(Color.WHITE);
textViewToConvert.setTypeface(OControlHelper.boldFont());
}
}
}
private void initCR() {
cursor = mContext.getContentResolver().query(crmStage.uri(),
projection, "type != ?", new String[]{"lead"}, "sequence");
}
@Override
public void onPageScrolled(int i, float v, int i2) {
}
@Override
public void onPageSelected(int position) {
mNavSpinner.setSelection(position);
selectedPagerPosition = position;
}
@Override
public void onPageScrollStateChanged(int i) {
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
mPager.setCurrentItem(position, true);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
@Override
public boolean onBackPressed() {
if (mFragments.size() > 0) {
return ((IOnBackPressListener) mFragments.get("index_" + mNavSpinner.getSelectedItemPosition())
).onBackPressed();
}
return true;
}
@Override
public void onRefresh() {
if (inNetwork()) {
Bundle syncBundle = new Bundle();
syncBundle.putBoolean(CRMOpportunities.KEY_IS_LEAD, false);
parent().sync().requestSync(CRMLead.AUTHORITY, syncBundle);
setSwipeRefreshing(true);
} else {
hideRefreshingProgress();
Toast.makeText(getActivity(), _s(R.string.toast_network_required), Toast.LENGTH_LONG)
.show();
}
}
private class StagePagerAdapter extends FragmentStatePagerAdapter {
private String key_filter;
public StagePagerAdapter(Cursor cursor, FragmentManager fm) {
super(fm);
key_filter = "opportunity";
}
@Override
public CharSequence getPageTitle(int position) {
cursor.moveToPosition(position);
String name = cursor.getString(cursor.getColumnIndex("name"));
int row_id = cursor.getInt(cursor.getColumnIndex(OColumn.ROW_ID));
String where = "stage_id = ? and type != ?";
List<String> args = new ArrayList<>();
args.add(row_id + "");
args.add("lead");
if (filterCustomerOpp) {
where += " and partner_id = ?";
args.add(customer_id + "");
}
int count = db().count(where, args.toArray(new String[args.size()]));
if (count > 0)
name += " (" + count + ")";
return name;
}
@Override
public Fragment getItem(int index) {
CRMOpportunities crm = new CRMOpportunities();
cursor.moveToPosition(index);
int stage_id = cursor.getInt(cursor.getColumnIndex(OColumn.ROW_ID));
Bundle bundle = new Bundle();
bundle.putInt(KEY_STAGE_ID, stage_id);
bundle.putString(KEY_FILTER, key_filter);
bundle.putInt("index", index);
if (filterCustomerOpp) {
bundle.putBoolean(Customers.KEY_FILTER_REQUEST, true);
bundle.putInt(Customers.KEY_CUSTOMER_ID, customer_id);
bundle.putString("name", getArguments().getString("name"));
}
crm.setArguments(bundle);
mFragments.put("index_" + index, crm);
return crm;
}
@Override
public void restoreState(Parcelable state, ClassLoader loader) {
super.restoreState(null, loader);
}
@Override
public int getCount() {
return cursor.getCount();
}
}
@Override
public List<ODrawerItem> drawerMenus(Context context) {
return new ArrayList<>();
}
@Override
public Class<CRMLead> database() {
return CRMLead.class;
}
private class DataObserver extends ContentObserver {
public DataObserver(Handler handler) {
super(handler);
}
@SuppressLint("NewApi")
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
}
@SuppressLint("NewApi")
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
updatePager();
}
}
public void updatePager() {
initCR();
initSpinner();
mAdapter.notifyDataSetChanged();
mPager.setCurrentItem(selectedPagerPosition);
}
}