Skip to content

Commit 6389f99

Browse files
committed
1. Arranged UI classes in different packages.
2. Improved UI. 3. Separated BLE scanner from BLE transport.
1 parent c82a8b1 commit 6389f99

Some content is hidden

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

50 files changed

+1318
-917
lines changed

.gitignore

+29-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
.DS_Store
2-
31
# Built application files
42
*.apk
53
*.ap_
@@ -67,3 +65,32 @@ fastlane/test_output
6765
fastlane/readme.md
6866

6967
app/src/main/assets/api_key.txt
68+
69+
# Built application files
70+
/*/build/
71+
72+
# Crashlytics configuations
73+
com_crashlytics_export_strings.xml
74+
75+
# Local configuration file (sdk path, etc)
76+
local.properties
77+
78+
# Gradle generated files
79+
.gradle/
80+
81+
# Signing files
82+
.signing/
83+
84+
# User-specific configurations
85+
.idea/*
86+
*.iml
87+
88+
# OS-specific files
89+
.DS_Storegit add
90+
.DS_Store
91+
.D
92+
._*
93+
.Spotlight-V100
94+
.Trashes
95+
ehthumbs.db
96+
Thumbs.db

app/src/main/java/com/espressif/AppConstants.java

+1
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ public class AppConstants {
1313
// Keys used to pass data between activities and to store data in SharedPreference.
1414
public static final String KEY_PROOF_OF_POSSESSION = "proof_of_possession";
1515
public static final String KEY_WIFI_SECURITY_TYPE = "wifi_security";
16+
public static final String KEY_STATUS_MSG = "status_msg";
1617
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.espressif.ble_scanner;
2+
3+
import android.bluetooth.BluetoothDevice;
4+
import android.bluetooth.le.ScanResult;
5+
6+
/**
7+
* Interface for BLE device scanning.
8+
*/
9+
public interface BleScanListener {
10+
11+
/**
12+
* Called when any BLE peripheral will be found.
13+
*
14+
* @param device BluetoothDevice
15+
* @param scanResult Scan result.
16+
*/
17+
void onPeripheralFound(BluetoothDevice device, ScanResult scanResult);
18+
19+
/**
20+
* Callback method for scan completed.
21+
*/
22+
void scanCompleted();
23+
24+
/**
25+
* Failed to scan for BLE bluetoothDevices.
26+
*
27+
* @param e Exception
28+
*/
29+
void onFailure(Exception e);
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package com.espressif.ble_scanner;
2+
3+
import android.bluetooth.BluetoothAdapter;
4+
import android.bluetooth.BluetoothManager;
5+
import android.bluetooth.le.BluetoothLeScanner;
6+
import android.bluetooth.le.ScanCallback;
7+
import android.bluetooth.le.ScanFilter;
8+
import android.bluetooth.le.ScanResult;
9+
import android.bluetooth.le.ScanSettings;
10+
import android.content.Context;
11+
import android.os.Handler;
12+
import android.text.TextUtils;
13+
import android.util.Log;
14+
15+
import java.util.ArrayList;
16+
import java.util.List;
17+
18+
public class BleScanner {
19+
20+
private static final String TAG = BleScanner.class.getSimpleName();
21+
22+
private Context context;
23+
private BleScanListener bleScanListener;
24+
private BluetoothAdapter bluetoothAdapter;
25+
private BluetoothLeScanner bluetoothLeScanner;
26+
27+
private long scanTimeout;
28+
private boolean isScanning = false;
29+
30+
public BleScanner(Context context, long scanTimeoutInMillis, BleScanListener bleScannerListener) {
31+
32+
this.context = context;
33+
this.scanTimeout = scanTimeoutInMillis;
34+
this.bleScanListener = bleScannerListener;
35+
36+
final BluetoothManager bluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
37+
bluetoothAdapter = bluetoothManager.getAdapter();
38+
}
39+
40+
public void startScan() {
41+
42+
Log.d(TAG, "startScan");
43+
44+
bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner();
45+
List<ScanFilter> filters = new ArrayList<>();
46+
ScanSettings settings = new ScanSettings.Builder()
47+
.setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)
48+
.build();
49+
50+
isScanning = true;
51+
bluetoothLeScanner.startScan(filters, settings, scanCallback);
52+
Handler someHandler = new Handler();
53+
someHandler.postDelayed(new Runnable() {
54+
55+
@Override
56+
public void run() {
57+
58+
stopScan();
59+
}
60+
}, scanTimeout);
61+
}
62+
63+
public void stopScan() {
64+
65+
Log.d(TAG, "onStopBleScan()");
66+
67+
if (bluetoothLeScanner != null && bluetoothAdapter != null && bluetoothAdapter.isEnabled()) {
68+
try {
69+
bluetoothLeScanner.stopScan(scanCallback);
70+
} catch (Exception e) {
71+
Log.e(TAG, e.toString());
72+
}
73+
}
74+
isScanning = false;
75+
bleScanListener.scanCompleted();
76+
}
77+
78+
public boolean isScanning() {
79+
return isScanning;
80+
}
81+
82+
final ScanCallback scanCallback = new ScanCallback() {
83+
84+
@Override
85+
public void onScanResult(int callbackType, ScanResult result) {
86+
87+
if (result.getDevice() != null && !TextUtils.isEmpty(result.getDevice().getName())) {
88+
89+
Log.d(TAG, "onScanResult");
90+
bleScanListener.onPeripheralFound(result.getDevice(), result);
91+
}
92+
}
93+
94+
@Override
95+
public void onBatchScanResults(List<ScanResult> results) {
96+
super.onBatchScanResults(results);
97+
Log.d(TAG, "onBatchScanResults()");
98+
}
99+
100+
@Override
101+
public void onScanFailed(int errorCode) {
102+
super.onScanFailed(errorCode);
103+
Log.d(TAG, "onScanFailed errorCode:" + errorCode);
104+
bleScanListener.onFailure(new Exception("BLE connect failed with error code : " + errorCode));
105+
}
106+
};
107+
}

app/src/main/java/com/espressif/provision/Provision.java

+48-47
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,12 @@
1717
import android.content.Intent;
1818
import android.os.Bundle;
1919

20-
import com.espressif.avs.ConfigureAVS;
2120
import com.espressif.provision.security.Security;
2221
import com.espressif.provision.session.Session;
2322
import com.espressif.provision.transport.ResponseListener;
2423
import com.espressif.provision.transport.Transport;
25-
import com.espressif.ui.BLEProvisionLanding;
26-
import com.espressif.ui.LoginWithAmazon;
27-
import com.espressif.ui.ProvisionLanding;
24+
import com.espressif.ui.activities.BLEProvisionLanding;
25+
import com.espressif.ui.activities.ProvisionLanding;
2826
import com.google.protobuf.ByteString;
2927
import com.google.protobuf.InvalidProtocolBufferException;
3028

@@ -34,7 +32,6 @@
3432
import espressif.Constants;
3533
import espressif.WifiConfig;
3634
import espressif.WifiConstants;
37-
import espressif.WifiScan;
3835

3936
import static java.lang.Thread.sleep;
4037

@@ -68,6 +65,7 @@ public class Provision {
6865
* Initialize Provision class with a Session object.
6966
* Session object should already have been
7067
* successfully initialized by calling Session.init.
68+
*
7169
* @param session
7270
*/
7371
public Provision(Session session) {
@@ -81,22 +79,23 @@ public Provision(Session session) {
8179
* This UI will take the user through the following flow
8280
* 1. Connect to the device via Wifi (AP) or Bluetooth (BLE)
8381
* 2. Provide Network information like SSID and Passphrase
82+
*
8483
* @param activity parent activity which is typically part of the App
85-
* @param config Config dictionary.
86-
* Currently supported configurations are
87-
* HashMap<String, String> config = new HashMap<>();
88-
* config.put(Provision.CONFIG_TRANSPORT_KEY, transportVersion);
89-
* config.put(Provision.CONFIG_SECURITY_KEY, securityVersion);
90-
* config.put(Provision.CONFIG_PROOF_OF_POSSESSION_KEY, POP);
91-
* config.put(Provision.CONFIG_BASE_URL_KEY, BASE_URL);
92-
* config.put(Provision.CONFIG_WIFI_AP_KEY, NETWORK_NAME_PREFIX);
93-
* config.put(BLETransport.SERVICE_UUID_KEY, SERVICE_UUID);
94-
* config.put(BLETransport.SESSION_UUID_KEY, SESSION_UUID);
95-
* config.put(BLETransport.CONFIG_UUID_KEY, CONFIG_UUID);
96-
* config.put(BLETransport.DEVICE_NAME_PREFIX_KEY, DEVICE_NAME_PREFIX);
84+
* @param config Config dictionary.
85+
* Currently supported configurations are
86+
* HashMap<String, String> config = new HashMap<>();
87+
* config.put(Provision.CONFIG_TRANSPORT_KEY, transportVersion);
88+
* config.put(Provision.CONFIG_SECURITY_KEY, securityVersion);
89+
* config.put(Provision.CONFIG_PROOF_OF_POSSESSION_KEY, POP);
90+
* config.put(Provision.CONFIG_BASE_URL_KEY, BASE_URL);
91+
* config.put(Provision.CONFIG_WIFI_AP_KEY, NETWORK_NAME_PREFIX);
92+
* config.put(BLETransport.SERVICE_UUID_KEY, SERVICE_UUID);
93+
* config.put(BLETransport.SESSION_UUID_KEY, SESSION_UUID);
94+
* config.put(BLETransport.CONFIG_UUID_KEY, CONFIG_UUID);
95+
* config.put(BLETransport.DEVICE_NAME_PREFIX_KEY, DEVICE_NAME_PREFIX);
9796
*/
98-
public static void showProvisioningUI (Activity activity,
99-
HashMap<String, String> config) {
97+
public static void showProvisioningUI(Activity activity,
98+
HashMap<String, String> config) {
10099
final String transportVersion = config.get(Provision.CONFIG_TRANSPORT_KEY);
101100
Class landingActivity = ProvisionLanding.class;
102101
if (transportVersion.equals(Provision.CONFIG_TRANSPORT_BLE)) {
@@ -121,22 +120,22 @@ public static void showProvisioningUI (Activity activity,
121120
* 3. Provide Network information like SSID and Passphrase
122121
*
123122
* @param activity parent activity which is typically part of the app
124-
// * @param productId product ID in the Alexa Voice Services project
125-
// * @param productDSN device serial number
126-
// * @param codeVerifier random value used as a code challenge. This should typically be sent to
127-
// * to received from the device to use in its communication with Alexa
128-
* @param config Config dictionary
129-
* Currently supported configurations are
130-
* HashMap<String, String> config = new HashMap<>();
131-
* config.put(Provision.CONFIG_TRANSPORT_KEY, transportVersion);
132-
* config.put(Provision.CONFIG_SECURITY_KEY, securityVersion);
133-
* config.put(Provision.CONFIG_PROOF_OF_POSSESSION_KEY, POP);
134-
* config.put(Provision.CONFIG_BASE_URL_KEY, BASE_URL);
135-
* config.put(Provision.CONFIG_WIFI_AP_KEY, NETWORK_NAME_PREFIX);
136-
* config.put(BLETransport.SERVICE_UUID_KEY, SERVICE_UUID);
137-
* config.put(BLETransport.SESSION_UUID_KEY, SESSION_UUID);
138-
* config.put(BLETransport.CONFIG_UUID_KEY, CONFIG_UUID);
139-
* config.put(BLETransport.DEVICE_NAME_PREFIX_KEY, DEVICE_NAME_PREFIX);
123+
* // * @param productId product ID in the Alexa Voice Services project
124+
* // * @param productDSN device serial number
125+
* // * @param codeVerifier random value used as a code challenge. This should typically be sent to
126+
* // * to received from the device to use in its communication with Alexa
127+
* @param config Config dictionary
128+
* Currently supported configurations are
129+
* HashMap<String, String> config = new HashMap<>();
130+
* config.put(Provision.CONFIG_TRANSPORT_KEY, transportVersion);
131+
* config.put(Provision.CONFIG_SECURITY_KEY, securityVersion);
132+
* config.put(Provision.CONFIG_PROOF_OF_POSSESSION_KEY, POP);
133+
* config.put(Provision.CONFIG_BASE_URL_KEY, BASE_URL);
134+
* config.put(Provision.CONFIG_WIFI_AP_KEY, NETWORK_NAME_PREFIX);
135+
* config.put(BLETransport.SERVICE_UUID_KEY, SERVICE_UUID);
136+
* config.put(BLETransport.SESSION_UUID_KEY, SESSION_UUID);
137+
* config.put(BLETransport.CONFIG_UUID_KEY, CONFIG_UUID);
138+
* config.put(BLETransport.DEVICE_NAME_PREFIX_KEY, DEVICE_NAME_PREFIX);
140139
*/
141140
public static void showProvisioningWithAmazonUI(Activity activity,
142141
// String productId,
@@ -162,14 +161,15 @@ public static void showProvisioningWithAmazonUI(Activity activity,
162161
/**
163162
* Send Configuration information relating to the Home
164163
* Wifi network which the device should use for Internet access
165-
* @param ssid ssid of the home network
166-
* @param passphrase passphrase
164+
*
165+
* @param ssid ssid of the home network
166+
* @param passphrase passphrase
167167
* @param actionListener listener to be called when config data is sent
168168
*/
169169
public void configureWifi(final String ssid,
170170
final String passphrase,
171171
final ProvisionActionListener actionListener) {
172-
if(session.isEstablished()) {
172+
if (session.isEstablished()) {
173173
byte[] message = createSetWifiConfigRequest(ssid, passphrase);
174174
transport.sendConfigData(PROVISIONING_CONFIG_PATH, message, new ResponseListener() {
175175
@Override
@@ -178,17 +178,17 @@ public void onSuccess(byte[] returnData) {
178178
if (status != Constants.Status.Success && provisioningListener != null) {
179179
provisioningListener.OnProvisioningFailed(new RuntimeException("Could not sent wifi credentials to device"));
180180
}
181-
if(actionListener != null) {
181+
if (actionListener != null) {
182182
actionListener.onComplete(status, null);
183183
}
184184
}
185185

186186
@Override
187187
public void onFailure(Exception e) {
188-
if(provisioningListener != null) {
188+
if (provisioningListener != null) {
189189
provisioningListener.OnProvisioningFailed(e);
190190
}
191-
if(actionListener != null) {
191+
if (actionListener != null) {
192192
actionListener.onComplete(Constants.Status.InternalError, e);
193193
}
194194
}
@@ -201,10 +201,11 @@ public void onFailure(Exception e) {
201201
* A typical flow will be
202202
* Initialize session -> Set config (1 or more times) -> Apply config
203203
* This API call will also start a poll for getting Wifi connection status from the device
204+
*
204205
* @param actionListener listener to be called when apply config message is sent
205206
*/
206207
public void applyConfigurations(final ProvisionActionListener actionListener) {
207-
if(session.isEstablished()) {
208+
if (session.isEstablished()) {
208209
byte[] message = createApplyConfigRequest();
209210
transport.sendConfigData(PROVISIONING_CONFIG_PATH, message, new ResponseListener() {
210211
@Override
@@ -231,7 +232,7 @@ public void onWifiStateUpdated(WifiConstants.WifiStationState stationState,
231232
provisioningListener.OnApplyConfigurationsFailed();
232233
}
233234
}
234-
if(actionListener != null) {
235+
if (actionListener != null) {
235236
actionListener.onComplete(status, null);
236237
}
237238
}
@@ -241,7 +242,7 @@ public void onFailure(Exception e) {
241242
if (provisioningListener != null) {
242243
provisioningListener.OnApplyConfigurationsFailed();
243244
}
244-
if(actionListener != null) {
245+
if (actionListener != null) {
245246
actionListener.onComplete(Constants.Status.InternalError, e);
246247
}
247248
}
@@ -300,8 +301,8 @@ private Object[] processGetWifiConfigStatusResponse(byte[] responseData) {
300301
WifiConstants.WifiStationState wifiStationState = WifiConstants.WifiStationState.Disconnected;
301302
WifiConstants.WifiConnectFailedReason failedReason = WifiConstants.WifiConnectFailedReason.UNRECOGNIZED;
302303

303-
if(responseData == null) {
304-
return new Object[] { wifiStationState, failedReason };
304+
if (responseData == null) {
305+
return new Object[]{wifiStationState, failedReason};
305306
}
306307

307308
byte[] decryptedData = this.security.decrypt(responseData);
@@ -312,7 +313,7 @@ private Object[] processGetWifiConfigStatusResponse(byte[] responseData) {
312313
} catch (InvalidProtocolBufferException e) {
313314
e.printStackTrace();
314315
}
315-
return new Object[] {wifiStationState, failedReason};
316+
return new Object[]{wifiStationState, failedReason};
316317
}
317318

318319
private void pollForWifiConnectionStatus(final WifiStateListener wifiStateListener) {

0 commit comments

Comments
 (0)