/* * Copyright (C) 2016 Simon Vig Therkildsen * * 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 net.simonvt.cathode.settings; import android.Manifest; import android.annotation.TargetApi; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.preference.SwitchPreference; import android.support.v7.widget.Toolbar; import android.view.View; import javax.inject.Inject; import net.simonvt.android.colorpicker.ColorPickerDialog; import net.simonvt.android.colorpicker.ColorPickerSwatch; import net.simonvt.cathode.CathodeApp; import net.simonvt.cathode.R; import net.simonvt.cathode.provider.DatabaseContract.EpisodeColumns; import net.simonvt.cathode.provider.ProviderSchematic.Episodes; import net.simonvt.cathode.settings.hidden.HiddenItems; import net.simonvt.cathode.ui.BaseActivity; import net.simonvt.cathode.ui.HomeActivity; import timber.log.Timber; public class SettingsActivity extends BaseActivity { private static final String FRAGMENT_SETTINGS = "net.simonvt.cathode.settings.SettingsActivity.settingsFragment"; private static final String DIALOG_COLOR_PICKER = "net.simonvt.cathode.settings.SettingsActivity.ColorPicker"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_toolbar); if (getFragmentManager().findFragmentByTag(FRAGMENT_SETTINGS) == null) { SettingsFragment settings = new SettingsFragment(); getFragmentManager().beginTransaction() .add(R.id.content, settings, FRAGMENT_SETTINGS) .commit(); } Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar.setTitle(R.string.title_settings); toolbar.setNavigationIcon(R.drawable.ic_arrow_back_24dp); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); } public static class SettingsFragment extends PreferenceFragment implements UpcomingTimeDialog.UpcomingTimeSelectedListener, ColorPickerSwatch.OnColorSelectedListener, ShowOffsetDialog.ShowOffsetSelectedListener { private static final String DIALOG_UPCOMING_TIME = "net.simonvt.cathode.settings.SettingsActivity.SettingsFragment.upcomingTime"; private static final String DIALOG_SHOW_OFFSET = "net.simonvt.cathode.settings.SettingsActivity.SettingsFragment.showOffset"; private static final int PERMISSION_REQUEST_CALENDAR = 11; @Inject UpcomingTimePreference upcomingTimePreference; SharedPreferences settings; SwitchPreference syncCalendar; private boolean isTablet; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); CathodeApp.inject(getActivity(), this); settings = PreferenceManager.getDefaultSharedPreferences(getActivity()); isTablet = getResources().getBoolean(R.bool.isTablet); addPreferencesFromResource(R.xml.settings_general); syncCalendar = (SwitchPreference) findPreference(Settings.CALENDAR_SYNC); syncCalendar.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { boolean checked = (boolean) newValue; syncCalendar.setChecked(checked); if (checked && !Permissions.hasCalendarPermission(getActivity())) { requestPermission(); } else { Accounts.requestCalendarSync(getActivity()); } return true; } }); findPreference("calendarColor").setOnPreferenceClickListener( new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { final int calendarColor = settings.getInt(Settings.CALENDAR_COLOR, Settings.CALENDAR_COLOR_DEFAULT); final int size = isTablet ? ColorPickerDialog.SIZE_LARGE : ColorPickerDialog.SIZE_SMALL; ColorPickerDialog dialog = ColorPickerDialog.newInstance(R.string.preference_calendar_color, Settings.CALENDAR_COLORS, calendarColor, 5, size); dialog.setTargetFragment(SettingsFragment.this, 0); dialog.show(getFragmentManager(), DIALOG_COLOR_PICKER); return true; } }); findPreference("notifications").setOnPreferenceClickListener( new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { startActivity(new Intent(getActivity(), NotificationSettingsActivity.class)); return true; } }); findPreference("hiddenItems").setOnPreferenceClickListener( new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { startActivity(new Intent(getActivity(), HiddenItems.class)); return true; } }); findPreference("upcomingTime").setOnPreferenceClickListener( new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { UpcomingTime upcomingTime = UpcomingTime.fromValue( settings.getLong(Settings.UPCOMING_TIME, UpcomingTime.WEEKS_1.getCacheTime())); UpcomingTimeDialog dialog = UpcomingTimeDialog.newInstance(upcomingTime); dialog.setTargetFragment(SettingsFragment.this, 0); dialog.show(getFragmentManager(), DIALOG_UPCOMING_TIME); return true; } }); findPreference(Settings.SHOWS_OFFSET).setOnPreferenceClickListener( new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { final int offset = FirstAiredOffsetPreference.getInstance().getOffsetHours(); ShowOffsetDialog dialog = ShowOffsetDialog.newInstance(offset); dialog.setTargetFragment(SettingsFragment.this, 0); dialog.show(getFragmentManager(), DIALOG_SHOW_OFFSET); return true; } }); findPreference("about").setOnPreferenceClickListener( new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { new AboutDialog().show(getFragmentManager(), HomeActivity.DIALOG_ABOUT); return true; } }); findPreference("logout").setOnPreferenceClickListener( new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { new LogoutDialog().show(getFragmentManager(), HomeActivity.DIALOG_LOGOUT); return true; } }); } @TargetApi(Build.VERSION_CODES.M) private void requestPermission() { requestPermissions(new String[] { Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR, }, PERMISSION_REQUEST_CALENDAR); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == PERMISSION_REQUEST_CALENDAR) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { Timber.d("Calendar permission granted"); Accounts.requestCalendarSync(getActivity()); } else { Timber.d("Calendar permission not granted"); } } } @Override public void onUpcomingTimeSelected(UpcomingTime value) { upcomingTimePreference.set(value); } @Override public void onColorSelected(int color) { final int calendarColor = settings.getInt(Settings.CALENDAR_COLOR, Settings.CALENDAR_COLOR_DEFAULT); if (color != calendarColor) { settings.edit() .putInt(Settings.CALENDAR_COLOR, color) .putBoolean(Settings.CALENDAR_COLOR_NEEDS_UPDATE, true) .apply(); if (Permissions.hasCalendarPermission(getActivity())) { Accounts.requestCalendarSync(getActivity()); } } } @Override public void onShowOffsetSelected(int offset) { final int showOffset = FirstAiredOffsetPreference.getInstance().getOffsetHours(); if (offset != showOffset) { FirstAiredOffsetPreference.getInstance().set(offset); final Context context = getActivity(); new Thread(new Runnable() { @Override public void run() { ContentValues values = new ContentValues(); values.put(EpisodeColumns.LAST_MODIFIED, System.currentTimeMillis()); context.getContentResolver().update(Episodes.EPISODES, values, null, null); Accounts.requestCalendarSync(context); } }).start(); } } } }