1/* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package androidx.wear.internal.widget.drawer; 18 19import androidx.annotation.Nullable; 20import androidx.annotation.RestrictTo; 21import androidx.annotation.RestrictTo.Scope; 22import androidx.wear.widget.drawer.WearableNavigationDrawerView; 23import androidx.wear.widget.drawer.WearableNavigationDrawerView.WearableNavigationDrawerAdapter; 24 25/** 26 * Provides a {@link WearableNavigationDrawerPresenter} implementation that is designed for the 27 * multi-page navigation drawer. 28 * 29 * @hide 30 */ 31@RestrictTo(Scope.LIBRARY) 32public class MultiPagePresenter extends WearableNavigationDrawerPresenter { 33 34 private final Ui mUi; 35 private final WearableNavigationDrawerView mDrawer; 36 private final boolean mIsAccessibilityEnabled; 37 @Nullable private WearableNavigationDrawerAdapter mAdapter; 38 39 /** 40 * Controls the user interface of a multi-page {@link WearableNavigationDrawerView}. 41 */ 42 public interface Ui { 43 44 /** 45 * Initializes the {@code Ui}. 46 */ 47 void initialize(WearableNavigationDrawerView drawer, 48 WearableNavigationDrawerPresenter presenter); 49 50 /** 51 * Should notify the {@code NavigationPagerAdapter} that the underlying data has changed. 52 */ 53 void notifyNavigationPagerAdapterDataChanged(); 54 55 /** 56 * Should notify the Page Indicator that the underlying data has changed. 57 */ 58 void notifyPageIndicatorDataChanged(); 59 60 /** 61 * Associates the given {@code adapter} with this {@link Ui}. 62 */ 63 void setNavigationPagerAdapter(WearableNavigationDrawerAdapter adapter); 64 65 /** 66 * Sets which item is selected and optionally smooth scrolls to it. 67 */ 68 void setNavigationPagerSelectedItem(int index, boolean smoothScrollTo); 69 } 70 71 public MultiPagePresenter(WearableNavigationDrawerView drawer, Ui ui, 72 boolean isAccessibilityEnabled) { 73 if (drawer == null) { 74 throw new IllegalArgumentException("Received null drawer."); 75 } 76 if (ui == null) { 77 throw new IllegalArgumentException("Received null ui."); 78 } 79 mDrawer = drawer; 80 mUi = ui; 81 mUi.initialize(drawer, this); 82 mIsAccessibilityEnabled = isAccessibilityEnabled; 83 } 84 85 @Override 86 public void onDataSetChanged() { 87 mUi.notifyNavigationPagerAdapterDataChanged(); 88 mUi.notifyPageIndicatorDataChanged(); 89 } 90 91 @Override 92 public void onNewAdapter(WearableNavigationDrawerAdapter adapter) { 93 if (adapter == null) { 94 throw new IllegalArgumentException("Received null adapter."); 95 } 96 mAdapter = adapter; 97 mAdapter.setPresenter(this); 98 mUi.setNavigationPagerAdapter(adapter); 99 } 100 101 @Override 102 public void onSelected(int index) { 103 notifyItemSelectedListeners(index); 104 } 105 106 @Override 107 public void onSetCurrentItemRequested(int index, boolean smoothScrollTo) { 108 mUi.setNavigationPagerSelectedItem(index, smoothScrollTo); 109 } 110 111 @Override 112 public boolean onDrawerTapped() { 113 if (mDrawer.isOpened()) { 114 if (mIsAccessibilityEnabled) { 115 // When accessibility gestures are enabled, the user can't access a closed nav 116 // drawer, so peek it instead. 117 mDrawer.getController().peekDrawer(); 118 } else { 119 mDrawer.getController().closeDrawer(); 120 } 121 return true; 122 } 123 return false; 124 } 125} 126