/* * Copyright (C) Winson Chiu * * 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 cw.kop.autobackground.settings; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; import android.os.Environment; import android.preference.Preference; import android.preference.PreferenceCategory; import android.preference.PreferenceFragment; import android.preference.SwitchPreference; import android.text.InputType; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.TimePicker; import android.widget.Toast; import java.io.File; import java.util.Calendar; import cw.kop.autobackground.DialogFactory; import cw.kop.autobackground.LiveWallpaperService; import cw.kop.autobackground.R; import cw.kop.autobackground.files.FileHandler; import cw.kop.autobackground.images.AdapterImages; import cw.kop.autobackground.images.FolderFragment; public class DownloadSettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener { private final static long CONVERT_MILLES_TO_MIN = 60000; private final static long CONVERT_MIN_TO_DAY = 1440; private final static int REQUEST_FILE_ID = 0; private SwitchPreference timerPref; private Preference startTimePref; private Activity activity; private PendingIntent pendingIntent; private AlarmManager alarmManager; private Preference imageHistorySizePref; private Preference thumbnailSizePref; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences_download); } @Override public void onAttach(Activity activity) { super.onAttach(activity); this.activity = getActivity(); Intent intent = new Intent(); intent.setAction(LiveWallpaperService.DOWNLOAD_WALLPAPER); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); pendingIntent = PendingIntent.getBroadcast(this.activity, 0, intent, 0); alarmManager = (AlarmManager) this.activity.getSystemService(Context.ALARM_SERVICE); Log.i("DSF", "onAttach"); } @Override public void onDetach() { activity = null; super.onDetach(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { timerPref = (SwitchPreference) findPreference("use_timer"); startTimePref = findPreference("timer_time"); Preference deletePref = findPreference("delete_images"); deletePref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { DialogFactory.ActionDialogListener clickListener = new DialogFactory.ActionDialogListener() { @Override public void onClickRight(View v) { FileHandler.deleteAllBitmaps(); Toast.makeText(activity, "Deleted images with prefix\n" + AppSettings.getImagePrefix(), Toast.LENGTH_SHORT).show(); this.dismissDialog(); } }; DialogFactory.showActionDialog(activity, "Are you sure you want to delete all images?", "This cannot be undone.", clickListener, -1, R.string.cancel_button, R.string.ok_button); return true; } }); final Preference prefixPref = findPreference("image_prefix_adv"); prefixPref.setSummary("Prefix: " + AppSettings.getImagePrefix()); prefixPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { DialogFactory.InputDialogListener listener = new DialogFactory.InputDialogListener() { @Override public void onClickRight(View v) { AppSettings.setImagePrefix(getEditTextString()); prefixPref.setSummary("Prefix: " + AppSettings.getImagePrefix()); dismissDialog(); } }; DialogFactory.showInputDialog(activity, "Image Prefix", "", "" + AppSettings.getImagePrefix(), listener, -1, R.string.cancel_button, R.string.ok_button, InputType.TYPE_CLASS_TEXT); return true; } }); final Preference timePref = findPreference("timer_time"); timePref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { DialogFactory.TimeDialogListener listener = new DialogFactory.TimeDialogListener() { @Override public void onTimeSet(TimePicker view, int hour, int minute) { AppSettings.setTimerHour(hour); AppSettings.setTimerMinute(minute); startTimePref.setSummary("Time to begin download timer: " + hour + ":" + String.format( "%02d", minute)); dismissDialog(); setDownloadAlarm(); } }; DialogFactory.showTimeDialog(activity, "Time to start download:", listener, AppSettings.getTimerHour(), AppSettings.getTimerMinute()); return true; } }); ((PreferenceCategory) findPreference("title_download_settings")).removePreference( findPreference("use_experimental_downloader_adv")); if (!AppSettings.useAdvanced()) { PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference( "title_download_settings"); preferenceCategory.removePreference(findPreference("full_resolution")); preferenceCategory.removePreference(findPreference("reset_on_manual_download")); preferenceCategory.removePreference(findPreference("download_on_connection")); preferenceCategory.removePreference(findPreference("use_download_notification")); preferenceCategory.removePreference(findPreference("force_download")); preferenceCategory.removePreference(findPreference("use_download_path")); preferenceCategory.removePreference(findPreference("use_image_history")); preferenceCategory.removePreference(findPreference("image_history_size")); preferenceCategory.removePreference(findPreference("use_thumbnails")); preferenceCategory.removePreference(findPreference("thumbnail_size")); preferenceCategory.removePreference(findPreference("delete_old_images")); preferenceCategory.removePreference(findPreference("check_duplicates")); preferenceCategory.removePreference(findPreference("image_prefix_adv")); preferenceCategory.removePreference(findPreference("delete_images")); } else { imageHistorySizePref = findPreference("image_history_size"); imageHistorySizePref.setOnPreferenceClickListener( new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { showImageHistorySiseDialog(); return true; } }); thumbnailSizePref = findPreference("thumbnail_size"); thumbnailSizePref.setOnPreferenceClickListener( new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { showThumbnailSizeDialog(); return true; } }); } return inflater.inflate(R.layout.fragment_list, container, false); } private void showDialogTimerMenu() { DialogFactory.ListDialogListener clickListener = new DialogFactory.ListDialogListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { switch (position) { case 0: AppSettings.setTimerDuration(AlarmManager.INTERVAL_HALF_DAY); break; case 1: AppSettings.setTimerDuration(1 * AlarmManager.INTERVAL_DAY); break; case 2: AppSettings.setTimerDuration(2 * AlarmManager.INTERVAL_DAY); break; case 3: AppSettings.setTimerDuration(3 * AlarmManager.INTERVAL_DAY); break; case 4: AppSettings.setTimerDuration(4 * AlarmManager.INTERVAL_DAY); break; case 5: AppSettings.setTimerDuration(5 * AlarmManager.INTERVAL_DAY); break; case 6: AppSettings.setTimerDuration(6 * AlarmManager.INTERVAL_DAY); break; case 7: AppSettings.setTimerDuration(7 * AlarmManager.INTERVAL_DAY); break; default: } float days = (float) AppSettings.getTimerDuration() / CONVERT_MILLES_TO_MIN / CONVERT_MIN_TO_DAY; timerPref.setSummary("Download every " + String.format("%.2f", days) + (days == 1 ? " day" : " days")); setDownloadAlarm(); dismissDialog(); } @Override public void onDismiss() { if (AppSettings.getTimerDuration() <= 0) { timerPref.setChecked(false); } } }; DialogFactory.showListDialog(activity, "Download Interval:", clickListener, R.array.timer_entry_menu); } private void showDialogTimerForInput() { DialogFactory.InputDialogListener listener = new DialogFactory.InputDialogListener() { @Override public void onClickMiddle(View v) { timerPref.setChecked(false); dismissDialog(); } @Override public void onClickRight(View v) { String value = getEditTextString(); if (TextUtils.isEmpty(value) || Long.parseLong(value) <= 0) { timerPref.setChecked(false); dismissDialog(); return; } long inputValue = Long.parseLong(value); if (inputValue < 30L) { inputValue = 30L; } AppSettings.setTimerDuration(inputValue * CONVERT_MILLES_TO_MIN); setDownloadAlarm(); float days = (float) AppSettings.getTimerDuration() / CONVERT_MILLES_TO_MIN / CONVERT_MIN_TO_DAY; timerPref.setSummary( "Download every " + String.format("%.2f", days) + (days == 1 ? " day" : " days")); dismissDialog(); } @Override public void onDismiss() { if (AppSettings.getTimerDuration() <= 0) { timerPref.setChecked(false); } } }; DialogFactory.showInputDialog(activity, "Download Interval", "Number of minutes", "" + (AppSettings.getTimerDuration() / CONVERT_MILLES_TO_MIN), listener, -1, R.string.cancel_button, R.string.ok_button, InputType.TYPE_CLASS_NUMBER); } private void showImageHistorySiseDialog() { DialogFactory.InputDialogListener listener = new DialogFactory.InputDialogListener() { @Override public void onClickMiddle(View v) { dismissDialog(); } @Override public void onClickRight(View v) { String value = getEditTextString(); if (TextUtils.isEmpty(value) || Integer.parseInt(value) < 0) { dismissDialog(); return; } int inputValue = Integer.parseInt(value); AppSettings.setImageHistorySize(inputValue); dismissDialog(); } }; DialogFactory.showInputDialog(activity, "Image History Size", "Number of images in history", "" + AppSettings.getImageHistorySize(), listener, -1, R.string.cancel_button, R.string.ok_button, InputType.TYPE_CLASS_NUMBER); } private void showThumbnailSizeDialog() { DialogFactory.InputDialogListener listener = new DialogFactory.InputDialogListener() { @Override public void onClickMiddle(View v) { dismissDialog(); } @Override public void onClickRight(View v) { String value = getEditTextString(); if (TextUtils.isEmpty(value) || Integer.parseInt(value) < 0) { dismissDialog(); return; } int inputValue = Integer.parseInt(value); AppSettings.setThumbnailSize(inputValue); dismissDialog(); } }; DialogFactory.showInputDialog(activity, "Thumbnail Size", "Max size in pixels", "" + AppSettings.getThumbnailSize(), listener, -1, R.string.cancel_button, R.string.ok_button, InputType.TYPE_CLASS_NUMBER); } private void setDownloadAlarm() { if (AppSettings.useTimer()) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, AppSettings.getTimerHour()); calendar.set(Calendar.MINUTE, AppSettings.getTimerMinute()); alarmManager.cancel(pendingIntent); if (calendar.getTimeInMillis() > System.currentTimeMillis()) { alarmManager.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AppSettings.getTimerDuration(), pendingIntent); } else { alarmManager.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis() + AlarmManager.INTERVAL_DAY, AppSettings.getTimerDuration(), pendingIntent); } Log.i("DSF", "Alarm Set: " + AppSettings.getTimerDuration()); } else { alarmManager.cancel(pendingIntent); } } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); final Preference widthPref = findPreference("user_width"); widthPref.setSummary("Minimum Width of Image: " + AppSettings.getImageWidth()); widthPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { DialogFactory.InputDialogListener listener = new DialogFactory.InputDialogListener() { @Override public void onClickRight(View v) { AppSettings.setImageWidth(getEditTextString()); widthPref.setSummary("Minimum Width of Image: " + AppSettings.getImageWidth()); dismissDialog(); } }; DialogFactory.showInputDialog(activity, "Minimum Width of Image:", "Width in pixels", "" + AppSettings.getImageWidth(), listener, -1, R.string.cancel_button, R.string.ok_button, InputType.TYPE_CLASS_NUMBER); return true; } }); final Preference heightPref = findPreference("user_height"); heightPref.setSummary("Minimum Height of Image: " + AppSettings.getImageHeight()); heightPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { DialogFactory.InputDialogListener listener = new DialogFactory.InputDialogListener() { @Override public void onClickRight(View v) { AppSettings.setImageHeight(getEditTextString()); heightPref.setSummary("Minimum Height of Image: " + AppSettings.getImageHeight()); dismissDialog(); } }; DialogFactory.showInputDialog(activity, "Minimum Height of Image:", "Height in pixels", "" + AppSettings.getImageHeight(), listener, -1, R.string.cancel_button, R.string.ok_button, InputType.TYPE_CLASS_NUMBER); return true; } }); if (AppSettings.useTimer()) { float days = (float) AppSettings.getTimerDuration() / CONVERT_MILLES_TO_MIN / CONVERT_MIN_TO_DAY; timerPref.setSummary("Download every " + String.format("%.2f", days) + (days == 1 ? " day" : " days")); } startTimePref.setSummary("Time to begin download timer: " + AppSettings.getTimerHour() + ":" + String.format( "%02d", AppSettings.getTimerMinute())); } @Override public void onResume() { super.onResume(); getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); } @Override public void onPause() { getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); super.onPause(); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, final String key) { if (!(activity).isFinishing()) { if (key.equals("use_timer")) { if (AppSettings.useTimer()) { if (AppSettings.useAdvanced()) { showDialogTimerForInput(); } else { showDialogTimerMenu(); } } else { SwitchPreference timerPref = (SwitchPreference) findPreference(key); timerPref.setSummary(getString(R.string.use_timer_description)); setDownloadAlarm(); } Log.i("DSF", "Alarm Set: " + AppSettings.useTimer()); } if (key.equals("use_download_path") && AppSettings.useDownloadPath()) { File startDir = Environment.getExternalStorageDirectory(); final FolderFragment folderFragment = new FolderFragment(); Bundle arguments = new Bundle(); arguments.putBoolean(FolderFragment.SHOW_DIRECTORY_TEXT, true); arguments.putBoolean(FolderFragment.USE_DIRECTORY, true); final AdapterImages adapter = new AdapterImages(activity, new File(File.separator), startDir, folderFragment); folderFragment.setArguments(arguments); folderFragment.setAdapter(adapter); folderFragment.setStartingDirectoryText(startDir.getAbsolutePath()); folderFragment.setListener(new FolderFragment.FolderEventListener() { public Activity dialogActivity; @Override public void onUseDirectoryClick() { AppSettings.setDownloadPath(adapter.getDirectory() .getAbsolutePath()); Toast.makeText(dialogActivity, "Download path set to: \n" + AppSettings.getDownloadPath(), Toast.LENGTH_SHORT) .show(); adapter.setFinished(); dialogActivity.onBackPressed(); } @Override public void onItemClick(int positionInList) { File selectedFile = adapter.getItem(positionInList); if (selectedFile.exists() && selectedFile.isDirectory()) { adapter.setDirectory(selectedFile); folderFragment.setDirectoryText(adapter.getDirectory() .getAbsolutePath()); } } @Override public boolean onBackPressed() { boolean endDirectory = adapter.backDirectory(); folderFragment.setDirectoryText(adapter.getDirectory() .getAbsolutePath()); if (!adapter.isFinished()) { ((SwitchPreference) findPreference(key)).setChecked(false); } return endDirectory; } @Override public void setActivity(Activity activity) { this.dialogActivity = activity; } }); getFragmentManager().beginTransaction() .setCustomAnimations(R.animator.none, R.animator.slide_to_bottom, R.animator.none, R.animator.slide_to_bottom) .add(R.id.content_frame, folderFragment, "folder_fragment") .addToBackStack(null) .commit(); } } } }