1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.launcher3; 18 19 import android.app.Activity; 20 import android.content.ContentResolver; 21 import android.database.ContentObserver; 22 import android.os.Bundle; 23 import android.os.Handler; 24 import android.preference.ListPreference; 25 import android.preference.Preference; 26 import android.preference.PreferenceFragment; 27 import android.provider.Settings; 28 import android.provider.Settings.System; 29 import android.support.v4.os.BuildCompat; 30 31 import com.android.launcher3.graphics.IconShapeOverride; 32 33 /** 34 * Settings activity for Launcher. Currently implements the following setting: Allow rotation 35 */ 36 public class SettingsActivity extends Activity { 37 38 private static final String ICON_BADGING_PREFERENCE_KEY = "pref_icon_badging"; 39 // TODO: use Settings.Secure.NOTIFICATION_BADGING 40 private static final String NOTIFICATION_BADGING = "notification_badging"; 41 42 @Override onCreate(Bundle savedInstanceState)43 protected void onCreate(Bundle savedInstanceState) { 44 super.onCreate(savedInstanceState); 45 46 // Display the fragment as the main content. 47 getFragmentManager().beginTransaction() 48 .replace(android.R.id.content, new LauncherSettingsFragment()) 49 .commit(); 50 } 51 52 /** 53 * This fragment shows the launcher preferences. 54 */ 55 public static class LauncherSettingsFragment extends PreferenceFragment { 56 57 private SystemDisplayRotationLockObserver mRotationLockObserver; 58 private IconBadgingObserver mIconBadgingObserver; 59 60 @Override onCreate(Bundle savedInstanceState)61 public void onCreate(Bundle savedInstanceState) { 62 super.onCreate(savedInstanceState); 63 getPreferenceManager().setSharedPreferencesName(LauncherFiles.SHARED_PREFERENCES_KEY); 64 addPreferencesFromResource(R.xml.launcher_preferences); 65 66 ContentResolver resolver = getActivity().getContentResolver(); 67 68 // Setup allow rotation preference 69 Preference rotationPref = findPreference(Utilities.ALLOW_ROTATION_PREFERENCE_KEY); 70 if (getResources().getBoolean(R.bool.allow_rotation)) { 71 // Launcher supports rotation by default. No need to show this setting. 72 getPreferenceScreen().removePreference(rotationPref); 73 } else { 74 mRotationLockObserver = new SystemDisplayRotationLockObserver(rotationPref, resolver); 75 76 // Register a content observer to listen for system setting changes while 77 // this UI is active. 78 resolver.registerContentObserver( 79 Settings.System.getUriFor(System.ACCELEROMETER_ROTATION), 80 false, mRotationLockObserver); 81 82 // Initialize the UI once 83 mRotationLockObserver.onChange(true); 84 rotationPref.setDefaultValue(Utilities.getAllowRotationDefaultValue(getActivity())); 85 } 86 87 Preference iconBadgingPref = findPreference(ICON_BADGING_PREFERENCE_KEY); 88 if (!BuildCompat.isAtLeastO()) { 89 getPreferenceScreen().removePreference( 90 findPreference(SessionCommitReceiver.ADD_ICON_PREFERENCE_KEY)); 91 getPreferenceScreen().removePreference(iconBadgingPref); 92 } else { 93 // Listen to system notification badge settings while this UI is active. 94 mIconBadgingObserver = new IconBadgingObserver(iconBadgingPref, resolver); 95 resolver.registerContentObserver( 96 Settings.Secure.getUriFor(NOTIFICATION_BADGING), 97 false, mIconBadgingObserver); 98 mIconBadgingObserver.onChange(true); 99 } 100 101 Preference iconShapeOverride = findPreference(IconShapeOverride.KEY_PREFERENCE); 102 if (iconShapeOverride != null) { 103 if (IconShapeOverride.isSupported(getActivity())) { 104 IconShapeOverride.handlePreferenceUi((ListPreference) iconShapeOverride); 105 } else { 106 getPreferenceScreen().removePreference(iconShapeOverride); 107 } 108 } 109 } 110 111 @Override onDestroy()112 public void onDestroy() { 113 if (mRotationLockObserver != null) { 114 getActivity().getContentResolver().unregisterContentObserver(mRotationLockObserver); 115 mRotationLockObserver = null; 116 } 117 if (mIconBadgingObserver != null) { 118 getActivity().getContentResolver().unregisterContentObserver(mIconBadgingObserver); 119 mIconBadgingObserver = null; 120 } 121 super.onDestroy(); 122 } 123 } 124 125 /** 126 * Content observer which listens for system auto-rotate setting changes, and enables/disables 127 * the launcher rotation setting accordingly. 128 */ 129 private static class SystemDisplayRotationLockObserver extends ContentObserver { 130 131 private final Preference mRotationPref; 132 private final ContentResolver mResolver; 133 SystemDisplayRotationLockObserver( Preference rotationPref, ContentResolver resolver)134 public SystemDisplayRotationLockObserver( 135 Preference rotationPref, ContentResolver resolver) { 136 super(new Handler()); 137 mRotationPref = rotationPref; 138 mResolver = resolver; 139 } 140 141 @Override onChange(boolean selfChange)142 public void onChange(boolean selfChange) { 143 boolean enabled = Settings.System.getInt(mResolver, 144 Settings.System.ACCELEROMETER_ROTATION, 1) == 1; 145 mRotationPref.setEnabled(enabled); 146 mRotationPref.setSummary(enabled 147 ? R.string.allow_rotation_desc : R.string.allow_rotation_blocked_desc); 148 } 149 } 150 151 /** 152 * Content observer which listens for system badging setting changes, 153 * and updates the launcher badging setting subtext accordingly. 154 */ 155 private static class IconBadgingObserver extends ContentObserver { 156 157 private final Preference mBadgingPref; 158 private final ContentResolver mResolver; 159 IconBadgingObserver(Preference badgingPref, ContentResolver resolver)160 public IconBadgingObserver(Preference badgingPref, ContentResolver resolver) { 161 super(new Handler()); 162 mBadgingPref = badgingPref; 163 mResolver = resolver; 164 } 165 166 @Override onChange(boolean selfChange)167 public void onChange(boolean selfChange) { 168 boolean enabled = Settings.Secure.getInt(mResolver, NOTIFICATION_BADGING, 1) == 1; 169 mBadgingPref.setSummary(enabled 170 ? R.string.icon_badging_desc_on 171 : R.string.icon_badging_desc_off); 172 } 173 } 174 175 } 176