com.waz.zclient.pages.main.profile.preferences.OptionsPreferences.java Source code

Java tutorial

Introduction

Here is the source code for com.waz.zclient.pages.main.profile.preferences.OptionsPreferences.java

Source

/**
 * Wire
 * Copyright (C) 2016 Wire Swiss GmbH
 *
 * 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 com.waz.zclient.pages.main.profile.preferences;

import android.Manifest;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.RawRes;
import android.support.v4.app.ActivityCompat;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
import com.waz.zclient.BaseActivity;
import com.waz.zclient.R;
import com.waz.zclient.calling.controllers.CallPermissionsController;
import com.waz.zclient.controllers.permission.RequestPermissionsObserver;
import com.waz.zclient.core.controllers.tracking.events.Event;
import com.waz.zclient.core.controllers.tracking.events.settings.ChangedBitRateModeEvent;
import com.waz.zclient.core.controllers.tracking.events.settings.ChangedContactsPermissionEvent;
import com.waz.zclient.core.controllers.tracking.events.settings.ChangedImageDownloadPreferenceEvent;
import com.waz.zclient.core.controllers.tracking.events.settings.ChangedSendButtonSettingEvent;
import com.waz.zclient.core.controllers.tracking.events.settings.ChangedThemeEvent;
import com.waz.zclient.media.SoundController;
import com.waz.zclient.pages.BasePreferenceFragment;
import com.waz.zclient.pages.main.profile.preferences.dialogs.WireRingtonePreferenceDialogFragment;
import com.waz.zclient.tracking.GlobalTrackingController;
import com.waz.zclient.utils.LayoutSpec;
import com.waz.zclient.utils.PermissionUtils;
import com.waz.zclient.utils.TrackingUtils;
import net.xpece.android.support.preference.RingtonePreference;
import net.xpece.android.support.preference.SwitchPreference;

public class OptionsPreferences extends BasePreferenceFragment<OptionsPreferences.Container>
        implements SharedPreferences.OnSharedPreferenceChangeListener, RequestPermissionsObserver {

    private Preference.OnPreferenceChangeListener bindPreferenceSummaryToValueListener = new PreferenceSummaryChangeListener();
    private RingtonePreference ringtonePreference;
    private RingtonePreference textTonePreference;
    private RingtonePreference pingPreference;
    private SwitchPreference themePreference;

    public static OptionsPreferences newInstance(String rootKey, Bundle extras) {
        OptionsPreferences f = new OptionsPreferences();
        Bundle args = extras == null ? new Bundle() : new Bundle(extras);
        args.putString(ARG_PREFERENCE_ROOT, rootKey);
        f.setArguments(args);
        return f;
    }

    @Override
    public void onCreatePreferences2(Bundle savedInstanceState, String rootKey) {
        super.onCreatePreferences2(savedInstanceState, rootKey);
        addPreferencesFromResource(R.xml.preferences_options);

        ringtonePreference = (RingtonePreference) findPreference(
                getString(R.string.pref_options_ringtones_ringtone_key));
        textTonePreference = (RingtonePreference) findPreference(
                getString(R.string.pref_options_ringtones_text_key));
        pingPreference = (RingtonePreference) findPreference(getString(R.string.pref_options_ringtones_ping_key));
        ringtonePreference.setShowSilent(true);
        textTonePreference.setShowSilent(true);
        pingPreference.setShowSilent(true);
        setDefaultRingtones();

        bindPreferenceSummaryToValue(ringtonePreference);
        bindPreferenceSummaryToValue(textTonePreference);
        bindPreferenceSummaryToValue(pingPreference);

        themePreference = (SwitchPreference) findPreference(getString(R.string.pref_options_theme_switch_key));
        themePreference.setChecked(getControllerFactory().getThemeController().isDarkTheme());

        if (LayoutSpec.isTablet(getActivity())) {
            PreferenceCategory requestedOptionsCategory = (PreferenceCategory) findPreference(
                    getString(R.string.pref_options_requested_category_key));
            if (requestedOptionsCategory != null) {
                requestedOptionsCategory.removePreference(themePreference);
            }
        }
    }

    @Override
    public void onStart() {
        super.onStart();
        getControllerFactory().getRequestPermissionsController().addObserver(this);
    }

    @Override
    public void onStop() {
        getControllerFactory().getRequestPermissionsController().removeObserver(this);
        super.onStop();
    }

    private void setDefaultRingtones() {
        addDefaultExtra(ringtonePreference.getKey(), R.raw.ringing_from_them);
        addDefaultExtra(textTonePreference.getKey(), R.raw.new_message);
        addDefaultExtra(pingPreference.getKey(), R.raw.ping_from_them);
    }

    private void addDefaultExtra(String key, @RawRes int defaultResId) {
        findPreference(key).getExtras().putInt(WireRingtonePreferenceDialogFragment.EXTRA_DEFAULT, defaultResId);
    }

    @Override
    public Event handlePreferenceChanged(SharedPreferences sharedPreferences, String key) {
        Event event = null;
        if (key.equals(getString(R.string.pref_options_sounds_key))) {
            String stringValue = sharedPreferences.getString(key, "");
            TrackingUtils.tagChangedSoundNotificationLevelEvent(
                    ((BaseActivity) getActivity()).injectJava(GlobalTrackingController.class), stringValue,
                    getContext());

        } else if (key.equals(ringtonePreference.getKey()) || key.equals(textTonePreference.getKey())
                || key.equals(pingPreference.getKey())) {

            SoundController ctrl = inject(SoundController.class);
            if (ctrl != null) {
                ctrl.setCustomSoundUrisFromPreferences(sharedPreferences);
            }
        } else if (key.equals(getString(R.string.pref_options_image_download_key))) {
            String stringValue = sharedPreferences.getString(key, "");
            boolean wifiOnly = stringValue.equals(getContext().getString(R.string.zms_image_download_value_wifi));
            event = new ChangedImageDownloadPreferenceEvent(wifiOnly);
        } else if (key.equals(getString(R.string.pref_options_contacts_key))) {
            boolean shareContacts = sharedPreferences.getBoolean(key, false);
            event = new ChangedContactsPermissionEvent(shareContacts, true);
            boolean hasContactsReadPermission = PermissionUtils.hasSelfPermissions(getContext(),
                    Manifest.permission.READ_CONTACTS);
            if (shareContacts && !hasContactsReadPermission) {
                ActivityCompat.requestPermissions(getActivity(), new String[] { Manifest.permission.READ_CONTACTS },
                        PermissionUtils.REQUEST_READ_CONTACTS);
            }
        } else if (key.equals(getString(R.string.pref_options_theme_switch_key))) {
            getControllerFactory().getThemeController().toggleThemePending(true);
            event = new ChangedThemeEvent(getControllerFactory().getThemeController().isDarkTheme());
        } else if (key.equals(getString(R.string.pref_options_cursor_send_button_key))) {
            boolean sendButtonIsOn = sharedPreferences.getBoolean(key, true);
            event = new ChangedSendButtonSettingEvent(sendButtonIsOn);
        } else if (key.equals(getString(R.string.pref_options_vbr_key))) {
            boolean vbrOn = sharedPreferences.getBoolean(key, false);
            CallPermissionsController ctrl = inject(CallPermissionsController.class);
            if (ctrl != null) {
                ctrl.setVariableBitRateMode(vbrOn);
            }
            event = new ChangedBitRateModeEvent(vbrOn, true);
        }
        return event;
    }

    private void bindPreferenceSummaryToValue(Preference preference) {
        preference.setOnPreferenceChangeListener(bindPreferenceSummaryToValueListener);
        final String key = preference.getKey();
        String value = getPreferenceManager().getSharedPreferences().getString(key, null);
        bindPreferenceSummaryToValueListener.onPreferenceChange(preference, value);
    }

    private static class PreferenceSummaryChangeListener implements Preference.OnPreferenceChangeListener {
        @Override
        public boolean onPreferenceChange(Preference preference, Object o) {
            final String value = (String) o;
            if (!(preference instanceof RingtonePreference)) {
                preference.setSummary(value);
                return true;
            }

            final Context context = preference.getContext();
            if (value == null) {
                preference.setSummary(R.string.pref_options_ringtones_default_summary);
                return true;
            } else if (value.isEmpty()) {
                preference.setSummary(RingtonePreference.getRingtoneSilentString(context));
                return true;
            }

            final Uri uri = Uri.parse(value);
            final int rawId = preference.getExtras().getInt(WireRingtonePreferenceDialogFragment.EXTRA_DEFAULT);
            if (uri.compareTo(Uri.parse("android.resource://" + context.getPackageName() + "/" + rawId)) == 0) {
                preference.setSummary(R.string.pref_options_ringtones_default_summary);
                return true;
            }

            preference.setSummary(RingtonePreference.getRingtoneTitle(context, uri));
            return true;
        }
    }

    public interface Container {
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, int[] grantResults) {
        if (requestCode == PermissionUtils.REQUEST_READ_CONTACTS && grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            boolean oldConfig = getControllerFactory().getUserPreferencesController().hasShareContactsEnabled();
            getControllerFactory().getUserPreferencesController().setShareContactsEnabled(!oldConfig);
            getControllerFactory().getUserPreferencesController().setShareContactsEnabled(oldConfig);
        }
    }
}