1d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng/* 2d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * Copyright (C) 2010 The Android Open Source Project 3d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * 4d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * Licensed under the Apache License, Version 2.0 (the "License"); 5d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * you may not use this file except in compliance with the License. 6d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * You may obtain a copy of the License at 7d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * 8d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * http://www.apache.org/licenses/LICENSE-2.0 9d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * 10d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * Unless required by applicable law or agreed to in writing, software 11d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * distributed under the License is distributed on an "AS IS" BASIS, 12d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * See the License for the specific language governing permissions and 14d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * limitations under the License. 15d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng */ 16d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 17d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengpackage com.android.contacts.common.preference; 18d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 19d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengimport android.content.ContentResolver; 20d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengimport android.content.Context; 21d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengimport android.database.ContentObserver; 22d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengimport android.os.Handler; 23d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengimport android.provider.ContactsContract; 24d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengimport android.provider.Settings; 25d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengimport android.provider.Settings.SettingNotFoundException; 26d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 27d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengimport com.android.contacts.common.R; 28d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 29d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng/** 30d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * Manages user preferences for contacts. 31d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng */ 32d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengpublic final class ContactsPreferences extends ContentObserver { 33d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 34d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng public static final String PREF_DISPLAY_ONLY_PHONES = "only_phones"; 35d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng public static final boolean PREF_DISPLAY_ONLY_PHONES_DEFAULT = false; 36d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 37d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng private Context mContext; 38d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng private int mSortOrder = -1; 39d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng private int mDisplayOrder = -1; 40d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng private ChangeListener mListener = null; 41d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng private Handler mHandler; 42d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 43d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng public ContactsPreferences(Context context) { 44d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng super(null); 45d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng mContext = context; 46d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng mHandler = new Handler(); 47d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 48d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 49d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng public boolean isSortOrderUserChangeable() { 50d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng return mContext.getResources().getBoolean(R.bool.config_sort_order_user_changeable); 51d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 52d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 53d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng public int getDefaultSortOrder() { 54d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng if (mContext.getResources().getBoolean(R.bool.config_default_sort_order_primary)) { 55d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng return ContactsContract.Preferences.SORT_ORDER_PRIMARY; 56d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } else { 57d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng return ContactsContract.Preferences.SORT_ORDER_ALTERNATIVE; 58d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 59d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 60d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 61d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng public int getSortOrder() { 62d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng if (!isSortOrderUserChangeable()) { 63d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng return getDefaultSortOrder(); 64d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 65d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 66d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng if (mSortOrder == -1) { 67d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng try { 68d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng mSortOrder = Settings.System.getInt(mContext.getContentResolver(), 69d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng ContactsContract.Preferences.SORT_ORDER); 70d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } catch (SettingNotFoundException e) { 71d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng mSortOrder = getDefaultSortOrder(); 72d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 73d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 74d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng return mSortOrder; 75d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 76d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 77d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng public void setSortOrder(int sortOrder) { 78d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng mSortOrder = sortOrder; 79d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng Settings.System.putInt(mContext.getContentResolver(), 80d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng ContactsContract.Preferences.SORT_ORDER, sortOrder); 81d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 82d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 83d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng public boolean isDisplayOrderUserChangeable() { 84d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng return mContext.getResources().getBoolean(R.bool.config_display_order_user_changeable); 85d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 86d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 87d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng public int getDefaultDisplayOrder() { 88d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng if (mContext.getResources().getBoolean(R.bool.config_default_display_order_primary)) { 89d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng return ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY; 90d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } else { 91d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng return ContactsContract.Preferences.DISPLAY_ORDER_ALTERNATIVE; 92d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 93d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 94d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 95d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng public int getDisplayOrder() { 96d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng if (!isDisplayOrderUserChangeable()) { 97d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng return getDefaultDisplayOrder(); 98d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 99d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 100d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng if (mDisplayOrder == -1) { 101d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng try { 102d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng mDisplayOrder = Settings.System.getInt(mContext.getContentResolver(), 103d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng ContactsContract.Preferences.DISPLAY_ORDER); 104d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } catch (SettingNotFoundException e) { 105d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng mDisplayOrder = getDefaultDisplayOrder(); 106d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 107d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 108d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng return mDisplayOrder; 109d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 110d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 111d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng public void setDisplayOrder(int displayOrder) { 112d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng mDisplayOrder = displayOrder; 113d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng Settings.System.putInt(mContext.getContentResolver(), 114d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng ContactsContract.Preferences.DISPLAY_ORDER, displayOrder); 115d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 116d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 117d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng public void registerChangeListener(ChangeListener listener) { 118d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng if (mListener != null) unregisterChangeListener(); 119d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 120d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng mListener = listener; 121d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 122d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng // Reset preferences to "unknown" because they may have changed while the 123d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng // observer was unregistered. 124d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng mDisplayOrder = -1; 125d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng mSortOrder = -1; 126d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 127d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng final ContentResolver contentResolver = mContext.getContentResolver(); 128d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng contentResolver.registerContentObserver( 129d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng Settings.System.getUriFor( 130d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng ContactsContract.Preferences.SORT_ORDER), false, this); 131d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng contentResolver.registerContentObserver( 132d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng Settings.System.getUriFor( 133d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng ContactsContract.Preferences.DISPLAY_ORDER), false, this); 134d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 135d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 136d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng public void unregisterChangeListener() { 137d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng if (mListener != null) { 138d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng mContext.getContentResolver().unregisterContentObserver(this); 139d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng mListener = null; 140d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 141d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 142d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 143d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng @Override 144d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng public void onChange(boolean selfChange) { 145d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng // This notification is not sent on the Ui thread. Use the previously created Handler 146d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng // to switch to the Ui thread 147d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng mHandler.post(new Runnable() { 148d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng @Override 149d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng public void run() { 150d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng mSortOrder = -1; 151d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng mDisplayOrder = -1; 152d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng if (mListener != null) mListener.onChange(); 153d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 154d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng }); 155d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 156d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng 157d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng public interface ChangeListener { 158d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng void onChange(); 159d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng } 160d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng} 161