package com.nolanlawson.apptracker;
import java.util.Arrays;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceActivity;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.RemoteViews;
import com.nolanlawson.apptracker.db.AppHistoryDbHelper;
import com.nolanlawson.apptracker.helper.FreemiumHelper;
import com.nolanlawson.apptracker.helper.PreferenceHelper;
import com.nolanlawson.apptracker.util.ArrayUtil;
import com.nolanlawson.apptracker.util.UtilLogger;
public class AppTrackerWidgetConfiguration extends PreferenceActivity implements OnClickListener, OnPreferenceChangeListener {
private static UtilLogger log = new UtilLogger(AppTrackerWidgetConfiguration.class);
private int appWidgetId;
private AppHistoryDbHelper dbHelper;
private Button okButton;
private ProgressBar progressBar;
private CheckBoxPreference lockPagePreference, hideSubtextPreference, hideAppTitlePreference,
stretchToFillPreference;
private ListPreference sortTypePreference, pageNumberPreference;
private View freeVersionTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.preference_list_content_with_button);
addPreferencesFromResource(R.xml.tracker_widget_config);
dbHelper = new AppHistoryDbHelper(getApplicationContext());
Bundle extras = getIntent().getExtras();
appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
okButton = (Button) findViewById(R.id.config_ok_button);
progressBar = (ProgressBar) findViewById(R.id.config_progress_bar);
okButton.setOnClickListener(this);
initializePreferences();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
dbHelper.close();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
completeConfig();
return true;
}
return (super.onKeyDown(keyCode, event));
}
private void completeConfig() {
// do in background to avoid jankiness
AsyncTask<Void,Void,Void> task = new AsyncTask<Void, Void, Void>(){
@Override
protected void onPreExecute() {
super.onPreExecute();
okButton.setVisibility(View.GONE);
progressBar.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(Void... params) {
saveConfigurations();
sendOutBroadcast();
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
setResult();
finish();
okButton.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
}
};
task.execute((Void)null);
}
private void initializePreferences() {
sortTypePreference = (ListPreference) findPreference(R.string.sort_type_preference);
sortTypePreference.setSummary(String.format(getText(R.string.sort_type_summary).toString(),sortTypePreference.getEntry()));
sortTypePreference.setOnPreferenceChangeListener(this);
// TODO: should we enable alphabetic sortings, even if it doesn't list every installed app??
sortTypePreference.setEntries(ArrayUtil.copyOf(
sortTypePreference.getEntries(), sortTypePreference.getEntries().length - 1));
sortTypePreference.setEntryValues(ArrayUtil.copyOf(
sortTypePreference.getEntryValues(), sortTypePreference.getEntryValues().length - 1));
int numAppHistories;
synchronized (AppHistoryDbHelper.class) {
numAppHistories = dbHelper.findCountOfInstalledAppHistoryEntries();
}
log.d("num app histories: %d", numAppHistories);
// possible pages of results to show
int numPages = (numAppHistories / WidgetUpdater.APPS_PER_PAGE)
+ (numAppHistories % WidgetUpdater.APPS_PER_PAGE == 0 ? 0 : 1);
CharSequence[] pageNumbers = new CharSequence[numPages];
for (int i = 0; i < numPages; i++) {
pageNumbers[i] = Integer.toString(i + 1);
}
pageNumberPreference = (ListPreference) findPreference(R.string.page_number_preference);
pageNumberPreference.setEntries(pageNumbers);
pageNumberPreference.setEntryValues(pageNumbers);
lockPagePreference = (CheckBoxPreference) findPreference(R.string.lock_page_preference);
lockPagePreference.setOnPreferenceChangeListener(this);
hideSubtextPreference = (CheckBoxPreference) findPreference(R.string.hide_subtext_preference);
hideSubtextPreference.setOnPreferenceChangeListener(this);
hideAppTitlePreference = (CheckBoxPreference) findPreference(R.string.hide_app_title_preference);
hideAppTitlePreference.setOnPreferenceChangeListener(this);
//showBackgroundPreference = (CheckBoxPreference) findPreference(R.string.show_background_preference);
stretchToFillPreference = (CheckBoxPreference) findPreference(R.string.stretch_to_fill_preference);
freeVersionTextView = findViewById(R.id.free_version_notification_view);
// most options are disabled in the free version
if (FreemiumHelper.isAppTrackerPremiumInstalled(getApplicationContext())) {
freeVersionTextView.setVisibility(View.GONE);
} else {
freeVersionTextView.setVisibility(View.VISIBLE);
stretchToFillPreference.setChecked(true);
stretchToFillPreference.setEnabled(false);
hideAppTitlePreference.setEnabled(false);
hideSubtextPreference.setEnabled(false);
lockPagePreference.setChecked(true);
lockPagePreference.setEnabled(false);
}
}
private void setResult() {
Intent result = new Intent();
result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
setResult(RESULT_OK, result);
}
private void sendOutBroadcast() {
AppWidgetManager mgr = AppWidgetManager.getInstance(this);
RemoteViews views = new RemoteViews(getPackageName(), R.layout.tracker_widget);
mgr.updateAppWidget(appWidgetId, views);
Intent widgetUpdate = new Intent();
widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
widgetUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { appWidgetId });
// have to make this unique for God knows what reason, otherwise you get a really
// funny and strange bug where the PowerControl layout gets grafted onto the wdiget
// for a split second before it loads
widgetUpdate.setData(Uri.withAppendedPath(Uri.parse(AppTrackerWidgetProvider.URI_SCHEME + "://widget/id/"), String.valueOf(appWidgetId)));
sendBroadcast(widgetUpdate);
}
private void saveConfigurations() {
log.d("Saving configurations...");
CharSequence sortType = sortTypePreference.getValue();
PreferenceHelper.setSortTypePreference(getApplicationContext(), sortType.toString(), appWidgetId);
log.d("pageNumberpref: " + pageNumberPreference);
log.d("pagenumberprefentry: " + pageNumberPreference.getEntry());
CharSequence pageNumberEntry = pageNumberPreference.getEntry();
int pageNumber = pageNumberEntry != null ? (Integer.parseInt(pageNumberEntry.toString()) - 1) : 0;
PreferenceHelper.setCurrentPageNumber(getApplicationContext(), pageNumber, appWidgetId);
boolean lockPage = lockPagePreference.isChecked();
PreferenceHelper.setLockPagePreference(getApplicationContext(), lockPage, appWidgetId);
boolean hideSubtext = hideSubtextPreference.isChecked();
PreferenceHelper.setHideSubtextPreference(getApplicationContext(), hideSubtext, appWidgetId);
boolean hideAppTitle = hideAppTitlePreference.isChecked();
PreferenceHelper.setHideAppTitlePreference(getApplicationContext(), hideAppTitle, appWidgetId);
//boolean showBackground = showBackgroundPreference.isChecked();
//PreferenceHelper.setShowBackgroundPreference(getApplicationContext(), showBackground, appWidgetId);
boolean stretchToFill = stretchToFillPreference.isChecked();
PreferenceHelper.setStretchToFillPreference(getApplicationContext(), stretchToFill, appWidgetId);
}
private Preference findPreference(int stringResId) {
return findPreference(getResources().getString(stringResId));
}
@Override
public void onClick(View v) {
// ok button clicked
completeConfig();
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (preference.getKey().equals(getText(R.string.sort_type_preference))) {
updateSortTypePreference(preference, newValue);
} else {
updateNonSortTypePreference(preference, newValue);
}
return true;
}
private void updateSortTypePreference(Preference preference, Object newValue) {
// if the sorting is alphabetic, then the subtext has to be disabled no matter what, because
// there is no subtext
if (newValue.equals(getText(R.string.sort_type_alphabetic))) {
hideSubtextPreference.setChecked(true);
hideSubtextPreference.setSummary(R.string.hide_subtext_disabled_for_alphabetic);
if (FreemiumHelper.isAppTrackerPremiumInstalled(getApplicationContext())) {
hideSubtextPreference.setEnabled(false);
}
} else {
if (sortTypePreference.getValue().equals(getText(R.string.sort_type_alphabetic))) {
// reset if we're switching back from sort type alphabetic
hideSubtextPreference.setChecked(false);
hideSubtextPreference.setSummary(R.string.hide_subtext_summary);
}
if (FreemiumHelper.isAppTrackerPremiumInstalled(getApplicationContext())) {
hideSubtextPreference.setEnabled(true);
}
}
stretchToFillPreference.setEnabled(
FreemiumHelper.isAppTrackerPremiumInstalled(getApplicationContext())
&& (hideAppTitlePreference.isChecked()
|| lockPagePreference.isChecked()
|| hideSubtextPreference.isChecked()));
// show the printable sort type rather than the internal one
CharSequence[] entries = sortTypePreference.getEntries();
CharSequence[] entryValues = sortTypePreference.getEntryValues();
CharSequence newValueAsEntry = entries[Arrays.asList(entryValues).indexOf(newValue)];
sortTypePreference.setSummary(String.format(getText(R.string.sort_type_summary).toString(),newValueAsEntry));
}
private void updateNonSortTypePreference(Preference preference,
Object newValue) {
String lockPagePreferenceKey = getResources().getString(R.string.lock_page_preference);
String hideAppTitlePreferenceKey = getResources().getString(R.string.hide_app_title_preference);
String hideSubtextPreferenceKey = getResources().getString(R.string.hide_subtext_preference);
if (preference.getKey().equals(lockPagePreferenceKey)) {
// enable or disable the page number preference depending on whether it's locked
pageNumberPreference.setEnabled((Boolean)newValue);
}
boolean enableStretchToFill = (Boolean)newValue;
// if it's being set to true, then we know we want to enable stretch to fill
// otherwise, we have to check each one individually,
// because we want to enable or disable the stretch to fill depending on whether or not ANY element
// is "hidden"
if (!(Boolean)newValue) {
if (preference.getKey().equals(lockPagePreferenceKey)) {
enableStretchToFill = hideAppTitlePreference.isChecked() || hideSubtextPreference.isChecked();
} else if (preference.getKey().equals(hideAppTitlePreferenceKey)) {
enableStretchToFill = lockPagePreference.isChecked() || hideSubtextPreference.isChecked();
} else if (preference.getKey().equals(hideSubtextPreferenceKey)) {
enableStretchToFill = hideAppTitlePreference.isChecked() || lockPagePreference.isChecked();
}
}
stretchToFillPreference.setEnabled(enableStretchToFill);
}
}