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