Skip to content

Commit 7265b4a

Browse files
authored
Merge pull request #19 from NordicSemiconductor/develop
Version 2.4.0
2 parents dda4394 + de883b3 commit 7265b4a

53 files changed

Lines changed: 1006 additions & 374 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/build.gradle

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ android {
88
applicationId "no.nordicsemi.android.nrfblinky"
99
minSdkVersion 18
1010
targetSdkVersion 28
11-
versionCode 8
12-
versionName "2.3.0"
11+
versionCode 9
12+
versionName "2.4.0"
1313
resConfigs "en"
1414

1515
vectorDrawables.useSupportLibrary = true
@@ -36,16 +36,16 @@ android {
3636

3737
dependencies {
3838
implementation fileTree(include: ['*.jar'], dir: 'libs')
39-
implementation 'com.android.support:appcompat-v7:28.0.0'
40-
implementation 'com.android.support:design:28.0.0'
41-
implementation 'com.android.support:recyclerview-v7:28.0.0'
42-
implementation 'com.android.support:cardview-v7:28.0.0'
43-
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
39+
implementation 'androidx.appcompat:appcompat:1.0.2'
40+
implementation 'com.google.android.material:material:1.1.0-alpha01'
41+
implementation 'androidx.recyclerview:recyclerview:1.0.0'
42+
implementation 'androidx.cardview:cardview:1.0.0'
43+
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
4444
// Lifecycle extensions
45-
implementation 'android.arch.lifecycle:extensions:1.1.1'
45+
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
4646
// Butter Knife
47-
implementation 'com.jakewharton:butterknife:8.8.1'
48-
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
47+
implementation 'com.jakewharton:butterknife:9.0.0-rc1'
48+
annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc1'
4949
// Brings the new BluetoothLeScanner API to older platforms
5050
implementation 'no.nordicsemi.android.support.v18:scanner:1.1.0'
5151
// Log Bluetooth LE events in nRF Logger

app/src/androidTest/java/no/nordicsemi/android/blinky/ApplicationTest.java

Lines changed: 0 additions & 35 deletions
This file was deleted.

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444
tools:ignore="GoogleAppIndexingWarning">
4545
<activity
4646
android:name=".SplashScreenActivity"
47+
android:theme="@style/AppTheme.SplashScreen"
48+
android:noHistory="true"
4749
android:launchMode="singleTop">
4850
<intent-filter>
4951
<action android:name="android.intent.action.MAIN"/>
@@ -57,7 +59,6 @@
5759
android:launchMode="singleTop">
5860
<intent-filter>
5961
<action android:name="android.intent.action.MAIN"/>
60-
6162
<category android:name="no.nordicsemi.android.nrftoolbox.LAUNCHER"/>
6263
</intent-filter>
6364
</activity>

app/src/main/java/no/nordicsemi/android/blinky/BlinkyActivity.java

Lines changed: 46 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,29 +22,39 @@
2222

2323
package no.nordicsemi.android.blinky;
2424

25-
import android.arch.lifecycle.ViewModelProviders;
25+
import androidx.lifecycle.ViewModelProviders;
2626
import android.content.Intent;
2727
import android.os.Bundle;
28-
import android.support.v7.app.AppCompatActivity;
29-
import android.support.v7.widget.Toolbar;
30-
import android.view.MenuItem;
28+
import androidx.appcompat.app.AppCompatActivity;
29+
import androidx.appcompat.widget.Toolbar;
30+
3131
import android.view.View;
3232
import android.widget.LinearLayout;
33+
import android.widget.ProgressBar;
3334
import android.widget.Switch;
3435
import android.widget.TextView;
3536
import android.widget.Toast;
3637

38+
import butterknife.BindView;
39+
import butterknife.ButterKnife;
40+
import butterknife.OnClick;
3741
import no.nordicsemi.android.blinky.adapter.DiscoveredBluetoothDevice;
3842
import no.nordicsemi.android.blinky.viewmodels.BlinkyViewModel;
3943

4044
@SuppressWarnings("ConstantConditions")
4145
public class BlinkyActivity extends AppCompatActivity {
4246
public static final String EXTRA_DEVICE = "no.nordicsemi.android.blinky.EXTRA_DEVICE";
4347

48+
private BlinkyViewModel mViewModel;
49+
50+
@BindView(R.id.led_switch) Switch mLed;
51+
@BindView(R.id.button_state) TextView mButtonState;
52+
4453
@Override
4554
protected void onCreate(final Bundle savedInstanceState) {
4655
super.onCreate(savedInstanceState);
4756
setContentView(R.layout.activity_blinky);
57+
ButterKnife.bind(this);
4858

4959
final Intent intent = getIntent();
5060
final DiscoveredBluetoothDevice device = intent.getParcelableExtra(EXTRA_DEVICE);
@@ -58,38 +68,54 @@ protected void onCreate(final Bundle savedInstanceState) {
5868
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
5969

6070
// Configure the view model
61-
final BlinkyViewModel viewModel = ViewModelProviders.of(this).get(BlinkyViewModel.class);
62-
viewModel.connect(device);
71+
mViewModel = ViewModelProviders.of(this).get(BlinkyViewModel.class);
72+
mViewModel.connect(device);
6373

6474
// Set up views
6575
final TextView ledState = findViewById(R.id.led_state);
66-
final Switch led = findViewById(R.id.led_switch);
67-
final TextView buttonState = findViewById(R.id.button_state);
6876
final LinearLayout progressContainer = findViewById(R.id.progress_container);
6977
final TextView connectionState = findViewById(R.id.connection_state);
7078
final View content = findViewById(R.id.device_container);
79+
final View notSupported = findViewById(R.id.not_supported);
7180

72-
led.setOnCheckedChangeListener((buttonView, isChecked) -> viewModel.toggleLED(isChecked));
73-
viewModel.isDeviceReady().observe(this, deviceReady -> {
81+
mLed.setOnCheckedChangeListener((buttonView, isChecked) -> mViewModel.toggleLED(isChecked));
82+
mViewModel.isDeviceReady().observe(this, deviceReady -> {
7483
progressContainer.setVisibility(View.GONE);
7584
content.setVisibility(View.VISIBLE);
7685
});
77-
viewModel.getConnectionState().observe(this, connectionState::setText);
78-
viewModel.isConnected().observe(this, connected -> {
79-
if (!connected) {
80-
Toast.makeText(this, R.string.state_disconnected, Toast.LENGTH_SHORT).show();
81-
finish();
86+
mViewModel.getConnectionState().observe(this, text -> {
87+
if (text != null) {
88+
progressContainer.setVisibility(View.VISIBLE);
89+
notSupported.setVisibility(View.GONE);
90+
connectionState.setText(text);
8291
}
8392
});
84-
viewModel.isSupported().observe(this, supported -> {
93+
mViewModel.isConnected().observe(this, this::onConnectionStateChanged);
94+
mViewModel.isSupported().observe(this, supported -> {
8595
if (!supported) {
86-
Toast.makeText(this, R.string.state_not_supported, Toast.LENGTH_SHORT).show();
96+
progressContainer.setVisibility(View.GONE);
97+
notSupported.setVisibility(View.VISIBLE);
8798
}
8899
});
89-
viewModel.getLEDState().observe(this, isOn -> {
100+
mViewModel.getLEDState().observe(this, isOn -> {
90101
ledState.setText(isOn ? R.string.turn_on : R.string.turn_off);
91-
led.setChecked(isOn);
102+
mLed.setChecked(isOn);
92103
});
93-
viewModel.getButtonState().observe(this, pressed -> buttonState.setText(pressed ? R.string.button_pressed : R.string.button_released));
104+
mViewModel.getButtonState().observe(this,
105+
pressed -> mButtonState.setText(pressed ?
106+
R.string.button_pressed : R.string.button_released));
107+
}
108+
109+
@OnClick(R.id.action_clear_cache)
110+
public void onTryAgainClicked() {
111+
mViewModel.reconnect();
112+
}
113+
114+
private void onConnectionStateChanged(final boolean connected) {
115+
mLed.setEnabled(connected);
116+
if (!connected) {
117+
mLed.setChecked(false);
118+
mButtonState.setText(R.string.button_unknown);
119+
}
94120
}
95121
}

app/src/main/java/no/nordicsemi/android/blinky/ScannerActivity.java

Lines changed: 57 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,24 @@
2323
package no.nordicsemi.android.blinky;
2424

2525
import android.Manifest;
26-
import android.arch.lifecycle.ViewModelProviders;
26+
import androidx.lifecycle.ViewModelProviders;
2727
import android.bluetooth.BluetoothAdapter;
2828
import android.content.Intent;
2929
import android.net.Uri;
3030
import android.os.Bundle;
3131
import 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;
4144
import android.view.View;
4245
import 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
}

app/src/main/java/no/nordicsemi/android/blinky/SplashScreenActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ protected void onCreate(final Bundle savedInstanceState) {
3636
setContentView(R.layout.activity_splash_screen);
3737

3838
new Handler().postDelayed(() -> {
39-
final Intent intent = new Intent(SplashScreenActivity.this, ScannerActivity.class);
39+
final Intent intent = new Intent(this, ScannerActivity.class);
4040
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
4141
startActivity(intent);
4242
finish();

app/src/main/java/no/nordicsemi/android/blinky/adapter/DeviceDiffCallback.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
package no.nordicsemi.android.blinky.adapter;
2424

25-
import android.support.v7.util.DiffUtil;
25+
import androidx.recyclerview.widget.DiffUtil;
2626

2727
import java.util.List;
2828

0 commit comments

Comments
 (0)