content: package id.aashari.code.miband2.Activities;
  
  import android.app.Activity;
  import android.app.ListActivity;
  import android.bluetooth.BluetoothAdapter;
  import android.bluetooth.BluetoothDevice;
  import android.bluetooth.BluetoothManager;
  import android.content.Context;
  import android.content.Intent;
  import android.content.pm.PackageManager;
  import android.os.Bundle;
  import android.os.Handler;
  import android.support.v7.app.AppCompatActivity;
  import android.view.LayoutInflater;
  import android.view.Menu;
  import android.view.MenuInflater;
  import android.view.MenuItem;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.AdapterView;
  import android.widget.BaseAdapter;
  import android.widget.ListView;
  import android.widget.TextView;
  import android.widget.Toast;
  
  
  import java.util.ArrayList;
  
  import id.aashari.code.miband2.R;
  
  /**
   * Activity for scanning and displaying available Bluetooth LE devices.
   */
  public class DeviceScanActivity extends AppCompatActivity {
      private LeDeviceListAdapter mLeDeviceListAdapter;
      private BluetoothAdapter mBluetoothAdapter;
      private boolean mScanning;
      private Handler mHandler;
  
      private static final int REQUEST_ENABLE_BT = 1;
      // Stops scanning after 10 seconds.
      private static final long SCAN_PERIOD = 10000;
      ListView listView;
  
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_device_scan);
  
          listView = (ListView) findViewById(R.id.listView);
  
  
          mHandler = new Handler();
  
          // Use this check to determine whether BLE is supported on the device.  Then you can
          // selectively disable BLE-related features.
          if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
              Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
              finish();
          }
  
          // Initializes a Bluetooth adapter.  For API level 18 and above, get a reference to
          // BluetoothAdapter through BluetoothManager.
          final BluetoothManager bluetoothManager =
                  (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
          mBluetoothAdapter = bluetoothManager.getAdapter();
  
          // Checks if Bluetooth is supported on the device.
          if (mBluetoothAdapter == null) {
              Toast.makeText(this, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show();
              finish();
              return;
          }
      }
  
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          MenuInflater inflater = getMenuInflater();
          inflater.inflate(R.menu.main, menu);
          if (!mScanning) {
              menu.findItem(R.id.menu_stop).setVisible(false);
              menu.findItem(R.id.menu_scan).setVisible(true);
              menu.findItem(R.id.menu_refresh).setActionView(null);
          } else {
              menu.findItem(R.id.menu_stop).setVisible(true);
              menu.findItem(R.id.menu_scan).setVisible(false);
              menu.findItem(R.id.menu_refresh).setActionView(
                      R.layout.actionbar_indeterminate_progress);
          }
          return true;
      }
  
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          switch (item.getItemId()) {
              case R.id.menu_scan:
                  mLeDeviceListAdapter.clear();
                  scanLeDevice(true);
                  break;
              case R.id.menu_stop:
                  scanLeDevice(false);
                  break;
          }
          return true;
      }
  
      @Override
      protected void onResume() {
          super.onResume();
  
          // Ensures Bluetooth is enabled on the device.  If Bluetooth is not currently enabled,
          // fire an intent to display a dialog asking the user to grant permission to enable it.
          if (!mBluetoothAdapter.isEnabled()) {
              if (!mBluetoothAdapter.isEnabled()) {
                  Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                  startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
              }
          }
  
          // Initializes list view adapter.
          mLeDeviceListAdapter = new LeDeviceListAdapter();
          listView.setAdapter(mLeDeviceListAdapter);
          listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
              @Override
              public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                  final BluetoothDevice device = mLeDeviceListAdapter.getDevice(i);
                  if (device == null) return;
                  final Intent intent = new Intent(DeviceScanActivity.this, MainActivity.class);
                  intent.putExtra(MainActivity.EXTRAS_DEVICE_NAME, device.getName());
                  intent.putExtra(MainActivity.EXTRAS_DEVICE_ADDRESS, device.getAddress());
                  intent.putExtra("device", device);
                  if (mScanning) {
                      mBluetoothAdapter.stopLeScan(mLeScanCallback);
                      mScanning = false;
                  }
                  startActivity(intent);
              }
          });
          scanLeDevice(true);
      }
  
      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          // User chose not to enable Bluetooth.
          if (requestCode == REQUEST_ENABLE_BT && resultCode == Activity.RESULT_CANCELED) {
              finish();
              return;
          }
          super.onActivityResult(requestCode, resultCode, data);
      }
  
      @Override
      protected void onPause() {
          super.onPause();
          scanLeDevice(false);
          mLeDeviceListAdapter.clear();
      }
  
  
  
      private void scanLeDevice(final boolean enable) {
          if (enable) {
              // Stops scanning after a pre-defined scan period.
              mHandler.postDelayed(new Runnable() {
                  @Override
                  public void run() {
                      mScanning = false;
                      mBluetoothAdapter.stopLeScan(mLeScanCallback);
                      invalidateOptionsMenu();
                  }
              }, SCAN_PERIOD);
  
              mScanning = true;
              mBluetoothAdapter.startLeScan(mLeScanCallback);
          } else {
              mScanning = false;
              mBluetoothAdapter.stopLeScan(mLeScanCallback);
          }
          invalidateOptionsMenu();
      }
  
      // Adapter for holding devices found through scanning.
      private class LeDeviceListAdapter extends BaseAdapter {
          private ArrayList<BluetoothDevice> mLeDevices;
          private LayoutInflater mInflator;
  
          public LeDeviceListAdapter() {
              super();
              mLeDevices = new ArrayList<BluetoothDevice>();
              mInflator = DeviceScanActivity.this.getLayoutInflater();
          }
  
          public void addDevice(BluetoothDevice device) {
              if (!mLeDevices.contains(device)) {
                  mLeDevices.add(device);
              }
          }
  
          public BluetoothDevice getDevice(int position) {
              return mLeDevices.get(position);
          }
  
          public void clear() {
              mLeDevices.clear();
          }
  
          @Override
          public int getCount() {
              return mLeDevices.size();
          }
  
          @Override
          public Object getItem(int i) {
              return mLeDevices.get(i);
          }
  
          @Override
          public long getItemId(int i) {
              return i;
          }
  
          @Override
          public View getView(int i, View view, ViewGroup viewGroup) {
              ViewHolder viewHolder;
              // General ListView optimization code.
              if (view == null) {
                  view = mInflator.inflate(R.layout.listitem_device, null);
                  viewHolder = new ViewHolder();
                  viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address);
                  viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name);
                  view.setTag(viewHolder);
              } else {
                  viewHolder = (ViewHolder) view.getTag();
              }
  
              BluetoothDevice device = mLeDevices.get(i);
              final String deviceName = device.getName();
              if (deviceName != null && deviceName.length() > 0)
                  viewHolder.deviceName.setText(deviceName);
              else
                  viewHolder.deviceName.setText(R.string.unknown_device);
              viewHolder.deviceAddress.setText(device.getAddress());
  
              return view;
          }
      }
  
      // Device scan callback.
      private BluetoothAdapter.LeScanCallback mLeScanCallback =
              new BluetoothAdapter.LeScanCallback() {
  
                  @Override
                  public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
                      runOnUiThread(new Runnable() {
                          @Override
                          public void run() {
                              mLeDeviceListAdapter.addDevice(device);
                              mLeDeviceListAdapter.notifyDataSetChanged();
                          }
                      });
                  }
              };
  
      static class ViewHolder {
          TextView deviceName;
          TextView deviceAddress;
      }
  }