diff options
Diffstat (limited to 'java/com/android/dialer/contactactions')
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..4718ff036 --- /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.contacts.common.ContactPhotoManager; +import com.android.dialer.common.Assert; +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: 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 |