1 package com.android.dialer.settings; 2 3 import com.google.common.collect.Lists; 4 5 import android.content.Context; 6 import android.content.SharedPreferences; 7 import android.os.Bundle; 8 import android.os.UserHandle; 9 import android.os.UserManager; 10 import android.preference.PreferenceManager; 11 import android.preference.PreferenceActivity.Header; 12 import android.text.TextUtils; 13 import android.view.LayoutInflater; 14 import android.view.MenuItem; 15 import android.view.View; 16 import android.view.ViewGroup; 17 import android.widget.ArrayAdapter; 18 import android.widget.ImageView; 19 import android.widget.ListAdapter; 20 import android.widget.TextView; 21 22 import com.android.dialer.DialtactsActivity; 23 import com.android.dialer.R; 24 import com.android.dialerbind.analytics.AnalyticsPreferenceActivity; 25 26 import java.util.List; 27 28 public class DialerSettingsActivity extends AnalyticsPreferenceActivity { 29 30 protected SharedPreferences mPreferences; 31 private HeaderAdapter mHeaderAdapter; 32 33 private static final int OWNER_HANDLE_ID = 0; 34 35 @Override onCreate(Bundle savedInstanceState)36 protected void onCreate(Bundle savedInstanceState) { 37 super.onCreate(savedInstanceState); 38 mPreferences = PreferenceManager.getDefaultSharedPreferences(this); 39 } 40 41 @Override onBuildHeaders(List<Header> target)42 public void onBuildHeaders(List<Header> target) { 43 final Header generalSettingsHeader = new Header(); 44 generalSettingsHeader.titleRes = R.string.general_settings_label; 45 generalSettingsHeader.summaryRes = R.string.general_settings_description; 46 generalSettingsHeader.fragment = GeneralSettingsFragment.class.getName(); 47 target.add(generalSettingsHeader); 48 49 // Only add the call settings header if the current user is the primary/owner user. 50 if (isPrimaryUser()) { 51 final Header callSettingHeader = new Header(); 52 callSettingHeader.titleRes = R.string.call_settings_label; 53 callSettingHeader.summaryRes = R.string.call_settings_description; 54 callSettingHeader.intent = DialtactsActivity.getCallSettingsIntent(); 55 target.add(callSettingHeader); 56 } 57 } 58 59 @Override onOptionsItemSelected(MenuItem item)60 public boolean onOptionsItemSelected(MenuItem item) { 61 if (item.getItemId() == android.R.id.home) { 62 onBackPressed(); 63 return true; 64 } 65 return false; 66 } 67 68 @Override isValidFragment(String fragmentName)69 protected boolean isValidFragment(String fragmentName) { 70 return true; 71 } 72 73 @Override setListAdapter(ListAdapter adapter)74 public void setListAdapter(ListAdapter adapter) { 75 if (adapter == null) { 76 super.setListAdapter(null); 77 } else { 78 // We don't have access to the hidden getHeaders() method, so grab the headers from 79 // the intended adapter and then replace it with our own. 80 int headerCount = adapter.getCount(); 81 List<Header> headers = Lists.newArrayList(); 82 for (int i = 0; i < headerCount; i++) { 83 headers.add((Header) adapter.getItem(i)); 84 } 85 mHeaderAdapter = new HeaderAdapter(this, headers); 86 super.setListAdapter(mHeaderAdapter); 87 } 88 } 89 90 /** 91 * Whether a user handle associated with the current user is that of the primary owner. That is, 92 * whether there is a user handle which has an id which matches the owner's handle. 93 * @return Whether the current user is the primary user. 94 */ isPrimaryUser()95 private boolean isPrimaryUser() { 96 UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE); 97 List<UserHandle> userHandles = userManager.getUserProfiles(); 98 for (int i = 0; i < userHandles.size(); i++){ 99 if (userHandles.get(i).myUserId() == OWNER_HANDLE_ID) { 100 return true; 101 } 102 } 103 104 return false; 105 } 106 107 /** 108 * This custom {@code ArrayAdapter} is mostly identical to the equivalent one in 109 * {@code PreferenceActivity}, except with a local layout resource. 110 */ 111 private static class HeaderAdapter extends ArrayAdapter<Header> { 112 static class HeaderViewHolder { 113 TextView title; 114 TextView summary; 115 } 116 117 private LayoutInflater mInflater; 118 HeaderAdapter(Context context, List<Header> objects)119 public HeaderAdapter(Context context, List<Header> objects) { 120 super(context, 0, objects); 121 mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 122 } 123 124 @Override getView(int position, View convertView, ViewGroup parent)125 public View getView(int position, View convertView, ViewGroup parent) { 126 HeaderViewHolder holder; 127 View view; 128 129 if (convertView == null) { 130 view = mInflater.inflate(R.layout.dialer_preferences, parent, false); 131 holder = new HeaderViewHolder(); 132 holder.title = (TextView) view.findViewById(R.id.title); 133 holder.summary = (TextView) view.findViewById(R.id.summary); 134 view.setTag(holder); 135 } else { 136 view = convertView; 137 holder = (HeaderViewHolder) view.getTag(); 138 } 139 140 // All view fields must be updated every time, because the view may be recycled 141 Header header = getItem(position); 142 holder.title.setText(header.getTitle(getContext().getResources())); 143 CharSequence summary = header.getSummary(getContext().getResources()); 144 if (!TextUtils.isEmpty(summary)) { 145 holder.summary.setVisibility(View.VISIBLE); 146 holder.summary.setText(summary); 147 } else { 148 holder.summary.setVisibility(View.GONE); 149 } 150 return view; 151 } 152 } 153 } 154