com.google.samples.apps.iosched.settings.SettingsActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.google.samples.apps.iosched.settings.SettingsActivity.java

Source

/*
 * Copyright 2014 Google Inc. All rights reserved.
 *
 * 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 com.google.samples.apps.iosched.settings;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.preference.PreferenceFragmentCompat;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;

import com.google.samples.apps.iosched.BuildConfig;
import com.google.samples.apps.iosched.R;
import com.google.samples.apps.iosched.messaging.MessagingRegistrationWithGCM;
import com.google.samples.apps.iosched.navigation.NavigationModel;
import com.google.samples.apps.iosched.service.SessionCalendarService;
import com.google.samples.apps.iosched.ui.BaseActivity;
import com.google.samples.apps.iosched.ui.widget.DrawShadowFrameLayout;
import com.google.samples.apps.iosched.util.PermissionsUtils;
import com.google.samples.apps.iosched.util.UIUtils;

/**
 * Activity for customizing app settings.
 */
public class SettingsActivity extends BaseActivity {
    public static final String[] CALENDAR_PERMISSIONS = new String[] { Manifest.permission.WRITE_CALENDAR };
    /**
     * Indicates a permission request because the Calendar sync feature is being turned off. The
     * Calendar needs to be cleared and therefore the access is needed to remove entries.
     */
    private static final int REQUEST_PERMISSION_REQUEST_CODE_DISABLE_CALENDAR = 222;
    /**
     * Indicates a permission request because the Calendar sync feature is being turned on.
     */
    private static final int REQUEST_PERMISSION_REQUEST_CODE_ENABLE_CALENDAR = 111;

    @Override
    protected NavigationModel.NavigationItemEnum getSelfNavDrawerItem() {
        return NavigationModel.NavigationItemEnum.SETTINGS;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.settings_act);
        overridePendingTransition(0, 0);
    }

    @Override
    public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions,
            @NonNull final int[] grantResults) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // The only permission that is granted is the calendar one so a full sync is needed
            // when the permission is granted. This clears the schedule when sync is turned off
            // and updates it when it is turned on.
            scheduleCalendarSync(this);
        } else {
            int messageResId = (requestCode == REQUEST_PERMISSION_REQUEST_CODE_DISABLE_CALENDAR
                    ? R.string.pref_sync_with_calendar_permission_denied_during_disable
                    : R.string.pref_sync_with_calendar_permission_denied_during_enable);
            PermissionsUtils.displayPermissionDeniedSnackbar(this, messageResId);
        }
    }

    static void scheduleCalendarSync(Activity activity) {
        Intent intent;
        if (SettingsUtils.shouldSyncCalendar(activity)) {
            // Add all calendar entries
            intent = new Intent(SessionCalendarService.ACTION_UPDATE_ALL_SESSIONS_CALENDAR);
        } else {
            // Remove all calendar entries
            intent = new Intent(SessionCalendarService.ACTION_CLEAR_ALL_SESSIONS_CALENDAR);
        }

        intent.setClass(activity, SessionCalendarService.class);
        activity.startService(intent);
    }

    /**
     * The Fragment is added via the R.layout.settings_act layout xml.
     */
    public static class SettingsFragment extends PreferenceFragmentCompat
            implements SharedPreferences.OnSharedPreferenceChangeListener {
        public SettingsFragment() {
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            SettingsUtils.registerOnSharedPreferenceChangeListener(getActivity(), this);
        }

        @Override
        public RecyclerView onCreateRecyclerView(final LayoutInflater inflater, final ViewGroup parent,
                final Bundle savedInstanceState) {
            // Override the default list which has horizontal padding. Instead place padding on
            // the preference items for nicer touch feedback.
            final RecyclerView prefList = (RecyclerView) inflater.inflate(R.layout.settings_list, parent, false);
            prefList.setHasFixedSize(true);
            return prefList;
        }

        @Override
        public void onCreatePreferences(Bundle bundle, String s) {
            addPreferencesFromResource(R.xml.settings_prefs);
        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            SettingsUtils.unregisterOnSharedPreferenceChangeListener(getActivity(), this);
        }

        @Override
        public void onResume() {
            super.onResume();

            // configure the fragment's top clearance to take our overlaid controls (Action Bar
            // and spinner box) into account.
            int actionBarSize = UIUtils.calculateActionBarSize(getActivity());
            DrawShadowFrameLayout drawShadowFrameLayout = (DrawShadowFrameLayout) getActivity()
                    .findViewById(R.id.main_content);
            if (drawShadowFrameLayout != null) {
                drawShadowFrameLayout.setShadowTopOffset(actionBarSize);
            }
            setContentTopClearance(actionBarSize);
        }

        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            // The Calendar Sync requires checking the Calendar permission.
            if (SettingsUtils.PREF_SYNC_CALENDAR.equals(key)) {
                // Request permission when it doesn't exist, saving the information about whether
                // the request enabled or disabled the sync via the requestCode.
                if (!PermissionsUtils.permissionsAlreadyGranted(getActivity(), CALENDAR_PERMISSIONS)) {
                    boolean shouldSync = SettingsUtils.shouldSyncCalendar(getActivity());
                    int requestCode = shouldSync ? REQUEST_PERMISSION_REQUEST_CODE_ENABLE_CALENDAR
                            : REQUEST_PERMISSION_REQUEST_CODE_DISABLE_CALENDAR;
                    ActivityCompat.requestPermissions(getActivity(), CALENDAR_PERMISSIONS, requestCode);
                    return;
                }
                scheduleCalendarSync(getActivity());
            } else if (BuildConfig.PREF_CONF_MESSAGES_ENABLED.equals(key)
                    || BuildConfig.PREF_ATTENDEE_AT_VENUE.equals(key)) {
                // This will activate re-registering with the correct GCM topic(s).
                new MessagingRegistrationWithGCM(getActivity()).registerDevice();

            }
        }

        private void setContentTopClearance(int clearance) {
            if (getView() != null) {
                getView().setPadding(getView().getPaddingLeft(), clearance, getView().getPaddingRight(),
                        getView().getPaddingBottom());
            }
        }
    }
}