1/* 2 * Copyright (C) 2009 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 17package com.android.contacts.preference; 18 19import android.content.res.Configuration; 20import android.database.Cursor; 21import android.os.Bundle; 22import android.preference.PreferenceActivity; 23import android.provider.ContactsContract.ProviderStatus; 24import android.support.annotation.LayoutRes; 25import android.support.annotation.NonNull; 26import android.support.annotation.StringRes; 27import android.support.v7.app.ActionBar; 28import android.support.v7.app.AppCompatDelegate; 29import android.support.v7.widget.Toolbar; 30import android.text.TextUtils; 31import android.view.MenuInflater; 32import android.view.MenuItem; 33import android.view.View; 34import android.view.ViewGroup; 35 36import com.android.contacts.R; 37import com.android.contacts.editor.SelectAccountDialogFragment; 38import com.android.contacts.interactions.ImportDialogFragment; 39import com.android.contacts.list.ProviderStatusWatcher; 40import com.android.contacts.model.account.AccountWithDataSet; 41import com.android.contacts.preference.DisplayOptionsPreferenceFragment.ProfileListener; 42import com.android.contacts.preference.DisplayOptionsPreferenceFragment.ProfileQuery; 43import com.android.contacts.util.AccountSelectionUtil; 44 45/** 46 * Contacts settings. 47 */ 48public final class ContactsPreferenceActivity extends PreferenceActivity 49 implements ProfileListener, SelectAccountDialogFragment.Listener { 50 51 private static final String TAG_ABOUT = "about_contacts"; 52 private static final String TAG_DISPLAY_OPTIONS = "display_options"; 53 54 private String mNewLocalProfileExtra; 55 private boolean mAreContactsAvailable; 56 57 private ProviderStatusWatcher mProviderStatusWatcher; 58 59 private AppCompatDelegate mCompatDelegate; 60 61 public static final String EXTRA_NEW_LOCAL_PROFILE = "newLocalProfile"; 62 63 @Override 64 protected void onCreate(Bundle savedInstanceState) { 65 mCompatDelegate = AppCompatDelegate.create(this, null); 66 67 super.onCreate(savedInstanceState); 68 mCompatDelegate.onCreate(savedInstanceState); 69 70 71 final ActionBar actionBar = mCompatDelegate.getSupportActionBar(); 72 if (actionBar != null) { 73 actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP); 74 } 75 76 mProviderStatusWatcher = ProviderStatusWatcher.getInstance(this); 77 78 mNewLocalProfileExtra = getIntent().getStringExtra(EXTRA_NEW_LOCAL_PROFILE); 79 final int providerStatus = mProviderStatusWatcher.getProviderStatus(); 80 mAreContactsAvailable = providerStatus == ProviderStatus.STATUS_NORMAL; 81 82 if (savedInstanceState == null) { 83 final DisplayOptionsPreferenceFragment fragment = DisplayOptionsPreferenceFragment 84 .newInstance(mNewLocalProfileExtra, mAreContactsAvailable); 85 getFragmentManager().beginTransaction() 86 .replace(android.R.id.content, fragment, TAG_DISPLAY_OPTIONS) 87 .commit(); 88 setActivityTitle(R.string.activity_title_settings); 89 } else { 90 final AboutPreferenceFragment aboutFragment = (AboutPreferenceFragment) 91 getFragmentManager().findFragmentByTag(TAG_ABOUT); 92 93 if (aboutFragment != null) { 94 setActivityTitle(R.string.setting_about); 95 } else { 96 setActivityTitle(R.string.activity_title_settings); 97 } 98 } 99 } 100 101 @Override 102 protected void onPostCreate(Bundle savedInstanceState) { 103 super.onPostCreate(savedInstanceState); 104 mCompatDelegate.onPostCreate(savedInstanceState); 105 } 106 107 public void setSupportActionBar(Toolbar toolbar) { 108 mCompatDelegate.setSupportActionBar(toolbar); 109 } 110 111 @NonNull 112 @Override 113 public MenuInflater getMenuInflater() { 114 return mCompatDelegate.getMenuInflater(); 115 } 116 117 @Override 118 public void setContentView(@LayoutRes int layoutRes) { 119 mCompatDelegate.setContentView(layoutRes); 120 } 121 122 @Override 123 public void setContentView(View view) { 124 mCompatDelegate.setContentView(view); 125 } 126 127 @Override 128 public void setContentView(View view, ViewGroup.LayoutParams params) { 129 mCompatDelegate.setContentView(view, params); 130 } 131 132 @Override 133 public void addContentView(View view, ViewGroup.LayoutParams params) { 134 mCompatDelegate.addContentView(view, params); 135 } 136 137 @Override 138 protected void onPostResume() { 139 super.onPostResume(); 140 mCompatDelegate.onPostResume(); 141 } 142 143 @Override 144 protected void onTitleChanged(CharSequence title, int color) { 145 super.onTitleChanged(title, color); 146 mCompatDelegate.setTitle(title); 147 } 148 149 @Override 150 public void onConfigurationChanged(Configuration newConfig) { 151 super.onConfigurationChanged(newConfig); 152 mCompatDelegate.onConfigurationChanged(newConfig); 153 } 154 155 @Override 156 protected void onDestroy() { 157 super.onDestroy(); 158 mCompatDelegate.onDestroy(); 159 } 160 161 @Override 162 public void invalidateOptionsMenu() { 163 mCompatDelegate.invalidateOptionsMenu(); 164 } 165 166 protected void showAboutFragment() { 167 getFragmentManager().beginTransaction() 168 .replace(android.R.id.content, AboutPreferenceFragment.newInstance(), TAG_ABOUT) 169 .addToBackStack(null) 170 .commit(); 171 setActivityTitle(R.string.setting_about); 172 } 173 174 @Override 175 public boolean onOptionsItemSelected(MenuItem item) { 176 if (item.getItemId() == android.R.id.home) { 177 onBackPressed(); 178 return true; 179 } 180 return false; 181 } 182 183 @Override 184 public void onBackPressed() { 185 if (getFragmentManager().getBackStackEntryCount() > 0) { 186 setActivityTitle(R.string.activity_title_settings); 187 getFragmentManager().popBackStack(); 188 } else { 189 super.onBackPressed(); 190 } 191 } 192 193 private void setActivityTitle(@StringRes int res) { 194 final ActionBar actionBar = mCompatDelegate.getSupportActionBar(); 195 if (actionBar != null) { 196 actionBar.setTitle(res); 197 } 198 } 199 200 @Override 201 public void onProfileLoaded(Cursor cursor) { 202 boolean hasProfile = false; 203 String displayName = null; 204 long contactId = -1; 205 if (cursor != null && cursor.moveToFirst()) { 206 hasProfile = cursor.getInt(ProfileQuery.CONTACT_IS_USER_PROFILE) == 1; 207 displayName = cursor.getString(ProfileQuery.CONTACT_DISPLAY_NAME); 208 contactId = cursor.getLong(ProfileQuery.CONTACT_ID); 209 } 210 if (hasProfile && TextUtils.isEmpty(displayName)) { 211 displayName = getString(R.string.missing_name); 212 } 213 final DisplayOptionsPreferenceFragment fragment = (DisplayOptionsPreferenceFragment) 214 getFragmentManager().findFragmentByTag(TAG_DISPLAY_OPTIONS); 215 fragment.updateMyInfoPreference(hasProfile, displayName, contactId); 216 } 217 218 @Override 219 public void onAccountChosen(AccountWithDataSet account, Bundle extraArgs) { 220 AccountSelectionUtil.doImport(this, extraArgs.getInt(ImportDialogFragment 221 .KEY_RES_ID), account, extraArgs.getInt(ImportDialogFragment.KEY_SUBSCRIPTION_ID)); 222 } 223 224 @Override 225 public void onAccountSelectorCancelled() { 226 } 227} 228