/*
* 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());
}
}
}
}