package uk.co.alt236.btlescan.ui.details; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.Menu; import android.view.MenuItem; import java.util.ArrayList; import java.util.Collection; import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; import uk.co.alt236.bluetoothlelib.device.BluetoothLeDevice; import uk.co.alt236.bluetoothlelib.device.adrecord.AdRecord; import uk.co.alt236.bluetoothlelib.device.beacon.BeaconType; import uk.co.alt236.bluetoothlelib.device.beacon.BeaconUtils; import uk.co.alt236.bluetoothlelib.device.beacon.ibeacon.IBeaconManufacturerData; import uk.co.alt236.bluetoothlelib.util.ByteUtils; import uk.co.alt236.btlescan.R; import uk.co.alt236.btlescan.ui.common.Navigation; import uk.co.alt236.btlescan.ui.common.recyclerview.RecyclerViewBinderCore; import uk.co.alt236.btlescan.ui.common.recyclerview.RecyclerViewItem; import uk.co.alt236.btlescan.ui.details.recyclerview.model.AdRecordItem; import uk.co.alt236.btlescan.ui.details.recyclerview.model.DeviceInfoItem; import uk.co.alt236.btlescan.ui.details.recyclerview.model.HeaderItem; import uk.co.alt236.btlescan.ui.details.recyclerview.model.IBeaconItem; import uk.co.alt236.btlescan.ui.details.recyclerview.model.RssiItem; import uk.co.alt236.btlescan.ui.details.recyclerview.model.TextItem; public class DeviceDetailsActivity extends AppCompatActivity { private static final String EXTRA_DEVICE = DeviceDetailsActivity.class.getName() + ".EXTRA_DEVICE"; private static final int LAYOUT_ID = R.layout.activity_details; @Bind(R.id.recycler) protected RecyclerView mRecycler; private BluetoothLeDevice mDevice; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(LAYOUT_ID); ButterKnife.bind(this); mRecycler.setLayoutManager(new LinearLayoutManager(this)); mDevice = getIntent().getParcelableExtra(EXTRA_DEVICE); getSupportActionBar().setTitle(mDevice.getName()); getSupportActionBar().setDisplayHomeAsUpEnabled(true); pupulateDetails(mDevice); } @Override public boolean onCreateOptionsMenu(final Menu menu) { getMenuInflater().inflate(R.menu.details, menu); return true; } @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { case R.id.menu_connect: new Navigation(this).startControlActivity(mDevice); return true; case android.R.id.home: onBackPressed(); return true; } return super.onOptionsItemSelected(item); } private void pupulateDetails(final BluetoothLeDevice device) { final DetailsRecyclerAdapter detailsRecyclerAdapter; final List<RecyclerViewItem> list = new ArrayList<>(); if (device == null) { list.add(new HeaderItem(getString(R.string.header_device_info))); list.add(new TextItem(getString(R.string.invalid_device_data))); } else { list.add(new HeaderItem(getString(R.string.header_device_info))); list.add(new DeviceInfoItem(device)); list.add(new HeaderItem(getString(R.string.header_rssi_info))); list.add(new RssiItem(device)); list.add(new HeaderItem(getString(R.string.header_scan_record))); list.add(new TextItem(ByteUtils.byteArrayToHexString(device.getScanRecord()))); final Collection<AdRecord> adRecords = device.getAdRecordStore().getRecordsAsCollection(); if (adRecords.size() > 0) { list.add(new HeaderItem(getString(R.string.header_raw_ad_records))); for (final AdRecord record : adRecords) { final String title = "#" + record.getType() + " " + record.getHumanReadableType(); list.add(new AdRecordItem(title, record)); } } final boolean isIBeacon = BeaconUtils.getBeaconType(device) == BeaconType.IBEACON; if (isIBeacon) { final IBeaconManufacturerData iBeaconData = new IBeaconManufacturerData(device); list.add(new HeaderItem(getString(R.string.header_ibeacon_data))); list.add(new IBeaconItem(iBeaconData)); } } final RecyclerViewBinderCore core = RecyclerViewCoreFactory.create(this); mRecycler.setAdapter(new DetailsRecyclerAdapter(core, list)); } public static Intent createIntent(Context context, BluetoothLeDevice device) { final Intent intent = new Intent(context, DeviceDetailsActivity.class); intent.putExtra(DeviceDetailsActivity.EXTRA_DEVICE, device); return intent; } }