Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added a feature that enables speedtests to be configured not to run on every tick #58

Closed
wants to merge 12 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,14 @@ public class DownloadSpeedTestDataSource implements NetMonDataSource {

private SpeedTestPreferences mPreferences;
private String mDisabledValue;
private SpeedTestAdvancedInterval mAdvancedInterval;

@Override
public void onCreate(Context context) {
Log.v(TAG, "onCreate");
mPreferences = SpeedTestPreferences.getInstance(context);
mDisabledValue = context.getString(R.string.speed_test_disabled);
mAdvancedInterval = new SpeedTestAdvancedInterval(context);
}

@Override
Expand All @@ -60,7 +62,7 @@ public ContentValues getContentValues() {
Log.v(TAG, "getContentValues");
ContentValues values = new ContentValues();

if (mPreferences.isEnabled()) {
if (mPreferences.isEnabled() && mAdvancedInterval.doUpdate()) {
SpeedTestDownloadConfig downloadConfig = mPreferences.getDownloadConfig();
if (!downloadConfig.isValid()) return values;
SpeedTestResult result = SpeedTestDownload.download(downloadConfig);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
package ca.rmen.android.networkmonitor.app.service.datasources;

import android.app.usage.ConfigurationStats;
import android.content.Context;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;

import ca.rmen.android.networkmonitor.Constants;
import ca.rmen.android.networkmonitor.app.speedtest.SpeedTestPreferences;
import ca.rmen.android.networkmonitor.util.Log;

/**
* Reason for it being in datasources is that I need access to NetMonSignalStrength, which is not public
*/
public class SpeedTestAdvancedInterval {
private static final String TAG = Constants.TAG + SpeedTestAdvancedInterval.class.getSimpleName();
private static final int SIGNAL_STRENGTH_VARIATION_THRESHOLD_DBM = 5;
private static final int SPEED_TEST_INTERVAL_NETWORK_CHANGE = -2;
private static final int SPEED_TEST_INTERVAL_DBM_OR_NETWORK_CHANGE = -1;

private SpeedTestPreferences mPreferences;

private NetMonSignalStrength mNetMonSignalStrength;
private int mLastSignalStrengthDbm;

// For fetching data regarding the network such as signal strength, network type etc.
private static TelephonyManager mTelephonyManager;

// For finding changes in the signal strength
private int mOldSignalStrength;

// For finding changes in the network
private int mNetworkType;

// For counting entries since last speedtest was performed
private int mIntervalCounter;

SpeedTestAdvancedInterval(Context context) {
Log.v(TAG, "onCreate");
mPreferences = SpeedTestPreferences.getInstance(context);
mIntervalCounter = 0;
mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS | PhoneStateListener.LISTEN_SERVICE_STATE);
mNetMonSignalStrength = new NetMonSignalStrength(context);
// Some value that never should be possible so we always updates the first run
mOldSignalStrength = 255;
mNetworkType = 255;
}

// Need to make sure we do not listen after we are done
public void onDestroy() {
Log.v(TAG, "onDestroy");
if (mTelephonyManager != null) mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
}

// Determines if the function should do a download test this call
public boolean doUpdate() {
Log.v(TAG, "doUpdate() " + mPreferences.getAdvancedSpeedInterval() + " : " + mIntervalCounter );
if (!mPreferences.isAdvancedEnabled()) {
return true;
}
else {
int mode = Integer.parseInt(mPreferences.getAdvancedSpeedInterval());
if (mode == SPEED_TEST_INTERVAL_NETWORK_CHANGE) {
// check for change in network
return changedNetwork();
}
else if (mode == SPEED_TEST_INTERVAL_DBM_OR_NETWORK_CHANGE) {
// check for change in network and for a difference in dbm by 5
if (changedDbm() || changedNetwork()) {
return true;
}
}
else {
mIntervalCounter++;
if (mode <= mIntervalCounter) {
mIntervalCounter = 0;
return true;
}
}
return false;
}
}

private boolean changedNetwork() {
if (mTelephonyManager.getNetworkType() != mNetworkType ){
mNetworkType = mTelephonyManager.getNetworkType();
return true;
}
return false;
}

private boolean changedDbm() {
Log.v(TAG, "changedDbm by: " + SIGNAL_STRENGTH_VARIATION_THRESHOLD_DBM + '?');
if (mLastSignalStrengthDbm != NetMonSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
if (mLastSignalStrengthDbm >= mOldSignalStrength + SIGNAL_STRENGTH_VARIATION_THRESHOLD_DBM
|| mLastSignalStrengthDbm <= mOldSignalStrength - SIGNAL_STRENGTH_VARIATION_THRESHOLD_DBM ) {
Log.v(TAG,"mOldSignalStrength has been changed from " + mOldSignalStrength + " to " + mLastSignalStrengthDbm);
mOldSignalStrength = mLastSignalStrengthDbm;
return true;
}
}
return false;
}

private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
Log.v(TAG, "onSignalStrengthsChanged: " + signalStrength);
mLastSignalStrengthDbm = mNetMonSignalStrength.getDbm(signalStrength);
}

@Override
public void onServiceStateChanged(ServiceState serviceState) {
Log.v(TAG, "onServiceStateChanged " + serviceState);
if (serviceState.getState() != ServiceState.STATE_IN_SERVICE) {
mLastSignalStrengthDbm = NetMonSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
}
}
};

}
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,14 @@ public class UploadSpeedTestDataSource implements NetMonDataSource {
private SpeedTestPreferences mPreferences;
private String mDisabledValue;

private SpeedTestAdvancedInterval mAdvancedInterval;

@Override
public void onCreate(Context context) {
Log.v(TAG, "onCreate");
mPreferences = SpeedTestPreferences.getInstance(context);
mDisabledValue = context.getString(R.string.speed_test_disabled);
mAdvancedInterval = new SpeedTestAdvancedInterval(context);
}

@Override
Expand All @@ -60,7 +63,7 @@ public ContentValues getContentValues() {
Log.v(TAG, "getContentValues");
ContentValues values = new ContentValues();

if (mPreferences.isEnabled()) {
if (mPreferences.isEnabled() && mAdvancedInterval.doUpdate()) {
SpeedTestUploadConfig uploadConfig = mPreferences.getUploadConfig();
if (!uploadConfig.isValid()) return values;
SpeedTestResult result = SpeedTestUpload.upload(uploadConfig);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ public class SpeedTestPreferences {

static final String PREF_SPEED_TEST_ENABLED = "PREF_SPEED_TEST_ENABLED";
static final String PREF_SPEED_TEST_DOWNLOAD_URL = "PREF_SPEED_TEST_DOWNLOAD_URL";
static final String PREF_ADVANCED_SPEED_TEST_ENABLED = "PREF_ADVANCED_SPEED_TEST_ENABLED";
static final String PREF_ADVANCED_UPDATE_INTERVAL = "PREF_ADVANCED_UPDATE_INTERVAL";
static final String PREF_SPEED_TEST_UPLOAD_SERVER = "PREF_SPEED_TEST_UPLOAD_SERVER";
static final String PREF_SPEED_TEST_UPLOAD_PORT = "PREF_SPEED_TEST_UPLOAD_PORT";
static final String PREF_SPEED_TEST_UPLOAD_USER = "PREF_SPEED_TEST_UPLOAD_USER";
Expand Down Expand Up @@ -79,6 +81,24 @@ public void setEnabled(boolean enabled) {
mSharedPrefs.edit().putBoolean(PREF_SPEED_TEST_ENABLED, enabled).apply();
}

public boolean isAdvancedEnabled() {
return mSharedPrefs.getBoolean(PREF_ADVANCED_SPEED_TEST_ENABLED, false);
}

public void setAdvancedEnabled(boolean enabled) {
Log.v(TAG, "setAdvancedEnabled " + enabled);
mSharedPrefs.edit().putBoolean(PREF_ADVANCED_SPEED_TEST_ENABLED, enabled).apply();
}

public String getAdvancedSpeedInterval() {
return mSharedPrefs.getString(PREF_ADVANCED_UPDATE_INTERVAL, "");
}

public void setAdvancedSpeedInterval(String speedInterval){
Log.v(TAG, "setAdvancedSpeedInterval" + speedInterval);
mSharedPrefs.edit().putString(PREF_ADVANCED_UPDATE_INTERVAL, speedInterval);
}

public SpeedTestUploadConfig getUploadConfig() {
String server = mSharedPrefs.getString(PREF_SPEED_TEST_UPLOAD_SERVER, "").trim();
int port = getIntPreference(PREF_SPEED_TEST_UPLOAD_PORT, PREF_SPEED_TEST_DEFAULT_UPLOAD_PORT);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,9 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin
getString(R.string.speed_test_warning_message));
}
break;
case SpeedTestPreferences.PREF_ADVANCED_UPDATE_INTERVAL:
updatePreferenceSummary(key, R.string.pref_summary_advanced_speed_test_logging_interval);
break;
// If the user changed the download url, delete the previously downloaded file
// and download the new one.
case SpeedTestPreferences.PREF_SPEED_TEST_DOWNLOAD_URL:
Expand Down
25 changes: 25 additions & 0 deletions networkmonitor/src/main/res/values/arrays.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,31 @@
<item>1800000</item>
<item>3600000</item>
</string-array>
<!-- Alternative update interval for speed test -->
<string-array name="preferences_speed_test_interval_labels">
<item>@string/pref_value_advanced_speed_test_logging_interval_network_change</item>
<item>@string/pref_value_advanced_speed_test_logging_interval_signal_change_5dbm</item>
<item>@string/pref_value_advanced_speed_test_logging_interval_2_times</item>
<item>@string/pref_value_advanced_speed_test_logging_interval_5_times</item>
<item>@string/pref_value_advanced_speed_test_logging_interval_10_times</item>
<item>@string/pref_value_advanced_speed_test_logging_interval_20_times</item>
<item>@string/pref_value_advanced_speed_test_logging_interval_30_times</item>
<item>@string/pref_value_advanced_speed_test_logging_interval_60_times</item>
<item>@string/pref_value_advanced_speed_test_logging_interval_100_times</item>
<item>@string/pref_value_advanced_speed_test_logging_interval_1000_times</item>
</string-array>
<string-array name="preferences_speed_test_interval_values" translatable="false">
<item>-2</item>
<item>-1</item>
<item>2</item>
<item>5</item>
<item>10</item>
<item>20</item>
<item>30</item>
<item>60</item>
<item>100</item>
<item>1000</item>
</string-array>
<string-array name="export_choices">
<item>@string/export_choice_csv</item>
<item>@string/export_choice_html</item>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,22 @@
<!-- Speed test preferences -->
<string name="pref_category_speed_test_settings">SPEED TEST SETTINGS</string>
<string name="pref_title_speed_test_enabled">Enable speed test</string>
<!-- Advanced speed test settings -->
<string name="pref_category_advanced_speed_test_settings">ADVANCED SPEED TEST SETTINGS</string>
<string name="pref_title_advanced_speed_test_settings_enable">Enable advanced</string>
<string name="pref_title_advanced_speed_test_logging_interval">Logging interval</string>
<string name="pref_summary_advanced_speed_test_logging_interval">%s</string>
<string name="pref_value_advanced_speed_test_logging_interval_never">Never</string>
<string name="pref_value_advanced_speed_test_logging_interval_network_change">When the network changes</string>
<string name="pref_value_advanced_speed_test_logging_interval_signal_change_5dbm">When network or signal changes 5 dbm</string>
<string name="pref_value_advanced_speed_test_logging_interval_2_times">Every second entry</string>
<string name="pref_value_advanced_speed_test_logging_interval_5_times">Every fifth entry</string>
<string name="pref_value_advanced_speed_test_logging_interval_10_times">Every tenth entry</string>
<string name="pref_value_advanced_speed_test_logging_interval_20_times">Every 20th entry</string>
<string name="pref_value_advanced_speed_test_logging_interval_30_times">Every 30th entry</string>
<string name="pref_value_advanced_speed_test_logging_interval_60_times">Every 60th entry</string>
<string name="pref_value_advanced_speed_test_logging_interval_100_times">Every 100th entry</string>
<string name="pref_value_advanced_speed_test_logging_interval_1000_times">Every 1000nd entry</string>
<!-- Download speed test preferences -->
<string name="pref_category_speed_test_download_settings">DOWNLOAD TEST (HTTP)</string>
<string name="pref_title_speed_test_download_url">URL of the file to download</string>
Expand Down
1 change: 0 additions & 1 deletion networkmonitor/src/main/res/xml/preferences.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
android:icon="@drawable/ic_pref_enable_service"
android:key="PREF_SERVICE_ENABLED"
android:title="@string/pref_title_service_enabled" />

<ca.rmen.android.networkmonitor.app.prefs.ThemedListPreference
android:defaultValue="10000"
android:entries="@array/preferences_updateInterval_labels"
Expand Down
16 changes: 16 additions & 0 deletions networkmonitor/src/main/res/xml/speed_test_preferences.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,22 @@
android:key="PREF_SPEED_TEST_ENABLED"
android:title="@string/pref_title_speed_test_enabled" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/pref_category_advanced_speed_test_settings" >
<!--suppress AndroidElementNotAllowed -->
<org.jraf.android.backport.switchwidget.SwitchPreference
android:defaultValue="false"
android:icon="@drawable/ic_pref_enable_service"
android:key="PREF_ADVANCED_SPEED_TEST_ENABLED"
android:title="@string/pref_title_advanced_speed_test_settings_enable"/>
<ca.rmen.android.networkmonitor.app.prefs.ThemedListPreference
android:defaultValue="-2"
android:entries="@array/preferences_speed_test_interval_labels"
android:entryValues="@array/preferences_speed_test_interval_values"
android:icon="@drawable/ic_pref_update_interval"
android:key="PREF_ADVANCED_UPDATE_INTERVAL"
android:summary="%s"
android:title="@string/pref_title_advanced_speed_test_logging_interval" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/pref_category_speed_test_download_settings" >
<!--suppress AndroidElementNotAllowed -->
<com.afollestad.materialdialogs.prefs.MaterialEditTextPreference
Expand Down