Skip to content

Commit 6b8d925

Browse files
authored
Merge pull request #3 from johnnzhou/UI
Main UI
2 parents 0bef9f3 + 645b333 commit 6b8d925

17 files changed

+440
-124
lines changed

app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ dependencies {
3939
implementation 'androidx.navigation:navigation-fragment:2.3.0'
4040
implementation 'androidx.navigation:navigation-ui:2.3.0'
4141
implementation 'com.android.volley:volley:1.2.0'
42+
implementation 'com.google.android.gms:play-services-location:18.0.0'
4243
testImplementation 'junit:junit:4.+'
4344
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
4445
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
@@ -5,6 +5,7 @@
55
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
66
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
77
<uses-permission android:name="android.permission.INTERNET"/>
8+
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
89
<application
910
android:allowBackup="true"
1011
android:icon="@mipmap/ic_launcher"
Lines changed: 91 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,143 @@
11
package com.lcl.lclmeasurementtool;
22

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

6-
import android.net.Network;
7-
import android.net.NetworkCapabilities;
6+
import android.content.Context;
87
import android.os.Bundle;
98
import android.util.Log;
9+
import android.widget.ImageView;
1010
import android.widget.TextView;
1111
import android.widget.Toast;
1212

13+
import com.google.android.material.floatingactionbutton.FloatingActionButton;
1314
import com.lcl.lclmeasurementtool.Managers.CellularManager;
1415
import com.lcl.lclmeasurementtool.Managers.NetworkManager;
1516
import com.lcl.lclmeasurementtool.Utils.SignalStrengthLevel;
17+
import com.lcl.lclmeasurementtool.Utils.UnitUtils;
1618

1719
public class MainActivity extends AppCompatActivity {
1820

1921
public static final String TAG = "MAIN_ACTIVITY";
2022

23+
private Context context;
2124
CellularManager mCellularManager;
2225
NetworkManager mNetworkManager;
2326

27+
private boolean isTestStarted;
28+
2429

2530
@Override
2631
protected void onCreate(Bundle savedInstanceState) {
2732
super.onCreate(savedInstanceState);
2833
setContentView(R.layout.activity_main);
29-
NetworkManager mNetworkManager = new NetworkManager(this);
30-
mCellularManager = CellularManager.getManager(this);
34+
this.context = this;
35+
36+
this.isTestStarted = false;
37+
38+
39+
// LocationManager manager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
40+
// if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && !manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
41+
// Toast.makeText(this, "Enable location services for accurate data", Toast.LENGTH_SHORT).show();
42+
// }
43+
44+
3145

32-
TextView tv = (TextView) findViewById(R.id.signalStrengthStatus);
3346

34-
mNetworkManager.addNetworkChangeListener(new NetworkManager.NetworkChangeListener() {
47+
this.mNetworkManager = new NetworkManager(this);
48+
this.mCellularManager = CellularManager.getManager(this);
49+
50+
if (!this.mNetworkManager.isCellularConnected()) {
51+
updateSignalStrengthTexts(SignalStrengthLevel.NONE, 0);
52+
}
53+
54+
setUpFAB();
55+
updateFAB(this.mNetworkManager.isCellularConnected());
56+
57+
this.mNetworkManager.addNetworkChangeListener(new NetworkManager.NetworkChangeListener() {
3558
@Override
3659
public void onAvailable() {
37-
// Log.i(TAG, "The cellular network is now available");
38-
mCellularManager.listenToSignalStrengthChange(tv);
60+
Log.i(TAG, "from call back on avaliable");
61+
updateFAB(true);
62+
mCellularManager.listenToSignalStrengthChange((level, dBm) ->
63+
updateSignalStrengthTexts(level, dBm));
3964
}
4065

4166
@Override
4267
public void onLost() {
43-
// Log.i(TAG, "The cellular network is now lost");
4468
mCellularManager.stopListening();
45-
tv.setText(SignalStrengthLevel.NONE.getName());
69+
updateSignalStrengthTexts(SignalStrengthLevel.NONE, 0);
70+
updateFAB(false);
4671
}
4772

4873
@Override
4974
public void onUnavailable() {
50-
// Log.i(TAG, "The cellular network is unavailable");
75+
updateSignalStrengthTexts(SignalStrengthLevel.NONE, 0);
76+
updateFAB(false);
5177
}
5278

5379
@Override
5480
public void onCellularNetworkChanged(boolean isConnected) {
55-
// Log.i(TAG, "The cellular network is connected? " + isConnected);
81+
if (!isConnected) {
82+
updateSignalStrengthTexts(SignalStrengthLevel.NONE, 0);
83+
updateFAB(isConnected);
84+
}
5685
}
5786
});
5887

59-
// if (mNetworkManager.isCellularConnected()) {
60-
// mCellularManager.listenToSignalStrengthChange(tv);
61-
// } else {
62-
// Toast.makeText(this, "You are not connected via cellular", Toast.LENGTH_LONG).show();
63-
// }
6488
}
6589

90+
private void updateSignalStrengthTexts(SignalStrengthLevel level, int dBm) {
91+
runOnUiThread(() -> {
92+
TextView signalStrengthValue = findViewById(R.id.SignalStrengthValue);
93+
TextView signalStrengthStatus = findViewById(R.id.SignalStrengthStatus);
94+
TextView signalStrengthUnit = findViewById(R.id.SignalStrengthUnit);
95+
ImageView signalStrengthIndicator = findViewById(R.id.SignalStrengthIndicator);
96+
signalStrengthValue.setText(String.valueOf(dBm));
97+
signalStrengthUnit.setText(UnitUtils.SIGNAL_STRENGTH_UNIT);
98+
signalStrengthStatus.setText(level.getName());
99+
signalStrengthIndicator.setColorFilter(level.getColor(context));
100+
});
101+
}
102+
103+
private void setUpFAB() {
104+
FloatingActionButton fab = findViewById(R.id.fab);
105+
fab.setOnClickListener(button -> {
106+
((FloatingActionButton) button).setImageResource( this.isTestStarted ? R.drawable.start : R.drawable.stop );
107+
fab.setColorFilter(ContextCompat.getColor(this, R.color.purple_500));
108+
109+
// TODO: init/cancel ping and iperf based in iTestStart
110+
111+
this.isTestStarted = !isTestStarted;
112+
Toast.makeText(this, "test starts: " + this.isTestStarted, Toast.LENGTH_SHORT).show();
113+
});
114+
}
115+
116+
private void updateFAB(boolean state) {
117+
runOnUiThread(() -> {
118+
FloatingActionButton fab = findViewById(R.id.fab);
119+
fab.setEnabled(state);
120+
fab.setImageResource(R.drawable.start);
121+
fab.setColorFilter(state ? ContextCompat.getColor(this, R.color.purple_500) :
122+
ContextCompat.getColor(this, R.color.light_gray));
123+
124+
// TODO: cancel ping and iperf if started
125+
// if (isTestStarted) {
126+
// cancel test
127+
// }
128+
129+
this.isTestStarted = false;
130+
});
131+
}
132+
133+
134+
// TODO: update FAB Icon and State when tests are done
135+
136+
66137
@Override
67138
protected void onDestroy() {
68139
super.onDestroy();
69-
mCellularManager.stopListening();
70-
mNetworkManager.removeAllNetworkChangeListeners();
140+
this.mCellularManager.stopListening();
141+
this.mNetworkManager.removeAllNetworkChangeListeners();
71142
}
72143
}
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: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import android.telephony.TelephonyManager;
99
import android.util.Log;
1010
import android.view.View;
11+
import android.widget.ImageView;
1112
import android.widget.TextView;
1213

1314
import androidx.annotation.NonNull;
@@ -60,7 +61,10 @@ private CellularManager(@NonNull Context context) {
6061
* @return a cellular manager
6162
*/
6263
public static CellularManager getManager(@NonNull Context context) {
63-
return cellularManager == null ? new CellularManager(context) : cellularManager;
64+
if (cellularManager == null) {
65+
cellularManager = new CellularManager(context);
66+
}
67+
return cellularManager;
6468
}
6569

6670
/**
@@ -76,8 +80,8 @@ public SignalStrength getSignalStrength() {
7680
* @return a corresponding signal strength level from the current context.
7781
*/
7882
public SignalStrengthLevel getSignalStrengthLevel() {
79-
if (report != null) {
80-
int level = report.getLevel();
83+
if (this.report != null) {
84+
int level = this.report.getLevel();
8185
return SignalStrengthLevel.init(level);
8286
}
8387

@@ -91,7 +95,7 @@ public SignalStrengthLevel getSignalStrengthLevel() {
9195
* report might be null if no cellular connection.
9296
*/
9397
public CellSignalStrength getCellSignalStrength() {
94-
return report;
98+
return this.report;
9599
}
96100

97101
/**
@@ -100,15 +104,14 @@ public CellSignalStrength getCellSignalStrength() {
100104
* If no cellular connection, 0.
101105
*/
102106
public int getDBM() {
103-
return report != null ? report.getDbm() : 0;
107+
return this.report != null ? this.report.getDbm() : 0;
104108
}
105109

106110
/**
107111
* Start listen to signal strength change and display onto the corresponding TextView.
108112
*
109-
* @param textView the text view that will be used to display the signal strength data.
110113
*/
111-
public void listenToSignalStrengthChange(TextView textView) {
114+
public void listenToSignalStrengthChange(CellularChangeListener listener) {
112115
new Thread(new Runnable() {
113116
@Override
114117
public void run() {
@@ -122,14 +125,18 @@ public void onSignalStrengthsChanged(SignalStrength signalStrength) {
122125
List<CellSignalStrengthLte> reports = signalStrength
123126
.getCellSignalStrengths(CellSignalStrengthLte.class);
124127

125-
String text;
128+
int dBm;
129+
SignalStrengthLevel level;
126130
if (reports.size() > 0) {
127131
CellSignalStrengthLte report = reports.get(0);
128-
text = report.getDbm() + " " + report.getLevel();
132+
level = SignalStrengthLevel.init(report.getLevel());
133+
dBm = report.getDbm();
129134
} else {
130-
text = SignalStrengthLevel.NONE.getName();
135+
level = SignalStrengthLevel.NONE;
136+
dBm = level.getLevelCode();
131137
}
132-
textView.setText(text);
138+
139+
listener.onChange(level, dBm);
133140

134141
if (stopListening) {
135142
Looper.myLooper().quit();

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

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public NetworkManager(@NonNull Context context) {
7070
* @param networkChangeListener a new listener (should not be null).
7171
*/
7272
public void addNetworkChangeListener(@NonNull NetworkChangeListener networkChangeListener) {
73-
mNetworkChangeListeners.add(networkChangeListener);
73+
this.mNetworkChangeListeners.add(networkChangeListener);
7474

7575
NetworkRequest request = new NetworkRequest
7676
.Builder()
@@ -110,23 +110,23 @@ public void onUnavailable() {
110110
}
111111
};
112112

113-
this.connectivityManager.registerNetworkCallback(request, networkCallback);
113+
this.connectivityManager.registerNetworkCallback(request, this.networkCallback);
114114
}
115115

116116
/**
117117
* Remove a specified listener
118118
*
119119
* @param networkChangeListener the listener to be removed (should not be null)
120120
*/
121-
public void removeNetworokChangeListener(@NonNull NetworkChangeListener networkChangeListener) {
122-
mNetworkChangeListeners.remove(networkChangeListener);
121+
public void removeNetworkChangeListener(@NonNull NetworkChangeListener networkChangeListener) {
122+
this.mNetworkChangeListeners.remove(networkChangeListener);
123123
}
124124

125125
/**
126126
* Remove all registered listeners
127127
*/
128128
public void removeAllNetworkChangeListeners() {
129-
mNetworkChangeListeners.clear();
129+
this.mNetworkChangeListeners.clear();
130130
this.connectivityManager.unregisterNetworkCallback(this.networkCallback);
131131
}
132132

@@ -135,14 +135,23 @@ public void removeAllNetworkChangeListeners() {
135135
* @return true if the current device is connected to the internet via cellular; false otherwise.
136136
*/
137137
public boolean isCellularConnected() {
138-
return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
138+
return this.capabilities != null &&
139+
this.capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
139140
}
140141

141142
public int getLinkDownstreamBandwidthKbps() {
142-
return this.capabilities.getLinkDownstreamBandwidthKbps();
143+
if (this.capabilities != null) {
144+
return this.capabilities.getLinkDownstreamBandwidthKbps();
145+
}
146+
147+
return 0;
143148
}
144149

145150
public int getLinkUpstreamBandwidthKbps() {
146-
return this.capabilities.getLinkUpstreamBandwidthKbps();
151+
if (this.capabilities != null) {
152+
return this.capabilities.getLinkUpstreamBandwidthKbps();
153+
}
154+
155+
return 0;
147156
}
148157
}

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)