Skip to content

Commit 0bef9f3

Browse files
committed
Merge branch 'feature/signalStrength' into main
# Conflicts: # app/src/main/java/com/lcl/lclmeasurementtool/Utils/ConvertUtils.java
2 parents 2cb774f + 481c5a1 commit 0bef9f3

File tree

13 files changed

+631
-68
lines changed

13 files changed

+631
-68
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="com.lcl.lclmeasurementtool">
44

5+
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
56
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
7+
<uses-permission android:name="android.permission.INTERNET"/>
68
<application
79
android:allowBackup="true"
810
android:icon="@mipmap/ic_launcher"
@@ -21,5 +23,4 @@
2123
</intent-filter>
2224
</activity>
2325
</application>
24-
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
2526
</manifest>
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,72 @@
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;
10+
import android.widget.TextView;
11+
import android.widget.Toast;
12+
13+
import com.lcl.lclmeasurementtool.Managers.CellularManager;
14+
import com.lcl.lclmeasurementtool.Managers.NetworkManager;
15+
import com.lcl.lclmeasurementtool.Utils.SignalStrengthLevel;
616

717
public class MainActivity extends AppCompatActivity {
818

19+
public static final String TAG = "MAIN_ACTIVITY";
20+
21+
CellularManager mCellularManager;
22+
NetworkManager mNetworkManager;
23+
24+
925
@Override
1026
protected void onCreate(Bundle savedInstanceState) {
1127
super.onCreate(savedInstanceState);
1228
setContentView(R.layout.activity_main);
29+
NetworkManager mNetworkManager = new NetworkManager(this);
30+
mCellularManager = CellularManager.getManager(this);
31+
32+
TextView tv = (TextView) findViewById(R.id.signalStrengthStatus);
33+
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+
// }
64+
}
65+
66+
@Override
67+
protected void onDestroy() {
68+
super.onDestroy();
69+
mCellularManager.stopListening();
70+
mNetworkManager.removeAllNetworkChangeListeners();
1371
}
1472
}
Lines changed: 128 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,151 @@
11
package com.lcl.lclmeasurementtool.Managers;
22
import android.content.Context;
3+
import android.os.Looper;
4+
import android.telephony.CellSignalStrength;
5+
import android.telephony.CellSignalStrengthLte;
6+
import android.telephony.PhoneStateListener;
37
import android.telephony.SignalStrength;
48
import android.telephony.TelephonyManager;
9+
import android.util.Log;
10+
import android.view.View;
11+
import android.widget.TextView;
12+
13+
import androidx.annotation.NonNull;
514

615
import com.lcl.lclmeasurementtool.Utils.SignalStrengthLevel;
716

17+
import java.util.List;
18+
819
/**
920
* CellularManager monitors changes in device's signal strength and
1021
* report changes(callback) to front-end UI
22+
* @see <a href="https://developer.android.com/reference/android/telephony/CellSignalStrengthLte">CellSignalStrengthLte</a>
1123
*/
12-
1324
public class CellularManager {
1425

15-
private TelephonyManager telephonyManager;
26+
// LOG TAG constant
27+
static final String TAG = "CELLULAR_MANAGER_TAG";
28+
29+
private static CellularManager cellularManager = null;
30+
31+
// the telephony manager that manages all access related to cellular information.
32+
private final TelephonyManager telephonyManager;
33+
34+
// the signal strength object that stores the information
35+
// retrieved from the system by the time the object is accessed.
36+
private final SignalStrength signalStrength;
1637

17-
public CellularManager(Context context) {
38+
// the LTE signal strength report that consists of all cellular signal strength information.
39+
private final CellSignalStrengthLte report;
40+
41+
// the flag that controls when to stop listening to signal strength change.
42+
private boolean stopListening;
43+
44+
/**
45+
* Construct a new CellularManager object based on current context.
46+
* @param context the context of the application.
47+
*/
48+
private CellularManager(@NonNull Context context) {
1849
this.telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
50+
this.signalStrength = this.telephonyManager.getSignalStrength();
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+
}
56+
}
57+
58+
/**
59+
* Retrieve the cellular manager object from current context.
60+
* @return a cellular manager
61+
*/
62+
public static CellularManager getManager(@NonNull Context context) {
63+
return cellularManager == null ? new CellularManager(context) : cellularManager;
1964
}
2065

66+
/**
67+
* Retrieve the signal strength object from current context.
68+
* @return a signal strength object.
69+
*/
2170
public SignalStrength getSignalStrength() {
22-
return this.telephonyManager.getSignalStrength();
71+
return this.signalStrength;
2372
}
2473

74+
/**
75+
* Retrieve the signalStrengthLevel Enum from current context.
76+
* @return a corresponding signal strength level from the current context.
77+
*/
2578
public SignalStrengthLevel getSignalStrengthLevel() {
26-
int level = getSignalStrength().getLevel();
27-
return SignalStrengthLevel.init(level);
79+
if (report != null) {
80+
int level = report.getLevel();
81+
return SignalStrengthLevel.init(level);
82+
}
83+
84+
return SignalStrengthLevel.NONE;
85+
}
86+
87+
/**
88+
* Retrieve the CellSignalStrength report.
89+
* @return a CellSignalStrength object that
90+
* contains all information related to cellular signal strength.
91+
* report might be null if no cellular connection.
92+
*/
93+
public CellSignalStrength getCellSignalStrength() {
94+
return report;
95+
}
96+
97+
/**
98+
* Retrieve the signal Strength in dBm.
99+
* @return an integer of signal strength in dBm.
100+
* If no cellular connection, 0.
101+
*/
102+
public int getDBM() {
103+
return report != null ? report.getDbm() : 0;
104+
}
105+
106+
/**
107+
* Start listen to signal strength change and display onto the corresponding TextView.
108+
*
109+
* @param textView the text view that will be used to display the signal strength data.
110+
*/
111+
public void listenToSignalStrengthChange(TextView textView) {
112+
new Thread(new Runnable() {
113+
@Override
114+
public void run() {
115+
stopListening = false;
116+
Looper.prepare();
117+
118+
telephonyManager.listen(new PhoneStateListener() {
119+
@Override
120+
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
121+
super.onSignalStrengthsChanged(signalStrength);
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+
}
132+
textView.setText(text);
133+
134+
if (stopListening) {
135+
Looper.myLooper().quit();
136+
}
137+
}
138+
}, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
139+
140+
Looper.loop();
141+
}
142+
}).start();
143+
}
144+
145+
/**
146+
* Stop listening the changes on signal strength.
147+
*/
148+
public void stopListening() {
149+
this.stopListening = true;
28150
}
29151
}

0 commit comments

Comments
 (0)