/*
* This source is part of the
* _____ ___ ____
* __ / / _ \/ _ | / __/___ _______ _
* / // / , _/ __ |/ _/_/ _ \/ __/ _ `/
* \___/_/|_/_/ |_/_/ (_)___/_/ \_, /
* /___/
* repository.
*
* Copyright (C) 2013 Benoit 'BoD' Lubek (BoD@JRAF.org)
* Copyright (C) 2013-2015 Carmen Alvarez (c@rmen.ca)
* Copyright (C) 2015 Rasmus Holm
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ca.rmen.android.networkmonitor.app.speedtest;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.preference.EditTextPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceManager;
import java.util.Locale;
import ca.rmen.android.networkmonitor.Constants;
import ca.rmen.android.networkmonitor.R;
import ca.rmen.android.networkmonitor.app.dialog.DialogFragmentFactory;
import ca.rmen.android.networkmonitor.app.prefs.NetMonPreferenceFragmentCompat;
import ca.rmen.android.networkmonitor.app.prefs.NetMonPreferences;
import ca.rmen.android.networkmonitor.app.speedtest.SpeedTestResult.SpeedTestStatus;
import ca.rmen.android.networkmonitor.util.FileUtil;
import ca.rmen.android.networkmonitor.util.Log;
/**
* Preferences for the speed test.
*/
public class SpeedTestPreferencesActivity extends AppCompatActivity { // NO_UCD (use default)
private static final String TAG = Constants.TAG + SpeedTestPreferencesActivity.class.getSimpleName();
private SpeedTestPreferences mSpeedTestPrefs;
private NetMonPreferenceFragmentCompat mPreferenceFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.v(TAG, "onCreate");
super.onCreate(savedInstanceState);
if (getSupportActionBar() != null)
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mPreferenceFragment = NetMonPreferenceFragmentCompat.newInstance(R.xml.speed_test_preferences);
getSupportFragmentManager().
beginTransaction().
replace(android.R.id.content, mPreferenceFragment).
commit();
getSupportFragmentManager().executePendingTransactions();
mSpeedTestPrefs = SpeedTestPreferences.getInstance(this);
Preference prefSpeedTestEnabled = mPreferenceFragment.findPreference(SpeedTestPreferences.PREF_SPEED_TEST_ENABLED);
if (NetMonPreferences.getInstance(this).isFastPollingEnabled())
prefSpeedTestEnabled.setEnabled(false);
SpeedTestResult result = mSpeedTestPrefs.getLastDownloadResult();
if (result.status != SpeedTestStatus.SUCCESS) download();
else
updateDownloadUrlPreferenceSummary();
updatePreferenceSummary(SpeedTestPreferences.PREF_SPEED_TEST_UPLOAD_SERVER, R.string.pref_summary_speed_test_upload_server);
updatePreferenceSummary(SpeedTestPreferences.PREF_SPEED_TEST_UPLOAD_PORT, R.string.pref_summary_speed_test_upload_port);
updatePreferenceSummary(SpeedTestPreferences.PREF_SPEED_TEST_UPLOAD_USER, R.string.pref_summary_speed_test_upload_user);
updatePreferenceSummary(SpeedTestPreferences.PREF_SPEED_TEST_UPLOAD_PATH, R.string.pref_summary_speed_test_upload_path);
}
@Override
protected void onStart() {
Log.v(TAG, "onStart");
super.onStart();
PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(mOnSharedPreferenceChangeListener);
}
@Override
protected void onStop() {
Log.v(TAG, "onStop");
PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(mOnSharedPreferenceChangeListener);
super.onStop();
boolean speedTestEnabled = mSpeedTestPrefs.isEnabled();
// If the user enabled the speed test, make sure we have enough info.
if (speedTestEnabled) {
SpeedTestDownloadConfig downloadConfig = mSpeedTestPrefs.getDownloadConfig(this);
if (!downloadConfig.isValid()) {
mSpeedTestPrefs.setEnabled(false);
DialogFragmentFactory.showInfoDialog(this, getString(R.string.speed_test_missing_info_dialog_title),
getString(R.string.speed_test_missing_info_dialog_message));
}
}
}
private final OnSharedPreferenceChangeListener mOnSharedPreferenceChangeListener = (sharedPreferences, key) -> {
Log.v(TAG, "onSharedPreferenceChanged: key = " + key);
// Show a warning when the user enables the speed test.
switch (key) {
case SpeedTestPreferences.PREF_SPEED_TEST_ENABLED:
if (sharedPreferences.getBoolean(key, false)) {
DialogFragmentFactory.showWarningDialog(SpeedTestPreferencesActivity.this, getString(R.string.speed_test_warning_title),
getString(R.string.speed_test_warning_message));
}
break;
case SpeedTestPreferences.PREF_SPEED_TEST_INTERVAL:
updatePreferenceSummary(key, R.string.pref_summary_speed_test_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:
FileUtil.clearCache(SpeedTestPreferencesActivity.this);
download();
break;
case SpeedTestPreferences.PREF_SPEED_TEST_UPLOAD_SERVER:
updatePreferenceSummary(key, R.string.pref_summary_speed_test_upload_server);
break;
case SpeedTestPreferences.PREF_SPEED_TEST_UPLOAD_PORT:
updatePreferenceSummary(key, R.string.pref_summary_speed_test_upload_port);
break;
case SpeedTestPreferences.PREF_SPEED_TEST_UPLOAD_USER:
updatePreferenceSummary(key, R.string.pref_summary_speed_test_upload_user);
break;
case SpeedTestPreferences.PREF_SPEED_TEST_UPLOAD_PATH:
updatePreferenceSummary(key, R.string.pref_summary_speed_test_upload_path);
break;
default:
break;
}
};
private void updatePreferenceSummary(CharSequence key, int summaryResId) {
Preference pref = mPreferenceFragment.findPreference(key);
if (pref instanceof EditTextPreference) {
CharSequence value = ((EditTextPreference) pref).getText();
String summary = getString(summaryResId, value);
pref.setSummary(summary);
}
}
/**
* Update the summary of the url preference, to include the size of the file we last retrieved.
*/
private void updateDownloadUrlPreferenceSummary() {
SpeedTestResult result = mSpeedTestPrefs.getLastDownloadResult();
String size = result.status == SpeedTestStatus.SUCCESS ? String.format(Locale.getDefault(), "%.3f", (float) result.fileBytes / 1000000) : "?";
String url = mSpeedTestPrefs.getDownloadConfig(this).url;
url = ellipsize(url);
String summary = getString(R.string.pref_summary_speed_test_download_url, url, size);
Preference pref = mPreferenceFragment.findPreference(SpeedTestPreferences.PREF_SPEED_TEST_DOWNLOAD_URL);
pref.setSummary(summary);
}
private static String ellipsize(String text) {
int maxLength = 30;
if (text.length() <= maxLength) return text;
String beginning = text.substring(0, maxLength / 2);
String end = text.substring(text.length() - maxLength / 2);
return beginning + "\u2026" + end;
}
/**
* Download the file to use for the speed test.
* We save the download result so we can update the summary of the url preference to include the file size.
*/
private void download() {
final SpeedTestDownloadConfig config = mSpeedTestPrefs.getDownloadConfig(this);
Preference pref = mPreferenceFragment.findPreference(SpeedTestPreferences.PREF_SPEED_TEST_DOWNLOAD_URL);
String summary = getString(R.string.pref_summary_speed_test_download_url, config.url, "?");
pref.setSummary(summary);
SpeedTestDownload.download(config, result -> {
mSpeedTestPrefs.setLastDownloadResult(result);
updateDownloadUrlPreferenceSummary();
}
);
}
}