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