in apps/sasquatch/src/main/java/com/microsoft/appcenter/sasquatch/activities/SettingsActivity.java [94:668]
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
initCheckBoxSetting(R.string.appcenter_state_key, R.string.appcenter_state_summary_enabled, R.string.appcenter_state_summary_disabled, new HasEnabled() {
@Override
public void setEnabled(boolean enabled) {
AppCenter.setEnabled(enabled);
sAnalyticsPaused = false;
}
@Override
public boolean isEnabled() {
return AppCenter.isEnabled().get();
}
});
initClickableSetting(R.string.country_code_key, MainActivity.sSharedPreferences.getString(getActivity().getString(R.string.country_code_key), ""), new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(final Preference preference) {
final EditText input = new EditText(getActivity());
input.setInputType(InputType.TYPE_CLASS_TEXT);
input.setHint(R.string.country_code_title);
input.setText(MainActivity.sSharedPreferences.getString(getActivity().getString(R.string.country_code_key), ""));
input.setSelection(input.getText().length());
new AlertDialog.Builder(getActivity()).setTitle(R.string.country_code_title).setView(input)
.setPositiveButton(R.string.save, new DialogInterface.OnClickListener() {
@SuppressLint("CommitPrefEdits")
@Override
public void onClick(DialogInterface dialog, int which) {
MainActivity.sSharedPreferences
.edit()
.putString(getActivity().getString(R.string.country_code_key), input.getText().toString())
.apply();
preference.setSummary(input.getText());
Toast.makeText(getActivity(), getActivity().getString(R.string.country_code_save_message), Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton(R.string.cancel, null)
.create().show();
return true;
}
});
initClickableSetting(R.string.storage_size_key, Formatter.formatFileSize(getActivity(), MainActivity.sSharedPreferences.getLong(MAX_STORAGE_SIZE_KEY, DEFAULT_MAX_STORAGE_SIZE)), new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(final Preference preference) {
final EditText input = new EditText(getActivity());
input.setInputType(InputType.TYPE_CLASS_NUMBER);
input.setHint(R.string.size_in_bytes);
input.setText(String.format(Locale.ENGLISH, "%d", MainActivity.sSharedPreferences.getLong(MAX_STORAGE_SIZE_KEY, DEFAULT_MAX_STORAGE_SIZE)));
input.setSelection(input.getText().length());
new AlertDialog.Builder(getActivity()).setTitle(R.string.storage_size_title).setView(input)
.setPositiveButton(R.string.save, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
long newSize = 0;
try {
newSize = Long.parseLong(input.getText().toString());
} catch (NumberFormatException ignored) {
}
if (newSize > 0) {
MainActivity.sSharedPreferences.edit().putLong(MAX_STORAGE_SIZE_KEY, newSize).apply();
Toast.makeText(getActivity(), String.format(getActivity().getString(R.string.storage_size_changed_format), Formatter.formatFileSize(getActivity(), newSize)), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getActivity(), R.string.storage_size_error, Toast.LENGTH_SHORT).show();
}
preference.setSummary(Formatter.formatFileSize(getActivity(), newSize));
}
})
.setNegativeButton(R.string.cancel, null)
.create().show();
return true;
}
});
final String DATABASE_NAME = "com.microsoft.appcenter.persistence";
final File dbFile = getActivity().getDatabasePath(DATABASE_NAME);
initClickableSetting(R.string.storage_file_size_key, Formatter.formatFileSize(getActivity(), dbFile.length()), null);
mDatabaseFileObserver = new FileObserver(dbFile.getAbsolutePath(), FileObserver.MODIFY | FileObserver.CLOSE_WRITE) {
@Override
public void onEvent(int event, @Nullable String path) {
onDatabaseFileChanged(dbFile);
}
};
initCheckBoxSetting(R.string.appcenter_network_requests_allowed_key, R.string.appcenter_network_requests_allowed, R.string.appcenter_network_requests_disallowed, new HasEnabled() {
@Override
public void setEnabled(boolean enabled) {
AppCenter.setNetworkRequestsAllowed(enabled);
}
@Override
public boolean isEnabled() {
return AppCenter.isNetworkRequestsAllowed();
}
});
/* Analytics. */
initCheckBoxSetting(R.string.appcenter_analytics_state_key, R.string.appcenter_analytics_state_summary_enabled, R.string.appcenter_analytics_state_summary_disabled, new HasEnabled() {
@Override
public void setEnabled(boolean enabled) {
Analytics.setEnabled(enabled);
sAnalyticsPaused = false;
}
@Override
public boolean isEnabled() {
return Analytics.isEnabled().get();
}
});
initCheckBoxSetting(R.string.appcenter_analytics_pause_key, R.string.appcenter_analytics_pause_summary_paused, R.string.appcenter_analytics_pause_summary_resumed, new HasEnabled() {
@Override
public boolean isEnabled() {
return sAnalyticsPaused;
}
@Override
public void setEnabled(boolean enabled) {
if (enabled) {
Analytics.pause();
} else {
Analytics.resume();
}
sAnalyticsPaused = enabled;
}
});
int interval = MainActivity.sSharedPreferences.getInt(ANALYTICS_TRANSMISSION_INTERVAL_KEY, DEFAULT_TRANSMISSION_INTERVAL_IN_SECONDS);
initClickableSetting(R.string.appcenter_analytics_transmission_interval_key, getTransmissionInterval(interval), new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(final Preference preference) {
/* Initialize views for dialog. */
final EditText input = new EditText(getActivity());
input.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED);
input.setHint(R.string.time_interval_in_seconds);
input.setText(String.format(Locale.ENGLISH, "%d", MainActivity.sSharedPreferences.getInt(ANALYTICS_TRANSMISSION_INTERVAL_KEY, DEFAULT_TRANSMISSION_INTERVAL_IN_SECONDS)));
input.setSelection(input.getText().length());
/* Display dialog. */
new AlertDialog.Builder(getActivity()).setTitle(R.string.appcenter_analytics_transmission_interval_title).setView(input)
.setPositiveButton(R.string.save, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int newInterval;
try {
newInterval = Integer.parseInt(input.getText().toString());
} catch (NumberFormatException ignored) {
Toast.makeText(getActivity(), getActivity().getString(R.string.analytics_transmission_interval_invalid_value), Toast.LENGTH_SHORT).show();
return;
}
if (newInterval == ActivityConstants.DEFAULT_TRANSMISSION_INTERVAL_IN_SECONDS) {
MainActivity.sSharedPreferences.edit().remove(ANALYTICS_TRANSMISSION_INTERVAL_KEY).apply();
} else {
MainActivity.sSharedPreferences.edit().putInt(ANALYTICS_TRANSMISSION_INTERVAL_KEY, newInterval).apply();
}
String intervalString = getTransmissionInterval(newInterval);
preference.setSummary(intervalString);
Toast.makeText(getActivity(), intervalString, Toast.LENGTH_SHORT).show();
/* Setting interval without restarting works if we used SKIP_START and has not started yet by changing startType. */
Analytics.setTransmissionInterval(newInterval);
}
})
.setNegativeButton(R.string.cancel, null)
.create().show();
return true;
}
});
initCheckBoxSetting(R.string.appcenter_auto_page_tracking_key, R.string.appcenter_auto_page_tracking_enabled, R.string.appcenter_auto_page_tracking_disabled, new HasEnabled() {
@Override
public boolean isEnabled() {
return AnalyticsPrivateHelper.isAutoPageTrackingEnabled();
}
@Override
public void setEnabled(boolean enabled) {
AnalyticsPrivateHelper.setAutoPageTrackingEnabled(enabled);
}
});
initCheckBoxSetting(R.string.appcenter_analytics_session_tracker_state_key, R.string.appcenter_analytics_session_tracker_state_enable, R.string.appcenter_analytics_session_tracker_state_disable, new HasEnabled() {
@Override
public void setEnabled(boolean enabled) {
MainActivity.sSharedPreferences.edit().putBoolean(getString(R.string.appcenter_analytics_session_tracker_state_key), enabled).apply();
Toast.makeText(getActivity(), R.string.appcenter_analytics_start_session_toast, Toast.LENGTH_SHORT).show();
}
@Override
public boolean isEnabled() {
return MainActivity.sSharedPreferences.getBoolean(getString(R.string.appcenter_analytics_session_tracker_state_key), false);
}
});
initClickableSetting(R.string.appcenter_analytics_start_session_key, new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Analytics.startSession();
return true;
}
});
/* Crashes. */
initCheckBoxSetting(R.string.appcenter_crashes_state_key, R.string.appcenter_crashes_state_summary_enabled, R.string.appcenter_crashes_state_summary_disabled, new HasEnabled() {
@Override
public void setEnabled(boolean enabled) {
Crashes.setEnabled(enabled);
}
@Override
public boolean isEnabled() {
return Crashes.isEnabled().get();
}
});
initChangeableSetting(R.string.appcenter_crashes_text_attachment_key, getCrashesTextAttachmentSummary(), new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
MainActivity.setTextAttachment((String) newValue);
preference.setSummary(getCrashesTextAttachmentSummary());
return true;
}
});
initClickableSetting(R.string.appcenter_crashes_file_attachment_key, getCrashesFileAttachmentSummary(), new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(Intent.createChooser(intent, "Select attachment file"), FILE_ATTACHMENT_DIALOG_ID);
return true;
}
});
/* Distribute. */
initCheckBoxSetting(R.string.appcenter_distribute_state_key, R.string.appcenter_distribute_state_summary_enabled, R.string.appcenter_distribute_state_summary_disabled, new HasEnabled() {
@Override
public void setEnabled(boolean enabled) {
Distribute.setEnabled(enabled);
}
@Override
public boolean isEnabled() {
return Distribute.isEnabled().get();
}
});
initCheckBoxSetting(R.string.appcenter_distribute_disable_automatic_check_for_update_key, R.string.appcenter_distribute_summary_enabled_automatic_check_for_update, R.string.appcenter_distribute_summary_disabled_automatic_check_for_update, new HasEnabled() {
@Override
public boolean isEnabled() {
return MainActivity.sSharedPreferences.getBoolean(getString(R.string.appcenter_distribute_disable_automatic_check_for_update_key), true);
}
@Override
public void setEnabled(boolean enabled) {
MainActivity.sSharedPreferences.edit().putBoolean(getString(R.string.appcenter_distribute_disable_automatic_check_for_update_key), enabled).apply();
Toast.makeText(getActivity(), R.string.appcenter_distribute_automatic_check_updated, Toast.LENGTH_SHORT).show();
}
});
initCheckBoxSetting(R.string.appcenter_distribute_debug_state_key, R.string.appcenter_distribute_debug_summary_enabled, R.string.appcenter_distribute_debug_summary_disabled, new HasEnabled() {
@Override
public boolean isEnabled() {
return MainActivity.sSharedPreferences.getBoolean(getString(R.string.appcenter_distribute_debug_state_key), false);
}
@Override
public void setEnabled(boolean enabled) {
MainActivity.sSharedPreferences.edit().putBoolean(getString(R.string.appcenter_distribute_debug_state_key), enabled).apply();
Distribute.setEnabledForDebuggableBuild(enabled);
}
});
initClickableSetting(R.string.appcenter_distribute_check_for_update_key, new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Distribute.checkForUpdate();
return true;
}
});
final HasSummary updateTrackHasSummary = new HasSummary() {
@Override
public String getSummary() {
UpdateTrackEnum updateTrackEnum = UpdateTrackEnum.init(MainActivity.sSharedPreferences.getInt(getString(R.string.appcenter_distribute_track_state_key), UpdateTrack.PUBLIC));
return updateTrackEnum != null ? getString(updateTrackEnum.summaryRes) : "Couldn't parse update track";
}
};
initChangeableSetting(R.string.appcenter_distribute_track_state_key, updateTrackHasSummary.getSummary(), new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (newValue == null) {
return false;
}
String[] updateTrackEntries = getResources().getStringArray(R.array.appcenter_distribute_update_track_entries);
int updateTrackNewValue = newValue.toString().equals(updateTrackEntries[0]) ? UpdateTrack.PUBLIC : UpdateTrack.PRIVATE;
MainActivity.sSharedPreferences.edit().putInt(getString(R.string.appcenter_distribute_track_state_key), updateTrackNewValue).apply();
preference.setSummary(updateTrackHasSummary.getSummary());
Toast.makeText(getActivity(), R.string.appcenter_distribute_track_state_updated, Toast.LENGTH_SHORT).show();
return true;
}
});
/* EventFilter. */
initCheckBoxSetting(R.string.appcenter_event_filter_state_key, R.string.appcenter_event_filter_state_summary_enabled, R.string.appcenter_event_filter_state_summary_disabled, new HasEnabled() {
@Override
public void setEnabled(boolean enabled) {
if (!sEventFilterStarted) {
AppCenter.start(EventFilter.class);
sEventFilterStarted = true;
}
EventFilter.setEnabled(enabled);
}
@Override
public boolean isEnabled() {
return sEventFilterStarted && EventFilter.isEnabled().get();
}
});
/* Auto page tracking. */
initCheckBoxSetting(R.string.appcenter_auto_page_tracking_key, R.string.appcenter_auto_page_tracking_enabled, R.string.appcenter_auto_page_tracking_disabled, new HasEnabled() {
@Override
public boolean isEnabled() {
return AnalyticsPrivateHelper.isAutoPageTrackingEnabled();
}
@Override
public void setEnabled(boolean enabled) {
AnalyticsPrivateHelper.setAutoPageTrackingEnabled(enabled);
}
});
/* Application Information. */
initClickableSetting(R.string.install_id_key, String.valueOf(AppCenter.getInstallId().get()), new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(final Preference preference) {
final EditText input = new EditText(getActivity());
input.setInputType(InputType.TYPE_CLASS_TEXT);
input.setText(String.valueOf(AppCenter.getInstallId().get()));
new AlertDialog.Builder(getActivity()).setTitle(R.string.install_id_title).setView(input)
.setPositiveButton(R.string.save, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (input.getText().toString().matches(UUID_FORMAT_REGEX)) {
UUID uuid = UUID.fromString(input.getText().toString());
SharedPreferences appCenterPreferences = getActivity().getSharedPreferences("AppCenter", Context.MODE_PRIVATE);
appCenterPreferences.edit().putString(PrefStorageConstants.KEY_INSTALL_ID, uuid.toString()).apply();
Toast.makeText(getActivity(), String.format(getActivity().getString(R.string.install_id_changed_format), uuid.toString()), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getActivity(), R.string.install_id_invalid, Toast.LENGTH_SHORT).show();
}
preference.setSummary(String.valueOf(AppCenter.getInstallId().get()));
}
})
.setNegativeButton(R.string.cancel, null)
.create().show();
return true;
}
});
/* When changing start type from SKIP_START to other type, we need to trigger a preference change to update the display from null to actual value. */
initChangeableSetting(R.string.install_id_key, String.valueOf(AppCenter.getInstallId().get()), new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
preference.setSummary(String.valueOf(AppCenter.getInstallId().get()));
return true;
}
});
final String defaultAppSecret = MainActivity.getDefaultAppSecret(getActivity().getResources());
final String appSecret = MainActivity.sSharedPreferences.getString(APP_SECRET_KEY, defaultAppSecret);
initChangeableSetting(R.string.app_secret_key, appSecret, new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(final Preference preference, Object newValue) {
if (newValue == null) {
return true;
}
String value = newValue.toString();
if (!TextUtils.isEmpty(value)) {
if (value.equals(MainActivity.getCustomAppSecretString(getActivity().getResources()))) {
/* If user selected custom, popup a text editor so they can enter whatever they want. */
showPreferenceTextEditor(getPreferenceManager().findPreference(getString(R.string.app_secret_key)), R.string.app_secret_title, APP_SECRET_KEY, defaultAppSecret, new EditTextListener() {
@Override
public void onSave(String value) {
if (!TextUtils.isEmpty(value)) {
setKeyValue(APP_SECRET_KEY, value);
Toast.makeText(getActivity(), String.format(getActivity().getString(R.string.app_secret_changed_format), value), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getActivity(), R.string.app_secret_invalid, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onReset() {
setKeyValue(APP_SECRET_KEY, defaultAppSecret);
preference.setSummary(MainActivity.sSharedPreferences.getString(APP_SECRET_KEY, null));
Toast.makeText(getActivity(), String.format(getActivity().getString(R.string.app_secret_changed_format), defaultAppSecret), Toast.LENGTH_SHORT).show();
}
});
} else {
setKeyValue(APP_SECRET_KEY, value);
preference.setSummary(MainActivity.sSharedPreferences.getString(APP_SECRET_KEY, null));
Toast.makeText(getActivity(), String.format(getActivity().getString(R.string.app_secret_changed_format), value), Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getActivity(), R.string.app_secret_invalid, Toast.LENGTH_SHORT).show();
}
return true;
}
});
/* Miscellaneous. */
final String startType = MainActivity.sSharedPreferences.getString(APPCENTER_START_TYPE, StartType.APP_SECRET.toString());
if (sInitialStartType == null) {
sInitialStartType = startType;
}
initChangeableSetting(R.string.appcenter_start_type_key, startType, new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (newValue == null) {
return true;
}
String startValue = newValue.toString();
setKeyValue(APPCENTER_START_TYPE, startValue);
preference.setSummary(MainActivity.sSharedPreferences.getString(APPCENTER_START_TYPE, null));
/* Try to start now, this tests double calls log an error as well as valid call if previous type was none. */
String logUrl = MainActivity.sSharedPreferences.getString(LOG_URL_KEY, MainActivity.getLogUrl(getActivity(), startValue));
if (!TextUtils.isEmpty(logUrl)) {
AppCenter.setLogUrl(logUrl);
}
MainActivity.startAppCenter(getActivity().getApplication(), startValue);
/* Invite to restart app to take effect. */
if (sNeedRestartOnStartTypeUpdate) {
Toast.makeText(getActivity(), R.string.appcenter_start_type_changed, Toast.LENGTH_SHORT).show();
} else {
sInitialStartType = startValue;
sNeedRestartOnStartTypeUpdate = true;
}
return true;
}
});
initEditText(R.string.target_id_key, R.string.target_id_title, TARGET_KEY, getString(R.string.target_id), new EditTextListener() {
@Override
public void onSave(String value) {
if (!TextUtils.isEmpty(value)) {
setKeyValue(TARGET_KEY, value);
Toast.makeText(getActivity(), String.format(getActivity().getString(R.string.target_id_changed_format), value), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getActivity(), R.string.target_id_invalid, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onReset() {
String defaultTargetId = getString(R.string.target_id);
setKeyValue(TARGET_KEY, defaultTargetId);
Toast.makeText(getActivity(), String.format(getActivity().getString(R.string.target_id_changed_format), defaultTargetId), Toast.LENGTH_SHORT).show();
}
});
initEditText(R.string.user_id_key, R.string.user_id_title, USER_ID_KEY, null, new EditTextListener() {
@Override
public void onSave(String value) {
setKeyValue(USER_ID_KEY, value);
MainActivity.setUserId(value);
}
@Override
public void onReset() {
setKeyValue(USER_ID_KEY, null);
MainActivity.setUserId(null);
}
});
initClickableSetting(R.string.clear_crash_user_confirmation_key, new Preference.OnPreferenceClickListener() {
@SuppressLint("VisibleForTests")
@Override
public boolean onPreferenceClick(Preference preference) {
SharedPreferences appCenterPreferences = getActivity().getSharedPreferences("AppCenter", Context.MODE_PRIVATE);
appCenterPreferences.edit().remove(Crashes.PREF_KEY_ALWAYS_SEND).apply();
Toast.makeText(getActivity(), R.string.clear_crash_user_confirmation_toast, Toast.LENGTH_SHORT).show();
return true;
}
});
String defaultLogUrl = MainActivity.getLogUrl(getActivity(), sInitialStartType);
final String defaultLogUrlDisplay = TextUtils.isEmpty(defaultLogUrl) ? getString(R.string.log_url_set_to_production) : defaultLogUrl;
initClickableSetting(R.string.log_url_key, MainActivity.sSharedPreferences.getString(LOG_URL_KEY, defaultLogUrlDisplay), new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(final Preference preference) {
final EditText input = new EditText(getActivity());
input.setInputType(InputType.TYPE_CLASS_TEXT);
input.setText(MainActivity.sSharedPreferences.getString(LOG_URL_KEY, null));
input.setHint(R.string.log_url_set_to_production);
new AlertDialog.Builder(getActivity()).setTitle(R.string.log_url_title).setView(input)
.setPositiveButton(R.string.save, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (Patterns.WEB_URL.matcher(input.getText().toString()).matches()) {
String url = input.getText().toString();
setKeyValue(LOG_URL_KEY, url);
if (!TextUtils.isEmpty(url)) {
AppCenter.setLogUrl(url);
}
toastUrlChange(url);
} else if (input.getText().toString().isEmpty()) {
setDefaultUrl();
} else {
Toast.makeText(getActivity(), R.string.log_url_invalid, Toast.LENGTH_SHORT).show();
}
preference.setSummary(MainActivity.sSharedPreferences.getString(LOG_URL_KEY, defaultLogUrlDisplay));
}
})
.setNeutralButton(R.string.reset, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String defaultUrl = setDefaultUrl();
if (!TextUtils.isEmpty(defaultUrl)) {
AppCenter.setLogUrl(defaultUrl);
}
preference.setSummary(MainActivity.sSharedPreferences.getString(LOG_URL_KEY, defaultLogUrlDisplay));
}
})
.setNegativeButton(R.string.cancel, null)
.create().show();
return true;
}
private String setDefaultUrl() {
setKeyValue(LOG_URL_KEY, null);
String logUrl = MainActivity.getLogUrl(getActivity(), sInitialStartType);
toastUrlChange(logUrl);
return logUrl;
}
private void toastUrlChange(String url) {
if (TextUtils.isEmpty(url)) {
url = getString(R.string.log_url_production);
}
Toast.makeText(getActivity(), String.format(getActivity().getString(R.string.log_url_changed_format), url), Toast.LENGTH_SHORT).show();
}
});
/* Register preference change listener. */
getPreferenceManager().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
}