diff options
Diffstat (limited to 'java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java')
-rw-r--r-- | java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java b/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java new file mode 100644 index 000000000..a580aee68 --- /dev/null +++ b/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2018 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.main.impl.bottomnav; + +import android.content.Context; +import android.support.annotation.IntDef; +import android.support.annotation.Nullable; +import android.util.AttributeSet; +import android.view.View; +import android.widget.LinearLayout; +import com.android.dialer.common.Assert; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; +import java.util.List; + +/** Dialer Bottom Nav Bar for {@link MainActivity}. */ +public final class BottomNavBar extends LinearLayout { + + /** Index for each tab in the bottom nav. */ + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + TabIndex.SPEED_DIAL, + TabIndex.CALL_LOG, + TabIndex.CONTACTS, + TabIndex.VOICEMAIL, + }) + public @interface TabIndex { + int SPEED_DIAL = 0; + int CALL_LOG = 1; + int CONTACTS = 2; + int VOICEMAIL = 3; + } + + private final List<OnBottomNavTabSelectedListener> listeners = new ArrayList<>(); + + private BottomNavItem speedDial; + private BottomNavItem callLog; + private BottomNavItem contacts; + private BottomNavItem voicemail; + private @TabIndex int selectedTab; + + public BottomNavBar(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + speedDial = findViewById(R.id.speed_dial_tab); + callLog = findViewById(R.id.call_log_tab); + contacts = findViewById(R.id.contacts_tab); + voicemail = findViewById(R.id.voicemail_tab); + + speedDial.setup(R.string.tab_title_speed_dial, R.drawable.quantum_ic_star_vd_theme_24); + callLog.setup(R.string.tab_title_call_history, R.drawable.quantum_ic_access_time_vd_theme_24); + contacts.setup(R.string.tab_title_contacts, R.drawable.quantum_ic_people_vd_theme_24); + voicemail.setup(R.string.tab_title_voicemail, R.drawable.quantum_ic_voicemail_vd_theme_24); + + speedDial.setOnClickListener( + v -> { + selectedTab = TabIndex.SPEED_DIAL; + setSelected(speedDial); + updateListeners(selectedTab); + }); + callLog.setOnClickListener( + v -> { + selectedTab = TabIndex.CALL_LOG; + setSelected(callLog); + updateListeners(selectedTab); + }); + contacts.setOnClickListener( + v -> { + selectedTab = TabIndex.CONTACTS; + setSelected(contacts); + updateListeners(selectedTab); + }); + voicemail.setOnClickListener( + v -> { + selectedTab = TabIndex.VOICEMAIL; + setSelected(voicemail); + updateListeners(selectedTab); + }); + } + + private void setSelected(View view) { + speedDial.setSelected(view == speedDial); + callLog.setSelected(view == callLog); + contacts.setSelected(view == contacts); + voicemail.setSelected(view == voicemail); + } + + /** + * Calls {@link View#performClick()} on the desired tab. + * + * @param tab {@link TabIndex} + */ + public void selectTab(@TabIndex int tab) { + if (tab == TabIndex.SPEED_DIAL) { + speedDial.performClick(); + } else if (tab == TabIndex.CALL_LOG) { + callLog.performClick(); + } else if (tab == TabIndex.CONTACTS) { + contacts.performClick(); + } else if (tab == TabIndex.VOICEMAIL) { + voicemail.performClick(); + } else { + throw new IllegalStateException("Invalid tab: " + tab); + } + } + + public void setNotificationCount(@TabIndex int tab, int count) { + if (tab == TabIndex.SPEED_DIAL) { + speedDial.setNotificationCount(count); + } else if (tab == TabIndex.CALL_LOG) { + callLog.setNotificationCount(count); + } else if (tab == TabIndex.CONTACTS) { + contacts.setNotificationCount(count); + } else if (tab == TabIndex.VOICEMAIL) { + voicemail.setNotificationCount(count); + } else { + throw new IllegalStateException("Invalid tab: " + tab); + } + } + + public void addOnTabSelectedListener(OnBottomNavTabSelectedListener listener) { + listeners.add(listener); + } + + private void updateListeners(@TabIndex int tabIndex) { + for (OnBottomNavTabSelectedListener listener : listeners) { + switch (tabIndex) { + case TabIndex.SPEED_DIAL: + listener.onSpeedDialSelected(); + break; + case TabIndex.CALL_LOG: + listener.onCallLogSelected(); + break; + case TabIndex.CONTACTS: + listener.onContactsSelected(); + break; + case TabIndex.VOICEMAIL: + listener.onVoicemailSelected(); + break; + default: + throw Assert.createIllegalStateFailException("Invalid tab: " + tabIndex); + } + } + } + + public int getSelectedTab() { + return selectedTab; + } + + /** Listener for bottom nav tab's on click events. */ + public interface OnBottomNavTabSelectedListener { + + /** Speed dial tab was clicked. */ + void onSpeedDialSelected(); + + /** Call Log tab was clicked. */ + void onCallLogSelected(); + + /** Contacts tab was clicked. */ + void onContactsSelected(); + + /** Voicemail tab was clicked. */ + void onVoicemailSelected(); + } +} |