Skip to content

Commit ccab111

Browse files
committed
Merge branch 'main' into feature/location
# Conflicts: # app/src/main/java/com/lcl/lclmeasurementtool/MainActivity.java # app/src/main/java/com/lcl/lclmeasurementtool/Managers/CellularManager.java # app/src/main/java/com/lcl/lclmeasurementtool/Managers/NetworkManager.java
2 parents 9ccf020 + 6b8d925 commit ccab111

17 files changed

+431
-116
lines changed

app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ dependencies {
4040
implementation 'androidx.navigation:navigation-ui:2.3.0'
4141
implementation 'com.google.android.gms:play-services-location:18.0.0'
4242
implementation 'com.android.volley:volley:1.2.0'
43+
implementation 'com.google.android.gms:play-services-location:18.0.0'
4344
testImplementation 'junit:junit:4.+'
4445
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
4546
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
77
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
88
<uses-permission android:name="android.permission.INTERNET"/>
9+
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
910
<application
1011
android:allowBackup="true"
1112
android:icon="@mipmap/ic_launcher"

app/src/main/java/com/lcl/lclmeasurementtool/MainActivity.java

Lines changed: 85 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,43 @@
11
package com.lcl.lclmeasurementtool;
22

3-
import androidx.annotation.NonNull;
43
import androidx.appcompat.app.AppCompatActivity;
4+
import androidx.core.content.ContextCompat;
55

66
import android.content.Intent;
77
import android.content.SharedPreferences;
88
import android.content.pm.PackageManager;
99
import android.net.Uri;
10+
import android.content.Context;
1011
import android.os.Bundle;
1112
import android.provider.Settings;
1213
import android.util.Log;
14+
import android.widget.ImageView;
1315
import android.widget.TextView;
1416

17+
import com.google.android.material.floatingactionbutton.FloatingActionButton;
1518
import com.lcl.lclmeasurementtool.Managers.CellularManager;
1619
import com.lcl.lclmeasurementtool.Managers.LocationServiceListener;
1720
import com.lcl.lclmeasurementtool.Managers.LocationServiceManager;
1821
import com.lcl.lclmeasurementtool.Managers.NetworkChangeListener;
1922
import com.lcl.lclmeasurementtool.Managers.NetworkManager;
2023
import com.lcl.lclmeasurementtool.Utils.SignalStrengthLevel;
2124
import com.lcl.lclmeasurementtool.Utils.UIUtils;
22-
2325
import java.util.UUID;
26+
import com.lcl.lclmeasurementtool.Utils.UnitUtils;
2427

2528
public class MainActivity extends AppCompatActivity {
2629

2730
public static final String TAG = "MAIN_ACTIVITY";
2831
private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 34;
32+
33+
private Context context;
2934
CellularManager mCellularManager;
3035
NetworkManager mNetworkManager;
3136
LocationServiceManager mLocationManager;
3237
LocationServiceListener locationServiceListener;
3338

39+
private boolean isTestStarted;
40+
3441

3542
@Override
3643
protected void onCreate(Bundle savedInstanceState) {
@@ -51,42 +58,107 @@ protected void onCreate(Bundle savedInstanceState) {
5158

5259
locationServiceListener = new LocationServiceListener(this.getApplicationContext(), getLifecycle());
5360
getLifecycle().addObserver(locationServiceListener);
61+
this.context = this;
62+
63+
this.isTestStarted = false;
64+
65+
66+
5467

55-
TextView tv = (TextView) findViewById(R.id.signalStrengthStatus);
68+
this.mNetworkManager = new NetworkManager(this);
69+
this.mCellularManager = CellularManager.getManager(this);
5670

57-
mNetworkManager.addNetworkChangeListener(new NetworkChangeListener() {
71+
if (!this.mNetworkManager.isCellularConnected()) {
72+
updateSignalStrengthTexts(SignalStrengthLevel.NONE, 0);
73+
}
74+
75+
setUpFAB();
76+
updateFAB(this.mNetworkManager.isCellularConnected());
77+
78+
this.mNetworkManager.addNetworkChangeListener(new NetworkManager.NetworkChangeListener() {
5879
@Override
5980
public void onAvailable() {
60-
// Log.i(TAG, "The cellular network is now available");
61-
mCellularManager.listenToSignalStrengthChange(tv);
81+
Log.i(TAG, "from call back on avaliable");
82+
updateFAB(true);
83+
mCellularManager.listenToSignalStrengthChange((level, dBm) ->
84+
updateSignalStrengthTexts(level, dBm));
6285
}
6386

6487
@Override
6588
public void onLost() {
66-
// Log.i(TAG, "The cellular network is now lost");
6789
mCellularManager.stopListening();
68-
tv.setText(SignalStrengthLevel.NONE.getName());
90+
updateSignalStrengthTexts(SignalStrengthLevel.NONE, 0);
91+
updateFAB(false);
6992
}
7093

7194
@Override
7295
public void onUnavailable() {
73-
// Log.i(TAG, "The cellular network is unavailable");
96+
updateSignalStrengthTexts(SignalStrengthLevel.NONE, 0);
97+
updateFAB(false);
7498
}
7599

76100
@Override
77101
public void onCellularNetworkChanged(boolean isConnected) {
78-
// Log.i(TAG, "The cellular network is connected? " + isConnected);
102+
if (!isConnected) {
103+
updateSignalStrengthTexts(SignalStrengthLevel.NONE, 0);
104+
updateFAB(isConnected);
105+
}
79106
}
80107
});
81108
}
82109

110+
private void updateSignalStrengthTexts(SignalStrengthLevel level, int dBm) {
111+
runOnUiThread(() -> {
112+
TextView signalStrengthValue = findViewById(R.id.SignalStrengthValue);
113+
TextView signalStrengthStatus = findViewById(R.id.SignalStrengthStatus);
114+
TextView signalStrengthUnit = findViewById(R.id.SignalStrengthUnit);
115+
ImageView signalStrengthIndicator = findViewById(R.id.SignalStrengthIndicator);
116+
signalStrengthValue.setText(String.valueOf(dBm));
117+
signalStrengthUnit.setText(UnitUtils.SIGNAL_STRENGTH_UNIT);
118+
signalStrengthStatus.setText(level.getName());
119+
signalStrengthIndicator.setColorFilter(level.getColor(context));
120+
});
121+
}
122+
123+
private void setUpFAB() {
124+
FloatingActionButton fab = findViewById(R.id.fab);
125+
fab.setOnClickListener(button -> {
126+
((FloatingActionButton) button).setImageResource( this.isTestStarted ? R.drawable.start : R.drawable.stop );
127+
fab.setColorFilter(ContextCompat.getColor(this, R.color.purple_500));
128+
129+
// TODO: init/cancel ping and iperf based in iTestStart
130+
131+
this.isTestStarted = !isTestStarted;
132+
Toast.makeText(this, "test starts: " + this.isTestStarted, Toast.LENGTH_SHORT).show();
133+
});
134+
}
135+
136+
private void updateFAB(boolean state) {
137+
runOnUiThread(() -> {
138+
FloatingActionButton fab = findViewById(R.id.fab);
139+
fab.setEnabled(state);
140+
fab.setImageResource(R.drawable.start);
141+
fab.setColorFilter(state ? ContextCompat.getColor(this, R.color.purple_500) :
142+
ContextCompat.getColor(this, R.color.light_gray));
143+
144+
// TODO: cancel ping and iperf if started
145+
// if (isTestStarted) {
146+
// cancel test
147+
// }
148+
149+
this.isTestStarted = false;
150+
});
151+
}
152+
153+
154+
// TODO: update FAB Icon and State when tests are done
155+
83156

84157
@Override
85158
protected void onDestroy() {
86159
super.onDestroy();
87-
mCellularManager.stopListening();
88-
mNetworkManager.removeAllNetworkChangeListeners();
89-
getLifecycle().removeObserver(locationServiceListener);
160+
this.mCellularManager.stopListening();
161+
this.mNetworkManager.removeAllNetworkChangeListeners();
90162
}
91163

92164

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.lcl.lclmeasurementtool.Managers;
2+
3+
import com.lcl.lclmeasurementtool.Utils.SignalStrengthLevel;
4+
5+
public interface CellularChangeListener {
6+
void onChange(SignalStrengthLevel level, int dBm);
7+
}

app/src/main/java/com/lcl/lclmeasurementtool/Managers/CellularManager.java

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
import android.telephony.PhoneStateListener;
77
import android.telephony.SignalStrength;
88
import android.telephony.TelephonyManager;
9+
import android.util.Log;
10+
import android.view.View;
11+
import android.widget.ImageView;
912
import android.widget.TextView;
1013

1114
import androidx.annotation.NonNull;
@@ -61,7 +64,6 @@ public static CellularManager getManager(@NonNull Context context) {
6164
if (cellularManager == null) {
6265
cellularManager = new CellularManager(context);
6366
}
64-
6567
return cellularManager;
6668
}
6769

@@ -78,8 +80,8 @@ public SignalStrength getSignalStrength() {
7880
* @return a corresponding signal strength level from the current context.
7981
*/
8082
public SignalStrengthLevel getSignalStrengthLevel() {
81-
if (report != null) {
82-
int level = report.getLevel();
83+
if (this.report != null) {
84+
int level = this.report.getLevel();
8385
return SignalStrengthLevel.init(level);
8486
}
8587

@@ -93,7 +95,7 @@ public SignalStrengthLevel getSignalStrengthLevel() {
9395
* report might be null if no cellular connection.
9496
*/
9597
public CellSignalStrength getCellSignalStrength() {
96-
return report;
98+
return this.report;
9799
}
98100

99101
/**
@@ -102,15 +104,14 @@ public CellSignalStrength getCellSignalStrength() {
102104
* If no cellular connection, 0.
103105
*/
104106
public int getDBM() {
105-
return report != null ? report.getDbm() : 0;
107+
return this.report != null ? this.report.getDbm() : 0;
106108
}
107109

108110
/**
109111
* Start listen to signal strength change and display onto the corresponding TextView.
110112
*
111-
* @param textView the text view that will be used to display the signal strength data.
112113
*/
113-
public void listenToSignalStrengthChange(TextView textView) {
114+
public void listenToSignalStrengthChange(CellularChangeListener listener) {
114115
new Thread(new Runnable() {
115116
@Override
116117
public void run() {
@@ -124,14 +125,18 @@ public void onSignalStrengthsChanged(SignalStrength signalStrength) {
124125
List<CellSignalStrengthLte> reports = signalStrength
125126
.getCellSignalStrengths(CellSignalStrengthLte.class);
126127

127-
String text;
128+
int dBm;
129+
SignalStrengthLevel level;
128130
if (reports.size() > 0) {
129131
CellSignalStrengthLte report = reports.get(0);
130-
text = report.getDbm() + " " + report.getLevel();
132+
level = SignalStrengthLevel.init(report.getLevel());
133+
dBm = report.getDbm();
131134
} else {
132-
text = SignalStrengthLevel.NONE.getName();
135+
level = SignalStrengthLevel.NONE;
136+
dBm = level.getLevelCode();
133137
}
134-
textView.setText(text);
138+
139+
listener.onChange(level, dBm);
135140

136141
if (stopListening) {
137142
Looper.myLooper().quit();

app/src/main/java/com/lcl/lclmeasurementtool/Managers/NetworkManager.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public static NetworkManager getManager(@NonNull Context context) {
7272
* @param networkChangeListener a new listener (should not be null).
7373
*/
7474
public void addNetworkChangeListener(@NonNull NetworkChangeListener networkChangeListener) {
75-
mNetworkChangeListeners.add(networkChangeListener);
75+
this.mNetworkChangeListeners.add(networkChangeListener);
7676

7777
NetworkRequest request = new NetworkRequest
7878
.Builder()
@@ -112,7 +112,7 @@ public void onUnavailable() {
112112
}
113113
};
114114

115-
this.connectivityManager.registerNetworkCallback(request, networkCallback);
115+
this.connectivityManager.registerNetworkCallback(request, this.networkCallback);
116116
}
117117

118118
/**
@@ -121,14 +121,14 @@ public void onUnavailable() {
121121
* @param networkChangeListener the listener to be removed (should not be null)
122122
*/
123123
public void removeNetworkChangeListener(@NonNull NetworkChangeListener networkChangeListener) {
124-
mNetworkChangeListeners.remove(networkChangeListener);
124+
this.mNetworkChangeListeners.remove(networkChangeListener);
125125
}
126126

127127
/**
128128
* Remove all registered listeners
129129
*/
130130
public void removeAllNetworkChangeListeners() {
131-
mNetworkChangeListeners.clear();
131+
this.mNetworkChangeListeners.clear();
132132
this.connectivityManager.unregisterNetworkCallback(this.networkCallback);
133133
}
134134

@@ -137,14 +137,23 @@ public void removeAllNetworkChangeListeners() {
137137
* @return true if the current device is connected to the internet via cellular; false otherwise.
138138
*/
139139
public boolean isCellularConnected() {
140-
return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
140+
return this.capabilities != null &&
141+
this.capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
141142
}
142143

143144
public int getLinkDownstreamBandwidthKbps() {
144-
return this.capabilities.getLinkDownstreamBandwidthKbps();
145+
if (this.capabilities != null) {
146+
return this.capabilities.getLinkDownstreamBandwidthKbps();
147+
}
148+
149+
return 0;
145150
}
146151

147152
public int getLinkUpstreamBandwidthKbps() {
148-
return this.capabilities.getLinkUpstreamBandwidthKbps();
153+
if (this.capabilities != null) {
154+
return this.capabilities.getLinkUpstreamBandwidthKbps();
155+
}
156+
157+
return 0;
149158
}
150159
}

app/src/main/java/com/lcl/lclmeasurementtool/Utils/DataTransferRateUnit.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,23 +33,23 @@ public enum DataTransferRateUnit {
3333
* @return the corresponding unit of the enum value.
3434
*/
3535
public Unit getUnit() {
36-
return unit;
36+
return this.unit;
3737
}
3838

3939
/**
4040
* Retrieve the String representation of the data transfer rate unit.
4141
* @return a string representation of the data transfer rate.
4242
*/
4343
public String getUnitString() {
44-
return magnitude.getUnitString() + unit.getUnitString() + "/s";
44+
return this.magnitude.getUnitString() + this.unit.getUnitString() + "/s";
4545
}
4646

4747
/**
4848
* Return the <code>Magnitude</code> of the enum value.
4949
* @return the corresponding magnitude of the enum value.
5050
*/
5151
public Magnitude getMagnitude() {
52-
return magnitude;
52+
return this.magnitude;
5353
}
5454

5555
/**
@@ -80,7 +80,7 @@ public enum Magnitude implements AbstractDataTransferRate {
8080

8181
@Override
8282
public int getLevel() {
83-
return level;
83+
return this.level;
8484
}
8585

8686
@Override
@@ -124,7 +124,7 @@ public enum Unit implements AbstractDataTransferRate {
124124

125125
@Override
126126
public int getLevel() {
127-
return level;
127+
return this.level;
128128
}
129129

130130
@Override
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:viewportWidth="24"
5+
android:viewportHeight="24">
6+
<path
7+
android:pathData="M17,4H20V20H17V4ZM5,14H8V20H5V14ZM11,9H14V20H11V9Z"
8+
android:fillColor="#ffffff"/>
9+
</vector>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="22dp"
3+
android:height="22dp"
4+
android:viewportWidth="22"
5+
android:viewportHeight="22">
6+
<path
7+
android:pathData="M17.6777,14.1421L16.2634,12.7279L11.6036,17.3877V0.997H9.6096V17.3877L4.9497,12.7279L3.5355,14.1421L10.6066,21.2132L17.6777,14.1421Z"
8+
android:fillColor="#828282"/>
9+
</vector>

0 commit comments

Comments
 (0)