/* * Copyright (c) 2015, Nils Braden * * This file is part of ttrss-reader-fork. This program is free software; you * can redistribute it and/or modify it under the terms of the GNU * General Public License as published by the Free Software Foundation; * either version 3 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. You should have received a * copy of the GNU General Public License along with this program; If * not, see http://www.gnu.org/licenses/. */ package org.ttrssreader.gui; import org.ttrssreader.R; import org.ttrssreader.controllers.Controller; import org.ttrssreader.controllers.DBHelper; import org.ttrssreader.controllers.Data; import org.ttrssreader.gui.fragments.PreferencesFragment; import org.ttrssreader.model.HeaderAdapter; import org.ttrssreader.preferences.Constants; import org.ttrssreader.utils.AsyncTask; import org.ttrssreader.utils.PostMortemReportExceptionHandler; import org.ttrssreader.utils.Utils; import android.app.backup.BackupManager; import android.content.Context; import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceActivity; import android.preference.PreferenceManager; import android.support.v7.widget.AppCompatCheckBox; import android.support.v7.widget.AppCompatCheckedTextView; import android.support.v7.widget.AppCompatEditText; import android.support.v7.widget.AppCompatRadioButton; import android.support.v7.widget.AppCompatSpinner; import android.support.v7.widget.Toolbar; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.Toast; import java.util.List; public class PreferencesActivity extends PreferenceActivity implements Toolbar.OnMenuItemClickListener { @SuppressWarnings("unused") private static final String TAG = PreferencesActivity.class.getSimpleName(); public static final int ACTIVITY_RELOAD = 45; private PostMortemReportExceptionHandler mDamageReport = new PostMortemReportExceptionHandler(this); private static AsyncTask<Void, Void, Void> init; private static List<Header> _headers; private boolean needResource = false; @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); LinearLayout root = (LinearLayout) findViewById(android.R.id.list).getParent().getParent().getParent(); Toolbar bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.toolbar_preferences, root, false); bar.inflateMenu(R.menu.preferences); bar.setOnMenuItemClickListener(this); // bar.setMenu(); root.addView(bar, 0); // insert at top bar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); } @SuppressWarnings("deprecation") @Override protected void onCreate(Bundle savedInstanceState) { setTheme(Controller.getInstance().getTheme()); super.onCreate(savedInstanceState); // IMPORTANT! mDamageReport.initialize(); setResult(Constants.ACTIVITY_SHOW_PREFERENCES); if (needResource) { addPreferencesFromResource(R.xml.prefs_main_top); addPreferencesFromResource(R.xml.prefs_http); addPreferencesFromResource(R.xml.prefs_ssl); addPreferencesFromResource(R.xml.prefs_wifi); addPreferencesFromResource(R.xml.prefs_usage); addPreferencesFromResource(R.xml.prefs_display); addPreferencesFromResource(R.xml.prefs_system); addPreferencesFromResource(R.xml.prefs_main_bottom); } } @Override public void onBuildHeaders(List<Header> headers) { _headers = headers; if (onIsHidingHeaders()) { needResource = true; } else { loadHeadersFromResource(R.xml.prefs_headers, headers); } } @Override public void setListAdapter(ListAdapter adapter) { if (adapter != null && _headers != null) { super.setListAdapter(new HeaderAdapter(this, _headers)); } else { super.setListAdapter(null); } } @Override protected void onPause() { super.onPause(); PreferenceManager.getDefaultSharedPreferences(this) .unregisterOnSharedPreferenceChangeListener(Controller.getInstance()); } @Override protected void onResume() { super.onResume(); PreferenceManager.getDefaultSharedPreferences(this) .registerOnSharedPreferenceChangeListener(Controller.getInstance()); } @Override protected void onStop() { super.onStop(); if (init != null) { init.cancel(true); init = null; } if (!Utils.checkIsConfigInvalid()) { init = new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { Controller.getInstance().initialize(getApplicationContext()); return null; } }; init.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } if (Controller.getInstance().isPreferencesChanged()) { new BackupManager(this).dataChanged(); Controller.getInstance().setPreferencesChanged(false); } } @Override protected void onDestroy() { mDamageReport.restoreOriginalHandler(); mDamageReport = null; super.onDestroy(); } @Override protected boolean isValidFragment(String fragmentName) { return PreferencesFragment.class.getName().equals(fragmentName); } @Override public void switchToHeader(Header header) { if (header.fragment != null) { super.switchToHeader(header); } } @Override public View onCreateView(String name, Context context, AttributeSet attrs) { // Allow super to try and create a view first final View result = super.onCreateView(name, context, attrs); if (result != null) { return result; } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { // If we're running pre-L, we need to 'inject' our tint aware Views in place of the // standard framework versions switch (name) { case "EditText": return new AppCompatEditText(this, attrs); case "Spinner": return new AppCompatSpinner(this, attrs); case "CheckBox": return new AppCompatCheckBox(this, attrs); case "RadioButton": return new AppCompatRadioButton(this, attrs); case "CheckedTextView": return new AppCompatCheckedTextView(this, attrs); } } return null; } @Override public boolean onMenuItemClick(MenuItem menuItem) { int id = menuItem.getItemId(); boolean doReset; doReset = (id == R.id.Preferences_Menu_Reset); doReset |= (id == R.id.Preferences_Menu_ResetCache); doReset |= (id == R.id.Preferences_Menu_ResetDatabase); if (doReset) new ResetTask(this).execute(menuItem.getItemId()); return doReset; } /** * All Reset-Operations should be done from Background. */ private class ResetTask extends AsyncTask<Integer, Void, Void> { private final Context context; private int textResource; public ResetTask(Context context) { this.context = context; } @Override protected Void doInBackground(Integer... params) { switch (params[0]) { case R.id.Preferences_Menu_Reset: SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); Constants.resetPreferences(prefs); textResource = R.string.Preferences_Reset_Done; break; case R.id.Preferences_Menu_ResetDatabase: Controller.getInstance().setDeleteDBScheduled(true); Controller.getInstance().setSinceId(0); DBHelper.getInstance().initialize(context); Data.getInstance().initTimers(); textResource = R.string.Preferences_ResetDatabase_Done; break; case R.id.Preferences_Menu_ResetCache: Data.getInstance().deleteAllRemoteFiles(); DBHelper.getInstance().initialize(context); textResource = R.string.Preferences_ResetCache_Done; break; } return null; } @Override protected void onPostExecute(Void aVoid) { Toast.makeText(context, textResource, Toast.LENGTH_SHORT).show(); setResult(ACTIVITY_RELOAD); finish(); super.onPostExecute(aVoid); } } }