package com.pandocloud.freeiot.ui.home; import android.app.Activity; import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Color; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.content.LocalBroadcastManager; import android.support.v4.widget.SwipeRefreshLayout; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.loopj.android.http.BaseJsonHttpResponseHandler; import com.nostra13.universalimageloader.core.ImageLoader; import com.pandocloud.android.api.AbsOpenApi; import com.pandocloud.android.utils.NetworkUtil; import com.pandocloud.freeiot.R; import com.pandocloud.freeiot.api.DevicesApi; import com.pandocloud.freeiot.api.WrapperBaseJsonHttpResponseHandler; import com.pandocloud.freeiot.ui.app.ActionConstants; import com.pandocloud.freeiot.ui.app.ProductInfoPrefs; import com.pandocloud.freeiot.ui.app.UserState; import com.pandocloud.freeiot.ui.base.EasyBaseAdapter; import com.pandocloud.freeiot.ui.bean.Device; import com.pandocloud.freeiot.ui.bean.http.BaseResponse; import com.pandocloud.freeiot.ui.bean.http.DevicesResponse; import com.pandocloud.freeiot.ui.db.DBManager; import com.pandocloud.freeiot.ui.device.DeviceAuthActivity; import com.pandocloud.freeiot.ui.device.DeviceControlActivity; import com.pandocloud.freeiot.ui.device.DeviceInfoModifyActivity; import com.pandocloud.freeiot.ui.device.DevicePermissionsListActivity; import com.pandocloud.freeiot.utils.ActivityUtils; import com.pandocloud.freeiot.utils.BusinessUtils; import com.pandocloud.freeiot.utils.CommonUtils; import com.pandocloud.freeiot.utils.DialogFactory; import com.pandocloud.freeiot.utils.ErrorCodeHelper; import com.pandocloud.freeiot.utils.GsonUtils; import com.pandocloud.freeiot.utils.LogUtils; import com.pandocloud.freeiot.utils.UIUtils; import com.umeng.update.UmengUpdateAgent; import org.apache.http.Header; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; public class MyDevicesListFragment extends Fragment implements View.OnClickListener, SwipeRefreshLayout.OnRefreshListener { private ListView mListView; private DeviceAdapter mAdapter; private SwipeRefreshLayout mSwipeRefreshLayout; private HashMap<String, Device> mDevicesHashMap; public MyDevicesListFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_my_devices_list, container, false); initView(rootView); return rootView; } public void initView(View rootView) { mSwipeRefreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_container); mSwipeRefreshLayout.setColorScheme(R.color.main_red_color); mSwipeRefreshLayout.setOnRefreshListener(this); mSwipeRefreshLayout.setProgressViewOffset(true, 0, UIUtils.dip2px(getActivity(), 48)); mListView = (ListView) rootView.findViewById(R.id.listview); LocalBroadcastManager.getInstance(getActivity()) .registerReceiver(refreshDevicesReceiver, new IntentFilter(ActionConstants.ACTON_REFRESH_DEVICES)); refreshDevices(true); // UpdateConfig.setDebug(true); UmengUpdateAgent.forceUpdate(getActivity()); } @Override public void onRefresh() { refreshDevices(true); } @Override public void onClick(View v) { } public void unbindingDevice(final int position, String identifier) { DevicesApi.deviceUnbinding(getActivity(), UserState.getInstances(getActivity()).getAccessToken(""), identifier, new WrapperBaseJsonHttpResponseHandler<BaseResponse>(getActivity()) { @Override public void onStart() { CommonUtils.showingProgressDialog(); } @Override protected BaseResponse parseResponse2(String rawJsonData, boolean isFailure) throws Throwable { LogUtils.d("MainActivity", "rawJsonData: " + rawJsonData); if (!isFailure && !TextUtils.isEmpty(rawJsonData)) { return GsonUtils.getInstance().getGson().fromJson(rawJsonData, BaseResponse.class); } return null; } @Override public void onSuccess(int statusCode, Header[] headers, String rawJsonData, BaseResponse response) { if (response.isSuccess()) { CommonUtils.ToastMsg(getActivity(), R.string.unbinding_success); mAdapter.removeAtPosition(position); refreshDevices(false); } else { super.onSuccess(statusCode, headers, rawJsonData, response); } } @Override public void onFinish() { CommonUtils.dismissDialog(); } }); } public void refreshDevices(final boolean showLoadingView) { if (showLoadingView) { mSwipeRefreshLayout.setRefreshing(true); } mDevicesHashMap = DBManager.getInstances(getActivity()).queryDeviceInfo(); DevicesApi.deviceList(getActivity(), UserState.getInstances(getActivity()).getAccessToken(""), new BaseJsonHttpResponseHandler<DevicesResponse>() { @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, String rawJsonResponse, DevicesResponse response) { LogUtils.e("end refresh devices http request with error", throwable); LogUtils.e("statusCode: " + statusCode); if (showLoadingView) { if (!NetworkUtil.isNetworkAvailable(getActivity()) || statusCode == 0) { CommonUtils.ToastMsg(getActivity(), getString(R.string.http_error_message)); } else { if (statusCode >= 500) { CommonUtils.ToastMsg(getActivity(), getString(R.string.http_server_error)); } else { if (throwable != null) { CommonUtils.ToastMsg(getActivity(), throwable.getMessage()); } } } } } @Override public void onSuccess(int statusCode, Header[] headers, String rawJsonData, DevicesResponse response) { if (response != null && getActivity() != null) { if (response.isSuccess()) { updateDevices(response.data); Collections.sort(response.data, new DeviceComparator()); if (mAdapter == null) { mAdapter = new DeviceAdapter(getActivity(), response.data); mListView.setAdapter(mAdapter); } else { mAdapter.updateDataSet(response.data); } } else { int code = response.code; CommonUtils.ToastMsg(getActivity(), ErrorCodeHelper.getInstances(getActivity()).getErrorMessage(code)); BusinessUtils.checkTokenAvailable(getActivity(), code); } } } @Override public void onFinish() { mSwipeRefreshLayout.setRefreshing(false); } @Override protected DevicesResponse parseResponse(String rawJsonData, boolean isFailure) throws Throwable { LogUtils.e("rawJsonData:" + rawJsonData); if (isFailure || TextUtils.isEmpty(rawJsonData)) { LogUtils.d("UserApi.deviceList->parseResponse: rawJsonData->" + rawJsonData); return null; } return GsonUtils.getInstance().getGson().fromJson(rawJsonData, DevicesResponse.class); } }); } public void updateDevices(List<Device> devices) { if (mDevicesHashMap == null || mDevicesHashMap.isEmpty()) { return; } for (Device device : devices) { if (!device.isOwner() && mDevicesHashMap.containsKey(device.identifier)) { device.name = mDevicesHashMap.get(device.identifier).name; } } } public void toDeviceSetting(String identifier) { Bundle bundle = new Bundle(); bundle.putString("identifier", identifier); ActivityUtils.start(getActivity(), DeviceAuthActivity.class, bundle, R.anim.slide_in_from_right, R.anim.slide_out_to_left); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { switch (requestCode) { //TODO // case UrlConfigActivity.URL_CONFIG_REQUEST_CODE: // finish(); // break; default: break; } } } BroadcastReceiver refreshDevicesReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (ActionConstants.ACTON_REFRESH_DEVICES.equals(intent.getAction())) { LogUtils.i("handler broadcase receiver, begin refresh devices http request ..."); refreshDevices(false); } } }; public void onDestroy() { LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(refreshDevicesReceiver); AbsOpenApi.cancel(getActivity(), true); super.onDestroy(); } class DeviceAdapter extends EasyBaseAdapter<Device> { private String productName; public DeviceAdapter(Context context, List<Device> dataset) { super(context, dataset); productName = ProductInfoPrefs.getInstances(mContext).getString("name", ""); } @Override public View getView(final int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(R.layout.adapter_device_item, parent, false); } final Device device = (Device) getItem(position); ImageView imageView = (ImageView)convertView.findViewById(R.id.image); TextView textView = (TextView) convertView.findViewById(R.id.textview); String iconUrl = ProductInfoPrefs.getInstances(mContext).getString("icon", ""); if (!TextUtils.isEmpty(iconUrl)) { ImageLoader.getInstance().displayImage(iconUrl, imageView); } else { imageView.setImageResource(R.drawable.icon); } if (device.isOnline()) { convertView.setClickable(true); // convertView.setBackgroundResource(R.drawable.selector_device_list); convertView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { deviceItemClick(device); } }); } else { convertView.setClickable(false); // convertView.setBackgroundResource(R.drawable.bg_list_item_press); convertView.setOnClickListener(null); } ImageView settingView = (ImageView) convertView.findViewById(R.id.setting); settingView.setVisibility(View.VISIBLE); if (device.isOwner()) { // settingView.setVisibility(View.VISIBLE); settingView.setImageResource(R.drawable.icon_setting); settingView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // createSettingDialog(mContext, position, device); showOwnerSettingDialog(mContext, position, device); } }); } else { // settingView.setVisibility(View.GONE); settingView.setImageResource(R.drawable.icon_settings2); settingView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showCommonSettingDailog(mContext, position, device); } }); } imageView.setVisibility(View.GONE); if (device.isOnline()) { textView.setTextColor(getResources().getColor(android.R.color.black)); if (!TextUtils.isEmpty(device.name)) { String txt = getString(R.string.device_name_format, device.name, device.identifier); SpannableStringBuilder stringBuilder = new SpannableStringBuilder(txt); stringBuilder.setSpan(new ForegroundColorSpan(Color.GRAY), txt.length() - device.identifier.length() - 2, txt.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE); textView.setText(stringBuilder); } else if(!TextUtils.isEmpty(productName)){ String txt = getString(R.string.device_name_format, productName, device.identifier); SpannableStringBuilder stringBuilder = new SpannableStringBuilder(txt); stringBuilder.setSpan(new ForegroundColorSpan(Color.GRAY), txt.length() - device.identifier.length() - 2, txt.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE); textView.setText(stringBuilder); } else { textView.setText(device.identifier); } } else { String txt; if (!TextUtils.isEmpty(device.name)) { txt = getString(R.string.device_name_format, device.name, device.identifier); } else if (!TextUtils.isEmpty(productName)) { txt = getString(R.string.device_name_format, productName, device.identifier); } else { txt = device.identifier; } textView.setText(txt); textView.setTextColor(Color.GRAY); } return convertView; } } class DeviceComparator implements Comparator<Device> { @Override public int compare(Device lhs, Device rhs) { if (lhs.isOnline() && rhs.isOnline()) { return 0; } if (lhs.isOnline()) { return -1; } if (rhs.isOnline()) { return 1; } return 0; } } public void deviceItemClick(Device device) { if (device.isOnline()) { Bundle bundle = new Bundle(); bundle.putString("identifier", device.identifier); // String name = ProductInfoPrefs.getInstances(getActivity()).getString("name", ""); bundle.putString("name", device.name); bundle.putString("app", device.app); ActivityUtils.start(getActivity(), DeviceControlActivity.class, bundle, R.anim.slide_in_from_right, R.anim.slide_out_to_left); } } /** * 是owner时,显示的菜单设置 * @param context * @param position * @param device */ public void showOwnerSettingDialog(Context context, final int position, final Device device) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(getString(R.string.settings)); String[] items = getResources().getStringArray(R.array.deivce_owner_setting); builder.setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); switch (which) { case 0: { Bundle bundle = new Bundle(); bundle.putSerializable("device", device); ActivityUtils.start(getActivity(), DeviceInfoModifyActivity.class, bundle, R.anim.slide_in_from_right, R.anim.slide_out_to_left); } break; case 1: { Bundle bundle = new Bundle(); bundle.putString("identifier", device.identifier); ActivityUtils.start(getActivity(), DevicePermissionsListActivity.class, bundle, R.anim.slide_in_from_right, R.anim.slide_out_to_left); } break; case 2: { DialogFactory.createCommonDialog(getActivity(), getString(R.string.warn), getString(R.string.unbinding_tip), getString(android.R.string.ok), getString(android.R.string.cancel), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); unbindingDevice(position, device.identifier); } }, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }).show(); } break; default: break; } } }); builder.create().show(); } /** * 不是owner时显示的菜单设置 * @param context * @param position * @param device */ public void showCommonSettingDailog(Context context, final int position, final Device device) { AlertDialog.Builder builder = new AlertDialog.Builder(context); // builder.setTitle(getString(R.string.settings)); String[] items = getResources().getStringArray(R.array.device_not_owner_setting); builder.setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: Bundle bundle = new Bundle(); if (mDevicesHashMap != null && mDevicesHashMap.containsKey(device.identifier)) { bundle.putBoolean("hasInfo", true); //本地数据库是否已经保存过数据 } bundle.putSerializable("device", device); ActivityUtils.start(getActivity(), DeviceInfoModifyActivity.class, bundle, R.anim.slide_in_from_right, R.anim.slide_out_to_left); break; case 1: DialogFactory.createCommonDialog(getActivity(), getString(R.string.warn), getString(R.string.device_delete_tip), getString(android.R.string.ok), getString(android.R.string.cancel), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); deleteDevice(position, device); } }, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }).show(); break; default: break; } } }); builder.create().show(); } public void deleteDevice(final int position, Device device) { DevicesApi.deviceDelete(getActivity(), UserState.getInstances(getActivity()).getAccessToken(""), device.identifier, new WrapperBaseJsonHttpResponseHandler<BaseResponse>(getActivity()) { @Override public void onStart() { CommonUtils.showingProgressDialog(); } @Override protected BaseResponse parseResponse2(String rawJsonData, boolean isFailure) throws Throwable { if (isFailure || TextUtils.isEmpty(rawJsonData)) { return null; } return GsonUtils.getInstance().getGson().fromJson(rawJsonData, BaseResponse.class); } @Override public void onSuccess(int statusCode, Header[] headers, String rawJsonData, BaseResponse response) { if (response.isSuccess()) { CommonUtils.ToastMsg(getActivity(), R.string.device_delete_success); mAdapter.removeAtPosition(position); refreshDevices(false); } else { super.onSuccess(statusCode, headers, rawJsonData, response); } } @Override public void onFinish() { CommonUtils.showingProgressDialog(); } }); } }