Loading core/java/android/app/Activity.java +3 −1 Original line number Diff line number Diff line Loading @@ -2095,7 +2095,9 @@ public class Activity extends ContextThemeWrapper "by the window decor. Do not request Window.FEATURE_ACTION_BAR and set " + "android:windowActionBar to false in your theme to use a Toolbar instead."); } mActionBar = new ToolbarActionBar(toolbar, getTitle(), this); ToolbarActionBar tbab = new ToolbarActionBar(toolbar, getTitle(), this); mActionBar = tbab; mWindow.setCallback(tbab.getWrappedWindowCallback()); mActionBar.invalidateOptionsMenu(); } Loading core/java/android/view/WindowCallbackWrapper.java 0 → 100644 +144 −0 Original line number Diff line number Diff line /* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.view; import android.view.accessibility.AccessibilityEvent; /** * A simple decorator stub for Window.Callback that passes through any calls * to the wrapped instance as a base implementation. Call super.foo() to call into * the wrapped callback for any subclasses. * * @hide for internal use */ public class WindowCallbackWrapper implements Window.Callback { private Window.Callback mWrapped; public WindowCallbackWrapper(Window.Callback wrapped) { if (wrapped == null) { throw new IllegalArgumentException("Window callback may not be null"); } mWrapped = wrapped; } @Override public boolean dispatchKeyEvent(KeyEvent event) { return mWrapped.dispatchKeyEvent(event); } @Override public boolean dispatchKeyShortcutEvent(KeyEvent event) { return mWrapped.dispatchKeyShortcutEvent(event); } @Override public boolean dispatchTouchEvent(MotionEvent event) { return mWrapped.dispatchTouchEvent(event); } @Override public boolean dispatchTrackballEvent(MotionEvent event) { return mWrapped.dispatchTrackballEvent(event); } @Override public boolean dispatchGenericMotionEvent(MotionEvent event) { return mWrapped.dispatchGenericMotionEvent(event); } @Override public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { return mWrapped.dispatchPopulateAccessibilityEvent(event); } @Override public View onCreatePanelView(int featureId) { return mWrapped.onCreatePanelView(featureId); } @Override public boolean onCreatePanelMenu(int featureId, Menu menu) { return mWrapped.onCreatePanelMenu(featureId, menu); } @Override public boolean onPreparePanel(int featureId, View view, Menu menu) { return mWrapped.onPreparePanel(featureId, view, menu); } @Override public boolean onMenuOpened(int featureId, Menu menu) { return mWrapped.onMenuOpened(featureId, menu); } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { return mWrapped.onMenuItemSelected(featureId, item); } @Override public void onWindowAttributesChanged(WindowManager.LayoutParams attrs) { mWrapped.onWindowAttributesChanged(attrs); } @Override public void onContentChanged() { mWrapped.onContentChanged(); } @Override public void onWindowFocusChanged(boolean hasFocus) { mWrapped.onWindowFocusChanged(hasFocus); } @Override public void onAttachedToWindow() { mWrapped.onAttachedToWindow(); } @Override public void onDetachedFromWindow() { mWrapped.onDetachedFromWindow(); } @Override public void onPanelClosed(int featureId, Menu menu) { mWrapped.onPanelClosed(featureId, menu); } @Override public boolean onSearchRequested() { return mWrapped.onSearchRequested(); } @Override public ActionMode onWindowStartingActionMode(ActionMode.Callback callback) { return mWrapped.onWindowStartingActionMode(callback); } @Override public void onActionModeStarted(ActionMode mode) { mWrapped.onActionModeStarted(mode); } @Override public void onActionModeFinished(ActionMode mode) { mWrapped.onActionModeFinished(mode); } } core/java/com/android/internal/app/ToolbarActionBar.java +23 −1 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.Window; import android.view.WindowCallbackWrapper; import android.widget.SpinnerAdapter; import android.widget.Toolbar; import com.android.internal.view.menu.MenuBuilder; Loading @@ -40,6 +41,7 @@ import java.util.ArrayList; public class ToolbarActionBar extends ActionBar { private Toolbar mToolbar; private DecorToolbar mDecorToolbar; private boolean mToolbarMenuPrepared; private Window.Callback mWindowCallback; private boolean mLastMenuVisibility; Loading @@ -64,12 +66,16 @@ public class ToolbarActionBar extends ActionBar { public ToolbarActionBar(Toolbar toolbar, CharSequence title, Window.Callback windowCallback) { mToolbar = toolbar; mDecorToolbar = new ToolbarWidgetWrapper(toolbar, false); mWindowCallback = windowCallback; mWindowCallback = new ToolbarCallbackWrapper(windowCallback); mDecorToolbar.setWindowCallback(mWindowCallback); toolbar.setOnMenuItemClickListener(mMenuClicker); mDecorToolbar.setWindowTitle(title); } public Window.Callback getWrappedWindowCallback() { return mWindowCallback; } @Override public void setCustomView(View view) { setCustomView(view, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); Loading Loading @@ -465,4 +471,20 @@ public class ToolbarActionBar extends ActionBar { mMenuVisibilityListeners.get(i).onMenuVisibilityChanged(isVisible); } } private class ToolbarCallbackWrapper extends WindowCallbackWrapper { public ToolbarCallbackWrapper(Window.Callback wrapped) { super(wrapped); } @Override public boolean onPreparePanel(int featureId, View view, Menu menu) { final boolean result = super.onPreparePanel(featureId, view, menu); if (result && !mToolbarMenuPrepared) { mDecorToolbar.setMenuPrepared(); mToolbarMenuPrepared = true; } return result; } } } Loading
core/java/android/app/Activity.java +3 −1 Original line number Diff line number Diff line Loading @@ -2095,7 +2095,9 @@ public class Activity extends ContextThemeWrapper "by the window decor. Do not request Window.FEATURE_ACTION_BAR and set " + "android:windowActionBar to false in your theme to use a Toolbar instead."); } mActionBar = new ToolbarActionBar(toolbar, getTitle(), this); ToolbarActionBar tbab = new ToolbarActionBar(toolbar, getTitle(), this); mActionBar = tbab; mWindow.setCallback(tbab.getWrappedWindowCallback()); mActionBar.invalidateOptionsMenu(); } Loading
core/java/android/view/WindowCallbackWrapper.java 0 → 100644 +144 −0 Original line number Diff line number Diff line /* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.view; import android.view.accessibility.AccessibilityEvent; /** * A simple decorator stub for Window.Callback that passes through any calls * to the wrapped instance as a base implementation. Call super.foo() to call into * the wrapped callback for any subclasses. * * @hide for internal use */ public class WindowCallbackWrapper implements Window.Callback { private Window.Callback mWrapped; public WindowCallbackWrapper(Window.Callback wrapped) { if (wrapped == null) { throw new IllegalArgumentException("Window callback may not be null"); } mWrapped = wrapped; } @Override public boolean dispatchKeyEvent(KeyEvent event) { return mWrapped.dispatchKeyEvent(event); } @Override public boolean dispatchKeyShortcutEvent(KeyEvent event) { return mWrapped.dispatchKeyShortcutEvent(event); } @Override public boolean dispatchTouchEvent(MotionEvent event) { return mWrapped.dispatchTouchEvent(event); } @Override public boolean dispatchTrackballEvent(MotionEvent event) { return mWrapped.dispatchTrackballEvent(event); } @Override public boolean dispatchGenericMotionEvent(MotionEvent event) { return mWrapped.dispatchGenericMotionEvent(event); } @Override public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { return mWrapped.dispatchPopulateAccessibilityEvent(event); } @Override public View onCreatePanelView(int featureId) { return mWrapped.onCreatePanelView(featureId); } @Override public boolean onCreatePanelMenu(int featureId, Menu menu) { return mWrapped.onCreatePanelMenu(featureId, menu); } @Override public boolean onPreparePanel(int featureId, View view, Menu menu) { return mWrapped.onPreparePanel(featureId, view, menu); } @Override public boolean onMenuOpened(int featureId, Menu menu) { return mWrapped.onMenuOpened(featureId, menu); } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { return mWrapped.onMenuItemSelected(featureId, item); } @Override public void onWindowAttributesChanged(WindowManager.LayoutParams attrs) { mWrapped.onWindowAttributesChanged(attrs); } @Override public void onContentChanged() { mWrapped.onContentChanged(); } @Override public void onWindowFocusChanged(boolean hasFocus) { mWrapped.onWindowFocusChanged(hasFocus); } @Override public void onAttachedToWindow() { mWrapped.onAttachedToWindow(); } @Override public void onDetachedFromWindow() { mWrapped.onDetachedFromWindow(); } @Override public void onPanelClosed(int featureId, Menu menu) { mWrapped.onPanelClosed(featureId, menu); } @Override public boolean onSearchRequested() { return mWrapped.onSearchRequested(); } @Override public ActionMode onWindowStartingActionMode(ActionMode.Callback callback) { return mWrapped.onWindowStartingActionMode(callback); } @Override public void onActionModeStarted(ActionMode mode) { mWrapped.onActionModeStarted(mode); } @Override public void onActionModeFinished(ActionMode mode) { mWrapped.onActionModeFinished(mode); } }
core/java/com/android/internal/app/ToolbarActionBar.java +23 −1 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.Window; import android.view.WindowCallbackWrapper; import android.widget.SpinnerAdapter; import android.widget.Toolbar; import com.android.internal.view.menu.MenuBuilder; Loading @@ -40,6 +41,7 @@ import java.util.ArrayList; public class ToolbarActionBar extends ActionBar { private Toolbar mToolbar; private DecorToolbar mDecorToolbar; private boolean mToolbarMenuPrepared; private Window.Callback mWindowCallback; private boolean mLastMenuVisibility; Loading @@ -64,12 +66,16 @@ public class ToolbarActionBar extends ActionBar { public ToolbarActionBar(Toolbar toolbar, CharSequence title, Window.Callback windowCallback) { mToolbar = toolbar; mDecorToolbar = new ToolbarWidgetWrapper(toolbar, false); mWindowCallback = windowCallback; mWindowCallback = new ToolbarCallbackWrapper(windowCallback); mDecorToolbar.setWindowCallback(mWindowCallback); toolbar.setOnMenuItemClickListener(mMenuClicker); mDecorToolbar.setWindowTitle(title); } public Window.Callback getWrappedWindowCallback() { return mWindowCallback; } @Override public void setCustomView(View view) { setCustomView(view, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); Loading Loading @@ -465,4 +471,20 @@ public class ToolbarActionBar extends ActionBar { mMenuVisibilityListeners.get(i).onMenuVisibilityChanged(isVisible); } } private class ToolbarCallbackWrapper extends WindowCallbackWrapper { public ToolbarCallbackWrapper(Window.Callback wrapped) { super(wrapped); } @Override public boolean onPreparePanel(int featureId, View view, Menu menu) { final boolean result = super.onPreparePanel(featureId, view, menu); if (result && !mToolbarMenuPrepared) { mDecorToolbar.setMenuPrepared(); mToolbarMenuPrepared = true; } return result; } } }