Skip to content

Commit d3138aa

Browse files
Merge branch 'feature'
2 parents 388c027 + 36a47cd commit d3138aa

32 files changed

+1249
-445
lines changed

app/build.gradle

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,20 @@ dependencies {
2525
// Compile Build Dependencies
2626
implementation fileTree(include: ["*.jar"], dir: "libs")
2727
implementation 'com.google.android.material:material:1.0.0'
28-
implementation 'androidx.preference:preference:1.0.0'
28+
implementation 'androidx.preference:preference:1.1.0'
2929
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
30-
implementation 'androidx.media:media:1.0.1'
30+
implementation 'androidx.annotation:annotation:1.1.0'
31+
implementation 'androidx.collection:collection:1.1.0'
32+
implementation 'androidx.media:media:1.1.0'
3133
implementation 'org.apache.commons:commons-lang3:3.9'
3234
implementation 'org.apache.commons:commons-collections4:4.4'
3335
implementation 'com.jjoe64:graphview:4.2.2'
3436
// Unit Test Dependencies
3537
testImplementation 'junit:junit:4.12'
36-
testImplementation 'org.powermock:powermock-module-junit4:2.0.2'
37-
testImplementation 'org.powermock:powermock-api-mockito2:2.0.2'
38+
testImplementation 'org.powermock:powermock-module-junit4:2.0.4'
39+
testImplementation 'org.powermock:powermock-api-mockito2:2.0.4'
3840
testImplementation 'com.googlecode.junit-toolbox:junit-toolbox:2.4'
39-
testImplementation 'org.robolectric:robolectric:4.3'
41+
testImplementation 'org.robolectric:robolectric:4.3.1'
4042
testImplementation 'androidx.test.ext:junit:1.1.1'
4143
// Android Test Dependencies
4244
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

app/src/main/java/com/vrem/util/LocaleUtils.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838

3939
public class LocaleUtils {
4040
static final Locale SPANISH = new Locale("es");
41-
static final Locale POLISH = new Locale("pl");
4241
static final Locale PORTUGUESE = new Locale("pt");
4342
static final Locale RUSSIAN = new Locale("ru");
4443
private static final String SEPARATOR = "_";
@@ -157,11 +156,11 @@ private static class SyncAvoid {
157156
SPANISH,
158157
Locale.FRENCH,
159158
Locale.ITALIAN,
160-
POLISH,
161159
PORTUGUESE,
162160
RUSSIAN,
163161
Locale.SIMPLIFIED_CHINESE,
164-
Locale.TRADITIONAL_CHINESE, DEFAULT)));
162+
Locale.TRADITIONAL_CHINESE,
163+
DEFAULT)));
165164
}
166165

167166
private static class CountryClosure implements Closure<Locale> {

app/src/main/java/com/vrem/wifianalyzer/MainContext.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
import android.content.Context;
2222
import android.content.res.Resources;
23-
import android.net.wifi.WifiManager;
2423
import android.os.Handler;
2524
import android.view.LayoutInflater;
2625

@@ -107,7 +106,6 @@ void setFilterAdapter(FilterAdapter filterAdapter) {
107106

108107
void initialize(@NonNull MainActivity mainActivity, boolean largeScreen) {
109108
Context applicationContext = mainActivity.getApplicationContext();
110-
WifiManager wifiManager = (WifiManager) applicationContext.getSystemService(Context.WIFI_SERVICE);
111109
Handler handler = new Handler();
112110
Repository repository = new Repository(applicationContext);
113111
Settings currentSettings = SettingsFactory.make(repository);
@@ -117,7 +115,7 @@ void initialize(@NonNull MainActivity mainActivity, boolean largeScreen) {
117115
setConfiguration(currentConfiguration);
118116
setSettings(currentSettings);
119117
setVendorService(VendorServiceFactory.makeVendorService(mainActivity.getResources()));
120-
setScannerService(ScannerServiceFactory.makeScannerService(wifiManager, handler, currentSettings));
118+
setScannerService(ScannerServiceFactory.makeScannerService(mainActivity, handler, currentSettings));
121119
setFilterAdapter(new FilterAdapter(currentSettings));
122120
}
123121

app/src/main/java/com/vrem/wifianalyzer/wifi/channelgraph/ChannelGraphView.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public GraphView getGraphView() {
9191
private int getNumX() {
9292
int channelFirst = wiFiChannelPair.first.getChannel() - WiFiChannels.CHANNEL_OFFSET;
9393
int channelLast = wiFiChannelPair.second.getChannel() + WiFiChannels.CHANNEL_OFFSET;
94-
return Math.min(GraphConstants.NUM_X_CHANNEL, channelLast - channelFirst + 1);
94+
return channelLast - channelFirst + 1;
9595
}
9696

9797
@NonNull

app/src/main/java/com/vrem/wifianalyzer/wifi/filter/SecurityFilter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class SecurityFilter extends EnumFilter<Security, SecurityAdapter> {
3838
ids.put(Security.WEP, R.id.filterSecurityWEP);
3939
ids.put(Security.WPA, R.id.filterSecurityWPA);
4040
ids.put(Security.WPA2, R.id.filterSecurityWPA2);
41+
ids.put(Security.WPA3, R.id.filterSecurityWPA3);
4142
}
4243

4344
SecurityFilter(@NonNull SecurityAdapter securityAdapter, @NonNull Dialog dialog) {

app/src/main/java/com/vrem/wifianalyzer/wifi/graphutils/GraphConstants.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ public class GraphConstants {
2727
public static final int MIN_Y = -100;
2828
public static final int MIN_Y_OFFSET = -1;
2929
public static final int MIN_Y_HALF = MIN_Y / 2;
30-
public static final int NUM_X_CHANNEL = 18;
31-
public static final int NUM_X_TIME = 21;
3230
public static final int MAX_NOTSEEN_COUNT = 20;
3331
public static final int THICKNESS_INVISIBLE = 0;
3432
public static final int THICKNESS_REGULAR = 5;

app/src/main/java/com/vrem/wifianalyzer/wifi/model/Security.java

Lines changed: 60 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,13 @@
2121
import com.vrem.util.EnumUtils;
2222
import com.vrem.wifianalyzer.R;
2323

24+
import org.apache.commons.collections4.CollectionUtils;
2425
import org.apache.commons.collections4.IterableUtils;
2526
import org.apache.commons.collections4.Predicate;
27+
import org.apache.commons.collections4.PredicateUtils;
28+
import org.apache.commons.collections4.Transformer;
2629

27-
import java.util.ArrayList;
30+
import java.util.Arrays;
2831
import java.util.List;
2932
import java.util.Locale;
3033
import java.util.Set;
@@ -37,29 +40,42 @@ public enum Security {
3740
WPS(R.drawable.ic_lock_outline),
3841
WEP(R.drawable.ic_lock_outline),
3942
WPA(R.drawable.ic_lock),
40-
WPA2(R.drawable.ic_lock);
43+
WPA2(R.drawable.ic_lock),
44+
WPA3(R.drawable.ic_lock, Constants.RSN);
4145

4246
private final int imageResource;
47+
private final String additional;
4348

4449
Security(int imageResource) {
50+
this(imageResource, null);
51+
}
52+
53+
Security(int imageResource, String additional) {
4554
this.imageResource = imageResource;
55+
this.additional = additional;
4656
}
4757

4858
@NonNull
49-
public static List<Security> findAll(String capabilities) {
50-
Set<Security> results = new TreeSet<>();
51-
if (capabilities != null) {
52-
String[] values = capabilities.toUpperCase(Locale.getDefault())
53-
.replace("][", "-").replace("]", "").replace("[", "").split("-");
54-
for (String value : values) {
55-
try {
56-
results.add(Security.valueOf(value));
57-
} catch (Exception e) {
58-
// skip getCapabilities that are not getSecurity
59-
}
60-
}
59+
public static Set<Security> findAll(String capabilities) {
60+
if (capabilities == null) {
61+
return new TreeSet<>();
6162
}
62-
return new ArrayList<>(results);
63+
return new TreeSet<>(
64+
CollectionUtils.select(
65+
CollectionUtils.collect(parseCapabilities(capabilities), new SecurityTransformer()),
66+
PredicateUtils.notNullPredicate()
67+
)
68+
);
69+
}
70+
71+
private static List<String> parseCapabilities(String capabilities) {
72+
return Arrays.asList(capabilities
73+
.toUpperCase(Locale.getDefault())
74+
.replace("][", "-")
75+
.replace("]", "")
76+
.replace("[", "")
77+
.split("-")
78+
);
6379
}
6480

6581
@NonNull
@@ -73,9 +89,9 @@ public int getImageResource() {
7389
}
7490

7591
private static class SecurityPredicate implements Predicate<Security> {
76-
private final List<Security> securities;
92+
private final Set<Security> securities;
7793

78-
private SecurityPredicate(@NonNull List<Security> securities) {
94+
private SecurityPredicate(@NonNull Set<Security> securities) {
7995
this.securities = securities;
8096
}
8197

@@ -85,4 +101,31 @@ public boolean evaluate(Security security) {
85101
}
86102
}
87103

104+
private static class SecurityAdditionalPredicate implements Predicate<Security> {
105+
private final String value;
106+
107+
private SecurityAdditionalPredicate(@NonNull String value) {
108+
this.value = value;
109+
}
110+
111+
@Override
112+
public boolean evaluate(Security security) {
113+
return value.equals(security.additional);
114+
}
115+
}
116+
117+
private static class SecurityTransformer implements Transformer<String, Security> {
118+
@Override
119+
public Security transform(String input) {
120+
try {
121+
return Security.valueOf(input);
122+
} catch (Exception e) {
123+
return IterableUtils.find(EnumUtils.values(Security.class), new SecurityAdditionalPredicate(input));
124+
}
125+
}
126+
}
127+
128+
private static class Constants {
129+
static final String RSN = "RSN";
130+
}
88131
}

app/src/main/java/com/vrem/wifianalyzer/wifi/model/WiFiDetail.java

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

3232
public class WiFiDetail implements Comparable<WiFiDetail> {
3333
public static final WiFiDetail EMPTY = new WiFiDetail(StringUtils.EMPTY, StringUtils.EMPTY, StringUtils.EMPTY, WiFiSignal.EMPTY);
34-
private static final String SSID_EMPTY = "***";
34+
private static final String SSID_EMPTY = "*hidden*";
3535

3636
private final List<WiFiDetail> children;
3737
private final String SSID;

app/src/main/java/com/vrem/wifianalyzer/wifi/scanner/PeriodicScan.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
import androidx.annotation.NonNull;
2626

2727
class PeriodicScan implements Runnable {
28-
static final int DELAY_INITIAL = 1;
29-
static final int DELAY_INTERVAL = 1000;
28+
static final long DELAY_INITIAL = 1L;
29+
static final long DELAY_INTERVAL = 1000L;
3030

3131
private final ScannerService scanner;
3232
private final Handler handler;
@@ -49,7 +49,7 @@ void start() {
4949
nextRun(DELAY_INITIAL);
5050
}
5151

52-
private void nextRun(int delayInitial) {
52+
private void nextRun(long delayInitial) {
5353
stop();
5454
handler.postDelayed(this, delayInitial);
5555
running = true;

app/src/main/java/com/vrem/wifianalyzer/wifi/scanner/Scanner.java

Lines changed: 10 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,10 @@
1818

1919
package com.vrem.wifianalyzer.wifi.scanner;
2020

21-
import android.annotation.TargetApi;
2221
import android.net.wifi.ScanResult;
2322
import android.net.wifi.WifiInfo;
24-
import android.net.wifi.WifiManager;
25-
import android.os.Build;
2623
import android.os.Handler;
2724

28-
import com.vrem.util.BuildUtils;
29-
import com.vrem.wifianalyzer.ActivityUtils;
3025
import com.vrem.wifianalyzer.settings.Settings;
3126
import com.vrem.wifianalyzer.wifi.model.WiFiData;
3227

@@ -40,16 +35,16 @@
4035

4136
class Scanner implements ScannerService {
4237
private final List<UpdateNotifier> updateNotifiers;
43-
private final WifiManager wifiManager;
4438
private final Settings settings;
4539
private Transformer transformer;
4640
private WiFiData wiFiData;
41+
private WiFiManagerWrapper wiFiManagerWrapper;
4742
private Cache cache;
4843
private PeriodicScan periodicScan;
4944

50-
Scanner(@NonNull WifiManager wifiManager, @NonNull Handler handler, @NonNull Settings settings) {
45+
Scanner(@NonNull WiFiManagerWrapper wiFiManagerWrapper, @NonNull Handler handler, @NonNull Settings settings) {
5146
this.updateNotifiers = new ArrayList<>();
52-
this.wifiManager = wifiManager;
47+
this.wiFiManagerWrapper = wiFiManagerWrapper;
5348
this.settings = settings;
5449
this.wiFiData = WiFiData.EMPTY;
5550
this.setTransformer(new Transformer());
@@ -59,7 +54,7 @@ class Scanner implements ScannerService {
5954

6055
@Override
6156
public void update() {
62-
enableWiFi();
57+
wiFiManagerWrapper.enableWiFi();
6358
scanResults();
6459
wiFiData = transformer.transformToWiFiData(cache.getScanResults(), cache.getWifiInfo());
6560
IterableUtils.forEach(updateNotifiers, new UpdateClosure());
@@ -98,22 +93,11 @@ public void resume() {
9893

9994
@Override
10095
public void stop() {
101-
if (!BuildUtils.isMinVersionQ()) {
102-
try {
103-
if (settings.isWiFiOffOnExit()) {
104-
disableWiFiLegacy();
105-
}
106-
} catch (Exception e) {
107-
// critical error: do not die
108-
}
96+
if (settings.isWiFiOffOnExit()) {
97+
wiFiManagerWrapper.disableWiFi();
10998
}
11099
}
111100

112-
@SuppressWarnings("deprecation")
113-
private void disableWiFiLegacy() {
114-
wifiManager.setWifiEnabled(false);
115-
}
116-
117101
@NonNull
118102
PeriodicScan getPeriodicScan() {
119103
return periodicScan;
@@ -136,38 +120,12 @@ List<UpdateNotifier> getUpdateNotifiers() {
136120
return updateNotifiers;
137121
}
138122

139-
private void enableWiFi() {
140-
try {
141-
if (!wifiManager.isWifiEnabled()) {
142-
if (BuildUtils.isMinVersionQ()) {
143-
enableWiFiAndroidQ();
144-
} else {
145-
enableWiFiLegacy();
146-
}
147-
}
148-
} catch (Exception e) {
149-
// critical error: do not die
150-
}
151-
}
152-
153-
@TargetApi(Build.VERSION_CODES.Q)
154-
private void enableWiFiAndroidQ() {
155-
ActivityUtils.startWiFiSettings();
156-
}
157-
158-
@SuppressWarnings("deprecation")
159-
private void enableWiFiLegacy() {
160-
wifiManager.setWifiEnabled(true);
161-
}
162-
163123
private void scanResults() {
164124
try {
165-
if (wifiManager.startScan()) {
166-
List<ScanResult> scanResults = wifiManager.getScanResults();
167-
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
168-
if (scanResults != null) {
169-
cache.add(scanResults, wifiInfo);
170-
}
125+
if (wiFiManagerWrapper.startScan()) {
126+
List<ScanResult> scanResults = wiFiManagerWrapper.scanResults();
127+
WifiInfo wifiInfo = wiFiManagerWrapper.wiFiInfo();
128+
cache.add(scanResults, wifiInfo);
171129
}
172130
} catch (Exception e) {
173131
// critical error: do not die

0 commit comments

Comments
 (0)