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