package com.shlb.comb.adapter; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.blakequ.bluetooth_manager_lib.device.BeaconType; import com.blakequ.bluetooth_manager_lib.device.BeaconUtils; import com.blakequ.bluetooth_manager_lib.device.BluetoothLeDevice; import com.blakequ.bluetooth_manager_lib.device.adrecord.AdRecord; import com.blakequ.bluetooth_manager_lib.device.ibeacon.IBeaconDevice; import com.blakequ.bluetooth_manager_lib.util.ByteUtils; import com.shlb.comb.R; import com.shlb.comb.util.Constants; public class DeviceListAdapter2 extends BaseArrayListAdapter{ private int scrodKey; public DeviceListAdapter2(Context context) { super(context); } public void updateConfig(int scrodKey){ this.scrodKey = scrodKey; } @Override public View getView(int position, View view, ViewGroup parent) { final ViewHolder viewHolder; // General ListView optimization code. if (view == null) { view = mInflater.inflate(R.layout.list_item_device, null); viewHolder = new ViewHolder(); viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address); viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name); viewHolder.deviceRssi = (TextView) view.findViewById(R.id.device_rssi); viewHolder.deviceIcon = (ImageView) view.findViewById(R.id.device_icon); viewHolder.deviceLastUpdated = (TextView) view.findViewById(R.id.device_last_update); viewHolder.ibeaconMajor = (TextView) view.findViewById(R.id.ibeacon_major); viewHolder.ibeaconMinor = (TextView) view.findViewById(R.id.ibeacon_minor); viewHolder.ibeaconDistance = (TextView) view.findViewById(R.id.ibeacon_distance); viewHolder.ibeaconUUID = (TextView) view.findViewById(R.id.ibeacon_uuid); viewHolder.ibeaconTxPower = (TextView) view.findViewById(R.id.ibeacon_tx_power); viewHolder.ibeaconSection = view.findViewById(R.id.ibeacon_section); viewHolder.ibeaconDistanceDescriptor = (TextView) view.findViewById(R.id.ibeacon_distance_descriptor); viewHolder.deviceRecord = (TextView) view.findViewById(R.id.ibeacon_scan_record); view.setTag(viewHolder); } else { viewHolder = (ViewHolder) view.getTag(); } final BluetoothLeDevice device = (BluetoothLeDevice) getItem(position); final String deviceName = device.getName(); final double rssi = device.getRssi(); if (deviceName != null && deviceName.length() > 0) { viewHolder.deviceName.setText(deviceName); } else { viewHolder.deviceName.setText(R.string.unknown_device); } if (BeaconUtils.getBeaconType(device) == BeaconType.IBEACON) { final IBeaconDevice iBeacon = new IBeaconDevice(device); final String accuracy = Constants.DOUBLE_TWO_DIGIT_ACCURACY.format(iBeacon.getAccuracy()); viewHolder.deviceIcon.setImageResource(R.mipmap.ic_device_ibeacon); viewHolder.ibeaconSection.setVisibility(View.VISIBLE); viewHolder.ibeaconMajor.setText(String.valueOf(iBeacon.getMajor())); viewHolder.ibeaconMinor.setText(String.valueOf(iBeacon.getMinor())); viewHolder.ibeaconTxPower.setText(String.valueOf(iBeacon.getCalibratedTxPower())); viewHolder.ibeaconUUID.setText(iBeacon.getUUID()); viewHolder.ibeaconDistance.setText( mContext.getString(R.string.formatter_meters, accuracy)); viewHolder.ibeaconDistanceDescriptor.setText(iBeacon.getDistanceDescriptor().toString()); } else { viewHolder.deviceIcon.setImageResource(R.mipmap.ic_bluetooth); viewHolder.ibeaconSection.setVisibility(View.GONE); } final String rssiString = mContext.getString(R.string.formatter_db, String.valueOf(rssi)); final String runningAverageRssiString = mContext.getString(R.string.formatter_db, String.valueOf(device.getRunningAverageRssi())); viewHolder.deviceLastUpdated.setText( android.text.format.DateFormat.format( Constants.TIME_FORMAT, new java.util.Date(device.getTimestamp()))); viewHolder.deviceAddress.setText(device.getAddress()); viewHolder.deviceRssi.setText(rssiString + " / " + runningAverageRssiString); //add for test if (scrodKey != -1){ AdRecord record = device.getAdRecordStore().getRecord(scrodKey); if (record != null) { viewHolder.deviceRecord.setVisibility(View.VISIBLE); viewHolder.deviceRecord.setText(record.getHumanReadableType()+":"+ByteUtils.byteArrayToHexString(record.getData())); }else { viewHolder.deviceRecord.setVisibility(View.GONE); } }else { viewHolder.deviceRecord.setVisibility(View.GONE); } return view; } public double calculateAccuracy(final int txPower, final double rssi) { if (rssi == 0) { return 0; // if we cannot determine accuracy, return -1. } final double ratio = rssi * 1.0 / txPower; if (ratio < 1.0) { return Math.pow(ratio, 10); } else { return (0.89976) * Math.pow(ratio, 7.7095) + 0.111; } } static class ViewHolder { TextView deviceName; TextView deviceAddress; TextView deviceRssi; TextView ibeaconUUID; TextView ibeaconMajor; TextView ibeaconMinor; TextView ibeaconTxPower; TextView ibeaconDistance; TextView ibeaconDistanceDescriptor; TextView deviceLastUpdated; View ibeaconSection; ImageView deviceIcon; TextView deviceRecord; } }