1a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn/* 2a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * Copyright (C) 2015 The Android Open Source Project 3a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * 4a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * Licensed under the Apache License, Version 2.0 (the "License"); 5a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * you may not use this file except in compliance with the License. 6a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * You may obtain a copy of the License at 7a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * 8a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * http://www.apache.org/licenses/LICENSE-2.0 9a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * 10a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * Unless required by applicable law or agreed to in writing, software 11a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * distributed under the License is distributed on an "AS IS" BASIS, 12a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * See the License for the specific language governing permissions and 14a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * limitations under the License 15a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn */ 16a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 17a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnpackage com.android.contacts.common.dialog; 18a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 196510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunnimport android.animation.Animator; 206510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunnimport android.animation.AnimatorListenerAdapter; 21a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport android.app.Activity; 22a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport android.content.Context; 23a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport android.content.Intent; 24c35d396656363774843c84bd138e9f23367a5567Tyler Gunnimport android.content.SharedPreferences; 25a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport android.net.Uri; 26a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport android.os.Bundle; 276510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunnimport android.os.Handler; 286510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunnimport android.os.Looper; 296510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunnimport android.os.Message; 306510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunnimport android.os.ResultReceiver; 31c35d396656363774843c84bd138e9f23367a5567Tyler Gunnimport android.preference.PreferenceManager; 32a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport android.telecom.PhoneAccountHandle; 33a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport android.telecom.TelecomManager; 34a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport android.text.Editable; 35c35d396656363774843c84bd138e9f23367a5567Tyler Gunnimport android.text.InputFilter; 36a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport android.text.TextUtils; 37a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport android.text.TextWatcher; 38a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport android.util.Log; 39a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport android.view.View; 40a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport android.view.ViewGroup; 416510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunnimport android.view.ViewTreeObserver; 42c35d396656363774843c84bd138e9f23367a5567Tyler Gunnimport android.view.WindowManager; 43c35d396656363774843c84bd138e9f23367a5567Tyler Gunnimport android.view.inputmethod.InputMethodManager; 446510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunnimport android.widget.AdapterView; 456510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunnimport android.widget.ArrayAdapter; 46a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport android.widget.EditText; 476510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunnimport android.widget.ListView; 48a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport android.widget.QuickContactBadge; 49a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport android.widget.TextView; 50a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 51a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport com.android.contacts.common.CallUtil; 52a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport com.android.contacts.common.ContactPhotoManager; 53a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport com.android.contacts.common.R; 54a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunnimport com.android.contacts.common.util.UriUtils; 556510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunnimport com.android.phone.common.animation.AnimUtils; 56a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 57c35d396656363774843c84bd138e9f23367a5567Tyler Gunnimport java.util.ArrayList; 58c35d396656363774843c84bd138e9f23367a5567Tyler Gunnimport java.util.List; 59c35d396656363774843c84bd138e9f23367a5567Tyler Gunn 60a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn/** 616510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn * Implements a dialog which prompts for a call subject for an outgoing call. The dialog includes 626510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn * a pop up list of historical call subjects. 63a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn */ 646510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunnpublic class CallSubjectDialog extends Activity { 65a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private static final String TAG = "CallSubjectDialog"; 66a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private static final int CALL_SUBJECT_LIMIT = 16; 67c35d396656363774843c84bd138e9f23367a5567Tyler Gunn private static final int CALL_SUBJECT_HISTORY_SIZE = 5; 68c35d396656363774843c84bd138e9f23367a5567Tyler Gunn 69c35d396656363774843c84bd138e9f23367a5567Tyler Gunn private static final int REQUEST_SUBJECT = 1001; 70c35d396656363774843c84bd138e9f23367a5567Tyler Gunn 71c35d396656363774843c84bd138e9f23367a5567Tyler Gunn public static final String PREF_KEY_SUBJECT_HISTORY_COUNT = "subject_history_count"; 72c35d396656363774843c84bd138e9f23367a5567Tyler Gunn public static final String PREF_KEY_SUBJECT_HISTORY_ITEM = "subject_history_item"; 73a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 74a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn /** 756510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn * Activity intent argument bundle keys: 76a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn */ 77c35d396656363774843c84bd138e9f23367a5567Tyler Gunn public static final String ARG_PHOTO_ID = "PHOTO_ID"; 78c35d396656363774843c84bd138e9f23367a5567Tyler Gunn public static final String ARG_PHOTO_URI = "PHOTO_URI"; 79c35d396656363774843c84bd138e9f23367a5567Tyler Gunn public static final String ARG_CONTACT_URI = "CONTACT_URI"; 80c35d396656363774843c84bd138e9f23367a5567Tyler Gunn public static final String ARG_NAME_OR_NUMBER = "NAME_OR_NUMBER"; 81c35d396656363774843c84bd138e9f23367a5567Tyler Gunn public static final String ARG_IS_BUSINESS = "IS_BUSINESS"; 82c35d396656363774843c84bd138e9f23367a5567Tyler Gunn public static final String ARG_NUMBER = "NUMBER"; 83c35d396656363774843c84bd138e9f23367a5567Tyler Gunn public static final String ARG_DISPLAY_NUMBER = "DISPLAY_NUMBER"; 84c35d396656363774843c84bd138e9f23367a5567Tyler Gunn public static final String ARG_NUMBER_LABEL = "NUMBER_LABEL"; 85c35d396656363774843c84bd138e9f23367a5567Tyler Gunn public static final String ARG_PHONE_ACCOUNT_HANDLE = "PHONE_ACCOUNT_HANDLE"; 86a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 876510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn private int mAnimationDuration; 886510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn private View mBackgroundView; 896510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn private View mDialogView; 90a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private QuickContactBadge mContactPhoto; 91a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private TextView mNameView; 92a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private TextView mNumberView; 93a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private EditText mCallSubjectView; 94a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private TextView mCharacterLimitView; 95a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private View mHistoryButton; 96a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private View mSendAndCallButton; 976510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn private ListView mSubjectList; 98a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 99a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private int mLimit = CALL_SUBJECT_LIMIT; 100a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private int mPhotoSize; 101c35d396656363774843c84bd138e9f23367a5567Tyler Gunn private SharedPreferences mPrefs; 102c35d396656363774843c84bd138e9f23367a5567Tyler Gunn private List<String> mSubjectHistory; 103a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 104a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private long mPhotoID; 105a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private Uri mPhotoUri; 106a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private Uri mContactUri; 107a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private String mNameOrNumber; 108a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private boolean mIsBusiness; 109a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private String mNumber; 110a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private String mDisplayNumber; 111a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private String mNumberLabel; 112a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private PhoneAccountHandle mPhoneAccountHandle; 113a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 114a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn /** 115a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * Handles changes to the text in the subject box. Ensures the character limit is updated. 116a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn */ 117a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private final TextWatcher mTextWatcher = new TextWatcher() { 118a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn @Override 119a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn public void beforeTextChanged(CharSequence s, int start, int count, int after) { 120a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn // no-op 121a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } 122a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 123a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn @Override 124a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn public void onTextChanged(CharSequence s, int start, int before, int count) { 125a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn updateCharacterLimit(); 126a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } 127a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 128a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn @Override 129a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn public void afterTextChanged(Editable s) { 130a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn // no-op 131a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } 132a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn }; 133a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 134a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn /** 1356510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn * Click listener which handles user clicks outside of the dialog. 1366510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn */ 1376510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn private View.OnClickListener mBackgroundListener = new View.OnClickListener() { 1386510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn @Override 1396510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn public void onClick(View v) { 1406510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn finish(); 1416510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn } 1426510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn }; 1436510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn 1446510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn /** 145a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * Handles displaying the list of past call subjects. 146a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn */ 147a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private final View.OnClickListener mHistoryOnClickListener = new View.OnClickListener() { 148a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn @Override 149a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn public void onClick(View v) { 1506510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn hideSoftKeyboard(CallSubjectDialog.this, mCallSubjectView); 1516510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn showCallHistory(mSubjectList.getVisibility() == View.GONE); 152a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } 153a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn }; 154a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 155a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn /** 156a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * Handles starting a call with a call subject specified. 157a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn */ 158a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private final View.OnClickListener mSendAndCallOnClickListener = new View.OnClickListener() { 159a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn @Override 160a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn public void onClick(View v) { 161c35d396656363774843c84bd138e9f23367a5567Tyler Gunn String subject = mCallSubjectView.getText().toString(); 162a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn Intent intent = CallUtil.getCallWithSubjectIntent(mNumber, mPhoneAccountHandle, 163c35d396656363774843c84bd138e9f23367a5567Tyler Gunn subject); 164a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 165a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn final TelecomManager tm = 1666510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn (TelecomManager) getSystemService(Context.TELECOM_SERVICE); 167a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn tm.placeCall(intent.getData(), intent.getExtras()); 168c35d396656363774843c84bd138e9f23367a5567Tyler Gunn 169c35d396656363774843c84bd138e9f23367a5567Tyler Gunn mSubjectHistory.add(subject); 170c35d396656363774843c84bd138e9f23367a5567Tyler Gunn saveSubjectHistory(mSubjectHistory); 1716510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn finish(); 172a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } 173a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn }; 174a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 175a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn /** 1766510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn * Handles auto-hiding the call history when user clicks in the call subject field to give it 1776510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn * focus. 1786510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn */ 1796510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn private final View.OnClickListener mCallSubjectClickListener = new View.OnClickListener() { 1806510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn @Override 1816510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn public void onClick(View v) { 1826510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn if (mSubjectList.getVisibility() == View.VISIBLE) { 1836510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn showCallHistory(false); 1846510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn } 1856510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn } 1866510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn }; 1876510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn 1886510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn /** 1896510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn * Item click listener which handles user clicks on the items in the list view. Dismisses 1906510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn * the activity, returning the subject to the caller and closing the activity with the 1916510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn * {@link Activity#RESULT_OK} result code. 1926510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn */ 1936510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn private AdapterView.OnItemClickListener mItemClickListener = 1946510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn new AdapterView.OnItemClickListener() { 1956510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn @Override 1966510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) { 1976510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mCallSubjectView.setText(mSubjectHistory.get(position)); 1986510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn showCallHistory(false); 1996510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn } 2006510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn }; 2016510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn 2026510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn /** 203c35d396656363774843c84bd138e9f23367a5567Tyler Gunn * Show the call subhect dialog given a phone number to dial (e.g. from the dialpad). 204c35d396656363774843c84bd138e9f23367a5567Tyler Gunn * 205c35d396656363774843c84bd138e9f23367a5567Tyler Gunn * @param activity The activity. 206c35d396656363774843c84bd138e9f23367a5567Tyler Gunn * @param number The number to dial. 207c35d396656363774843c84bd138e9f23367a5567Tyler Gunn */ 208c35d396656363774843c84bd138e9f23367a5567Tyler Gunn public static void start(Activity activity, String number) { 209c35d396656363774843c84bd138e9f23367a5567Tyler Gunn start(activity, 210c35d396656363774843c84bd138e9f23367a5567Tyler Gunn -1 /* photoId */, 211c35d396656363774843c84bd138e9f23367a5567Tyler Gunn null /* photoUri */, 212c35d396656363774843c84bd138e9f23367a5567Tyler Gunn null /* contactUri */, 213c35d396656363774843c84bd138e9f23367a5567Tyler Gunn number /* nameOrNumber */, 214c35d396656363774843c84bd138e9f23367a5567Tyler Gunn false /* isBusiness */, 215c35d396656363774843c84bd138e9f23367a5567Tyler Gunn number /* number */, 216c35d396656363774843c84bd138e9f23367a5567Tyler Gunn null /* displayNumber */, 217c35d396656363774843c84bd138e9f23367a5567Tyler Gunn null /* numberLabel */, 218c35d396656363774843c84bd138e9f23367a5567Tyler Gunn null /* phoneAccountHandle */); 219c35d396656363774843c84bd138e9f23367a5567Tyler Gunn } 220c35d396656363774843c84bd138e9f23367a5567Tyler Gunn 221c35d396656363774843c84bd138e9f23367a5567Tyler Gunn /** 222a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * Creates a call subject dialog. 223a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * 224a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * @param activity The current activity. 225a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * @param photoId The photo ID (used to populate contact photo). 226a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * @param photoUri The photo Uri (used to populate contact photo). 227a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * @param contactUri The Contact URI (used so quick contact can be invoked from contact photo). 228a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * @param nameOrNumber The name or number of the callee. 229a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * @param isBusiness {@code true} if a business is being called (used for contact photo). 230a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * @param number The raw number to dial. 231a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * @param displayNumber The number to dial, formatted for display. 232a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * @param numberLabel The label for the number (if from a contact). 233a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * @param phoneAccountHandle The phone account handle. 234a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn */ 235a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn public static void start(Activity activity, long photoId, Uri photoUri, Uri contactUri, 236a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn String nameOrNumber, boolean isBusiness, String number, String displayNumber, 237a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn String numberLabel, PhoneAccountHandle phoneAccountHandle) { 238a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn Bundle arguments = new Bundle(); 239a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn arguments.putLong(ARG_PHOTO_ID, photoId); 240a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn arguments.putParcelable(ARG_PHOTO_URI, photoUri); 241a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn arguments.putParcelable(ARG_CONTACT_URI, contactUri); 242a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn arguments.putString(ARG_NAME_OR_NUMBER, nameOrNumber); 243a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn arguments.putBoolean(ARG_IS_BUSINESS, isBusiness); 244a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn arguments.putString(ARG_NUMBER, number); 245a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn arguments.putString(ARG_DISPLAY_NUMBER, displayNumber); 246a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn arguments.putString(ARG_NUMBER_LABEL, numberLabel); 247a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn arguments.putParcelable(ARG_PHONE_ACCOUNT_HANDLE, phoneAccountHandle); 248c35d396656363774843c84bd138e9f23367a5567Tyler Gunn start(activity, arguments); 249c35d396656363774843c84bd138e9f23367a5567Tyler Gunn } 250c35d396656363774843c84bd138e9f23367a5567Tyler Gunn 251c35d396656363774843c84bd138e9f23367a5567Tyler Gunn /** 252c35d396656363774843c84bd138e9f23367a5567Tyler Gunn * Shows the call subject dialog given a Bundle containing all the arguments required to 253c35d396656363774843c84bd138e9f23367a5567Tyler Gunn * display the dialog (e.g. from Quick Contacts). 254c35d396656363774843c84bd138e9f23367a5567Tyler Gunn * 255c35d396656363774843c84bd138e9f23367a5567Tyler Gunn * @param activity The activity. 256c35d396656363774843c84bd138e9f23367a5567Tyler Gunn * @param arguments The arguments bundle. 257c35d396656363774843c84bd138e9f23367a5567Tyler Gunn */ 258c35d396656363774843c84bd138e9f23367a5567Tyler Gunn public static void start(Activity activity, Bundle arguments) { 2596510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn Intent intent = new Intent(activity, CallSubjectDialog.class); 2606510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn intent.putExtras(arguments); 2616510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn activity.startActivity(intent); 262a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } 263a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 264a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn /** 265a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * Creates the dialog, inflating the layout and populating it with the name and phone number. 266a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * 267a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * @param savedInstanceState The last saved instance state of the Fragment, 268a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * or null if this is a freshly created Fragment. 269a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * 270a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * @return Dialog instance. 271a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn */ 272a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn @Override 2736510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn public void onCreate(Bundle savedInstanceState) { 2746510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn super.onCreate(savedInstanceState); 2756510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mAnimationDuration = getResources().getInteger(R.integer.call_subject_animation_duration); 2766510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mPrefs = PreferenceManager.getDefaultSharedPreferences(this); 2776510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mPhotoSize = getResources().getDimensionPixelSize( 278a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn R.dimen.call_subject_dialog_contact_photo_size); 279a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn readArguments(); 280c35d396656363774843c84bd138e9f23367a5567Tyler Gunn mSubjectHistory = loadSubjectHistory(mPrefs); 281a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 2826510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn setContentView(R.layout.dialog_call_subject); 2836510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, 2846510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn ViewGroup.LayoutParams.MATCH_PARENT); 2856510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mBackgroundView = findViewById(R.id.call_subject_dialog); 2866510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mBackgroundView.setOnClickListener(mBackgroundListener); 2876510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mDialogView = findViewById(R.id.dialog_view); 2886510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mContactPhoto = (QuickContactBadge) findViewById(R.id.contact_photo); 2896510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mNameView = (TextView) findViewById(R.id.name); 2906510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mNumberView = (TextView) findViewById(R.id.number); 2916510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mCallSubjectView = (EditText) findViewById(R.id.call_subject); 292a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mCallSubjectView.addTextChangedListener(mTextWatcher); 2936510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mCallSubjectView.setOnClickListener(mCallSubjectClickListener); 294c35d396656363774843c84bd138e9f23367a5567Tyler Gunn InputFilter[] filters = new InputFilter[1]; 295c35d396656363774843c84bd138e9f23367a5567Tyler Gunn filters[0] = new InputFilter.LengthFilter(mLimit); 296c35d396656363774843c84bd138e9f23367a5567Tyler Gunn mCallSubjectView.setFilters(filters); 2976510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mCharacterLimitView = (TextView) findViewById(R.id.character_limit); 2986510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mHistoryButton = findViewById(R.id.history_button); 299a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mHistoryButton.setOnClickListener(mHistoryOnClickListener); 300c35d396656363774843c84bd138e9f23367a5567Tyler Gunn mHistoryButton.setVisibility(mSubjectHistory.isEmpty() ? View.GONE : View.VISIBLE); 3016510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mSendAndCallButton = findViewById(R.id.send_and_call_button); 302a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mSendAndCallButton.setOnClickListener(mSendAndCallOnClickListener); 3036510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mSubjectList = (ListView) findViewById(R.id.subject_list); 3046510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mSubjectList.setOnItemClickListener(mItemClickListener); 3056510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mSubjectList.setVisibility(View.GONE); 306a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 307a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn updateContactInfo(); 308a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn updateCharacterLimit(); 309a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } 310a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 311a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn /** 312a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * Populates the contact info fields based on the current contact information. 313a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn */ 314a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private void updateContactInfo() { 315c35d396656363774843c84bd138e9f23367a5567Tyler Gunn if (mContactUri != null) { 316c35d396656363774843c84bd138e9f23367a5567Tyler Gunn setPhoto(mPhotoID, mPhotoUri, mContactUri, mNameOrNumber, mIsBusiness); 317c35d396656363774843c84bd138e9f23367a5567Tyler Gunn } else { 318c35d396656363774843c84bd138e9f23367a5567Tyler Gunn mContactPhoto.setVisibility(View.GONE); 319c35d396656363774843c84bd138e9f23367a5567Tyler Gunn } 320a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mNameView.setText(mNameOrNumber); 321a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn if (!TextUtils.isEmpty(mNumberLabel) && !TextUtils.isEmpty(mDisplayNumber)) { 322a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mNumberView.setVisibility(View.VISIBLE); 3236510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mNumberView.setText(getString(R.string.call_subject_type_and_number, 3246510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mNumberLabel, mDisplayNumber)); 325a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } else { 326a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mNumberView.setVisibility(View.GONE); 327a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mNumberView.setText(null); 328a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } 329a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } 330a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 331a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn /** 332a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * Reads arguments from the fragment arguments and populates the necessary instance variables. 333a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn */ 334a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private void readArguments() { 3356510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn Bundle arguments = getIntent().getExtras(); 336a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn if (arguments == null) { 337a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn Log.e(TAG, "Arguments cannot be null."); 338c35d396656363774843c84bd138e9f23367a5567Tyler Gunn return; 339a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } 340a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mPhotoID = arguments.getLong(ARG_PHOTO_ID); 341a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mPhotoUri = arguments.getParcelable(ARG_PHOTO_URI); 342a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mContactUri = arguments.getParcelable(ARG_CONTACT_URI); 343a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mNameOrNumber = arguments.getString(ARG_NAME_OR_NUMBER); 344a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mIsBusiness = arguments.getBoolean(ARG_IS_BUSINESS); 345a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mNumber = arguments.getString(ARG_NUMBER); 346a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mDisplayNumber = arguments.getString(ARG_DISPLAY_NUMBER); 347a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mNumberLabel = arguments.getString(ARG_NUMBER_LABEL); 348a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mPhoneAccountHandle = arguments.getParcelable(ARG_PHONE_ACCOUNT_HANDLE); 349a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } 350a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 351a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn /** 352a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * Updates the character limit display, coloring the text RED when the limit is reached or 353a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * exceeded. 354a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn */ 355a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private void updateCharacterLimit() { 356a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn int length = mCallSubjectView.length(); 357a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mCharacterLimitView.setText( 3586510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn getString(R.string.call_subject_limit, length, mLimit)); 359a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn if (length >= mLimit) { 3606510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mCharacterLimitView.setTextColor(getResources().getColor( 361a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn R.color.call_subject_limit_exceeded)); 362a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } else { 3636510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mCharacterLimitView.setTextColor(getResources().getColor( 364a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn R.color.dialtacts_secondary_text_color)); 365a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } 366a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } 367a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 368a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn /** 369a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * Sets the photo on the quick contact photo. 370a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * 371a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * @param photoId 372a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * @param photoUri 373a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * @param contactUri 374a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * @param displayName 375a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn * @param isBusiness 376a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn */ 377a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn private void setPhoto(long photoId, Uri photoUri, Uri contactUri, String displayName, 378a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn boolean isBusiness) { 379a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mContactPhoto.assignContactUri(contactUri); 380a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mContactPhoto.setOverlay(null); 381a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 382a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn int contactType; 383a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn if (isBusiness) { 384a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn contactType = ContactPhotoManager.TYPE_BUSINESS; 385a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } else { 386a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn contactType = ContactPhotoManager.TYPE_DEFAULT; 387a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } 388a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 389a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn String lookupKey = null; 390a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn if (contactUri != null) { 391a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn lookupKey = UriUtils.getLookupKeyFromUri(contactUri); 392a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } 393a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 394a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn ContactPhotoManager.DefaultImageRequest 395a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn request = new ContactPhotoManager.DefaultImageRequest( 396a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn displayName, lookupKey, contactType, true /* isCircular */); 397a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn 398a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn if (photoId == 0 && photoUri != null) { 3996510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn ContactPhotoManager.getInstance(this).loadPhoto(mContactPhoto, photoUri, 400a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn mPhotoSize, false /* darkTheme */, true /* isCircular */, request); 401a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } else { 4026510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn ContactPhotoManager.getInstance(this).loadThumbnail(mContactPhoto, photoId, 403a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn false /* darkTheme */, true /* isCircular */, request); 404a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } 405a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn } 406c35d396656363774843c84bd138e9f23367a5567Tyler Gunn 407c35d396656363774843c84bd138e9f23367a5567Tyler Gunn /** 408c35d396656363774843c84bd138e9f23367a5567Tyler Gunn * Loads the subject history from shared preferences. 409c35d396656363774843c84bd138e9f23367a5567Tyler Gunn * 410c35d396656363774843c84bd138e9f23367a5567Tyler Gunn * @param prefs Shared preferences. 411c35d396656363774843c84bd138e9f23367a5567Tyler Gunn * @return List of subject history strings. 412c35d396656363774843c84bd138e9f23367a5567Tyler Gunn */ 413c35d396656363774843c84bd138e9f23367a5567Tyler Gunn public static List<String> loadSubjectHistory(SharedPreferences prefs) { 414c35d396656363774843c84bd138e9f23367a5567Tyler Gunn int historySize = prefs.getInt(PREF_KEY_SUBJECT_HISTORY_COUNT, 0); 415c35d396656363774843c84bd138e9f23367a5567Tyler Gunn List<String> subjects = new ArrayList(historySize); 416c35d396656363774843c84bd138e9f23367a5567Tyler Gunn 417c35d396656363774843c84bd138e9f23367a5567Tyler Gunn for (int ix = 0 ; ix < historySize; ix++) { 418c35d396656363774843c84bd138e9f23367a5567Tyler Gunn String historyItem = prefs.getString(PREF_KEY_SUBJECT_HISTORY_ITEM + ix, null); 419c35d396656363774843c84bd138e9f23367a5567Tyler Gunn if (!TextUtils.isEmpty(historyItem)) { 420c35d396656363774843c84bd138e9f23367a5567Tyler Gunn subjects.add(historyItem); 421c35d396656363774843c84bd138e9f23367a5567Tyler Gunn } 422c35d396656363774843c84bd138e9f23367a5567Tyler Gunn } 423c35d396656363774843c84bd138e9f23367a5567Tyler Gunn 424c35d396656363774843c84bd138e9f23367a5567Tyler Gunn return subjects; 425c35d396656363774843c84bd138e9f23367a5567Tyler Gunn } 426c35d396656363774843c84bd138e9f23367a5567Tyler Gunn 427c35d396656363774843c84bd138e9f23367a5567Tyler Gunn /** 428c35d396656363774843c84bd138e9f23367a5567Tyler Gunn * Saves the subject history list to shared prefs, removing older items so that there are only 429c35d396656363774843c84bd138e9f23367a5567Tyler Gunn * {@link #CALL_SUBJECT_HISTORY_SIZE} items at most. 430c35d396656363774843c84bd138e9f23367a5567Tyler Gunn * 431c35d396656363774843c84bd138e9f23367a5567Tyler Gunn * @param history The history. 432c35d396656363774843c84bd138e9f23367a5567Tyler Gunn */ 433c35d396656363774843c84bd138e9f23367a5567Tyler Gunn private void saveSubjectHistory(List<String> history) { 434c35d396656363774843c84bd138e9f23367a5567Tyler Gunn // Remove oldest subject(s). 435c35d396656363774843c84bd138e9f23367a5567Tyler Gunn while (history.size() > CALL_SUBJECT_HISTORY_SIZE) { 436c35d396656363774843c84bd138e9f23367a5567Tyler Gunn history.remove(0); 437c35d396656363774843c84bd138e9f23367a5567Tyler Gunn } 438c35d396656363774843c84bd138e9f23367a5567Tyler Gunn 439c35d396656363774843c84bd138e9f23367a5567Tyler Gunn SharedPreferences.Editor editor = mPrefs.edit(); 440c35d396656363774843c84bd138e9f23367a5567Tyler Gunn int historyCount = 0; 441c35d396656363774843c84bd138e9f23367a5567Tyler Gunn for (String subject : history) { 442c35d396656363774843c84bd138e9f23367a5567Tyler Gunn if (!TextUtils.isEmpty(subject)) { 443c35d396656363774843c84bd138e9f23367a5567Tyler Gunn editor.putString(PREF_KEY_SUBJECT_HISTORY_ITEM + historyCount, 444c35d396656363774843c84bd138e9f23367a5567Tyler Gunn subject); 445c35d396656363774843c84bd138e9f23367a5567Tyler Gunn historyCount++; 446c35d396656363774843c84bd138e9f23367a5567Tyler Gunn } 447c35d396656363774843c84bd138e9f23367a5567Tyler Gunn } 448c35d396656363774843c84bd138e9f23367a5567Tyler Gunn editor.putInt(PREF_KEY_SUBJECT_HISTORY_COUNT, historyCount); 449c35d396656363774843c84bd138e9f23367a5567Tyler Gunn editor.apply(); 450c35d396656363774843c84bd138e9f23367a5567Tyler Gunn } 451c35d396656363774843c84bd138e9f23367a5567Tyler Gunn 452c35d396656363774843c84bd138e9f23367a5567Tyler Gunn /** 453c35d396656363774843c84bd138e9f23367a5567Tyler Gunn * Hide software keyboard for the given {@link View}. 454c35d396656363774843c84bd138e9f23367a5567Tyler Gunn */ 455c35d396656363774843c84bd138e9f23367a5567Tyler Gunn public void hideSoftKeyboard(Context context, View view) { 456c35d396656363774843c84bd138e9f23367a5567Tyler Gunn InputMethodManager imm = (InputMethodManager) context.getSystemService( 457c35d396656363774843c84bd138e9f23367a5567Tyler Gunn Context.INPUT_METHOD_SERVICE); 458c35d396656363774843c84bd138e9f23367a5567Tyler Gunn if (imm != null) { 4596510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 460c35d396656363774843c84bd138e9f23367a5567Tyler Gunn } 461c35d396656363774843c84bd138e9f23367a5567Tyler Gunn } 462c35d396656363774843c84bd138e9f23367a5567Tyler Gunn 463c35d396656363774843c84bd138e9f23367a5567Tyler Gunn /** 4646510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn * Hides or shows the call history list. 4656510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn * 4666510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn * @param show {@code true} if the call history should be shown, {@code false} otherwise. 467c35d396656363774843c84bd138e9f23367a5567Tyler Gunn */ 4686510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn private void showCallHistory(final boolean show) { 4696510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn // Bail early if the visibility has not changed. 4706510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn if ((show && mSubjectList.getVisibility() == View.VISIBLE) || 4716510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn (!show && mSubjectList.getVisibility() == View.GONE)) { 4726510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn return; 473c35d396656363774843c84bd138e9f23367a5567Tyler Gunn } 4746510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn 4756510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn final int dialogStartingBottom = mDialogView.getBottom(); 4766510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn if (show) { 4776510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn // Showing the subject list; bind the list of history items to the list and show it. 4786510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn ArrayAdapter<String> adapter = new ArrayAdapter<String>(CallSubjectDialog.this, 4796510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn R.layout.call_subject_history_list_item, mSubjectHistory); 4806510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mSubjectList.setAdapter(adapter); 4816510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mSubjectList.setVisibility(View.VISIBLE); 4826510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn } else { 4836510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn // Hiding the subject list. 4846510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mSubjectList.setVisibility(View.GONE); 4856510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn } 4866510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn 4876510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn // Use a ViewTreeObserver so that we can animate between the pre-layout and post-layout 4886510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn // states. 4896510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn final ViewTreeObserver observer = mBackgroundView.getViewTreeObserver(); 4906510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn observer.addOnPreDrawListener( 4916510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn new ViewTreeObserver.OnPreDrawListener() { 4926510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn @Override 4936510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn public boolean onPreDraw() { 4946510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn // We don't want to continue getting called. 4956510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn if (observer.isAlive()) { 4966510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn observer.removeOnPreDrawListener(this); 4976510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn } 4986510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn 4996510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn // Determine the amount the dialog has shifted due to the relayout. 5006510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn int shiftAmount = dialogStartingBottom - mDialogView.getBottom(); 5016510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn 5026510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn // If the dialog needs to be shifted, do that now. 5036510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn if (shiftAmount != 0) { 5046510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn // Start animation in translated state and animate to translationY 0. 5056510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mDialogView.setTranslationY(shiftAmount); 5066510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mDialogView.animate() 5076510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn .translationY(0) 5086510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn .setInterpolator(AnimUtils.EASE_OUT_EASE_IN) 5096510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn .setDuration(mAnimationDuration) 5106510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn .start(); 5116510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn } 5126510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn 5136510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn if (show) { 5146510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn // Show the subhect list. 5156510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mSubjectList.setTranslationY(mSubjectList.getHeight()); 5166510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn 5176510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mSubjectList.animate() 5186510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn .translationY(0) 5196510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn .setInterpolator(AnimUtils.EASE_OUT_EASE_IN) 5206510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn .setDuration(mAnimationDuration) 5216510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn .setListener(new AnimatorListenerAdapter() { 5226510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn @Override 5236510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn public void onAnimationEnd(Animator animation) { 5246510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn super.onAnimationEnd(animation); 5256510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn } 5266510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn 5276510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn @Override 5286510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn public void onAnimationStart(Animator animation) { 5296510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn super.onAnimationStart(animation); 5306510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mSubjectList.setVisibility(View.VISIBLE); 5316510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn } 5326510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn }) 5336510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn .start(); 5346510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn } else { 5356510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn // Hide the subject list. 5366510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mSubjectList.setTranslationY(0); 5376510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn 5386510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mSubjectList.animate() 5396510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn .translationY(mSubjectList.getHeight()) 5406510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn .setInterpolator(AnimUtils.EASE_OUT_EASE_IN) 5416510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn .setDuration(mAnimationDuration) 5426510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn .setListener(new AnimatorListenerAdapter() { 5436510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn @Override 5446510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn public void onAnimationEnd(Animator animation) { 5456510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn super.onAnimationEnd(animation); 5466510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn mSubjectList.setVisibility(View.GONE); 5476510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn } 5486510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn 5496510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn @Override 5506510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn public void onAnimationStart(Animator animation) { 5516510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn super.onAnimationStart(animation); 5526510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn } 5536510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn }) 5546510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn .start(); 5556510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn } 5566510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn return true; 5576510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn } 5586510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn } 5596510868e03604f36699e92f1a2f5f06e1ccdf726Tyler Gunn ); 560c35d396656363774843c84bd138e9f23367a5567Tyler Gunn } 561a4e1829625be913e69ba52976a97b4f1875eb039Tyler Gunn} 562