/** * ******************************************************************************* * Copyright 2016 Tom Praschan * <p/> * 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 * <p/> * http://www.apache.org/licenses/LICENSE-2.0 * <p/> * 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 de.tap.easy_xkcd.fragments; import android.Manifest; import android.app.Activity; import android.app.ProgressDialog; import android.app.TimePickerDialog; import android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.preference.Preference; import android.preference.PreferenceFragment; import android.support.v4.app.ActivityCompat; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.support.v7.widget.CardView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; import android.widget.TimePicker; import android.widget.Toast; import com.tap.xkcd_reader.BuildConfig; import com.tap.xkcd_reader.R; import com.turhanoz.android.reactivedirectorychooser.ui.DirectoryChooserFragment; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import de.tap.easy_xkcd.Activities.MainActivity; import de.tap.easy_xkcd.Activities.NestedSettingsActivity; import de.tap.easy_xkcd.database.DatabaseManager; import de.tap.easy_xkcd.services.ArticleDownloadService; import de.tap.easy_xkcd.services.ComicDownloadService; import de.tap.easy_xkcd.utils.Comic; import de.tap.easy_xkcd.utils.PrefHelper; import de.tap.easy_xkcd.utils.ThemePrefs; import de.tap.easy_xkcd.widget.WidgetLatestProvider; import de.tap.easy_xkcd.widget.WidgetRandomProvider; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import okio.BufferedSink; import okio.Okio; import uz.shift.colorpicker.LineColorPicker; public class NestedPreferenceFragment extends PreferenceFragment { private static final String APPEARANCE = "appearance"; private static final String BEHAVIOR = "behavior"; private static final String ALT_SHARING = "altSharing"; private static final String ADVANCED = "advanced"; private static final String NIGHT = "night"; private static final String WIDGET = "widget"; private static final String TAG_KEY = "NESTED_KEY"; private static final String COLORED_NAVBAR = "pref_navbar"; private static final String COLOR_PRIMARY = "pref_color_primary"; private static final String COLOR_ACCENT = "pref_color_accent"; private static final String NOTIFICATIONS_INTERVAL = "pref_notifications"; private static final String FULL_OFFLINE = "pref_offline"; private static final String WHATIF_OFFLINE = "pref_offline_whatif"; private static final String NIGHT_THEME = "pref_night"; private static final String AUTO_NIGHT = "pref_auto_night"; private static final String AUTO_NIGHT_START = "pref_auto_night_start"; private static final String AUTO_NIGHT_END = "pref_auto_night_end"; private static final String INVERT_COLORS = "pref_invert"; private static final String REPAIR = "pref_repair"; private static final String MOBILE_ENABLED = "pref_update_mobile"; private static final String FAB_OPTIONS = "pref_random"; private static final String OFFLINE_PATH_PREF = "pref_offline_path"; private static final String DONATE = "pref_hide_donate"; private static final String WIDGET_ALT = "widget_alt"; private static final String WIDGET_COMIC_NUMBER = "widget_comicNumber"; private static final String NAV_DRAWER_SWIPE = "pref_nav_swipe"; private static final String OFFLINE_PATH = "/easy xkcd"; private static final String OFFLINE_WHATIF_PATH = "/easy xkcd/what if/"; private PrefHelper prefHelper; private ThemePrefs themePrefs; public static NestedPreferenceFragment newInstance(String key) { NestedPreferenceFragment fragment = new NestedPreferenceFragment(); // supply arguments to bundle. Bundle args = new Bundle(); args.putString(TAG_KEY, key); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); prefHelper = new PrefHelper(getActivity()); themePrefs = new ThemePrefs(getActivity()); checkPreferenceResource(); } private void checkPreferenceResource() { String key = getArguments().getString(TAG_KEY); assert key != null; // Load the preferences from an XML resource switch (key) { case APPEARANCE: addPreferencesFromResource(R.xml.pref_appearance); findPreference(COLORED_NAVBAR).setEnabled(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP); findPreference(COLORED_NAVBAR).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { getActivity().setResult(Activity.RESULT_OK); Intent intent = getActivity().getIntent(); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION); getActivity().overridePendingTransition(0, 0); getActivity().finish(); getActivity().overridePendingTransition(0, 0); startActivity(intent); return true; } }); findPreference(COLOR_ACCENT).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { final View dialog = getActivity().getLayoutInflater().inflate(R.layout.color_chooser, null); final TextView title = (TextView) dialog.findViewById(R.id.title); title.setText(getResources().getString(R.string.theme_accent_color_dialog)); title.setBackgroundColor(themePrefs.getPrimaryColor(false)); final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); final LineColorPicker lineColorPicker = (LineColorPicker) dialog.findViewById(R.id.picker3); lineColorPicker.setColors(themePrefs.getAccentColors()); lineColorPicker.setSelectedColor(themePrefs.getAccentColor()); if (themePrefs.nightThemeEnabled()) ((CardView) dialog.findViewById(R.id.dialog_card_view)).setCardBackgroundColor(ContextCompat.getColor(getActivity(), R.color.background_material_dark)); builder.setView(dialog); final AlertDialog alertDialog = builder.show(); dialog.findViewById(R.id.ok).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { themePrefs.setNewTheme(lineColorPicker.getColor()); getActivity().setResult(Activity.RESULT_OK); new Handler().post(new Runnable() { @Override public void run() { alertDialog.dismiss(); Intent intent = getActivity().getIntent(); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION); getActivity().overridePendingTransition(0, 0); getActivity().finish(); getActivity().overridePendingTransition(0, 0); startActivity(intent); } }); } }); return true; } }); findPreference(COLOR_PRIMARY).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { final LayoutInflater inflater = getActivity().getLayoutInflater(); final View dialog = inflater.inflate(R.layout.color_chooser, null); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); final TextView title = (TextView) dialog.findViewById(R.id.title); title.setText(getResources().getString(R.string.theme_primary_color_dialog)); title.setBackgroundColor(themePrefs.getPrimaryColor(false)); final LineColorPicker lineColorPicker = (LineColorPicker) dialog.findViewById(R.id.picker3); lineColorPicker.setColors(themePrefs.getPrimaryColors()); lineColorPicker.setSelectedColor(themePrefs.getPrimaryColor(true)); if (themePrefs.nightThemeEnabled()) ((CardView) dialog.findViewById(R.id.dialog_card_view)).setCardBackgroundColor(ContextCompat.getColor(getActivity(), R.color.background_material_dark)); builder.setView(dialog); final AlertDialog alertDialog = builder.show(); dialog.findViewById(R.id.ok).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { themePrefs.setPrimaryColor(lineColorPicker.getColor()); getActivity().setResult(Activity.RESULT_OK); new Handler().post(new Runnable() { @Override public void run() { alertDialog.dismiss(); Intent intent = getActivity().getIntent(); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION); getActivity().overridePendingTransition(0, 0); getActivity().finish(); getActivity().overridePendingTransition(0, 0); startActivity(intent); } }); } }); return true; } }); findPreference(DONATE).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { getActivity().setResult(Activity.RESULT_OK); return true; } }); findPreference(FAB_OPTIONS).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object o) { getActivity().setResult(Activity.RESULT_OK); return true; } }); break; case BEHAVIOR: addPreferencesFromResource(R.xml.pref_behavior); findPreference(NOTIFICATIONS_INTERVAL).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(final Preference preference, Object o) { getActivity().setResult(MainActivity.UPDATE_ALARM); return true; } }); findPreference(FULL_OFFLINE).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { boolean checked = Boolean.valueOf(newValue.toString()); if (checked) { if (prefHelper.isOnline(getActivity())) { if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { Toast.makeText(getActivity(), getResources().getString(R.string.loading_comics), Toast.LENGTH_SHORT).show(); getActivity().startService(new Intent(getActivity(), ComicDownloadService.class)); } else { ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); } } else { Toast.makeText(getActivity(), R.string.no_connection, Toast.LENGTH_SHORT).show(); } return false; } else { android.support.v7.app.AlertDialog.Builder mDialog = new android.support.v7.app.AlertDialog.Builder(getActivity()); mDialog.setMessage(R.string.delete_offline_dialog) .setNegativeButton(R.string.dialog_cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { getActivity().finish(); prefHelper.setFullOffline(true); } }) .setPositiveButton(R.string.dialog_yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { new deleteComicsTask().execute(); } else { ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 2); } } }) .setCancelable(false); mDialog.show(); return true; } } }); findPreference(WHATIF_OFFLINE).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { boolean checked = Boolean.valueOf(newValue.toString()); if (checked) { if (prefHelper.isOnline(getActivity())) { if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { //new downloadArticlesTask().execute(); Toast.makeText(getActivity(), getResources().getString(R.string.loading_articles), Toast.LENGTH_SHORT).show(); getActivity().startService(new Intent(getActivity(), ArticleDownloadService.class)); return true; } else { ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 3); return false; } } else { Toast.makeText(getActivity(), R.string.no_connection, Toast.LENGTH_SHORT).show(); return false; } } else { android.support.v7.app.AlertDialog.Builder mDialog = new android.support.v7.app.AlertDialog.Builder(getActivity()); mDialog.setMessage(R.string.delete_offline_whatif_dialog) .setNegativeButton(R.string.dialog_cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { getActivity().finish(); prefHelper.setFullOfflineWhatIf(true); } }) .setPositiveButton(R.string.dialog_yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { new deleteArticlesTask().execute(); } else { ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 4); } } }) .setCancelable(false); mDialog.show(); return true; } } }); findPreference(NAV_DRAWER_SWIPE).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { prefHelper.setNavDrawerSwipe(Boolean.parseBoolean(newValue.toString())); getActivity().setResult(Activity.RESULT_OK); return true; } }); break; case NIGHT: addPreferencesFromResource(R.xml.pref_night); final Preference start = findPreference(AUTO_NIGHT_START); final Preference end = findPreference(AUTO_NIGHT_END); final int[] startTime = themePrefs.getAutoNightStart(); final int[] endTime = themePrefs.getAutoNightEnd(); start.setSummary(themePrefs.getStartSummary()); end.setSummary(themePrefs.getEndSummary()); findPreference(NIGHT_THEME).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { themePrefs.setWhatIfNightMode(Boolean.valueOf(newValue.toString())); getActivity().setResult(Activity.RESULT_OK); Intent intent = getActivity().getIntent(); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION); getActivity().overridePendingTransition(0, 0); getActivity().finish(); getActivity().overridePendingTransition(0, 0); startActivity(intent); return true; } }); findPreference(AUTO_NIGHT).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { getActivity().setResult(Activity.RESULT_OK); return true; } }); findPreference(INVERT_COLORS).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { getActivity().setResult(Activity.RESULT_OK); return true; } }); start.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { TimePickerDialog tpd = new TimePickerDialog(getActivity(), new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker timePicker, int hourOfDay, int minute) { themePrefs.setAutoNightStart(new int[]{hourOfDay, minute}); getActivity().setResult(Activity.RESULT_OK); start.setSummary(themePrefs.getStartSummary()); } }, startTime[0], startTime[1], android.text.format.DateFormat.is24HourFormat(getActivity())); tpd.show(); return true; } }); end.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { TimePickerDialog tpd = new TimePickerDialog(getActivity(), new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker timePicker, int hourOfDay, int minute) { themePrefs.setAutoNightEnd(new int[]{hourOfDay, minute}); getActivity().setResult(Activity.RESULT_OK); end.setSummary(themePrefs.getEndSummary()); } }, endTime[0], endTime[1], android.text.format.DateFormat.is24HourFormat(getActivity())); tpd.show(); return true; } }); findPreference(COLOR_ACCENT).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { final View dialog = getActivity().getLayoutInflater().inflate(R.layout.color_chooser, null); final TextView title = (TextView) dialog.findViewById(R.id.title); title.setText(getResources().getString(R.string.theme_accent_color_dialog)); title.setBackgroundColor(themePrefs.getPrimaryColor(false)); final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); final LineColorPicker lineColorPicker = (LineColorPicker) dialog.findViewById(R.id.picker3); lineColorPicker.setColors(themePrefs.getAccentColors()); lineColorPicker.setSelectedColor(themePrefs.getAccentColor()); if (themePrefs.nightThemeEnabled()) ((CardView) dialog.findViewById(R.id.dialog_card_view)).setCardBackgroundColor(ContextCompat.getColor(getActivity(), R.color.background_material_dark)); builder.setView(dialog); final AlertDialog alertDialog = builder.show(); dialog.findViewById(R.id.ok).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { themePrefs.setAccentColorNight(lineColorPicker.getColor()); getActivity().setResult(Activity.RESULT_OK); new Handler().post(new Runnable() { @Override public void run() { alertDialog.dismiss(); Intent intent = getActivity().getIntent(); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION); getActivity().overridePendingTransition(0, 0); getActivity().finish(); getActivity().overridePendingTransition(0, 0); startActivity(intent); } }); } }); return true; } }); break; case ALT_SHARING: addPreferencesFromResource(R.xml.pref_alt_sharing); break; case WIDGET: addPreferencesFromResource(R.xml.pref_widgets); break; case ADVANCED: addPreferencesFromResource(R.xml.pref_advanced); findPreference(REPAIR).setEnabled(MainActivity.fullOffline); findPreference(MOBILE_ENABLED).setEnabled(MainActivity.fullOffline | MainActivity.fullOfflineWhatIf); findPreference(REPAIR).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { if (prefHelper.isOnline(getActivity())) { if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { new repairComicsTask().execute(); } else { ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 5); } } else { Toast.makeText(getActivity(), R.string.no_connection, Toast.LENGTH_SHORT).show(); } return true; } }); findPreference(OFFLINE_PATH_PREF).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { //DialogFragment directoryChooserFragment = DirectoryChooserFragment.newInstance(Environment.getExternalStorageDirectory()); DialogFragment directoryChooserFragment = DirectoryChooserFragment.newInstance(new File("/")); FragmentTransaction transaction = ((NestedSettingsActivity) getActivity()).getManger().beginTransaction(); directoryChooserFragment.show(transaction, "RDC"); } else { ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 12); } return true; } }); break; } } public class repairComicsTask extends AsyncTask<Void, Integer, Void> { private ProgressDialog progress; @Override protected void onPreExecute() { progress = new ProgressDialog(getActivity()); progress.setTitle(getResources().getString(R.string.loading_offline)); progress.setMessage(getResources().getString(R.string.loading_offline_message)); progress.setIndeterminate(false); progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progress.setCancelable(false); progress.show(); } @Override protected Void doInBackground(Void... params) { int newest; try { newest = new Comic(0).getComicNumber(); prefHelper.setNewestComic(newest); prefHelper.setHighestOffline(newest); } catch (Exception e) { newest = prefHelper.getNewest(); } for (int i = 1; i <= newest; i++) { Log.d("i", String.valueOf(i)); try { File sdCard = prefHelper.getOfflinePath(); File dir = new File(sdCard.getAbsolutePath() + OFFLINE_PATH); File file = new File(dir, String.valueOf(i) + ".png"); FileInputStream fis = new FileInputStream(file); BitmapFactory.decodeStream(fis); fis.close(); } catch (Exception e) { Log.e("error", i + " not found in external"); try { FileInputStream fis = getActivity().openFileInput(String.valueOf(i)); fis.close(); } catch (Exception e2) { Log.e("error", i + " not found in internal"); redownloadComic(i); } } int p = (int) (i / ((float) newest) * 100); publishProgress(p); } return null; } private void redownloadComic(int i) { OkHttpClient client = new OkHttpClient(); File sdCard = prefHelper.getOfflinePath(); File dir = new File(sdCard.getAbsolutePath() + OFFLINE_PATH); try { Comic comic = new Comic(i, getActivity()); Request request = new Request.Builder() .url(comic.getComicData()[2]) .build(); Response response = client.newCall(request).execute(); try { File file = new File(dir, String.valueOf(i) + ".png"); BufferedSink sink = Okio.buffer(Okio.sink(file)); sink.writeAll(response.body().source()); sink.close(); } catch (Exception e) { Log.e("Error at comic" + i, "Saving to external storage failed"); try { FileOutputStream fos = getActivity().openFileOutput(String.valueOf(i), Context.MODE_PRIVATE); BufferedSink sink = Okio.buffer(Okio.sink(fos)); sink.writeAll(response.body().source()); fos.close(); sink.close(); } catch (Exception e2) { Log.e("Error at comic" + i, "Saving to internal storage failed"); } } response.body().close(); prefHelper.addTitle(comic.getComicData()[0], i); prefHelper.addAlt(comic.getComicData()[1], i); } catch (Exception e) { e.printStackTrace(); } } protected void onProgressUpdate(Integer... pro) { progress.setProgress(pro[0]); } @Override protected void onPostExecute(Void dummy) { progress.dismiss(); getActivity().setResult(Activity.RESULT_OK); getActivity().finish(); } } public class deleteComicsTask extends AsyncTask<Void, Integer, Void> { private ProgressDialog progress; @Override protected void onPreExecute() { progress = new ProgressDialog(getActivity()); progress.setTitle(getResources().getString(R.string.delete_offline)); progress.setMessage(getResources().getString(R.string.loading_offline_message)); progress.setIndeterminate(false); progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progress.setCancelable(false); progress.show(); } @Override protected Void doInBackground(Void... params) { int newest = prefHelper.getNewest(); if (!BuildConfig.DEBUG) { DatabaseManager databaseManager = new DatabaseManager(getActivity()); for (int i = 1; i <= newest; i++) { if (databaseManager.checkFavorite(i)) { //delete from internal storage getActivity().deleteFile(String.valueOf(i)); //delete from external storage File sdCard = prefHelper.getOfflinePath(); File dir = new File(sdCard.getAbsolutePath() + OFFLINE_PATH); File file = new File(dir, String.valueOf(i) + ".png"); file.delete(); int p = (int) (i / ((float) newest) * 100); publishProgress(p); } } prefHelper.deleteTitleAndAlt(newest, databaseManager); } prefHelper.setHighestOffline(0); prefHelper.setFullOffline(false); return null; } protected void onProgressUpdate(Integer... pro) { progress.setProgress(pro[0]); } @Override protected void onPostExecute(Void dummy) { progress.dismiss(); getActivity().setResult(Activity.RESULT_OK); getActivity().finish(); } } public class deleteArticlesTask extends AsyncTask<Void, Void, Void> { private ProgressDialog progress; @Override protected void onPreExecute() { progress = new ProgressDialog(getActivity()); progress.setTitle(getResources().getString(R.string.delete_offline_articles)); progress.setMessage(getResources().getString(R.string.loading_offline_message)); progress.setIndeterminate(true); progress.setCancelable(false); progress.show(); } @Override protected Void doInBackground(Void... params) { if (!BuildConfig.DEBUG) { File sdCard = prefHelper.getOfflinePath(); File dir = new File(sdCard.getAbsolutePath() + OFFLINE_WHATIF_PATH); deleteFolder(dir); } return null; } @Override protected void onPostExecute(Void dummy) { progress.dismiss(); prefHelper.setFullOfflineWhatIf(false); getActivity().setResult(Activity.RESULT_OK); getActivity().finish(); } } private void deleteFolder(File file) { if (file.isDirectory()) for (File child : file.listFiles()) deleteFolder(child); file.delete(); } }