diff --git a/app/build.gradle b/app/build.gradle index 925d48f..bf3bf79 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -54,6 +54,10 @@ android { buildConfigField "boolean", "IS_ALLOWED_FILTERING_BY_PREFIX", "true" } } + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } } protobuf { @@ -80,7 +84,7 @@ protobuf { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'com.android.support.constraint:constraint-layout:1.1.0' + implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'com.android.support:design:28.0.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' diff --git a/app/src/androidTest/java/com/espressif/espressif/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/espressif/espressif/ExampleInstrumentedTest.java index 14a0fab..f75c6b0 100644 --- a/app/src/androidTest/java/com/espressif/espressif/ExampleInstrumentedTest.java +++ b/app/src/androidTest/java/com/espressif/espressif/ExampleInstrumentedTest.java @@ -20,7 +20,7 @@ import org.junit.Test; import org.junit.runner.RunWith; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; /** * Instrumented test, which will execute on an Android device. diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e709724..5c92c96 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + diff --git a/app/src/main/java/com/espressif/provision/security/Security1.java b/app/src/main/java/com/espressif/provision/security/Security1.java index addfdef..aa4503f 100644 --- a/app/src/main/java/com/espressif/provision/security/Security1.java +++ b/app/src/main/java/com/espressif/provision/security/Security1.java @@ -160,15 +160,9 @@ private void processStep0Response(byte[] hexData) throws RuntimeException { this.cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); this.clientVerify = this.encrypt(devicePublicKey); - } catch (InvalidProtocolBufferException e) { - Log.e(TAG, e.getMessage()); - } catch (InvalidKeyException e) { + } catch (InvalidProtocolBufferException | InvalidKeyException | NoSuchAlgorithmException e) { Log.e(TAG, e.getMessage()); - } catch (NoSuchAlgorithmException e) { - Log.e(TAG, e.getMessage()); - } catch (NoSuchPaddingException e) { - e.printStackTrace(); - } catch (InvalidAlgorithmParameterException e) { + } catch (NoSuchPaddingException | InvalidAlgorithmParameterException e) { e.printStackTrace(); } } diff --git a/app/src/main/java/com/espressif/ui/activities/EspMainActivity.java b/app/src/main/java/com/espressif/ui/activities/EspMainActivity.java index 4120171..e4aeb07 100644 --- a/app/src/main/java/com/espressif/ui/activities/EspMainActivity.java +++ b/app/src/main/java/com/espressif/ui/activities/EspMainActivity.java @@ -13,11 +13,13 @@ // limitations under the License. package com.espressif.ui.activities; +import android.Manifest; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.PackageManager; import android.location.LocationManager; import android.os.Build; import android.os.Bundle; @@ -26,7 +28,6 @@ import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; -import android.text.TextUtils; import android.util.Log; import android.view.HapticFeedbackConstants; import android.view.Menu; @@ -123,6 +124,12 @@ protected void onResume() { if (BuildConfig.FLAVOR_transport.equals("ble") && BLEProvisionLanding.isBleWorkDone) { BLEProvisionLanding.bleTransport.disconnect(); } + + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 87); + } + } } @Override diff --git a/app/src/main/java/com/espressif/ui/activities/ProvisionActivity.java b/app/src/main/java/com/espressif/ui/activities/ProvisionActivity.java index 86856b0..01f7364 100644 --- a/app/src/main/java/com/espressif/ui/activities/ProvisionActivity.java +++ b/app/src/main/java/com/espressif/ui/activities/ProvisionActivity.java @@ -13,8 +13,13 @@ // limitations under the License. package com.espressif.ui.activities; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.graphics.Color; +import android.net.wifi.ScanResult; +import android.net.wifi.WifiManager; import android.os.Bundle; import android.os.Vibrator; import android.support.v7.app.AppCompatActivity; @@ -25,6 +30,7 @@ import android.util.Log; import android.view.HapticFeedbackConstants; import android.view.View; +import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; @@ -40,6 +46,10 @@ import com.espressif.provision.session.Session; import com.espressif.provision.transport.SoftAPTransport; import com.espressif.provision.transport.Transport; +import com.espressif.ui.adapters.AutoSuggestAdapter; + +import java.util.ArrayList; +import java.util.List; import espressif.Constants; import espressif.WifiConstants; @@ -49,7 +59,7 @@ public class ProvisionActivity extends AppCompatActivity { private static final String TAG = "Espressif::" + ProvisionActivity.class.getSimpleName(); private TextView ssid; - private EditText ssidInput; + private AutoCompleteTextView ssidInput; private EditText passwordInput; private Button btnProvision; private ProgressBar progressBar; @@ -58,6 +68,11 @@ public class ProvisionActivity extends AppCompatActivity { private String ssidValue, passphraseValue = ""; private String pop, baseUrl, transportVersion, securityVersion; + private AutoSuggestAdapter autoSuggestAdapter; + + private WifiManager wifiManager; + private WifiReceiver wifiReceiver; + @Override protected void onCreate(Bundle savedInstanceState) { @@ -67,6 +82,14 @@ protected void onCreate(Bundle savedInstanceState) { toolbar.setTitle(R.string.title_activity_provision); setSupportActionBar(toolbar); + // TODO: Add check for wifi enabled + + wifiReceiver = new WifiReceiver(); + wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); + registerReceiver(wifiReceiver, + new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); + wifiManager.startScan(); + Intent intent = getIntent(); final String wifiSSID = intent.getStringExtra(Provision.PROVISIONING_WIFI_SSID); wifiSecurityType = intent.getIntExtra(AppConstants.KEY_WIFI_SECURITY_TYPE, AppConstants.WIFI_OPEN); @@ -76,6 +99,10 @@ protected void onCreate(Bundle savedInstanceState) { securityVersion = intent.getStringExtra(Provision.CONFIG_SECURITY_KEY); ssid = findViewById(R.id.ssid_text); + + autoSuggestAdapter = new AutoSuggestAdapter(this, + android.R.layout.simple_dropdown_item_1line); + ssidInput = findViewById(R.id.ssid_input); passwordInput = findViewById(R.id.password_input); btnProvision = findViewById(R.id.btn_provision); @@ -111,6 +138,9 @@ protected void onCreate(Bundle savedInstanceState) { btnProvision.setAlpha(0.5f); btnProvision.setTextColor(Color.WHITE); + ssidInput.setThreshold(2); + ssidInput.setAdapter(autoSuggestAdapter); + ssidInput.addTextChangedListener(new TextWatcher() { @Override @@ -390,4 +420,30 @@ private void goToSuccessPage(String statusText) { goToSuccessPage.putExtras(getIntent()); startActivity(goToSuccessPage); } + + public class WifiReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + + Log.d(TAG,"wifi receiver"); + + + if(intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) + { + List scanResults = wifiManager.getScanResults(); + + ArrayList ssidList = new ArrayList<>(); + + for (ScanResult scanResult : scanResults) { + if (scanResult.frequency > 2400 && scanResult.frequency < 2500){ + ssidList.add(scanResult.SSID); + } + } + + autoSuggestAdapter.setListData(ssidList); + autoSuggestAdapter.notifyDataSetChanged(); + } + } + } } diff --git a/app/src/main/java/com/espressif/ui/adapters/AutoSuggestAdapter.java b/app/src/main/java/com/espressif/ui/adapters/AutoSuggestAdapter.java new file mode 100644 index 0000000..a82867c --- /dev/null +++ b/app/src/main/java/com/espressif/ui/adapters/AutoSuggestAdapter.java @@ -0,0 +1,62 @@ +package com.espressif.ui.adapters; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.widget.ArrayAdapter; +import android.widget.Filter; +import android.widget.Filterable; + +import java.util.ArrayList; +import java.util.List; + + +public class AutoSuggestAdapter extends ArrayAdapter implements Filterable { + private List listData; + + public AutoSuggestAdapter(@NonNull Context context, int resource) { + super(context, resource); + listData = new ArrayList<>(); + } + + public void setListData(List list) { + listData.clear(); + listData.addAll(list); + } + + @Override + public int getCount() { + return listData.size(); + } + + @Nullable + @Override + public String getItem(int position) { + return listData.get(position); + } + + @NonNull + @Override + public Filter getFilter() { + Filter dataFilter = new Filter() { + @Override + protected FilterResults performFiltering(CharSequence constraint) { + FilterResults filterResults = new FilterResults(); + if (constraint != null) { + filterResults.values = listData; + filterResults.count = listData.size(); + } + return filterResults; + } + @Override + protected void publishResults(CharSequence constraint, FilterResults results) { + if (results != null && (results.count > 0)) { + notifyDataSetChanged(); + } else { + notifyDataSetInvalidated(); + } + } + }; + return dataFilter; + } +} diff --git a/app/src/main/java/com/espressif/ui/adapters/WiFiListAdapter.java b/app/src/main/java/com/espressif/ui/adapters/WiFiListAdapter.java index 3585fce..390ad23 100644 --- a/app/src/main/java/com/espressif/ui/adapters/WiFiListAdapter.java +++ b/app/src/main/java/com/espressif/ui/adapters/WiFiListAdapter.java @@ -9,8 +9,8 @@ import android.widget.ImageView; import android.widget.TextView; -import com.espressif.provision.R; import com.espressif.AppConstants; +import com.espressif.provision.R; import com.espressif.ui.models.WiFiAccessPoint; import java.util.ArrayList; diff --git a/app/src/main/res/layout/content_provision.xml b/app/src/main/res/layout/content_provision.xml index 589c086..3ab6567 100644 --- a/app/src/main/res/layout/content_provision.xml +++ b/app/src/main/res/layout/content_provision.xml @@ -46,7 +46,7 @@ android:layout_marginEnd="20dp" android:layout_marginBottom="30dp"> -