| /* |
| * Copyright (C) 2013 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.settings; |
| |
| import android.content.ComponentName; |
| import android.content.Context; |
| import android.content.DialogInterface; |
| import android.content.Intent; |
| import android.content.pm.ApplicationInfo; |
| import android.content.pm.PackageManager; |
| import android.graphics.drawable.Drawable; |
| import android.os.Bundle; |
| import android.provider.Telephony.Sms.Intents; |
| import android.telephony.TelephonyManager; |
| import android.text.TextUtils; |
| import android.view.LayoutInflater; |
| import android.view.View; |
| import android.view.ViewGroup; |
| import android.widget.BaseAdapter; |
| import android.widget.ImageView; |
| import android.widget.TextView; |
| |
| import com.android.internal.app.AlertActivity; |
| import com.android.internal.app.AlertController; |
| import com.android.internal.telephony.SmsApplication; |
| import com.android.internal.telephony.SmsApplication.SmsApplicationData; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| public final class SmsDefaultDialog extends AlertActivity implements |
| DialogInterface.OnClickListener { |
| private SmsApplicationData mNewSmsApplicationData; |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| |
| Intent intent = getIntent(); |
| String packageName = intent.getStringExtra(Intents.EXTRA_PACKAGE_NAME); |
| |
| setResult(RESULT_CANCELED); |
| if (!buildDialog(packageName)) { |
| finish(); |
| } |
| } |
| |
| @Override |
| public void onClick(DialogInterface dialog, int which) { |
| switch (which) { |
| case BUTTON_POSITIVE: |
| SmsApplication.setDefaultApplication(mNewSmsApplicationData.mPackageName, this); |
| setResult(RESULT_OK); |
| break; |
| case BUTTON_NEGATIVE: |
| break; |
| default: |
| if (which >= 0) { |
| AppListAdapter adapter = (AppListAdapter) mAlertParams.mAdapter; |
| if (!adapter.isSelected(which)) { |
| String packageName = adapter.getPackageName(which); |
| if (!TextUtils.isEmpty(packageName)) { |
| SmsApplication.setDefaultApplication(packageName, this); |
| setResult(RESULT_OK); |
| } |
| } |
| } |
| break; |
| } |
| } |
| |
| private boolean buildDialog(String packageName) { |
| TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); |
| if (!tm.isSmsCapable()) { |
| // No phone, no SMS |
| return false; |
| } |
| final AlertController.AlertParams p = mAlertParams; |
| p.mTitle = getString(R.string.sms_change_default_dialog_title); |
| mNewSmsApplicationData = SmsApplication.getSmsApplicationData(packageName, this); |
| if (mNewSmsApplicationData != null) { |
| // New default SMS app specified, change to that directly after the confirmation |
| // dialog. |
| SmsApplicationData oldSmsApplicationData = null; |
| ComponentName oldSmsComponent = SmsApplication.getDefaultSmsApplication(this, true); |
| if (oldSmsComponent != null) { |
| oldSmsApplicationData = SmsApplication.getSmsApplicationData( |
| oldSmsComponent.getPackageName(), this); |
| if (oldSmsApplicationData.mPackageName.equals( |
| mNewSmsApplicationData.mPackageName)) { |
| return false; |
| } |
| } |
| |
| // Compose dialog; get |
| if (oldSmsApplicationData != null) { |
| p.mMessage = getString(R.string.sms_change_default_dialog_text, |
| mNewSmsApplicationData.mApplicationName, |
| oldSmsApplicationData.mApplicationName); |
| } else { |
| p.mMessage = getString(R.string.sms_change_default_no_previous_dialog_text, |
| mNewSmsApplicationData.mApplicationName); |
| } |
| p.mPositiveButtonText = getString(R.string.yes); |
| p.mNegativeButtonText = getString(R.string.no); |
| p.mPositiveButtonListener = this; |
| p.mNegativeButtonListener = this; |
| } else { |
| // No new default SMS app specified, show a list of all SMS apps and let user to pick |
| p.mAdapter = new AppListAdapter(); |
| p.mOnClickListener = this; |
| p.mNegativeButtonText = getString(R.string.cancel); |
| p.mNegativeButtonListener = this; |
| } |
| setupAlert(); |
| |
| return true; |
| } |
| |
| /** |
| * The list of SMS apps with label, icon. Current default SMS app is marked as "default". |
| */ |
| private class AppListAdapter extends BaseAdapter { |
| /** |
| * SMS app item in the list |
| */ |
| private class Item { |
| final String label; // app label |
| final Drawable icon; // app icon |
| final String packgeName; // full app package name |
| |
| public Item(String label, Drawable icon, String packageName) { |
| this.label = label; |
| this.icon = icon; |
| this.packgeName = packageName; |
| } |
| } |
| |
| // The list |
| private final List<Item> mItems; |
| // The index of selected |
| private final int mSelectedIndex; |
| |
| public AppListAdapter() { |
| mItems = getItems(); |
| int selected = getSelectedIndex(); |
| // Move selected up to the top so it is easy to find |
| if (selected > 0) { |
| Item item = mItems.remove(selected); |
| mItems.add(0, item); |
| selected = 0; |
| } |
| mSelectedIndex = selected; |
| } |
| |
| @Override |
| public int getCount() { |
| return mItems != null ? mItems.size() : 0; |
| } |
| |
| @Override |
| public Object getItem(int position) { |
| return mItems != null && position < mItems.size() ? mItems.get(position) : null; |
| } |
| |
| @Override |
| public long getItemId(int position) { |
| return position; |
| } |
| |
| @Override |
| public View getView(int position, View convertView, ViewGroup parent) { |
| Item item = ((Item) getItem(position)); |
| LayoutInflater inflater = getLayoutInflater(); |
| View view = inflater.inflate(R.layout.app_preference_item, parent, false); |
| TextView textView = (TextView) view.findViewById(android.R.id.title); |
| textView.setText(item.label); |
| if (position == mSelectedIndex) { |
| view.findViewById(R.id.default_label).setVisibility(View.VISIBLE); |
| } else { |
| view.findViewById(R.id.default_label).setVisibility(View.GONE); |
| } |
| ImageView imageView = (ImageView)view.findViewById(android.R.id.icon); |
| imageView.setImageDrawable(item.icon); |
| return view; |
| } |
| |
| /** |
| * Get the selected package name by |
| * |
| * @param position the index of the item in the list |
| * @return the package name of selected item |
| */ |
| public String getPackageName(int position) { |
| Item item = (Item) getItem(position); |
| if (item != null) { |
| return item.packgeName; |
| } |
| return null; |
| } |
| |
| /** |
| * Check if an item at a position is already selected |
| * |
| * @param position the index of the item in the list |
| * @return true if the item at the position is already selected, false otherwise |
| */ |
| public boolean isSelected(int position) { |
| return position == mSelectedIndex; |
| } |
| |
| // Get the list items by looking for SMS apps |
| private List<Item> getItems() { |
| PackageManager pm = getPackageManager(); |
| List<Item> items = new ArrayList<>(); |
| for (SmsApplication.SmsApplicationData app : |
| SmsApplication.getApplicationCollection(SmsDefaultDialog.this)) { |
| try { |
| String packageName = app.mPackageName; |
| ApplicationInfo appInfo = pm.getApplicationInfo(packageName, 0/*flags*/); |
| if (appInfo != null) { |
| items.add(new Item( |
| appInfo.loadLabel(pm).toString(), |
| appInfo.loadIcon(pm), |
| packageName)); |
| } |
| } catch (PackageManager.NameNotFoundException e) { |
| // Ignore package can't be found |
| } |
| } |
| return items; |
| } |
| |
| // Get the selected item index by looking for the current default SMS app |
| private int getSelectedIndex() { |
| ComponentName appName = SmsApplication.getDefaultSmsApplication( |
| SmsDefaultDialog.this, true); |
| if (appName != null) { |
| String defaultSmsAppPackageName = appName.getPackageName(); |
| if (!TextUtils.isEmpty(defaultSmsAppPackageName)) { |
| for (int i = 0; i < mItems.size(); i++) { |
| if (TextUtils.equals(mItems.get(i).packgeName, defaultSmsAppPackageName)) { |
| return i; |
| } |
| } |
| } |
| } |
| return -1; |
| } |
| } |
| } |