package com.xiaomi.xms.sales.widget;
import android.content.Context;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.database.MergeCursor;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.RelativeLayout;
import android.widget.Spinner;
import com.xiaomi.xms.sales.R;
import com.xiaomi.xms.sales.adapter.RegionAdapter;
import com.xiaomi.xms.sales.cache.RegionCache;
import com.xiaomi.xms.sales.cache.RegionCache.QueryCallback;
import com.xiaomi.xms.sales.db.DBContract.Region;
import com.xiaomi.xms.sales.util.LogUtil;
public class RegionSelector extends RelativeLayout {
private static final String TAG = "RegionSelector";
private static final int UNSELECTED = 0;
private Context mContext;
private Spinner mProvinceSpinner;
private Spinner mCitySpinner;
private Spinner mDistrictSpinner;
private RegionAdapter mProvinceAdapter = null;
private RegionAdapter mCityAdapter = null;
private RegionAdapter mDistrictAdapter = null;
private OnSelectedListener mListener;
private int mOldProvinceId;
private int mOldCityId;
private int mOldDistrictId;
public RegionSelector(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
LayoutInflater.from(context).inflate(R.layout.city_selector, this, true);
}
public int getProvince() {
return (Integer) mProvinceSpinner.getSelectedView().getTag();
}
public int getCity() {
return (Integer) mCitySpinner.getSelectedView().getTag();
}
public int getDistrict() {
return (Integer) mDistrictSpinner.getSelectedView().getTag();
}
public interface OnSelectedListener {
public void onProvinceSelected(long id);
public void onCitySelected(long id);
public void onDistrictSelected(long id);
}
public void setOnSelectedListener(OnSelectedListener listener) {
mListener = listener;
}
public void removeOnSelectedListener() {
mListener = null;
}
public void set(int provinceId, int cityId, int districtId) {
mOldProvinceId = provinceId;
mOldCityId = cityId;
mOldDistrictId = districtId;
if (mProvinceAdapter != null) {
mProvinceSpinner.setSelection(findPositionInCursor(mProvinceAdapter.getCursor(),
provinceId));
}
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mProvinceSpinner = (Spinner) findViewById(R.id.address_province);
mCitySpinner = (Spinner) findViewById(R.id.address_city);
mDistrictSpinner = (Spinner) findViewById(R.id.address_district);
RegionCache.getInstance(mContext).getProvince(mGetProvinceOnCreateCallback);
mCitySpinner.setEnabled(false);
mDistrictSpinner.setEnabled(false);
}
private int findPositionInCursor(Cursor cursor, int id) {
if (cursor.moveToFirst()) {
do {
if (id == cursor.getInt(cursor.getColumnIndex(Region._ID))) {
return cursor.getPosition();
}
} while (cursor.moveToNext());
}
return -1;
}
private Cursor prependHeader(Cursor cursor, String name) {
MatrixCursor header = new MatrixCursor(new String[] {
Region._ID, Region.NAME
});
header.addRow(new Object[] {
-1, name
});
if (cursor == null) {
return header;
}
return new MergeCursor(new Cursor[] {
header, cursor
});
}
private QueryCallback mGetProvinceOnCreateCallback = new QueryCallback() {
@Override
public void queryComplete(Cursor cursor) {
if (cursor == null) {
LogUtil.w(TAG, "get province null.");
} else {
if (cursor.getCount() == 0) {
cursor.close();
return;
}
LogUtil.d(TAG, "get province ok.");
mProvinceAdapter = new RegionAdapter(mContext, prependHeader(
cursor, mContext.getString(R.string.address_province_select)));
mProvinceSpinner.setAdapter(mProvinceAdapter);
mProvinceSpinner.setOnItemSelectedListener(mProvinceListener);
mCitySpinner.setOnItemSelectedListener(mCityListener);
mDistrictSpinner.setOnItemSelectedListener(mDistrictListener);
if (mOldProvinceId > 0) {
mProvinceSpinner.setSelection(findPositionInCursor(
mProvinceAdapter.getCursor(), mOldProvinceId));
mOldProvinceId = -1;
}
}
}
};
private OnItemSelectedListener mProvinceListener = new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
LogUtil.d(TAG, "province selected:" + id);
if (id > 0) {
mCitySpinner.setEnabled(true);
if (mListener != null) {
mListener.onProvinceSelected(id);
}
} else {
mCitySpinner.setEnabled(false);
}
mCitySpinner.setSelection(UNSELECTED);
mDistrictSpinner.setEnabled(false);
RegionCache.getInstance(mContext).getCityByProvinceId(
id, new QueryCallback() {
@Override
public void queryComplete(Cursor cursor) {
cursor = prependHeader(cursor,
mContext.getString(R.string.address_city_select));
if (mCityAdapter == null) {
LogUtil.d(TAG, "new city adapter");
mCityAdapter = new RegionAdapter(mContext, cursor);
mCitySpinner.setAdapter(mCityAdapter);
} else {
mCityAdapter.changeCursor(cursor);
}
if (mOldCityId > 0) {
mCitySpinner.setSelection(findPositionInCursor(cursor,
mOldCityId));
mOldCityId = -1;
}
}
});
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
};
private OnItemSelectedListener mCityListener = new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
LogUtil.d(TAG, "city selected:" + id);
if (id > 0) {
mDistrictSpinner.setEnabled(true);
if (mListener != null) {
mListener.onCitySelected(id);
}
} else {
mDistrictSpinner.setEnabled(false);
}
mDistrictSpinner.setSelection(UNSELECTED);
RegionCache.getInstance(mContext).getDistrictByCityId(id,
new QueryCallback() {
@Override
public void queryComplete(Cursor cursor) {
cursor = prependHeader(cursor,
mContext.getString(R.string.address_district_select));
if (mDistrictAdapter == null) {
LogUtil.d(TAG, "new district adapter");
mDistrictAdapter = new RegionAdapter(mContext, cursor);
mDistrictSpinner.setAdapter(mDistrictAdapter);
} else {
mDistrictAdapter.changeCursor(cursor);
}
if (mOldDistrictId > 0) {
mDistrictSpinner.setSelection(findPositionInCursor(cursor,
mOldDistrictId));
mOldDistrictId = -1;
}
}
});
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
};
private OnItemSelectedListener mDistrictListener = new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
LogUtil.d(TAG, "district selected:" + id);
if (id <= 0) {
return;
}
if (mListener != null) {
mListener.onDistrictSelected(id);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
};
}