Skip to content

Commit 481c5a1

Browse files
committed
refine network manager and cellular manager; add some colors to colors.xml
1 parent 4c52cdf commit 481c5a1

File tree

8 files changed

+273
-27
lines changed

8 files changed

+273
-27
lines changed

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

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
11
package com.lcl.lclmeasurementtool;
22

3+
import androidx.annotation.NonNull;
34
import androidx.appcompat.app.AppCompatActivity;
45

6+
import android.net.Network;
7+
import android.net.NetworkCapabilities;
58
import android.os.Bundle;
9+
import android.util.Log;
610
import android.widget.TextView;
711
import android.widget.Toast;
812

913
import com.lcl.lclmeasurementtool.Managers.CellularManager;
1014
import com.lcl.lclmeasurementtool.Managers.NetworkManager;
15+
import com.lcl.lclmeasurementtool.Utils.SignalStrengthLevel;
1116

1217
public class MainActivity extends AppCompatActivity {
1318

19+
public static final String TAG = "MAIN_ACTIVITY";
20+
1421
CellularManager mCellularManager;
1522
NetworkManager mNetworkManager;
1623

@@ -24,16 +31,42 @@ protected void onCreate(Bundle savedInstanceState) {
2431

2532
TextView tv = (TextView) findViewById(R.id.signalStrengthStatus);
2633

27-
if (mNetworkManager.isCellularConnected()) {
28-
mCellularManager.listenToSignalStrengthChange(tv);
29-
} else {
30-
Toast.makeText(this, "You are not connected via cellular", Toast.LENGTH_LONG).show();
31-
}
34+
mNetworkManager.addNetworkChangeListener(new NetworkManager.NetworkChangeListener() {
35+
@Override
36+
public void onAvailable() {
37+
// Log.i(TAG, "The cellular network is now available");
38+
mCellularManager.listenToSignalStrengthChange(tv);
39+
}
40+
41+
@Override
42+
public void onLost() {
43+
// Log.i(TAG, "The cellular network is now lost");
44+
mCellularManager.stopListening();
45+
tv.setText(SignalStrengthLevel.NONE.getName());
46+
}
47+
48+
@Override
49+
public void onUnavailable() {
50+
// Log.i(TAG, "The cellular network is unavailable");
51+
}
52+
53+
@Override
54+
public void onCellularNetworkChanged(boolean isConnected) {
55+
// Log.i(TAG, "The cellular network is connected? " + isConnected);
56+
}
57+
});
58+
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+
// }
3264
}
3365

3466
@Override
3567
protected void onDestroy() {
3668
super.onDestroy();
3769
mCellularManager.stopListening();
70+
mNetworkManager.removeAllNetworkChangeListeners();
3871
}
3972
}

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

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,12 @@
1010
import android.view.View;
1111
import android.widget.TextView;
1212

13+
import androidx.annotation.NonNull;
14+
1315
import com.lcl.lclmeasurementtool.Utils.SignalStrengthLevel;
1416

17+
import java.util.List;
18+
1519
/**
1620
* CellularManager monitors changes in device's signal strength and
1721
* report changes(callback) to front-end UI
@@ -20,7 +24,7 @@
2024
public class CellularManager {
2125

2226
// LOG TAG constant
23-
static final String LOG_TAG = "CELLULAR_MANAGER_TAG";
27+
static final String TAG = "CELLULAR_MANAGER_TAG";
2428

2529
private static CellularManager cellularManager = null;
2630

@@ -41,17 +45,21 @@ public class CellularManager {
4145
* Construct a new CellularManager object based on current context.
4246
* @param context the context of the application.
4347
*/
44-
private CellularManager(Context context) {
48+
private CellularManager(@NonNull Context context) {
4549
this.telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
4650
this.signalStrength = this.telephonyManager.getSignalStrength();
47-
this.report = this.signalStrength.getCellSignalStrengths(CellSignalStrengthLte.class).get(0);
51+
if (this.signalStrength.getCellSignalStrengths(CellSignalStrengthLte.class).size() > 0) {
52+
this.report = this.signalStrength.getCellSignalStrengths(CellSignalStrengthLte.class).get(0);
53+
} else {
54+
this.report = null;
55+
}
4856
}
4957

5058
/**
5159
* Retrieve the cellular manager object from current context.
5260
* @return a cellular manager
5361
*/
54-
public static CellularManager getManager(Context context) {
62+
public static CellularManager getManager(@NonNull Context context) {
5563
return cellularManager == null ? new CellularManager(context) : cellularManager;
5664
}
5765

@@ -68,14 +76,19 @@ public SignalStrength getSignalStrength() {
6876
* @return a corresponding signal strength level from the current context.
6977
*/
7078
public SignalStrengthLevel getSignalStrengthLevel() {
71-
int level = report.getLevel();
72-
return SignalStrengthLevel.init(level);
79+
if (report != null) {
80+
int level = report.getLevel();
81+
return SignalStrengthLevel.init(level);
82+
}
83+
84+
return SignalStrengthLevel.NONE;
7385
}
7486

7587
/**
7688
* Retrieve the CellSignalStrength report.
7789
* @return a CellSignalStrength object that
78-
* contains all information related to cellular signal strength
90+
* contains all information related to cellular signal strength.
91+
* report might be null if no cellular connection.
7992
*/
8093
public CellSignalStrength getCellSignalStrength() {
8194
return report;
@@ -84,9 +97,10 @@ public CellSignalStrength getCellSignalStrength() {
8497
/**
8598
* Retrieve the signal Strength in dBm.
8699
* @return an integer of signal strength in dBm.
100+
* If no cellular connection, 0.
87101
*/
88102
public int getDBM() {
89-
return report.getDbm();
103+
return report != null ? report.getDbm() : 0;
90104
}
91105

92106
/**
@@ -105,10 +119,16 @@ public void run() {
105119
@Override
106120
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
107121
super.onSignalStrengthsChanged(signalStrength);
108-
CellSignalStrengthLte report = signalStrength
109-
.getCellSignalStrengths(CellSignalStrengthLte.class)
110-
.get(0);
111-
String text = report.getDbm() + " " + report.getLevel();
122+
List<CellSignalStrengthLte> reports = signalStrength
123+
.getCellSignalStrengths(CellSignalStrengthLte.class);
124+
125+
String text;
126+
if (reports.size() > 0) {
127+
CellSignalStrengthLte report = reports.get(0);
128+
text = report.getDbm() + " " + report.getLevel();
129+
} else {
130+
text = SignalStrengthLevel.NONE.getName();
131+
}
112132
textView.setText(text);
113133

114134
if (stopListening) {

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

Lines changed: 104 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,50 +5,144 @@
55
import android.net.Network;
66
import android.net.NetworkCapabilities;
77
import android.net.NetworkInfo;
8+
import android.net.NetworkRequest;
89
import android.os.Build;
910
import android.util.Log;
1011

11-
import androidx.annotation.RequiresApi;
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
15+
import androidx.annotation.NonNull;
16+
1217

1318
/**
1419
* NetworkManager manages all network related information, including but not limited to
1520
* connectivity states, active network information(wifi, cellular) and
1621
* listen to changes in network states.
22+
*
23+
* @see <a href="https://developer.android.com/training/basics/network-ops/reading-network-state#java">reading network state</a>
1724
*/
1825
public class NetworkManager {
1926

2027
// LOG TAG constant
21-
private static final String LOG_TAG = "NETWORK_MANAGER_TAG";
28+
private static final String TAG = "NETWORK_MANAGER_TAG";
29+
30+
public interface NetworkChangeListener {
31+
void onAvailable();
32+
void onUnavailable();
33+
void onLost();
34+
void onCellularNetworkChanged(boolean isConnected);
35+
}
36+
37+
// A List of registered ColorChangeListeners
38+
private List<NetworkChangeListener> mNetworkChangeListeners;
39+
40+
// A Network Callback object
41+
private ConnectivityManager.NetworkCallback networkCallback;
2242

2343
// the connectivity manager object that keeps track of all information
2444
// related to phone's connectivyt states.
2545
private ConnectivityManager connectivityManager;
2646

47+
// the network object that encapsulates all info regarding Network
48+
private Network network;
49+
2750
// the network capabilities object that stores everything that the
2851
// current device supports with regards to networking.
2952
private NetworkCapabilities capabilities;
3053

31-
// boolean value that keeps track of the cellular connectivity state.
32-
private boolean isCellularConnected;
33-
3454
/**
3555
* Initialize a Network Manager object following the context of current device.
3656
* @param context the Context object of the current device
3757
*/
38-
public NetworkManager(Context context) {
58+
public NetworkManager(@NonNull Context context) {
3959
this.connectivityManager =
4060
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
4161

42-
Network network = this.connectivityManager.getActiveNetwork();
62+
this.network = this.connectivityManager.getActiveNetwork();
4363
this.capabilities = this.connectivityManager.getNetworkCapabilities(network);
44-
this.isCellularConnected = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
64+
this.mNetworkChangeListeners = new ArrayList<>();
65+
}
66+
67+
/**
68+
* Registers a new listener
69+
*
70+
* @param networkChangeListener a new listener (should not be null).
71+
*/
72+
public void addNetworkChangeListener(@NonNull NetworkChangeListener networkChangeListener) {
73+
mNetworkChangeListeners.add(networkChangeListener);
74+
75+
NetworkRequest request = new NetworkRequest
76+
.Builder()
77+
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
78+
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
79+
.build();
80+
81+
this.networkCallback = new ConnectivityManager.NetworkCallback() {
82+
@Override
83+
public void onAvailable(@NonNull Network network) {
84+
super.onAvailable(network);
85+
Log.i(TAG, "current network is " + network);
86+
mNetworkChangeListeners.forEach(NetworkChangeListener::onAvailable);
87+
}
88+
89+
@Override
90+
public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
91+
super.onCapabilitiesChanged(network, networkCapabilities);
92+
Log.e(TAG, "The default network changed capabilities: " + networkCapabilities);
93+
mNetworkChangeListeners.forEach(l -> l.onCellularNetworkChanged(
94+
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
95+
));
96+
}
97+
98+
@Override
99+
public void onLost(@NonNull Network network) {
100+
super.onLost(network);
101+
Log.e(TAG, "The default network lost. Previous one is " + network);
102+
mNetworkChangeListeners.forEach(NetworkChangeListener::onLost);
103+
}
104+
105+
@Override
106+
public void onUnavailable() {
107+
super.onUnavailable();
108+
Log.e(TAG, "The default network is unavailable");
109+
mNetworkChangeListeners.forEach(NetworkChangeListener::onUnavailable);
110+
}
111+
};
112+
113+
this.connectivityManager.registerNetworkCallback(request, networkCallback);
114+
}
115+
116+
/**
117+
* Remove a specified listener
118+
*
119+
* @param networkChangeListener the listener to be removed (should not be null)
120+
*/
121+
public void removeNetworokChangeListener(@NonNull NetworkChangeListener networkChangeListener) {
122+
mNetworkChangeListeners.remove(networkChangeListener);
45123
}
46124

47125
/**
48-
* Returns the cellular connectivity state of the current device.
126+
* Remove all registered listeners
127+
*/
128+
public void removeAllNetworkChangeListeners() {
129+
mNetworkChangeListeners.clear();
130+
this.connectivityManager.unregisterNetworkCallback(this.networkCallback);
131+
}
132+
133+
/**
134+
* Returns the current cellular connectivity state of the current device when this method gets called.
49135
* @return true if the current device is connected to the internet via cellular; false otherwise.
50136
*/
51137
public boolean isCellularConnected() {
52-
return isCellularConnected;
138+
return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
139+
}
140+
141+
public int getLinkDownstreamBandwidthKbps() {
142+
return this.capabilities.getLinkDownstreamBandwidthKbps();
143+
}
144+
145+
public int getLinkUpstreamBandwidthKbps() {
146+
return this.capabilities.getLinkUpstreamBandwidthKbps();
53147
}
54148
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,11 @@ public interface AbstractDataTransferRate {
99
* @return an numeric representation of the enumeration value.
1010
*/
1111
int getLevel();
12+
13+
/**
14+
* Retrieve the String representation of the unit.
15+
* @return a string representation of the unit.
16+
* Null value will be returned if the enum mapping fails.
17+
*/
18+
String getUnitString();
1219
}

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,14 @@ public Unit getUnit() {
3636
return unit;
3737
}
3838

39+
/**
40+
* Retrieve the String representation of the data transfer rate unit.
41+
* @return a string representation of the data transfer rate.
42+
*/
43+
public String getUnitString() {
44+
return magnitude.getUnitString() + unit.getUnitString() + "/s";
45+
}
46+
3947
/**
4048
* Return the <code>Magnitude</code> of the enum value.
4149
* @return the corresponding magnitude of the enum value.
@@ -74,6 +82,19 @@ public enum Magnitude implements AbstractDataTransferRate {
7482
public int getLevel() {
7583
return level;
7684
}
85+
86+
@Override
87+
public String getUnitString() {
88+
switch (this) {
89+
case Kilo:
90+
return "K";
91+
case Mega:
92+
return "M";
93+
case Giga:
94+
return "G";
95+
}
96+
return null;
97+
}
7798
}
7899

79100
/**
@@ -105,5 +126,16 @@ public enum Unit implements AbstractDataTransferRate {
105126
public int getLevel() {
106127
return level;
107128
}
129+
130+
@Override
131+
public String getUnitString() {
132+
switch (this) {
133+
case Bit:
134+
return "b";
135+
case Byte:
136+
return "B";
137+
}
138+
return null;
139+
}
108140
}
109141
}

0 commit comments

Comments
 (0)