summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/contactactions
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/dialer/contactactions')
-rw-r--r--java/com/android/dialer/contactactions/AndroidManifest.xml16
-rw-r--r--java/com/android/dialer/contactactions/ContactActionBottomSheet.java136
-rw-r--r--java/com/android/dialer/contactactions/ContactActionModule.java38
-rw-r--r--java/com/android/dialer/contactactions/DividerModule.java41
-rw-r--r--java/com/android/dialer/contactactions/IntentModule.java75
-rw-r--r--java/com/android/dialer/contactactions/res/layout/contact_layout.xml53
-rw-r--r--java/com/android/dialer/contactactions/res/layout/divider_layout.xml23
-rw-r--r--java/com/android/dialer/contactactions/res/layout/module_layout.xml40
-rw-r--r--java/com/android/dialer/contactactions/res/layout/sheet_layout.xml24
-rw-r--r--java/com/android/dialer/contactactions/res/values/dimens.xml20
10 files changed, 466 insertions, 0 deletions
diff --git a/java/com/android/dialer/contactactions/AndroidManifest.xml b/java/com/android/dialer/contactactions/AndroidManifest.xml
new file mode 100644
index 000000000..a64066e0b
--- /dev/null
+++ b/java/com/android/dialer/contactactions/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<!--
+ ~ Copyright (C) 2017 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
+ -->
+<manifest package="com.android.dialer.contactactions"/>
diff --git a/java/com/android/dialer/contactactions/ContactActionBottomSheet.java b/java/com/android/dialer/contactactions/ContactActionBottomSheet.java
new file mode 100644
index 000000000..9bf7ca095
--- /dev/null
+++ b/java/com/android/dialer/contactactions/ContactActionBottomSheet.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2017 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.dialer.contactactions;
+
+import android.content.Context;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.design.widget.BottomSheetDialog;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import com.android.dialer.common.Assert;
+import com.android.dialer.contactphoto.ContactPhotoManager;
+import com.android.dialer.dialercontact.DialerContact;
+import java.util.List;
+
+/**
+ * {@link BottomSheetDialog} used for building a list of contact actions in a bottom sheet menu.
+ *
+ * <p>{@link #show(Context, DialerContact, List)} should be used to create and display the menu.
+ * Modules are built using {@link ContactActionModule} and some defaults are provided by {@link
+ * IntentModule} and {@link DividerModule}.
+ */
+public class ContactActionBottomSheet extends BottomSheetDialog implements OnClickListener {
+
+ private final List<ContactActionModule> modules;
+ private final DialerContact contact;
+
+ private ContactActionBottomSheet(
+ Context context, DialerContact contact, List<ContactActionModule> modules) {
+ super(context);
+ this.modules = modules;
+ this.contact = contact;
+ setContentView(LayoutInflater.from(context).inflate(R.layout.sheet_layout, null));
+ }
+
+ public static ContactActionBottomSheet show(
+ Context context, DialerContact contact, List<ContactActionModule> modules) {
+ ContactActionBottomSheet sheet = new ContactActionBottomSheet(context, contact, modules);
+ sheet.show();
+ return sheet;
+ }
+
+ @Override
+ protected void onCreate(Bundle bundle) {
+ super.onCreate(bundle);
+ LinearLayout container = Assert.isNotNull(findViewById(R.id.action_container));
+ container.addView(getContactView(container));
+
+ for (ContactActionModule module : modules) {
+ if (module instanceof DividerModule) {
+ container.addView(getDividerView(container));
+ } else {
+ container.addView(getModuleView(container, module));
+ }
+ }
+ }
+
+ // TODO(calderwoodra): add on click action to contact.
+ private View getContactView(ViewGroup container) {
+ LayoutInflater inflater = LayoutInflater.from(getContext());
+ View contactView = inflater.inflate(R.layout.contact_layout, container, false);
+
+ ContactPhotoManager.getInstance(getContext())
+ .loadDialerThumbnailOrPhoto(
+ contactView.findViewById(R.id.quick_contact_photo),
+ contact.hasContactUri() ? Uri.parse(contact.getContactUri()) : null,
+ contact.getPhotoId(),
+ contact.hasPhotoUri() ? Uri.parse(contact.getPhotoUri()) : null,
+ contact.getNameOrNumber(),
+ contact.getContactType());
+
+ TextView nameView = contactView.findViewById(R.id.contact_name);
+ TextView numberView = contactView.findViewById(R.id.phone_number);
+
+ nameView.setText(contact.getNameOrNumber());
+ if (!TextUtils.isEmpty(contact.getDisplayNumber())) {
+ numberView.setVisibility(View.VISIBLE);
+ String secondaryInfo =
+ TextUtils.isEmpty(contact.getNumberLabel())
+ ? contact.getDisplayNumber()
+ : getContext()
+ .getString(
+ com.android.contacts.common.R.string.call_subject_type_and_number,
+ contact.getNumberLabel(),
+ contact.getDisplayNumber());
+ numberView.setText(secondaryInfo);
+ } else {
+ numberView.setVisibility(View.GONE);
+ numberView.setText(null);
+ }
+ return contactView;
+ }
+
+ private View getDividerView(ViewGroup container) {
+ LayoutInflater inflater = LayoutInflater.from(getContext());
+ return inflater.inflate(R.layout.divider_layout, container, false);
+ }
+
+ private View getModuleView(ViewGroup container, ContactActionModule module) {
+ LayoutInflater inflater = LayoutInflater.from(getContext());
+ View moduleView = inflater.inflate(R.layout.module_layout, container, false);
+ ((TextView) moduleView.findViewById(R.id.module_text)).setText(module.getStringId());
+ ((ImageView) moduleView.findViewById(R.id.module_image))
+ .setImageResource(module.getDrawableId());
+ moduleView.setOnClickListener(this);
+ moduleView.setTag(module);
+ return moduleView;
+ }
+
+ @Override
+ public void onClick(View view) {
+ if (((ContactActionModule) view.getTag()).onClick()) {
+ dismiss();
+ }
+ }
+}
diff --git a/java/com/android/dialer/contactactions/ContactActionModule.java b/java/com/android/dialer/contactactions/ContactActionModule.java
new file mode 100644
index 000000000..8089edc7b
--- /dev/null
+++ b/java/com/android/dialer/contactactions/ContactActionModule.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2017 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.dialer.contactactions;
+
+import android.support.annotation.DrawableRes;
+import android.support.annotation.StringRes;
+
+/**
+ * Modules used to build {@link ContactActionBottomSheet}.
+ *
+ * <p>Contacts as they relate to this class should be thought of as any entity that an action can be
+ * performed on like unknown/restricted contacts, along with saved and non-saved contacts.
+ */
+public interface ContactActionModule {
+
+ @StringRes
+ int getStringId();
+
+ @DrawableRes
+ int getDrawableId();
+
+ /** @return true if the bottom sheet should close, false otherwise */
+ boolean onClick();
+}
diff --git a/java/com/android/dialer/contactactions/DividerModule.java b/java/com/android/dialer/contactactions/DividerModule.java
new file mode 100644
index 000000000..aabd160db
--- /dev/null
+++ b/java/com/android/dialer/contactactions/DividerModule.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2017 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.dialer.contactactions;
+
+import com.android.dialer.common.Assert;
+
+/**
+ * A module that inserts a grey line divider into {@link ContactActionModule}. Layout it provided in
+ * R.layout.divider_layout.xml
+ */
+public final class DividerModule implements ContactActionModule {
+
+ @Override
+ public int getStringId() {
+ throw Assert.createUnsupportedOperationFailException();
+ }
+
+ @Override
+ public int getDrawableId() {
+ throw Assert.createUnsupportedOperationFailException();
+ }
+
+ @Override
+ public boolean onClick() {
+ throw Assert.createUnsupportedOperationFailException();
+ }
+}
diff --git a/java/com/android/dialer/contactactions/IntentModule.java b/java/com/android/dialer/contactactions/IntentModule.java
new file mode 100644
index 000000000..201f52192
--- /dev/null
+++ b/java/com/android/dialer/contactactions/IntentModule.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2017 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.dialer.contactactions;
+
+import android.content.Context;
+import android.content.Intent;
+import android.support.annotation.DrawableRes;
+import android.support.annotation.StringRes;
+import com.android.dialer.callintent.CallInitiationType.Type;
+import com.android.dialer.callintent.CallIntentBuilder;
+
+/**
+ * {@link ContactActionModule} useful for making easy to build modules based on starting an intent.
+ */
+public class IntentModule implements ContactActionModule {
+
+ private final Context context;
+ private final Intent intent;
+ private final @StringRes int text;
+ private final @DrawableRes int image;
+
+ public IntentModule(Context context, Intent intent, @StringRes int text, @DrawableRes int image) {
+ this.context = context;
+ this.intent = intent;
+ this.text = text;
+ this.image = image;
+ }
+
+ @Override
+ public int getStringId() {
+ return text;
+ }
+
+ @Override
+ public int getDrawableId() {
+ return image;
+ }
+
+ @Override
+ public boolean onClick() {
+ context.startActivity(intent);
+ return true;
+ }
+
+ public static IntentModule newCallModule(Context context, String number, Type initiationType) {
+ return new IntentModule(
+ context,
+ new CallIntentBuilder(number, initiationType).build(),
+ R.string.call,
+ R.drawable.quantum_ic_call_white_24);
+ }
+
+ public static IntentModule newVideoCallModule(
+ Context context, String number, Type initiationType) {
+ return new IntentModule(
+ context,
+ new CallIntentBuilder(number, initiationType).setIsVideoCall(true).build(),
+ R.string.video_call,
+ R.drawable.quantum_ic_videocam_white_24);
+ }
+}
diff --git a/java/com/android/dialer/contactactions/res/layout/contact_layout.xml b/java/com/android/dialer/contactactions/res/layout/contact_layout.xml
new file mode 100644
index 000000000..bf3297153
--- /dev/null
+++ b/java/com/android/dialer/contactactions/res/layout/contact_layout.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2017 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
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginTop="8dp"
+ android:layout_marginBottom="12dp"
+ android:layout_marginEnd="8dp">
+
+ <QuickContactBadge
+ android:id="@+id/quick_contact_photo"
+ android:layout_width="@dimen/contact_actions_image_size"
+ android:layout_height="@dimen/contact_actions_image_size"
+ android:layout_marginStart="@dimen/contact_actions_image_margin"
+ android:layout_marginEnd="@dimen/contact_actions_image_margin"
+ android:padding="4dp"
+ android:focusable="true"/>
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical">
+
+ <TextView
+ android:id="@+id/contact_name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ style="@style/PrimaryText"/>
+
+ <TextView
+ android:id="@+id/phone_number"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="2dp"
+ style="@style/SecondaryText"/>
+ </LinearLayout>
+</LinearLayout> \ No newline at end of file
diff --git a/java/com/android/dialer/contactactions/res/layout/divider_layout.xml b/java/com/android/dialer/contactactions/res/layout/divider_layout.xml
new file mode 100644
index 000000000..fdee50e48
--- /dev/null
+++ b/java/com/android/dialer/contactactions/res/layout/divider_layout.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2017 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
+ -->
+<View
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_marginTop="8dp"
+ android:layout_marginBottom="8dp"
+ android:background="#12000000"/>
diff --git a/java/com/android/dialer/contactactions/res/layout/module_layout.xml b/java/com/android/dialer/contactactions/res/layout/module_layout.xml
new file mode 100644
index 000000000..9aee67937
--- /dev/null
+++ b/java/com/android/dialer/contactactions/res/layout/module_layout.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2017 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
+ -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/module_container"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="?android:attr/selectableItemBackground">
+
+ <ImageView
+ android:id="@+id/module_image"
+ android:layout_width="@dimen/contact_actions_image_size"
+ android:layout_height="@dimen/contact_actions_image_size"
+ android:layout_marginStart="@dimen/contact_actions_image_margin"
+ android:layout_marginEnd="@dimen/contact_actions_image_margin"
+ android:tint="@color/dialer_secondary_text_color"
+ android:scaleType="center"/>
+
+ <TextView
+ android:id="@+id/module_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ style="@style/PrimaryText"/>
+</LinearLayout> \ No newline at end of file
diff --git a/java/com/android/dialer/contactactions/res/layout/sheet_layout.xml b/java/com/android/dialer/contactactions/res/layout/sheet_layout.xml
new file mode 100644
index 000000000..6984367bf
--- /dev/null
+++ b/java/com/android/dialer/contactactions/res/layout/sheet_layout.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2017 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
+ -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/action_container"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingTop="4dp"
+ android:paddingBottom="8dp"/>
diff --git a/java/com/android/dialer/contactactions/res/values/dimens.xml b/java/com/android/dialer/contactactions/res/values/dimens.xml
new file mode 100644
index 000000000..47bf804ac
--- /dev/null
+++ b/java/com/android/dialer/contactactions/res/values/dimens.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2017 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
+ -->
+<resources>
+ <dimen name="contact_actions_image_size">48dp</dimen>
+ <dimen name="contact_actions_image_margin">12dp</dimen>
+</resources> \ No newline at end of file