110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian/*
210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * Copyright (C) 2017 The Android Open Source Project
310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian *
410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License");
510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * you may not use this file except in compliance with the License.
610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * You may obtain a copy of the License at
710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian *
810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian *      http://www.apache.org/licenses/LICENSE-2.0
910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian *
1010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * Unless required by applicable law or agreed to in writing, software
1110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS,
1210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * See the License for the specific language governing permissions and
1410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * limitations under the License
1510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian */
1610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian
1710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianpackage com.android.dialer.app.settings;
1810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian
1910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.app.Fragment;
2010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.content.Context;
2110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.graphics.drawable.Icon;
2210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.os.Bundle;
2310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.preference.Preference;
2410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.preference.PreferenceActivity;
2510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.preference.PreferenceFragment;
2610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.preference.PreferenceScreen;
2710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.support.annotation.VisibleForTesting;
2810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.telecom.PhoneAccount;
2910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.telecom.PhoneAccountHandle;
3010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.telecom.TelecomManager;
3110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport java.util.List;
3210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian
3310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian/**
3410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * Preference screen that lists SIM phone accounts to select from, and forwards the selected account
3510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * to {@link #PARAM_TARGET_FRAGMENT}. Can only be used in a {@link PreferenceActivity}
3610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian */
3710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianpublic class PhoneAccountSelectionFragment extends PreferenceFragment {
3810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian
3910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  /** The {@link PreferenceFragment} to launch after the account is selected. */
4010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  public static final String PARAM_TARGET_FRAGMENT = "target_fragment";
4110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian
4210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  /**
4310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian   * The arguments bundle to pass to the {@link #PARAM_TARGET_FRAGMENT}
4410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian   *
4510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian   * @see Fragment#getArguments()
4610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian   */
4710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  public static final String PARAM_ARGUMENTS = "arguments";
4810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian
4910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  /**
5010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian   * The key to insert the selected {@link PhoneAccountHandle} to bundle in {@link #PARAM_ARGUMENTS}
5110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian   */
5210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  public static final String PARAM_PHONE_ACCOUNT_HANDLE_KEY = "phone_account_handle_key";
5310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian
5410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  /**
5510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian   * The title of the {@link #PARAM_TARGET_FRAGMENT} once it is launched with {@link
5610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian   * PreferenceActivity#startWithFragment(String, Bundle, Fragment, int)}, as a string resource ID.
5710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian   */
5810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  public static final String PARAM_TARGET_TITLE_RES = "target_title_res";
5910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian
6010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  private String targetFragment;
6110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  private Bundle arguments;
6210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  private String phoneAccountHandleKey;
6310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  private int titleRes;
6410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian
6510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  @Override
6610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  public void onCreate(Bundle savedInstanceState) {
6710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    super.onCreate(savedInstanceState);
6810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    targetFragment = getArguments().getString(PARAM_TARGET_FRAGMENT);
6910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    arguments = new Bundle();
7010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    arguments.putAll(getArguments().getBundle(PARAM_ARGUMENTS));
7110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    phoneAccountHandleKey = getArguments().getString(PARAM_PHONE_ACCOUNT_HANDLE_KEY);
7210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    titleRes = getArguments().getInt(PARAM_TARGET_TITLE_RES, 0);
7310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  }
7410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian
7510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  final class AccountPreference extends Preference {
7610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    private final PhoneAccountHandle phoneAccountHandle;
7710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian
7810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    public AccountPreference(
7910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian        Context context, PhoneAccountHandle phoneAccountHandle, PhoneAccount phoneAccount) {
8010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian      super(context);
8110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian      this.phoneAccountHandle = phoneAccountHandle;
8210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian      setTitle(phoneAccount.getLabel());
8310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian      setSummary(phoneAccount.getShortDescription());
8410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian      Icon icon = phoneAccount.getIcon();
8510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian      if (icon != null) {
8610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian        setIcon(icon.loadDrawable(context));
8710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian      }
8810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    }
8910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian
9010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    @VisibleForTesting
9110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    void click() {
9210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian      onClick();
9310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    }
9410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian
9510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    @Override
9610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    protected void onClick() {
9710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian      super.onClick();
9810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian      PreferenceActivity preferenceActivity = (PreferenceActivity) getActivity();
9910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian      arguments.putParcelable(phoneAccountHandleKey, phoneAccountHandle);
10010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian      preferenceActivity.startWithFragment(targetFragment, arguments, null, 0, titleRes, 0);
10110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    }
10210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  }
10310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian
10410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  @Override
10510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  public void onResume() {
10610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    super.onResume();
10710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext()));
10810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    PreferenceScreen screen = getPreferenceScreen();
10910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian
11010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    TelecomManager telecomManager = getContext().getSystemService(TelecomManager.class);
11110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian
11210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    List<PhoneAccountHandle> accountHandles = telecomManager.getCallCapablePhoneAccounts();
11310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian
11410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    Context context = getActivity();
11510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    for (PhoneAccountHandle handle : accountHandles) {
11610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian      PhoneAccount account = telecomManager.getPhoneAccount(handle);
11710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian      if (account != null) {
11810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian        final boolean isSimAccount =
11910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian            0 != (account.getCapabilities() & PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION);
12010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian        if (isSimAccount) {
12110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian          screen.addPreference(new AccountPreference(context, handle, account));
12210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian        }
12310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian      }
12410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    }
12510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian  }
12610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian}
127