/**
* author : lipan
* filename : AddCampusActivity.java
* create_time : 2014年11月7日 下午2:10:47
*/
package com.sets.speedtest.activity;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.apache.http.entity.StringEntity;
import org.json.JSONArray;
import org.json.JSONObject;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.Handler;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.sets.speedtest.R;
import com.sets.speedtest.common.ClearAutoCompleteEditText;
import com.sets.speedtest.common.CommDialog;
import com.sets.speedtest.common.CommToast;
import com.sets.speedtest.common.MyArrayAdapter;
import com.sets.speedtest.constant.C;
import com.sets.speedtest.db.CampusDao;
import com.sets.speedtest.domain.AddressInfo;
import com.sets.speedtest.domain.Campus;
import com.sets.speedtest.listener.ClearEditTextListener;
import com.sets.speedtest.listener.CommListener;
import com.sets.speedtest.listener.OnDialogClickListener;
import com.sets.speedtest.manager.DBOpenManager;
import com.sets.speedtest.manager.SharedPreferencesManager;
import com.sets.speedtest.manager.http.BaseResponseHandler;
import com.sets.speedtest.manager.http.WSClient;
import com.sets.speedtest.utils.DateUtils;
import com.sets.speedtest.utils.JsonUtils;
import com.sets.speedtest.utils.ResponseParser;
import com.sets.speedtest.utils.StringB;
import com.sets.speedtest.utils.ViewUtils;
import com.wangjie.androidinject.annotation.annotations.base.AILayout;
import com.wangjie.androidinject.annotation.annotations.base.AISystemService;
import com.wangjie.androidinject.annotation.annotations.base.AIView;
/**
* @author : lipan
* @create_time : 2014年11月7日 下午2:10:47
* @desc : 填写其他学校地址
* @update_person:
* @update_time :
* @update_desc :
*
*/
@AILayout(R.layout.activity_add_campus)
public class AddCampusActivity extends BaseActivity
{
@AIView(id = R.id.cityET, clickMethod = "BtnClick")
private ClearAutoCompleteEditText cityTextView; // 城市
@AIView(id = R.id.campusET, clickMethod = "BtnClick")
private ClearAutoCompleteEditText campusTextView; // 大学自动补全
@AIView(id = R.id.classroomET, clickMethod = "BtnClick")
private ClearAutoCompleteEditText classroomTextView; // 教室
@AIView(id = R.id.cityLayout)
private LinearLayout cityLayout; // 城市layout
@AIView(id = R.id.campusLayout)
private LinearLayout campusLayout; // 大学layout
@AISystemService
private LayoutInflater layoutInflater;
private Map<String, String> campusMap; // 所有大学信息:key学校;value城市
private List<String> cityList; // 所有城市信息
private LocationClient mLocationClient = null;
private String locationCity = ""; // 定位城市
private String historyCity; // 记住历史城市
private String historyCampus; // 大学改变时检索详细地址;城市忽略。。因为大学的城市是固定的
private Boolean retry = false; // 是否需要重新获取详细地址信息列表
@AIView(id = R.id.main_parent)
private LinearLayout mainLayout; // 最外层layout...
private Integer keyboardHeight = 0; // 键盘高度
private Integer baseHeight = 0; // 除去键盘、状态栏、导航栏的剩余高度
private Integer statusBarHeight; // 状态栏高度
@Override
public void BtnClick(View v)
{
switch (v.getId())
{
case R.id.navi_btn_right: // 导航栏右上角
CommDialog.showConfirmDialog(getContext(), R.string.call_help,
R.string.call_help_confirm, getString(R.string.dialog_cancel),
getString(R.string.call_help_go), true, true, new OnDialogClickListener()
{
@Override
public void onRightClick(View v)
{
ViewUtils.call(getContext(), getString(R.string.call_help_no));
}
});
break;
case R.id.next:
// 表单信息是否为空
if (validate())
{
commitAddInfo();
}
break;
case R.id.cityET:
cityFocus();
break;
case R.id.campusET:
campusFocus();
break;
case R.id.classroomET:
classroomFocus();
break;
case R.id.helpBtn:
debugWithDialog("帮助信息");
break;
default:
break;
}
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
initData();
initView();
}
private void initView()
{
// 第一次打开应用时提示...
if (SharedPreferencesManager.getInstance().getUserInfo().isFirst)
{
CommDialog.showInfoDialog(context, getString(R.string.comments), null);
SharedPreferencesManager.getInstance().setIsFirst(false);
}
// 计算键盘高度
mainLayout.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener()
{
@Override
public void onGlobalLayout()
{
if (keyboardHeight < 100)
{
Rect r = new Rect();
mainLayout.getWindowVisibleDisplayFrame(r);
int screenHeight = mainLayout.getRootView().getHeight();
keyboardHeight = screenHeight - (r.bottom - r.top);
// 计算高度
baseHeight = ViewUtils.getDeviceHeight(getContext()) - statusBarHeight
- keyboardHeight
- getResources().getDimensionPixelSize(R.dimen.navi_height);
}
}
});
// 状态栏高度
statusBarHeight = ViewUtils.getStatusBarHeight(getContext());
// 城市获得焦点,自动补全
cityTextView.setClearEditTextListener(new ClearEditTextListener()
{
@Override
public void onFocusChange(View v, boolean hasFocus)
{
// 获得焦点时查询学校地址...
if (hasFocus)
{
cityFocus();
}
}
@Override
public void afterTextChanged(String s)
{
if (StringB.isBlank(s))
{
historyCity = "";
campusTextView.setAdapter(null);
}
}
});
// 大学获得焦点,自动补全大学信息(加城市参数)
campusTextView.setClearEditTextListener(new ClearEditTextListener()
{
@Override
public void onFocusChange(View v, boolean hasFocus)
{
// 获得焦点时查询学校地址...
if (hasFocus)
{
campusFocus();
}
}
});
// 大学选中,更新城市
campusTextView.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
String campusChosen = ((TextView) view).getText().toString();
cityTextView.setText(campusMap.get(campusChosen));
}
});
// 详细地址点击后展开
classroomTextView.setClearEditTextListener(new ClearEditTextListener()
{
@Override
public void onFocusChange(View v, boolean hasFocus)
{
if (hasFocus)
{
classroomFocus();
}
}
@Override
public void afterTextChanged(String s)
{
if ("".equals(s))
{
// 如果adapter内容非空;可能需要弹出补全框
if (null != classroomTextView.getAdapter()
&& classroomTextView.getAdapter().getCount() > 0)
{
classroomTextView.showDropDown();
}
}
}
});
// 设置监听事件
setListener(new CommListener()
{
@Override
public void allViewsOnTouchExcludeInput()
{
// TODO 不监听
ViewUtils.show(cityLayout);
ViewUtils.show(campusLayout);
}
});
// 弹出键盘
ViewUtils.showSoftKeyboard(cityTextView);
}
private void initData()
{
// 获得城市信息
cityList = new CampusDao(DBOpenManager.getInstance().getBaseDb()).getCityList();
}
// 城市获得焦点(点击/获得焦点)
private void cityFocus()
{
if (null == cityTextView.getAdapter())
{
// 城市自动补全
MyArrayAdapter<String> cityAdapter = new MyArrayAdapter<String>(this,
R.layout.auto_complete_text_item, cityList.toArray(new String[0]));
cityTextView.setAdapter(cityAdapter);
cityTextView.setDropDownHeight(200);
}
// 如果文本内容非城市集合中的一个,重新设置一次文本的值,有可能触发自动补全下拉框
if (!cityList.contains(ViewUtils.getText(cityTextView)))
{
ViewUtils.setTextSelectionEnd(cityTextView, ViewUtils.getText(cityTextView));
}
}
// 地址获得焦点(点击/获得焦点)
private void campusFocus()
{
// TODO 隐藏城市
// ViewUtils.hide(cityLayout);
// 如果城市合法记录历史城市
if (cityList.contains(ViewUtils.getText(cityTextView)))
{
if (!ViewUtils.getText(cityTextView).equals(historyCity))
{
// 城市合法并发生改变了,清空大学adapter
campusTextView.setAdapter(null);
}
historyCity = ViewUtils.getText(cityTextView);
}
if (null == campusTextView.getAdapter())
{
// 获得城市、学校信息
LinkedList<Campus> campusList = new CampusDao(DBOpenManager.getInstance().getBaseDb())
.getCampusList(historyCity);
campusMap = new TreeMap<String, String>();
for (Campus campus : campusList)
{
campusMap.put(campus.name, campus.city); // 所有大学
}
// 大学自动补全
MyArrayAdapter<String> campusAdapter = new MyArrayAdapter<String>(getContext(),
R.layout.auto_complete_text_item, campusMap.keySet().toArray(new String[0]));
campusTextView.setAdapter(campusAdapter);
campusTextView.setDropDownHeight(baseHeight
- getResources().getDimensionPixelSize(R.dimen.gap_100)
+ getResources().getDimensionPixelSize(R.dimen.gap_10));
}
// 如果文本内容非地址集合中的一个,重新设置一次文本的值,有可能触发自动补全下拉框
if (!campusMap.containsKey(ViewUtils.getText(campusTextView)))
{
ViewUtils.setTextSelectionEnd(campusTextView, ViewUtils.getText(campusTextView));
}
}
// 详细地址获得焦点(点击/获得焦点)
@SuppressWarnings("unchecked")
private void classroomFocus()
{
// 城市/大学为空不处理
if (StringB.isBlank(ViewUtils.getText(cityTextView))
|| StringB.isBlank(ViewUtils.getText(campusTextView)))
{
return;
}
// TODO 隐藏城市、地址layout
ViewUtils.hide(cityLayout);
ViewUtils.hide(campusLayout);
// 跟上一次填写学校相同,不做http请求
if (ViewUtils.getText(campusTextView).equals(historyCampus) && !retry)
{
// 如果adapter内容非空;可能需要弹出补全框
if (null != classroomTextView.getAdapter()
&& classroomTextView.getAdapter().getCount() > 0)
{
// 如果详细地址为空,弹出全量补全框
if (StringB.isBlank(ViewUtils.getText(classroomTextView)))
{
classroomTextView.showDropDown();
} else
// 如果文本内容非详细地址集合中的一个,重新设置一次文本的值,尝试触发补全框
if (!((MyArrayAdapter<String>) classroomTextView.getAdapter()).getList().contains(
ViewUtils.getText(classroomTextView)))
{
ViewUtils.setTextSelectionEnd(classroomTextView,
ViewUtils.getText(classroomTextView));
}
}
} else
{
// 保存当次点击详细地址时的大学名称
historyCampus = ViewUtils.getText(campusTextView);
// 清空上一次请求的adapter
classroomTextView.setAdapter(null);
try
{
JSONObject data = new JSONObject();
data.put("city", ViewUtils.getText(cityTextView));
data.put("college", ViewUtils.getText(campusTextView));
// 上传
WSClient.postJson(getApplicationContext(), C.WS_GET_DETAIL_ADDRESS,
new StringEntity(data.toString(), C.CHARSET_UTF8), new BaseResponseHandler(
getContext(), R.string.get_detail_add, false)
{
public void onSuccess(int statusCode, JSONObject response)
{
if (C.RSP_CODE_SUCCESS == response.optInt(C.RSP_CODE))
{
retry = false;// 该次请求成功...
JSONArray addJsonArray = response.optJSONArray(C.RSP_DATA);
if (addJsonArray.length() > 0)
{
List<String> addList = JsonUtils
.jsonArray2List(addJsonArray);
// 详细地址自动补全
MyArrayAdapter<String> classroomAdapter = new MyArrayAdapter<String>(
getContext(), R.layout.auto_complete_text_item,
addList);
classroomTextView.setAdapter(classroomAdapter);
classroomTextView.setDropDownHeight(baseHeight
- getResources().getDimensionPixelSize(
R.dimen.gap_50)
+ getResources().getDimensionPixelSize(
R.dimen.gap_10));
if (ViewUtils.isEmpty(classroomTextView))
{
classroomTextView.showDropDown();
}else
{
ViewUtils.setTextSelectionEnd(classroomTextView,
ViewUtils.getText(classroomTextView));
}
}
}
};
@Override
public void onFinish()
{
super.onFinish(); // 隐藏loading...
ViewUtils.showSoftKeyboard(classroomTextView); // 弹出软键盘
}
@Override
public void onFailure(Throwable error, String content)
{
// 请求失败,需要重新尝试请求
retry = true;// 该次请求异常...
}
});
} catch (Exception e)
{
e.printStackTrace();
}
}
}
/**
* 信息校验
*/
private boolean validate()
{
if (StringB.isBlank(ViewUtils.getText(cityTextView)))
{
CommToast.showInfo(getContext(), getString(R.string.is_empty, "城市"));
return false;
} else if (!cityList.contains(ViewUtils.getText(cityTextView)))
{
CommToast.showInfo(getContext(), getString(R.string.is_empty, "正确的城市"));
return false;
}
if (StringB.isBlank(ViewUtils.getText(campusTextView)))
{
CommToast.showInfo(getContext(), getString(R.string.is_empty, "地址"));
return false;
}
if (StringB.isBlank(ViewUtils.getText(classroomTextView)))
{
CommToast.showInfo(getContext(), getString(R.string.is_empty, "详细地址"));
return false;
}
return true;
}
/**
* 下一步;提交地址信息
*/
private void commitAddInfo()
{
// 定位的城市和输入的城市不一样
if (StringB.isNotBlank(locationCity)
&& !locationCity.equals(ViewUtils.getText(cityTextView)))
{
CommDialog.showConfirmDialog(context, R.string.city_not_in_position,
new OnDialogClickListener()
{
@Override
public void onLeftClick(View v)
{
return;
}
@Override
public void onRightClick(View v)
{
commit();
}
});
}else
{
commit();
}
}
private void commit()
{
try
{
final JSONObject params = new JSONObject();
params.put("city", ViewUtils.getText(cityTextView));
params.put("college", ViewUtils.getText(campusTextView));
params.put("address", ViewUtils.getText(classroomTextView));
StringEntity entity = new StringEntity(params.toString(),
C.CHARSET_UTF8);
WSClient.postJson(getContext(), C.WS_SAVE_ADDRESS, entity,
new BaseResponseHandler(getContext(), R.string.save_add,
null)
{
@Override
public void onSuccess(int statusCode,
JSONObject response)
{
ResponseParser handler = ResponseParser.handler(
getContext(), response);
if (handler.success)
{
// 记录地址Id~~
// SharedPreferencesManager.getInstance().setAddressId(
// handler.data.optInt("addressId"));
// 传参
AddressInfo address = new AddressInfo(params
.optString("city"), params
.optString("college"), params
.optString("address"), handler.data
.optInt("addressId"));
Bundle data = new Bundle();
data.putParcelable(AddressInfo.KEY, address);
startActivity(SpeedTestActivity.class, data);
} else
{
CommToast.showInfo(getContext(),
handler.errorMsg);
}
}
@Override
public void onFailure(Throwable error, String content)
{
CommToast.showInfo(getContext(),
getString(R.string.system_error));
}
});
} catch (Exception e)
{
CommToast.showInfo(getContext(), getString(R.string.system_error));
}
}
/**
* 初始化定位
*/
private void initLocation()
{
// 定位初始化
mLocationClient = new LocationClient(getApplicationContext()); // 声明LocationClient类
mLocationClient.registerLocationListener(new BDLocationListener()
{
@Override
public void onReceiveLocation(BDLocation location)
{
if (null == location)
{
return;
}
// 自动补全城市 这里为了和百一测评大学码表的城市字段统一,去掉"市"字
String cityName = location.getCity();
if (!StringB.isBlank(cityName) && ViewUtils.isEmpty(cityTextView) && cityList.contains(locationCity = cityName.trim().replaceAll("市", "")))
{
// locationCity = cityName.trim().replaceAll("市", ""); // 缓存定位的
ViewUtils.setTextSelectionEnd(cityTextView, cityName.replaceAll("市", ""));
new Handler().postDelayed(new Runnable()
{
@Override
public void run()
{
cityTextView.dismissDropDown();
}
}, 300);
if (mLocationClient.isStarted())
{
mLocationClient.stop();
}
}
}
}); // 注册监听函数
LocationClientOption option = new LocationClientOption();
option.setOpenGps(false); // 打开gps
option.setLocationMode(LocationMode.Battery_Saving);// 设置定位模式
option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(30000);// 设置发起定位请求的间隔时间为30s
option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
option.setNeedDeviceDirect(false);// 返回的定位结果包含手机机头的方向
mLocationClient.setLocOption(option);
mLocationClient.start();
mLocationClient.requestLocation(); // 请求获取位置信息
}
@Override
protected void onResume()
{
super.onResume();
initLocation();
}
@Override
protected void onPause()
{
super.onPause();
if (mLocationClient.isStarted())
{
mLocationClient.stop();
}
}
private long mExitTime;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK)
{
if ((DateUtils.getCurrentMillis() - mExitTime) > 2000)
{
CommToast.showInfo(this, R.string.exit_app, Gravity.BOTTOM, 0, getResources()
.getDimensionPixelSize(R.dimen.gap_50));
mExitTime = DateUtils.getCurrentMillis();
} else
{
CommToast.dismiss();
// 两次按返回键在两秒内,那么退出应用
finish();
}
return true;
}
return super.onKeyDown(keyCode, event);
}
}