1058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar/*
2058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * Copyright (C) 2014 The Android Open Source Project
3058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar *
4058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
5058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * you may not use this file except in compliance with the License.
6058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * You may obtain a copy of the License at
7058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar *
8058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
9058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar *
10058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * Unless required by applicable law or agreed to in writing, software
11058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
12058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * See the License for the specific language governing permissions and
14058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * limitations under the License.
15058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar */
16058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyarpackage android.support.v7.app;
17058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
18239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyarimport android.app.ActionBar;
19b01b01dddd64c945dd8dfa896648aa36dc47dde3Chris Banesimport android.app.Activity;
20239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyarimport android.content.Context;
21058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyarimport android.content.res.Configuration;
22239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyarimport android.content.res.TypedArray;
23058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyarimport android.graphics.drawable.Drawable;
24058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyarimport android.os.Build;
25065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikasimport android.support.annotation.NonNull;
26058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyarimport android.support.annotation.Nullable;
27058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyarimport android.support.annotation.StringRes;
28058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyarimport android.support.v4.view.GravityCompat;
29058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyarimport android.support.v4.widget.DrawerLayout;
3093011d6b0ca0622a6b098d3c3670ac7cc7bf9632Chris Banesimport android.support.v7.graphics.drawable.DrawerArrowDrawable;
31058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyarimport android.support.v7.widget.Toolbar;
326aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyarimport android.util.Log;
33058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyarimport android.view.MenuItem;
34058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyarimport android.view.View;
35058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
36058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar/**
37058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * This class provides a handy way to tie together the functionality of
38058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * {@link android.support.v4.widget.DrawerLayout} and the framework <code>ActionBar</code> to
39058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * implement the recommended design for navigation drawers.
40058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar *
41058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * <p>To use <code>ActionBarDrawerToggle</code>, create one in your Activity and call through
42058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * to the following methods corresponding to your Activity callbacks:</p>
43058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar *
44058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * <ul>
45058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * <li>{@link android.app.Activity#onConfigurationChanged(android.content.res.Configuration)
46058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * onConfigurationChanged}
47058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * <li>{@link android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
48058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * onOptionsItemSelected}</li>
49058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * </ul>
50058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar *
51058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * <p>Call {@link #syncState()} from your <code>Activity</code>'s
52058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * {@link android.app.Activity#onPostCreate(android.os.Bundle) onPostCreate} to synchronize the
53058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * indicator with the state of the linked DrawerLayout after <code>onRestoreInstanceState</code>
54058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * has occurred.</p>
55058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar *
56058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * <p><code>ActionBarDrawerToggle</code> can be used directly as a
57058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * {@link android.support.v4.widget.DrawerLayout.DrawerListener}, or if you are already providing
58058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar * your own listener, call through to each of the listener methods from your own.</p>
594973e7230c02dbdce093ab33a209f742d3f27e7cYigit Boyar *
604973e7230c02dbdce093ab33a209f742d3f27e7cYigit Boyar * <p>
614973e7230c02dbdce093ab33a209f742d3f27e7cYigit Boyar * You can customize the the animated toggle by defining the
624973e7230c02dbdce093ab33a209f742d3f27e7cYigit Boyar * {@link android.support.v7.appcompat.R.styleable#DrawerArrowToggle drawerArrowStyle} in your
634973e7230c02dbdce093ab33a209f742d3f27e7cYigit Boyar * ActionBar theme.
64058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar */
65058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyarpublic class ActionBarDrawerToggle implements DrawerLayout.DrawerListener {
66058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
67058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    /**
68058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * Allows an implementing Activity to return an {@link ActionBarDrawerToggle.Delegate} to use
69058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * with ActionBarDrawerToggle.
70058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     */
71058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    public interface DelegateProvider {
72058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
73058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        /**
74058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar         * @return Delegate to use for ActionBarDrawableToggles, or null if the Activity
75058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar         * does not wish to override the default behavior.
76058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar         */
77058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        @Nullable
78058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        Delegate getDrawerToggleDelegate();
79058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
80058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
81058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    public interface Delegate {
82058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
83058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        /**
84058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar         * Set the Action Bar's up indicator drawable and content description.
85058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar         *
86058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar         * @param upDrawable     - Drawable to set as up indicator
87058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar         * @param contentDescRes - Content description to set
88058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar         */
89058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        void setActionBarUpIndicator(Drawable upDrawable, @StringRes int contentDescRes);
90058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
91058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        /**
92058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar         * Set the Action Bar's up indicator content description.
93058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar         *
94058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar         * @param contentDescRes - Content description to set
95058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar         */
96058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        void setActionBarDescription(@StringRes int contentDescRes);
97239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
98239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        /**
99239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar         * Returns the drawable to be set as up button when DrawerToggle is disabled
100239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar         */
101239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        Drawable getThemeUpIndicator();
102239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
103239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        /**
104239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar         * Returns the context of ActionBar
105239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar         */
106239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        Context getActionBarThemedContext();
1076aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar
1086aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        /**
1096aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar         * Returns whether navigation icon is visible or not.
1106aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar         * Used to print warning messages in case developer forgets to set displayHomeAsUp to true
1116aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar         */
1126aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        boolean isNavigationVisible();
113058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
114058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
115058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    private final Delegate mActivityImpl;
116058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    private final DrawerLayout mDrawerLayout;
117058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
118065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas    private DrawerArrowDrawable mSlider;
119239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    private Drawable mHomeAsUpIndicator;
1202c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    boolean mDrawerIndicatorEnabled = true;
121239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    private boolean mHasCustomUpIndicator;
122058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    private final int mOpenDrawerContentDescRes;
123058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    private final int mCloseDrawerContentDescRes;
124239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    // used in toolbar mode when DrawerToggle is disabled
1252c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    View.OnClickListener mToolbarNavigationClickListener;
1266aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    // If developer does not set displayHomeAsUp, DrawerToggle won't show up.
1276aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    // DrawerToggle logs a warning if this case is detected
1286aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    private boolean mWarnedForDisplayHomeAsUp = false;
129058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
130058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    /**
131058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * Construct a new ActionBarDrawerToggle.
132058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     *
133058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * <p>The given {@link Activity} will be linked to the specified {@link DrawerLayout} and
134058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * its Actionbar's Up button will be set to a custom drawable.
135058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * <p>This drawable shows a Hamburger icon when drawer is closed and an arrow when drawer
136058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * is open. It animates between these two states as the drawer opens.</p>
137058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     *
138058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * <p>String resources must be provided to describe the open/close drawer actions for
139058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * accessibility services.</p>
140058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     *
141058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * @param activity                  The Activity hosting the drawer. Should have an ActionBar.
142058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * @param drawerLayout              The DrawerLayout to link to the given Activity's ActionBar
143058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * @param openDrawerContentDescRes  A String resource to describe the "open drawer" action
144058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     *                                  for accessibility
145058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * @param closeDrawerContentDescRes A String resource to describe the "close drawer" action
146058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     *                                  for accessibility
147058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     */
148058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout,
149058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            @StringRes int openDrawerContentDescRes,
150058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            @StringRes int closeDrawerContentDescRes) {
151239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        this(activity, null, drawerLayout, null, openDrawerContentDescRes,
152239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                closeDrawerContentDescRes);
153058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
154058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
155058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    /**
156058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * Construct a new ActionBarDrawerToggle with a Toolbar.
157058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * <p>
158058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * The given {@link Activity} will be linked to the specified {@link DrawerLayout} and
159058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * the Toolbar's navigation icon will be set to a custom drawable. Using this constructor
160058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * will set Toolbar's navigation click listener to toggle the drawer when it is clicked.
161058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * <p>
162058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * This drawable shows a Hamburger icon when drawer is closed and an arrow when drawer
163058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * is open. It animates between these two states as the drawer opens.
164058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * <p>
165058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * String resources must be provided to describe the open/close drawer actions for
166058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * accessibility services.
167058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * <p>
168058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * Please use {@link #ActionBarDrawerToggle(Activity, DrawerLayout, int, int)} if you are
169058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * setting the Toolbar as the ActionBar of your activity.
170058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     *
171058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * @param activity                  The Activity hosting the drawer.
172058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * @param toolbar                   The toolbar to use if you have an independent Toolbar.
173058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * @param drawerLayout              The DrawerLayout to link to the given Activity's ActionBar
174058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * @param openDrawerContentDescRes  A String resource to describe the "open drawer" action
175058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     *                                  for accessibility
176058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * @param closeDrawerContentDescRes A String resource to describe the "close drawer" action
177058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     *                                  for accessibility
178058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     */
179058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout,
180058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            Toolbar toolbar, @StringRes int openDrawerContentDescRes,
181058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            @StringRes int closeDrawerContentDescRes) {
182239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        this(activity, toolbar, drawerLayout, null, openDrawerContentDescRes,
183239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                closeDrawerContentDescRes);
184058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
185058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
186058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    /**
187058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * In the future, we can make this constructor public if we want to let developers customize
188058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * the
189058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * animation.
190058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     */
191065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas    ActionBarDrawerToggle(Activity activity, Toolbar toolbar, DrawerLayout drawerLayout,
192065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas            DrawerArrowDrawable slider, @StringRes int openDrawerContentDescRes,
193058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            @StringRes int closeDrawerContentDescRes) {
194058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        if (toolbar != null) {
195058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            mActivityImpl = new ToolbarCompatDelegate(toolbar);
196058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            toolbar.setNavigationOnClickListener(new View.OnClickListener() {
197058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar                @Override
198058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar                public void onClick(View v) {
199239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                    if (mDrawerIndicatorEnabled) {
200239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                        toggle();
201239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                    } else if (mToolbarNavigationClickListener != null) {
202239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                        mToolbarNavigationClickListener.onClick(v);
203239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                    }
204058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar                }
205058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            });
206058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        } else if (activity instanceof DelegateProvider) { // Allow the Activity to provide an impl
207058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            mActivityImpl = ((DelegateProvider) activity).getDrawerToggleDelegate();
208239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
209239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            mActivityImpl = new JellybeanMr2Delegate(activity);
210058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
211058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            mActivityImpl = new HoneycombDelegate(activity);
212058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        } else {
213239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            mActivityImpl = new DummyDelegate(activity);
214058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        }
215058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
216058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        mDrawerLayout = drawerLayout;
217058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        mOpenDrawerContentDescRes = openDrawerContentDescRes;
218058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        mCloseDrawerContentDescRes = closeDrawerContentDescRes;
219239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        if (slider == null) {
220065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas            mSlider = new DrawerArrowDrawable(mActivityImpl.getActionBarThemedContext());
221239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        } else {
222239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            mSlider = slider;
223239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        }
224239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
225239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        mHomeAsUpIndicator = getThemeUpIndicator();
226058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
227058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
228058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    /**
229058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * Synchronize the state of the drawer indicator/affordance with the linked DrawerLayout.
230058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     *
231058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * <p>This should be called from your <code>Activity</code>'s
232058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * {@link Activity#onPostCreate(android.os.Bundle) onPostCreate} method to synchronize after
233058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * the DrawerLayout's instance state has been restored, and any other time when the state
234058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * may have diverged in such a way that the ActionBarDrawerToggle was not notified.
235058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * (For example, if you stop forwarding appropriate drawer events for a period of time.)</p>
236058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     */
237058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    public void syncState() {
238058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
239065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas            setPosition(1);
240058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        } else {
241065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas            setPosition(0);
242058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        }
243239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        if (mDrawerIndicatorEnabled) {
244239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            setActionBarUpIndicator((Drawable) mSlider,
245239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                    mDrawerLayout.isDrawerOpen(GravityCompat.START) ?
246239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                            mCloseDrawerContentDescRes : mOpenDrawerContentDescRes);
247239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        }
248058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
249058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
250058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    /**
251058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * This method should always be called by your <code>Activity</code>'s
252058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * {@link Activity#onConfigurationChanged(android.content.res.Configuration)
253058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * onConfigurationChanged}
254058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * method.
255058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     *
256058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * @param newConfig The new configuration
257058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     */
258058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    public void onConfigurationChanged(Configuration newConfig) {
259239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        // Reload drawables that can change with configuration
260239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        if (!mHasCustomUpIndicator) {
261239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            mHomeAsUpIndicator = getThemeUpIndicator();
262239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        }
263058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        syncState();
264058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
265058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
266058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    /**
267058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * This method should be called by your <code>Activity</code>'s
268058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * {@link Activity#onOptionsItemSelected(android.view.MenuItem) onOptionsItemSelected} method.
269058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * If it returns true, your <code>onOptionsItemSelected</code> method should return true and
270058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * skip further processing.
271058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     *
272058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * @param item the MenuItem instance representing the selected menu item
273058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * @return true if the event was handled and further processing should not occur
274058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     */
275058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    public boolean onOptionsItemSelected(MenuItem item) {
276239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        if (item != null && item.getItemId() == android.R.id.home && mDrawerIndicatorEnabled) {
277058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            toggle();
278058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            return true;
279058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        }
280058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        return false;
281058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
282058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
2832c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    void toggle() {
2847b69fc37eed8a2c6a1680fa2b7d2735752e34d1dKirill Grouchnikov        int drawerLockMode = mDrawerLayout.getDrawerLockMode(GravityCompat.START);
2857b69fc37eed8a2c6a1680fa2b7d2735752e34d1dKirill Grouchnikov        if (mDrawerLayout.isDrawerVisible(GravityCompat.START)
2867b69fc37eed8a2c6a1680fa2b7d2735752e34d1dKirill Grouchnikov                && (drawerLockMode != DrawerLayout.LOCK_MODE_LOCKED_OPEN)) {
287058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            mDrawerLayout.closeDrawer(GravityCompat.START);
2887b69fc37eed8a2c6a1680fa2b7d2735752e34d1dKirill Grouchnikov        } else if (drawerLockMode != DrawerLayout.LOCK_MODE_LOCKED_CLOSED) {
289058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            mDrawerLayout.openDrawer(GravityCompat.START);
290058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        }
291058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
292058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
293058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    /**
294239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * Set the up indicator to display when the drawer indicator is not
295239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * enabled.
296239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * <p>
297239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * If you pass <code>null</code> to this method, the default drawable from
298239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * the theme will be used.
299239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     *
300239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * @param indicator A drawable to use for the up indicator, or null to use
301239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     *                  the theme's default
302239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * @see #setDrawerIndicatorEnabled(boolean)
303239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     */
304239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    public void setHomeAsUpIndicator(Drawable indicator) {
305239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        if (indicator == null) {
306239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            mHomeAsUpIndicator = getThemeUpIndicator();
307239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            mHasCustomUpIndicator = false;
308239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        } else {
309239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            mHomeAsUpIndicator = indicator;
310239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            mHasCustomUpIndicator = true;
311239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        }
312239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
313239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        if (!mDrawerIndicatorEnabled) {
314239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            setActionBarUpIndicator(mHomeAsUpIndicator, 0);
315239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        }
316239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    }
317239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
318239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    /**
319239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * Set the up indicator to display when the drawer indicator is not
320239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * enabled.
321239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * <p>
322239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * If you pass 0 to this method, the default drawable from the theme will
323239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * be used.
324239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     *
325239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * @param resId Resource ID of a drawable to use for the up indicator, or 0
326239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     *              to use the theme's default
327239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * @see #setDrawerIndicatorEnabled(boolean)
328239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     */
329239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    public void setHomeAsUpIndicator(int resId) {
330239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        Drawable indicator = null;
331239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        if (resId != 0) {
332239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            indicator = mDrawerLayout.getResources().getDrawable(resId);
333239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        }
334239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        setHomeAsUpIndicator(indicator);
335239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    }
336239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
337239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    /**
338239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * @return true if the enhanced drawer indicator is enabled, false otherwise
339239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * @see #setDrawerIndicatorEnabled(boolean)
340239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     */
341239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    public boolean isDrawerIndicatorEnabled() {
342239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        return mDrawerIndicatorEnabled;
343239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    }
344239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
345239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    /**
346239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * Enable or disable the drawer indicator. The indicator defaults to enabled.
347239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     *
348239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * <p>When the indicator is disabled, the <code>ActionBar</code> will revert to displaying
349239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * the home-as-up indicator provided by the <code>Activity</code>'s theme in the
350239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * <code>android.R.attr.homeAsUpIndicator</code> attribute instead of the animated
351239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * drawer glyph.</p>
352239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     *
353239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * @param enable true to enable, false to disable
354239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     */
355239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    public void setDrawerIndicatorEnabled(boolean enable) {
356239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        if (enable != mDrawerIndicatorEnabled) {
357239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            if (enable) {
358239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                setActionBarUpIndicator((Drawable) mSlider,
359239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                        mDrawerLayout.isDrawerOpen(GravityCompat.START) ?
360239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                                mCloseDrawerContentDescRes : mOpenDrawerContentDescRes);
361239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            } else {
362239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                setActionBarUpIndicator(mHomeAsUpIndicator, 0);
363239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            }
364239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            mDrawerIndicatorEnabled = enable;
365239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        }
366239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    }
367239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
368065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas    /**
369065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas     * @return DrawerArrowDrawable that is currently shown by the ActionBarDrawerToggle.
370065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas     */
371065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas    @NonNull
372065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas    public DrawerArrowDrawable getDrawerArrowDrawable() {
373065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas        return mSlider;
374065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas    }
375065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas
376065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas    /**
377065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas     * Sets the DrawerArrowDrawable that should be shown by this ActionBarDrawerToggle.
378065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas     *
379065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas     * @param drawable DrawerArrowDrawable that should be shown by this ActionBarDrawerToggle.
380065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas     */
381065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas    public void setDrawerArrowDrawable(@NonNull DrawerArrowDrawable drawable) {
382065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas        mSlider = drawable;
383065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas        syncState();
384065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas    }
385239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
386239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    /**
387058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * {@link DrawerLayout.DrawerListener} callback method. If you do not use your
388058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * ActionBarDrawerToggle instance directly as your DrawerLayout's listener, you should call
389058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * through to this method from your own listener object.
390058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     *
391058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * @param drawerView  The child view that was moved
392058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * @param slideOffset The new offset of this drawer within its range, from 0-1
393058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     */
394058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    @Override
395058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    public void onDrawerSlide(View drawerView, float slideOffset) {
396065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas        setPosition(Math.min(1f, Math.max(0, slideOffset)));
397058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
398058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
399058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    /**
400058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * {@link DrawerLayout.DrawerListener} callback method. If you do not use your
401058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * ActionBarDrawerToggle instance directly as your DrawerLayout's listener, you should call
402058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * through to this method from your own listener object.
403058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     *
404058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * @param drawerView Drawer view that is now open
405058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     */
406058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    @Override
407058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    public void onDrawerOpened(View drawerView) {
408065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas        setPosition(1);
409239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        if (mDrawerIndicatorEnabled) {
410239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            setActionBarDescription(mCloseDrawerContentDescRes);
411239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        }
412058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
413058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
414058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    /**
415058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * {@link DrawerLayout.DrawerListener} callback method. If you do not use your
416058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * ActionBarDrawerToggle instance directly as your DrawerLayout's listener, you should call
417058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * through to this method from your own listener object.
418058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     *
419058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * @param drawerView Drawer view that is now closed
420058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     */
421058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    @Override
422058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    public void onDrawerClosed(View drawerView) {
423065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas        setPosition(0);
424239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        if (mDrawerIndicatorEnabled) {
425239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            setActionBarDescription(mOpenDrawerContentDescRes);
426239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        }
427058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
428058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
429058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    /**
430058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * {@link DrawerLayout.DrawerListener} callback method. If you do not use your
431058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * ActionBarDrawerToggle instance directly as your DrawerLayout's listener, you should call
432058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * through to this method from your own listener object.
433058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     *
434058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     * @param newState The new drawer motion state
435058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     */
436058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    @Override
437058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    public void onDrawerStateChanged(int newState) {
438058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
439058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
440239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    /**
441239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * Returns the fallback listener for Navigation icon click events.
442239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     *
443239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * @return The click listener which receives Navigation click events from Toolbar when
444239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * drawer indicator is disabled.
445239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * @see #setToolbarNavigationClickListener(android.view.View.OnClickListener)
446239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * @see #setDrawerIndicatorEnabled(boolean)
447239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * @see #isDrawerIndicatorEnabled()
448239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     */
449239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    public View.OnClickListener getToolbarNavigationClickListener() {
450239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        return mToolbarNavigationClickListener;
451239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    }
452239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
453239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    /**
454239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * When DrawerToggle is constructed with a Toolbar, it sets the click listener on
455239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * the Navigation icon. If you want to listen for clicks on the Navigation icon when
456239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * DrawerToggle is disabled ({@link #setDrawerIndicatorEnabled(boolean)}, you should call this
457239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * method with your listener and DrawerToggle will forward click events to that listener
458239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * when drawer indicator is disabled.
459239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     *
460239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * @see #setDrawerIndicatorEnabled(boolean)
461239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     */
462239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    public void setToolbarNavigationClickListener(
463239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            View.OnClickListener onToolbarNavigationClickListener) {
464239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        mToolbarNavigationClickListener = onToolbarNavigationClickListener;
465239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    }
466239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
467058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    void setActionBarUpIndicator(Drawable upDrawable, int contentDescRes) {
4686aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        if (!mWarnedForDisplayHomeAsUp && !mActivityImpl.isNavigationVisible()) {
4696aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar            Log.w("ActionBarDrawerToggle", "DrawerToggle may not show up because NavigationIcon"
4706aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar                    + " is not visible. You may need to call "
4716aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar                    + "actionbar.setDisplayHomeAsUpEnabled(true);");
4726aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar            mWarnedForDisplayHomeAsUp = true;
4736aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        }
474058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        mActivityImpl.setActionBarUpIndicator(upDrawable, contentDescRes);
475058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
476058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
477058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    void setActionBarDescription(int contentDescRes) {
478058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        mActivityImpl.setActionBarDescription(contentDescRes);
479058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
480058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
481239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    Drawable getThemeUpIndicator() {
482239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        return mActivityImpl.getThemeUpIndicator();
483239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    }
484058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
485065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas    private void setPosition(float position) {
486065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas        if (position == 1f) {
487065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas            mSlider.setVerticalMirror(true);
488065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas        } else if (position == 0f) {
489065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas            mSlider.setVerticalMirror(false);
490058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        }
491065099c327b2262317028f4d6c5004b7bf41d2f5Aurimas Liutikas        mSlider.setProgress(position);
492058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
493058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
494058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    /**
495239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * Delegate if SDK version is between honeycomb and JBMR2
496058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     */
497239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    private static class HoneycombDelegate implements Delegate {
498058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
499239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        final Activity mActivity;
500239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        ActionBarDrawerToggleHoneycomb.SetIndicatorInfo mSetIndicatorInfo;
501058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
5022c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas        HoneycombDelegate(Activity activity) {
503058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            mActivity = activity;
504058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        }
505058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
506058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        @Override
507239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        public Drawable getThemeUpIndicator() {
508239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            return ActionBarDrawerToggleHoneycomb.getThemeUpIndicator(mActivity);
509058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        }
510058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
511058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        @Override
512239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        public Context getActionBarThemedContext() {
513239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            final ActionBar actionBar = mActivity.getActionBar();
514239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            final Context context;
515239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            if (actionBar != null) {
516239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                context = actionBar.getThemedContext();
517239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            } else {
518239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                context = mActivity;
519239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            }
520239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            return context;
521239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        }
522239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
523239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        @Override
5246aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        public boolean isNavigationVisible() {
5256aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar            final ActionBar actionBar = mActivity.getActionBar();
5266aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar            return actionBar != null
5276aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar                    && (actionBar.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) != 0;
5286aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        }
5296aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar
5306aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        @Override
531239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        public void setActionBarUpIndicator(Drawable themeImage, int contentDescRes) {
5329d61fd41d558d1a7eb70a83ef23f3336fa9fa9ebGrigory Novikov            final ActionBar actionBar = mActivity.getActionBar();
5339d61fd41d558d1a7eb70a83ef23f3336fa9fa9ebGrigory Novikov            if (actionBar != null) {
5349d61fd41d558d1a7eb70a83ef23f3336fa9fa9ebGrigory Novikov                actionBar.setDisplayShowHomeEnabled(true);
5359d61fd41d558d1a7eb70a83ef23f3336fa9fa9ebGrigory Novikov                mSetIndicatorInfo = ActionBarDrawerToggleHoneycomb.setActionBarUpIndicator(
5369d61fd41d558d1a7eb70a83ef23f3336fa9fa9ebGrigory Novikov                        mSetIndicatorInfo, mActivity, themeImage, contentDescRes);
5379d61fd41d558d1a7eb70a83ef23f3336fa9fa9ebGrigory Novikov                actionBar.setDisplayShowHomeEnabled(false);
5389d61fd41d558d1a7eb70a83ef23f3336fa9fa9ebGrigory Novikov            }
539239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        }
540239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
541239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        @Override
542239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        public void setActionBarDescription(int contentDescRes) {
543239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            mSetIndicatorInfo = ActionBarDrawerToggleHoneycomb.setActionBarDescription(
544239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                    mSetIndicatorInfo, mActivity, contentDescRes);
545058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        }
546058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
547058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
548058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    /**
549239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * Delegate if SDK version is JB MR2 or newer
550058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     */
551239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    private static class JellybeanMr2Delegate implements Delegate {
552058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
553058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        final Activity mActivity;
554058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
5552c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas        JellybeanMr2Delegate(Activity activity) {
556058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            mActivity = activity;
557058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        }
558058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
559058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        @Override
560239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        public Drawable getThemeUpIndicator() {
561239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            final TypedArray a = getActionBarThemedContext().obtainStyledAttributes(null,
562239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                    new int[]{android.R.attr.homeAsUpIndicator}, android.R.attr.actionBarStyle, 0);
563239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            final Drawable result = a.getDrawable(0);
564239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            a.recycle();
565239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            return result;
566239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        }
567239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
568239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        @Override
569239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        public Context getActionBarThemedContext() {
570239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            final ActionBar actionBar = mActivity.getActionBar();
571239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            final Context context;
572058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            if (actionBar != null) {
573239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                context = actionBar.getThemedContext();
574239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            } else {
575239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                context = mActivity;
576239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            }
577239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            return context;
578239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        }
579239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
580239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        @Override
5816aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        public boolean isNavigationVisible() {
5826aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar            final ActionBar actionBar = mActivity.getActionBar();
5836aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar            return actionBar != null &&
5846aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar                    (actionBar.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) != 0;
5856aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        }
5866aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar
5876aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        @Override
588239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        public void setActionBarUpIndicator(Drawable drawable, int contentDescRes) {
589239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            final ActionBar actionBar = mActivity.getActionBar();
590239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            if (actionBar != null) {
591239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar                actionBar.setHomeAsUpIndicator(drawable);
592058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar                actionBar.setHomeActionContentDescription(contentDescRes);
593058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            }
594058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        }
595058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
596058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        @Override
597239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        public void setActionBarDescription(int contentDescRes) {
598239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            final ActionBar actionBar = mActivity.getActionBar();
599058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            if (actionBar != null) {
600058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar                actionBar.setHomeActionContentDescription(contentDescRes);
601058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            }
602058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        }
603058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
604058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
605239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar    /**
606239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * Used when DrawerToggle is initialized with a Toolbar
607239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     */
608058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    static class ToolbarCompatDelegate implements Delegate {
609239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
610058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        final Toolbar mToolbar;
611b05853eced17425de1b914d0d5e1c44c12c17454Yigit Boyar        final Drawable mDefaultUpIndicator;
612b05853eced17425de1b914d0d5e1c44c12c17454Yigit Boyar        final CharSequence mDefaultContentDescription;
613058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
614058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        ToolbarCompatDelegate(Toolbar toolbar) {
615058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            mToolbar = toolbar;
616b05853eced17425de1b914d0d5e1c44c12c17454Yigit Boyar            mDefaultUpIndicator = toolbar.getNavigationIcon();
617b05853eced17425de1b914d0d5e1c44c12c17454Yigit Boyar            mDefaultContentDescription = toolbar.getNavigationContentDescription();
618058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        }
619058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
620058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        @Override
621058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        public void setActionBarUpIndicator(Drawable upDrawable, @StringRes int contentDescRes) {
622058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar            mToolbar.setNavigationIcon(upDrawable);
623b05853eced17425de1b914d0d5e1c44c12c17454Yigit Boyar            setActionBarDescription(contentDescRes);
624058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        }
625058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
626058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        @Override
627058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        public void setActionBarDescription(@StringRes int contentDescRes) {
628b05853eced17425de1b914d0d5e1c44c12c17454Yigit Boyar            if (contentDescRes == 0) {
629b05853eced17425de1b914d0d5e1c44c12c17454Yigit Boyar                mToolbar.setNavigationContentDescription(mDefaultContentDescription);
630b05853eced17425de1b914d0d5e1c44c12c17454Yigit Boyar            } else {
631b05853eced17425de1b914d0d5e1c44c12c17454Yigit Boyar                mToolbar.setNavigationContentDescription(contentDescRes);
632b05853eced17425de1b914d0d5e1c44c12c17454Yigit Boyar            }
633058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        }
634239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
635239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        @Override
636239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        public Drawable getThemeUpIndicator() {
637b05853eced17425de1b914d0d5e1c44c12c17454Yigit Boyar            return mDefaultUpIndicator;
638239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        }
639239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
640239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        @Override
641239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        public Context getActionBarThemedContext() {
642239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            return mToolbar.getContext();
643239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        }
6446aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar
6456aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        @Override
6466aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        public boolean isNavigationVisible() {
6476aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar            return true;
6486aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        }
649058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
650058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
651058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    /**
652239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar     * Fallback delegate
653058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar     */
654058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    static class DummyDelegate implements Delegate {
655239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        final Activity mActivity;
656239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
657239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        DummyDelegate(Activity activity) {
658239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            mActivity = activity;
659239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        }
660058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
661058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        @Override
662058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        public void setActionBarUpIndicator(Drawable upDrawable, @StringRes int contentDescRes) {
663058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
664058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        }
665058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
666058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        @Override
667058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        public void setActionBarDescription(@StringRes int contentDescRes) {
668058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar
669058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar        }
670239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
671239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        @Override
672239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        public Drawable getThemeUpIndicator() {
673239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            return null;
674239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        }
675239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar
676239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        @Override
677239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        public Context getActionBarThemedContext() {
678239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar            return mActivity;
679239e759c480945ee5c164c7c75cb30ff164caa91Yigit Boyar        }
6806aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar
6816aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        @Override
6826aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        public boolean isNavigationVisible() {
6836aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar            return true;
6846aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        }
685058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar    }
686058467cbd6dd0acdfaec61e65ab9e352868ec5c9Yigit Boyar}
687