diff options
Diffstat (limited to 'showcaseview/java/com/github/amlcurran/showcaseview/targets/ActionBarViewWrapper.java')
-rw-r--r-- | showcaseview/java/com/github/amlcurran/showcaseview/targets/ActionBarViewWrapper.java | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/showcaseview/java/com/github/amlcurran/showcaseview/targets/ActionBarViewWrapper.java b/showcaseview/java/com/github/amlcurran/showcaseview/targets/ActionBarViewWrapper.java new file mode 100644 index 0000000..dd09d44 --- /dev/null +++ b/showcaseview/java/com/github/amlcurran/showcaseview/targets/ActionBarViewWrapper.java @@ -0,0 +1,164 @@ +/* + * Copyright 2014 Alex Curran + * + * 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 com.github.amlcurran.showcaseview.targets; + +import android.util.Log; +import android.view.View; +import android.view.ViewParent; + +import java.lang.reflect.Field; + +/** + * Class which wraps round the many implementations of ActionBarView and allows finding of Action + * items + */ +class ActionBarViewWrapper { + + private ViewParent mActionBarView; + private Class mActionBarViewClass; + private Class mAbsActionBarViewClass; + + public ActionBarViewWrapper(ViewParent actionBarView) { + if (!actionBarView.getClass().getName().contains("ActionBarView")) { + String previousP = actionBarView.getClass().getName(); + actionBarView = actionBarView.getParent(); + String throwP = actionBarView.getClass().getName(); + if (!actionBarView.getClass().getName().contains("ActionBarView")) { + throw new IllegalStateException("Cannot find ActionBarView for " + + "Activity, instead found " + previousP + " and " + throwP); + } + } + mActionBarView = actionBarView; + mActionBarViewClass = actionBarView.getClass(); + mAbsActionBarViewClass = actionBarView.getClass().getSuperclass(); + } + + /** + * Return the view which represents the spinner on the ActionBar, or null if there isn't one + */ + public View getSpinnerView() { + try { + Field spinnerField = mActionBarViewClass.getDeclaredField("mSpinner"); + spinnerField.setAccessible(true); + return (View) spinnerField.get(mActionBarView); + } catch (NoSuchFieldException e) { + Log.e("TAG", "Failed to find actionbar spinner", e); + } catch (IllegalAccessException e) { + Log.e("TAG", "Failed to access actionbar spinner", e); + } + return null; + } + + /** + * Return the view which represents the title on the ActionBar, or null if there isn't one + */ + public View getTitleView() { + try { + Field mTitleViewField = mActionBarViewClass.getDeclaredField("mTitleView"); + mTitleViewField.setAccessible(true); + return (View) mTitleViewField.get(mActionBarView); + } catch (NoSuchFieldException e) { + Log.e("TAG", "Failed to find actionbar title", e); + } catch (IllegalAccessException e) { + Log.e("TAG", "Failed to access actionbar title", e); + } + return null; + } + + /** + * Return the view which represents the overflow action item on the ActionBar, or null if there isn't one + */ + public View getOverflowView() { + try { + Field actionMenuPresenterField = mAbsActionBarViewClass.getDeclaredField("mActionMenuPresenter"); + actionMenuPresenterField.setAccessible(true); + Object actionMenuPresenter = actionMenuPresenterField.get(mActionBarView); + Field overflowButtonField = actionMenuPresenter.getClass().getDeclaredField("mOverflowButton"); + overflowButtonField.setAccessible(true); + return (View) overflowButtonField.get(actionMenuPresenter); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + return null; + } + + /** + * Return the view which represents the MediaRouterButton action item on the ActionBar, or null + * if there isn't one + */ + public View getMediaRouterButtonView() { + try { + Field actionMenuPresenterField = + mAbsActionBarViewClass.getDeclaredField("mActionMenuPresenter"); + actionMenuPresenterField.setAccessible(true); + Object actionMenuPresenter = actionMenuPresenterField.get(mActionBarView); + Field mediaRouteButtonField = actionMenuPresenter.getClass() + .getDeclaredField("mScrapActionButtonView"); + mediaRouteButtonField.setAccessible(true); + return (View) mediaRouteButtonField.get(actionMenuPresenter); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + return null; + } + + public View getActionItem(int actionItemId) { + try { + Field actionMenuPresenterField = mAbsActionBarViewClass.getDeclaredField("mActionMenuPresenter"); + actionMenuPresenterField.setAccessible(true); + Object actionMenuPresenter = actionMenuPresenterField.get(mActionBarView); + + Field menuViewField = actionMenuPresenter.getClass().getSuperclass().getDeclaredField("mMenuView"); + menuViewField.setAccessible(true); + Object menuView = menuViewField.get(actionMenuPresenter); + + Field mChField; + if (menuView.getClass().toString().contains("com.actionbarsherlock")) { + // There are thousands of superclasses to traverse up + // Have to get superclasses because mChildren is private + mChField = menuView.getClass().getSuperclass().getSuperclass() + .getSuperclass().getSuperclass().getDeclaredField("mChildren"); + } else if (menuView.getClass().toString().contains("android.support.v7")) { + mChField = menuView.getClass().getSuperclass().getSuperclass() + .getSuperclass().getDeclaredField("mChildren"); + } else { + mChField = menuView.getClass().getSuperclass().getSuperclass() + .getDeclaredField("mChildren"); + } + mChField.setAccessible(true); + Object[] mChs = (Object[]) mChField.get(menuView); + for (Object mCh : mChs) { + if (mCh != null) { + View v = (View) mCh; + if (v.getId() == actionItemId) { + return v; + } + } + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + return null; + } + +} |