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