1da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen/*
2da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen * Copyright (C) 2015 The Android Open Source Project
3da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen *
4da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen * Licensed under the Apache License, Version 2.0 (the "License");
5da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen * you may not use this file except in compliance with the License.
6da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen * You may obtain a copy of the License at
7da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen *
8da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen *      http://www.apache.org/licenses/LICENSE-2.0
9da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen *
10da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen * Unless required by applicable law or agreed to in writing, software
11da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen * distributed under the License is distributed on an "AS IS" BASIS,
12da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen * See the License for the specific language governing permissions and
14da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen * limitations under the License.
15da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen */
16da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
17da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chenpackage android.support.car.app.menu;
18da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
19da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chenimport android.content.Context;
20da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chenimport android.graphics.Bitmap;
21da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chenimport android.graphics.drawable.Drawable;
22da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chenimport android.os.Bundle;
23da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chenimport android.os.Handler;
24da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chenimport android.support.annotation.LayoutRes;
2513df550560fd8e7e6287603a112659cca244eeeeYao Chenimport android.support.car.Car;
26868f9e6e890eeaf3281e55475f102cb677d6032aYao Chenimport android.support.car.app.CarFragmentActivity;
2765de2039a94251f62d02a32e3136c0db4fc80d90Yao Chenimport android.support.car.app.menu.compat.CarMenuConstantsComapt.MenuItemConstants;
2870f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chenimport android.support.car.input.CarInputManager;
2903100f7264789a3f36713b0dd69363ce4785435aYao Chenimport android.support.v4.app.Fragment;
30da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chenimport android.util.DisplayMetrics;
31da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chenimport android.view.LayoutInflater;
32da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chenimport android.view.View;
33da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chenimport android.view.ViewGroup;
3470f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chenimport android.view.WindowManager;
3570f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chenimport android.widget.EditText;
36da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
37da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen/**
38da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen * Base class for a car app which wants to use a drawer.
3957de61296cc8f29d8740fc7e6983af9553e7a410Jason Tholstrup * @hide
40da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen */
41868f9e6e890eeaf3281e55475f102cb677d6032aYao Chenpublic abstract class CarDrawerActivity extends CarFragmentActivity {
42da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    private static final String TAG = "CarDrawerActivity";
4365de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen
44da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    private static final String KEY_DRAWERSHOWING =
45da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen            "android.support.car.app.CarDrawerActivity.DRAWER_SHOWING";
4670f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    private static final String KEY_INPUTSHOWING =
4770f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen            "android.support.car.app.CarDrawerActivity.INPUT_SHOWING";
4870f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    private static final String KEY_SEARCHBOXENABLED =
4970f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen            "android.support.car.app.CarDrawerActivity.SEARCH_BOX_ENABLED";
50da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
51da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    private final Handler mHandler = new Handler();
5270f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    private final CarUiController mUiController;
53da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
54da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    private CarMenuCallbacks mMenuCallbacks;
5565de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    private OnMenuClickListener mMenuClickListener;
56da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    private boolean mDrawerShowing;
5770f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    private boolean mShowingSearchBox;
5870f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    private boolean mSearchBoxEnabled;
59da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    private boolean mOnCreateCalled = false;
6070f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    private View.OnClickListener mSearchBoxOnClickListener;
6170f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen
6270f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    private CarInputManager mInputManager;
6370f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    private EditText mSearchBoxView;
6470f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen
6565de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    public interface OnMenuClickListener {
6670f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        /**
6765de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen         * Called when the menu button is clicked.
6865de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen         *
6965de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen         * @return True if event was handled. This will prevent the drawer from executing its
7065de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen         *         default action (opening/closing/going back). False if the event was not handled
7165de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen         *         so the drawer will execute the default action.
7270f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen         */
7365de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        boolean onClicked();
7470f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    }
75da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
7613df550560fd8e7e6287603a112659cca244eeeeYao Chen    public CarDrawerActivity(Proxy proxy, Context context, Car car) {
7713df550560fd8e7e6287603a112659cca244eeeeYao Chen        super(proxy, context, car);
7865de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        mUiController = createCarUiController();
7965de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    }
8065de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen
8165de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    /**
8265de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen     * Create a {@link android.support.car.app.menu.CarUiController}.
8365de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen     *
8465de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen     * Derived class can override this function to return a customized ui controller.
8565de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen     */
8665de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    protected CarUiController createCarUiController() {
8765de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        return CarUiController.createCarUiController(this);
88da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    }
89da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
90da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    @Override
91da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    public void setContentView(View view) {
92da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen        ViewGroup parent = (ViewGroup) findViewById(mUiController.getFragmentContainerId());
93da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen        parent.addView(view);
94da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    }
95da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
96da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    @Override
97da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    public void setContentView(@LayoutRes int resourceId) {
98da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen        ViewGroup parent = (ViewGroup) findViewById(mUiController.getFragmentContainerId());
99da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen        LayoutInflater inflater = getLayoutInflater();
100da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen        inflater.inflate(resourceId, parent, true);
101da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    }
102da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
10303100f7264789a3f36713b0dd69363ce4785435aYao Chen    @Override
10403100f7264789a3f36713b0dd69363ce4785435aYao Chen    public View findViewById(@LayoutRes int id) {
10503100f7264789a3f36713b0dd69363ce4785435aYao Chen        return super.findViewById(mUiController.getFragmentContainerId()).findViewById(id);
10603100f7264789a3f36713b0dd69363ce4785435aYao Chen    }
10703100f7264789a3f36713b0dd69363ce4785435aYao Chen
108d33cc25ece71923740ebc87be2048475b452cf0bYao Chen    @Override
10965de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    protected void onCreate(Bundle savedInstanceState) {
11065de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        super.onCreate(savedInstanceState);
11165de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        super.setContentView(mUiController.getContentView());
11265de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        mInputManager = getInputManager();
11365de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        mHandler.post(new Runnable() {
11465de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen            @Override
11565de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen            public void run() {
11665de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen                if (mMenuCallbacks != null) {
11765de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen                    mMenuCallbacks.registerOnChildrenChangedListener(mMenuListener);
11865de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen                }
11965de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen                mOnCreateCalled = true;
12065de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen            }
12165de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        });
12265de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    }
12365de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen
12465de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    @Override
12565de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    protected void onDestroy() {
12665de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        super.onDestroy();
12765de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        mHandler.post(new Runnable() {
12865de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen            @Override
12965de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen            public void run() {
13065de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen                if (mMenuCallbacks != null) {
13165de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen                    mMenuCallbacks.unregisterOnChildrenChangedListener(mMenuListener);
13265de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen                    mMenuCallbacks = null;
13365de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen                }
13465de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen            }
13565de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        });
13665de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    }
13765de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen
13865de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    @Override
13965de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    protected void onRestoreInstanceState(Bundle savedInstanceState) {
14065de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        super.onRestoreInstanceState(savedInstanceState);
14165de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        mDrawerShowing = savedInstanceState.getBoolean(KEY_DRAWERSHOWING);
14265de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        mUiController.onRestoreInstanceState(savedInstanceState);
14365de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    }
14465de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen
14565de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    @Override
14665de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    protected void onSaveInstanceState(Bundle outState) {
14765de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        super.onSaveInstanceState(outState);
14865de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        outState.putBoolean(KEY_DRAWERSHOWING, mDrawerShowing);
14965de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        mUiController.onSaveInstanceState(outState);
15065de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    }
15165de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen
15265de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    @Override
153d33cc25ece71923740ebc87be2048475b452cf0bYao Chen    protected void onStart() {
154d33cc25ece71923740ebc87be2048475b452cf0bYao Chen        super.onStart();
15570f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
156d33cc25ece71923740ebc87be2048475b452cf0bYao Chen        mUiController.onStart();
157d33cc25ece71923740ebc87be2048475b452cf0bYao Chen    }
158d33cc25ece71923740ebc87be2048475b452cf0bYao Chen
159d33cc25ece71923740ebc87be2048475b452cf0bYao Chen    @Override
160d33cc25ece71923740ebc87be2048475b452cf0bYao Chen    protected void onResume() {
161d33cc25ece71923740ebc87be2048475b452cf0bYao Chen        super.onResume();
162d33cc25ece71923740ebc87be2048475b452cf0bYao Chen        mUiController.onResume();
163d33cc25ece71923740ebc87be2048475b452cf0bYao Chen    }
164d33cc25ece71923740ebc87be2048475b452cf0bYao Chen
165d33cc25ece71923740ebc87be2048475b452cf0bYao Chen    @Override
166d33cc25ece71923740ebc87be2048475b452cf0bYao Chen    protected void onPause() {
167d33cc25ece71923740ebc87be2048475b452cf0bYao Chen        super.onPause();
168d33cc25ece71923740ebc87be2048475b452cf0bYao Chen        mUiController.onPause();
169d33cc25ece71923740ebc87be2048475b452cf0bYao Chen    }
170d33cc25ece71923740ebc87be2048475b452cf0bYao Chen
171d33cc25ece71923740ebc87be2048475b452cf0bYao Chen    @Override
172d33cc25ece71923740ebc87be2048475b452cf0bYao Chen    protected void onStop() {
173d33cc25ece71923740ebc87be2048475b452cf0bYao Chen        super.onStop();
174d33cc25ece71923740ebc87be2048475b452cf0bYao Chen        mUiController.onStop();
175d33cc25ece71923740ebc87be2048475b452cf0bYao Chen    }
176d33cc25ece71923740ebc87be2048475b452cf0bYao Chen
17765de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    /**
17865de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen     * Set the fragment in the main fragment container.
17965de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen     */
18065de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    public void setContentFragment(Fragment fragment) {
18165de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        super.setContentFragment(fragment, mUiController.getFragmentContainerId());
1829d3fdf2eed6187804c78df5952e7290f5ed15fc3Yao Chen    }
1839d3fdf2eed6187804c78df5952e7290f5ed15fc3Yao Chen
18465de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    /**
18565de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen     * Return the main fragment container id for the app.
18665de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen     */
18765de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    public int getFragmentContainerId() {
18865de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        return mUiController.getFragmentContainerId();
189da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    }
190da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
19165de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    /**
19265de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen     * Set the callbacks for car menu interactions.
19365de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen     */
194da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    public void setCarMenuCallbacks(final CarMenuCallbacks callbacks) {
195da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen        if (mOnCreateCalled) {
196da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen            throw new IllegalStateException(
197da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen                    "Cannot call setCarMenuCallbacks after onCreate has been called.");
198da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen        }
199da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen        mMenuCallbacks = callbacks;
20065de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        mUiController.registerCarMenuCallbacks(callbacks);
201da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    }
202da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
203da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    /**
204da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     * Listener that listens for when the menu button is pressed.
205da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     *
206da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     * @param listener {@link OnMenuClickListener} that will listen for menu button clicks.
207da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     */
208da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    public void setOnMenuClickedListener(OnMenuClickListener listener) {
20965de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        mMenuClickListener = listener;
210da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    }
211da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
212f4a72c4f1aa2394c6c289ed89dcb95cde548f236Aidan Snoswell    /**
213f4a72c4f1aa2394c6c289ed89dcb95cde548f236Aidan Snoswell     * Restore the menu button drawable
214f4a72c4f1aa2394c6c289ed89dcb95cde548f236Aidan Snoswell     */
215f4a72c4f1aa2394c6c289ed89dcb95cde548f236Aidan Snoswell    public void restoreMenuButtonDrawable() {
216f4a72c4f1aa2394c6c289ed89dcb95cde548f236Aidan Snoswell        mUiController.restoreMenuButtonDrawable();
217f4a72c4f1aa2394c6c289ed89dcb95cde548f236Aidan Snoswell    }
218f4a72c4f1aa2394c6c289ed89dcb95cde548f236Aidan Snoswell
219f4a72c4f1aa2394c6c289ed89dcb95cde548f236Aidan Snoswell    /**
220f4a72c4f1aa2394c6c289ed89dcb95cde548f236Aidan Snoswell     * Sets the menu button bitmap
221f4a72c4f1aa2394c6c289ed89dcb95cde548f236Aidan Snoswell     *
222f4a72c4f1aa2394c6c289ed89dcb95cde548f236Aidan Snoswell     * @param bitmap Bitmap to the menu button to.
223f4a72c4f1aa2394c6c289ed89dcb95cde548f236Aidan Snoswell     */
224f4a72c4f1aa2394c6c289ed89dcb95cde548f236Aidan Snoswell    public void setMenuButtonBitmap(Bitmap bitmap) {
225f4a72c4f1aa2394c6c289ed89dcb95cde548f236Aidan Snoswell        mUiController.setMenuButtonBitmap(bitmap);
226f4a72c4f1aa2394c6c289ed89dcb95cde548f236Aidan Snoswell    }
227da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
228da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    /**
229da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     * Set the title of the menu.
230da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     */
231da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    public void setTitle(CharSequence title) {
232da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen        mUiController.setTitle(title);
233da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    }
234da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
235da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    /**
236da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     * Set the System UI to be light.
237da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     */
238da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    public void setLightMode() {
239da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen        mUiController.setLightMode();
240da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    }
241da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
242da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    /**
243da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     * Set the System UI to be dark.
244da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     */
245da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    public void setDarkMode() {
246da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen        mUiController.setDarkMode();
247da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    }
248da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
249da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    /**
250da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     * Set the System UI to be dark during day mode and light during night mode.
251da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     */
252da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    public void setAutoLightDarkMode() {
253da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen        mUiController.setAutoLightDarkMode();
254da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    }
255da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
256da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    /**
257da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     * Sets the application background to the given {@link android.graphics.Bitmap}.
258da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     *
259da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     * @param bitmap to use as background.
260da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     */
261da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    public void setBackground(Bitmap bitmap) {
262da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen        mUiController.setBackground(bitmap);
263da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    }
264da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
265da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    /**
26665de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen     * Sets the color of the scrim to the right of the car menu drawer.
26765de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen     */
268da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    public void setScrimColor(int color) {
269da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen        mUiController.setScrimColor(color);
270da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    }
271da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
272da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    /**
273da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     * Show the menu associated with the given id in the drawer.
274da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     *
275da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     * @param id Id of the menu to link to.
276da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     * @param title Title that should be displayed.
277da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen     */
278da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    public void showMenu(String id, String title) {
279da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen        mUiController.showMenu(id, title);
280da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    }
281da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
28265de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    public boolean onMenuClicked() {
28365de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        if (mMenuClickListener != null) {
284cdab519a5f1116d2aba680ac1bc2bfd05e5de980Aidan Snoswell            return mMenuClickListener.onClicked();
28565de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        }
28665de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        return false;
28765de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    }
28865de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen
28965de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    public void restoreSearchBox() {
29065de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        if (isSearchBoxEnabled()) {
29165de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen            mUiController.showSearchBox(mSearchBoxOnClickListener);
29265de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen            mShowingSearchBox = true;
29365de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        }
294da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    }
295da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
296da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    private final CarMenuCallbacks.OnChildrenChangedListener mMenuListener =
297da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen            new CarMenuCallbacks.OnChildrenChangedListener() {
298da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen                @Override
299da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen                public void onChildrenChanged(String parentId) {
300da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen                    if (mOnCreateCalled) {
30165de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen                        mUiController.onChildrenChanged(parentId);
302da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen                    }
303da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen                }
304da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
305da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen                @Override
306da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen                public void onChildChanged(String parentId, Bundle item,
30765de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen                        Drawable leftIcon, Drawable rightIcon) {
308da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen                    DisplayMetrics metrics = getResources().getDisplayMetrics();
309da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen                    if (leftIcon != null) {
31065de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen                        item.putParcelable(MenuItemConstants.KEY_LEFTICON,
311da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen                                Utils.snapshot(metrics, leftIcon));
312da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen                    }
313da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
314da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen                    if (rightIcon != null) {
31565de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen                        item.putParcelable(MenuItemConstants.KEY_RIGHTICON,
316da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen                                Utils.snapshot(metrics, rightIcon));
317da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen                    }
318da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen                    if (mOnCreateCalled) {
31965de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen                        mUiController.onChildChanged(parentId, item);
320da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen                    }
321da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen                }
322da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen            };
323da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
324da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    public void closeDrawer() {
325da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen        mUiController.closeDrawer();
326da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    }
327da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
328da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    public void openDrawer() {
329da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen        mUiController.openDrawer();
330da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    }
331da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen
33270f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    public boolean isDrawerShowing() {
33370f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        return mDrawerShowing;
33470f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    }
33570f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen
33665de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    public void setDrawerShowing(boolean showing) {
33765de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        mDrawerShowing = showing;
33865de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    }
33965de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen
34065de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    public boolean isSearchBoxEnabled() {
34165de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        return mSearchBoxEnabled;
34265de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    }
34365de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen
34465de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    public boolean isShowingSearchBox() {
34565de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        return mShowingSearchBox;
34665de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    }
34765de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen
34870f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    /**
34970f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen     * Shows a small clickable {@link android.widget.EditText}.
35070f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen     *
35170f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen     * {@link View} will be {@code null} in {@link View.OnClickListener#onClick(View)}.
35270f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen     *
35370f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen     * @param listener {@link View.OnClickListener} that is called when user selects the
35470f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen     *                 {@link android.widget.EditText}.
35570f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen     */
35670f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    public void showSearchBox(View.OnClickListener listener) {
35770f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        if (!isDrawerShowing()) {
35870f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen            mUiController.showSearchBox(listener);
35970f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen            mShowingSearchBox = true;
36070f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        }
36170f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        mSearchBoxEnabled = true;
36270f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        mSearchBoxOnClickListener = listener;
36370f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    }
36470f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen
36565de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    public void showSearchBox() {
36665de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        showSearchBox(mSearchBoxOnClickListener);
36765de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    }
36865de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen
36970f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    public void hideSearchBox() {
37070f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        if (isShowingSearchBox()) {
37170f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen            stopInput();
37270f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        }
37370f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        mSearchBoxEnabled = false;
37470f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    }
37570f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen
37670f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    public void setSearchBoxEditListener(SearchBoxEditListener listener) {
37765de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        mUiController.setSearchBoxEditListener(listener);
37870f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    }
37970f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen
38070f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    public void stopInput() {
38170f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        // STOPSHIP: sometimes focus is lost and we are not able to hide the keyboard.
38270f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        // properly fix this before we ship.
38370f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        if (mSearchBoxView != null) {
38470f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen            mSearchBoxView.requestFocusFromTouch();
38570f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        }
38670f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        mUiController.stopInput();
38770f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        mInputManager.stopInput();
38870f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        mShowingSearchBox = false;
38970f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    }
39070f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen
39170f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    /**
39270f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen     * Start input on the search box that is provided by a car ui provider.
39370f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen     * TODO: Migrate to use the new input/search api once it becomes stable (b/27108311).
39470f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen     * @param hint Search hint
39570f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen     */
39670f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    public void startInput(String hint) {
39770f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        startInput(hint, mSearchBoxOnClickListener);
39870f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    }
39970f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen
40070f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    /**
40170f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen     * Start input on the search box that is provided by a car ui provider.
40270f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen     * TODO: Migrate to use the new input/search api once it becomes stable (b/27108311).
40370f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen     * @param hint Search hint
40470f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen     * @param onClickListener Listener for the search box clicks.
40570f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen     */
40670f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    public void startInput(final String hint, final View.OnClickListener onClickListener) {
40770f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        mInputManager = getInputManager();
40865de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        EditText inputView = mUiController.startInput(hint, onClickListener);
40970f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        getInputManager().startInput(inputView);
41070f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        mSearchBoxView = inputView;
41170f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        mShowingSearchBox = true;
41270f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    }
41370f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen
41465de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen    public void setSearchBoxColors(int backgroundColor, int searchLogoColor, int textColor,
41570f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen            int hintTextColor) {
41665de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        mUiController.setSearchBoxColors(backgroundColor, searchLogoColor,
41765de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen                textColor, hintTextColor);
41870f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    }
41970f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen
42070f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    public void setSearchBoxEndView(View endView) {
42170f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen        mUiController.setSearchBoxEndView(endView);
42270f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    }
42370f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen
42470f6a63ea01a15f33f282edcf31948a35b789aa7Yao Chen    public void showToast(String text, int duration) {
42565de2039a94251f62d02a32e3136c0db4fc80d90Yao Chen        mUiController.showToast(text, duration);
426da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen    }
427da63b8de8a536a9e19c5443fcc3e2d4d2316f5eaYao Chen}
428