2323package no .nordicsemi .android .blinky ;
2424
2525import android .Manifest ;
26- import android . arch .lifecycle .ViewModelProviders ;
26+ import androidx .lifecycle .ViewModelProviders ;
2727import android .bluetooth .BluetoothAdapter ;
2828import android .content .Intent ;
2929import android .net .Uri ;
3030import android .os .Bundle ;
3131import android .provider .Settings ;
32- import android .support .annotation .NonNull ;
33- import android .support .annotation .Nullable ;
34- import android .support .v4 .app .ActivityCompat ;
35- import android .support .v7 .app .AppCompatActivity ;
36- import android .support .v7 .widget .DividerItemDecoration ;
37- import android .support .v7 .widget .LinearLayoutManager ;
38- import android .support .v7 .widget .RecyclerView ;
39- import android .support .v7 .widget .SimpleItemAnimator ;
40- import android .support .v7 .widget .Toolbar ;
32+ import androidx .annotation .NonNull ;
33+ import androidx .annotation .Nullable ;
34+ import androidx .core .app .ActivityCompat ;
35+ import androidx .appcompat .app .AppCompatActivity ;
36+ import androidx .recyclerview .widget .DividerItemDecoration ;
37+ import androidx .recyclerview .widget .LinearLayoutManager ;
38+ import androidx .recyclerview .widget .RecyclerView ;
39+ import androidx .recyclerview .widget .SimpleItemAnimator ;
40+ import androidx .appcompat .widget .Toolbar ;
41+
42+ import android .view .Menu ;
43+ import android .view .MenuItem ;
4144import android .view .View ;
4245import android .widget .Button ;
4346
@@ -80,8 +83,7 @@ protected void onCreate(@Nullable final Bundle savedInstanceState) {
8083 // Configure the recycler view
8184 final RecyclerView recyclerView = findViewById (R .id .recycler_view_ble_devices );
8285 recyclerView .setLayoutManager (new LinearLayoutManager (this ));
83- final DividerItemDecoration dividerItemDecoration = new DividerItemDecoration (recyclerView .getContext (), DividerItemDecoration .VERTICAL );
84- recyclerView .addItemDecoration (dividerItemDecoration );
86+ recyclerView .addItemDecoration (new DividerItemDecoration (this , DividerItemDecoration .VERTICAL ));
8587 ((SimpleItemAnimator ) recyclerView .getItemAnimator ()).setSupportsChangeAnimations (false );
8688 final DevicesAdapter adapter = new DevicesAdapter (this , mScannerViewModel .getDevices ());
8789 adapter .setOnItemClickListener (this );
@@ -91,8 +93,7 @@ protected void onCreate(@Nullable final Bundle savedInstanceState) {
9193 @ Override
9294 protected void onRestart () {
9395 super .onRestart ();
94- mScannerViewModel .getDevices ().clear ();
95- mScannerViewModel .getScannerState ().clearRecords ();
96+ clear ();
9697 }
9798
9899 @ Override
@@ -102,14 +103,39 @@ protected void onStop() {
102103 }
103104
104105 @ Override
105- public void onItemClick (final DiscoveredBluetoothDevice device ) {
106+ public boolean onCreateOptionsMenu (final Menu menu ) {
107+ getMenuInflater ().inflate (R .menu .filter , menu );
108+ menu .findItem (R .id .filter_uuid ).setChecked (mScannerViewModel .isUuidFilterEnabled ());
109+ menu .findItem (R .id .filter_nearby ).setChecked (mScannerViewModel .isNearbyFilterEnabled ());
110+ return true ;
111+ }
112+
113+ @ Override
114+ public boolean onOptionsItemSelected (final MenuItem item ) {
115+ switch (item .getItemId ()) {
116+ case R .id .filter_uuid :
117+ item .setChecked (!item .isChecked ());
118+ mScannerViewModel .filterByUuid (item .isChecked ());
119+ return true ;
120+ case R .id .filter_nearby :
121+ item .setChecked (!item .isChecked ());
122+ mScannerViewModel .filterByDistance (item .isChecked ());
123+ return true ;
124+ }
125+ return super .onOptionsItemSelected (item );
126+ }
127+
128+ @ Override
129+ public void onItemClick (@ NonNull final DiscoveredBluetoothDevice device ) {
106130 final Intent controlBlinkIntent = new Intent (this , BlinkyActivity .class );
107131 controlBlinkIntent .putExtra (BlinkyActivity .EXTRA_DEVICE , device );
108132 startActivity (controlBlinkIntent );
109133 }
110134
111135 @ Override
112- public void onRequestPermissionsResult (final int requestCode , @ NonNull final String [] permissions , @ NonNull final int [] grantResults ) {
136+ public void onRequestPermissionsResult (final int requestCode ,
137+ @ NonNull final String [] permissions ,
138+ @ NonNull final int [] grantResults ) {
113139 super .onRequestPermissionsResult (requestCode , permissions , grantResults );
114140 switch (requestCode ) {
115141 case REQUEST_ACCESS_COARSE_LOCATION :
@@ -133,7 +159,10 @@ public void onEnableBluetoothClicked() {
133159 @ OnClick (R .id .action_grant_location_permission )
134160 public void onGrantLocationPermissionClicked () {
135161 Utils .markLocationPermissionRequested (this );
136- ActivityCompat .requestPermissions (this , new String []{Manifest .permission .ACCESS_COARSE_LOCATION }, REQUEST_ACCESS_COARSE_LOCATION );
162+ ActivityCompat .requestPermissions (
163+ this ,
164+ new String [] { Manifest .permission .ACCESS_COARSE_LOCATION },
165+ REQUEST_ACCESS_COARSE_LOCATION );
137166 }
138167
139168 @ OnClick (R .id .action_permission_settings )
@@ -147,7 +176,8 @@ public void onPermissionSettingsClicked() {
147176 * Start scanning for Bluetooth devices or displays a message based on the scanner state.
148177 */
149178 private void startScan (final ScannerStateLiveData state ) {
150- // First, check the Location permission. This is required on Marshmallow onwards in order to scan for Bluetooth LE devices.
179+ // First, check the Location permission. This is required on Marshmallow onwards in order
180+ // to scan for Bluetooth LE devices.
151181 if (Utils .isLocationPermissionsGranted (this )) {
152182 mNoLocationPermissionView .setVisibility (View .GONE );
153183
@@ -174,6 +204,7 @@ private void startScan(final ScannerStateLiveData state) {
174204 mNoBluetoothView .setVisibility (View .VISIBLE );
175205 mScanningView .setVisibility (View .INVISIBLE );
176206 mEmptyView .setVisibility (View .GONE );
207+ clear ();
177208 }
178209 } else {
179210 mNoLocationPermissionView .setVisibility (View .VISIBLE );
@@ -193,4 +224,12 @@ private void startScan(final ScannerStateLiveData state) {
193224 private void stopScan () {
194225 mScannerViewModel .stopScan ();
195226 }
227+
228+ /**
229+ * Clears the list of devices, which will notify the observer.
230+ */
231+ private void clear () {
232+ mScannerViewModel .getDevices ().clear ();
233+ mScannerViewModel .getScannerState ().clearRecords ();
234+ }
196235}
0 commit comments