summaryrefslogtreecommitdiffstats
path: root/java/com/android/contacts/common/list/ContactTileView.java
blob: 15582d684923b57d3bfbb9631100127f7fea228f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.contacts.common.list;

import android.content.Context;
import android.graphics.Rect;
import android.net.Uri;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.contacts.common.ContactPhotoManager;
import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
import com.android.contacts.common.MoreContactUtils;
import com.android.contacts.common.R;
import com.android.dialer.callintent.CallInitiationType;
import com.android.dialer.callintent.CallSpecificAppData;
import com.android.dialer.common.LogUtil;

/** A ContactTile displays a contact's picture and name */
public abstract class ContactTileView extends FrameLayout {

  private static final String TAG = ContactTileView.class.getSimpleName();
  protected Listener mListener;
  private Uri mLookupUri;
  private ImageView mPhoto;
  private TextView mName;
  private ContactPhotoManager mPhotoManager = null;

  public ContactTileView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  @Override
  protected void onFinishInflate() {
    super.onFinishInflate();
    mName = (TextView) findViewById(R.id.contact_tile_name);
    mPhoto = (ImageView) findViewById(R.id.contact_tile_image);

    OnClickListener listener = createClickListener();
    setOnClickListener(listener);
  }

  protected OnClickListener createClickListener() {
    return new OnClickListener() {
      @Override
      public void onClick(View v) {
        if (mListener == null) {
          return;
        }
        CallSpecificAppData callSpecificAppData =
            CallSpecificAppData.newBuilder()
                .setCallInitiationType(CallInitiationType.Type.SPEED_DIAL)
                .build();
        mListener.onContactSelected(
            getLookupUri(),
            MoreContactUtils.getTargetRectFromView(ContactTileView.this),
            callSpecificAppData);
      }
    };
  }

  public void setPhotoManager(ContactPhotoManager photoManager) {
    mPhotoManager = photoManager;
  }

  /**
   * Populates the data members to be displayed from the fields in {@link
   * com.android.contacts.common.list.ContactEntry}
   */
  public void loadFromContact(ContactEntry entry) {

    if (entry != null) {
      mName.setText(getNameForView(entry));
      mLookupUri = entry.lookupUri;

      setVisibility(View.VISIBLE);

      if (mPhotoManager != null) {
        DefaultImageRequest request = getDefaultImageRequest(entry.namePrimary, entry.lookupKey);
        configureViewForImage(entry.photoUri == null);
        if (mPhoto != null) {
          mPhotoManager.loadPhoto(
              mPhoto,
              entry.photoUri,
              getApproximateImageSize(),
              isDarkTheme(),
              isContactPhotoCircular(),
              request);


        }
      } else {
        LogUtil.w(TAG, "contactPhotoManager not set");
      }
    } else {
      setVisibility(View.INVISIBLE);
    }
  }

  public void setListener(Listener listener) {
    mListener = listener;
  }

  public Uri getLookupUri() {
    return mLookupUri;
  }

  /**
   * Returns the string that should actually be displayed as the contact's name. Subclasses can
   * override this to return formatted versions of the name - i.e. first name only.
   */
  protected String getNameForView(ContactEntry contactEntry) {
    return contactEntry.namePrimary;
  }

  /**
   * Implemented by subclasses to estimate the size of the picture. This can return -1 if only a
   * thumbnail is shown anyway
   */
  protected abstract int getApproximateImageSize();

  protected abstract boolean isDarkTheme();

  /**
   * Implemented by subclasses to reconfigure the view's layout and subviews, based on whether or
   * not the contact has a user-defined photo.
   *
   * @param isDefaultImage True if the contact does not have a user-defined contact photo (which
   *     means a default contact image will be applied by the {@link ContactPhotoManager}
   */
  protected void configureViewForImage(boolean isDefaultImage) {
    // No-op by default.
  }

  /**
   * Implemented by subclasses to allow them to return a {@link DefaultImageRequest} with the
   * various image parameters defined to match their own layouts.
   *
   * @param displayName The display name of the contact
   * @param lookupKey The lookup key of the contact
   * @return A {@link DefaultImageRequest} object with each field configured by the subclass as
   *     desired, or {@code null}.
   */
  protected DefaultImageRequest getDefaultImageRequest(String displayName, String lookupKey) {
    return new DefaultImageRequest(displayName, lookupKey, isContactPhotoCircular());
  }

  /**
   * Whether contact photo should be displayed as a circular image. Implemented by subclasses so
   * they can change which drawables to fetch.
   */
  protected boolean isContactPhotoCircular() {
    return true;
  }

  public interface Listener {

    /** Notification that the contact was selected; no specific action is dictated. */
    void onContactSelected(
        Uri contactLookupUri, Rect viewRect, CallSpecificAppData callSpecificAppData);

    /** Notification that the specified number is to be called. */
    void onCallNumberDirectly(String phoneNumber, CallSpecificAppData callSpecificAppData);
  }
}