Skip to content

Instantly share code, notes, and snippets.

View NikolaDespotoski's full-sized avatar

Nikola Despotoski NikolaDespotoski

View GitHub Profile
@NikolaDespotoski
NikolaDespotoski / OverflowButton.java
Last active December 21, 2015 15:58
Obtain the View reference of the overflow button in the ActionBar, using java reflection.
// Path to overflow button in nutshell: android.R.id.home -> ActionBarView -> AbsActionBarView -> ActionMenuPresenter -> mOverflowButton
public static View getOverflowButton(Activity a){
View homeButton = a.findViewById(android.R.id.home);
ViewParent parentOfHome = homeButton.getParent().getParent(); //ActionBarView is parent of home ImageView, see layout file in sources
try{
parentOfHome = parentOfHome.getParent();//get to ActionBarView;
Class absActionBarView = parentOfHome.getClass().getSuperclass(); //ActionBarView -> AbsActionBarView class
Field menuPresenter = absActionBarView.getDeclaredField("mActionMenuPresenter"); // ActionMenuPresenter is the object that calls openOverflowMenu() closeOverflowMenu()
@NikolaDespotoski
NikolaDespotoski / MenuItemLongPress.java
Created October 14, 2013 17:15
Capturing Android MenuItem long press event with help of Java Reflection.
private interface OnMenuItemLongClickListener{
boolean onMenuItemLongClik(MenuItem m);
}
private void getMenuItemsView(Activity a, final Menu m, final OnMenuItemLongClickListener listener) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
View homeButton = a.findViewById(android.R.id.home);
ViewParent parentOfHome = homeButton.getParent().getParent(); //ActionBarView is parent of home ImageView, see layout file in sources
if (!parentOfHome.getClass().getName().contains("ActionBarView")) {
parentOfHome = parentOfHome.getParent();
Class absAbv = parentOfHome.getClass().getSuperclass(); //ActionBarView -> AbsActionBarView class
@NikolaDespotoski
NikolaDespotoski / AllCapsTransformationMethodCompat.java
Last active August 29, 2015 14:02
textView.setAllCaps() backward compatibility below ICS
public class AllCapsMethodTransformationCompat implements TransformationMethod {
private static AllCapsMethodTransformationCompat sInstance;
private static AllCapsMethodTransformationCompat sKeepOriginalInstance;
private boolean mAllCaps = false;
private String mOriginalString;
public AllCapsMethodTransformationCompat(String string) {
mOriginalString = string;
}
@NikolaDespotoski
NikolaDespotoski / MapViewActivity.java
Last active August 29, 2015 14:06
Abstract MapViewActivity built on Google Maps v2. It searches for MapView instance and handles all segments of activity lifecycle. Dependencies: android-support-v7-appcompat
import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import com.google.android.gms.maps.GoogleMap;
@NikolaDespotoski
NikolaDespotoski / NotifyingFadingActionBar.java
Last active August 29, 2015 14:07
FadingActionBar is great library, but it lacks ability to bind listeners to track how much ActionBarDrawable has been faded in/out.
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@NikolaDespotoski
NikolaDespotoski / ActionBarDrawerToggleHelper
Last active January 19, 2016 00:30
Animate and toggle Toolbar navigation icon without opening the navigation drawer.
private enum ActionDrawableState{
BURGER, ARROW
}
private static void toggleActionBarIcon(ActionDrawableState state, final ActionBarDrawerToggle toggle, boolean animate){
if(animate) {
float start = state == ActionDrawableState.ARROW ? 0f : 1.0f;
final float end = Math.abs(start - 1);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
ValueAnimator offsetAnimator = ValueAnimator.ofFloat(start, end);
offsetAnimator.setDuration(300);
@NikolaDespotoski
NikolaDespotoski / SwipeRefreshLayoutToggleScrollListener
Created November 27, 2014 15:19
Fix for known bug when scrolling a RecyclerView inside SwipeRefreshLayout to the top and refresh is called prematurely, before the first item is shown.
public class SwipeRefreshLayoutToggleScrollListener extends RecyclerView.OnScrollListener {
private List<RecyclerView.OnScrollListener> mScrollListeners = new ArrayList<RecyclerView.OnScrollListener>();
private int mExpectedVisiblePosition = 0;
private SwipeRefreshLayout mSwipeLayout;
public SwipeRefreshLayoutToggleScrollListener(SwipeRefreshLayout swipeLayout) {
mSwipeLayout = swipeLayout;
}
public void addScrollListener(RecyclerView.OnScrollListener listener){
mScrollListeners.add(listener);
@NikolaDespotoski
NikolaDespotoski / MentionTransformation
Created November 28, 2014 07:27
Transformation method that looks for mentions of Twitter-like format in any TextView.
/**
* Created by nikola on 11/28/14.
*/
public class MentionTransformation implements TransformationMethod {
private int mColor;
private Pattern MENTIONS_PATTERN = Pattern.compile("\\B@[a-z0-9_-]+");
private MentionTransformation(int color) {
mColor = color;
@NikolaDespotoski
NikolaDespotoski / MaterialColorRandomizer.java
Last active August 29, 2015 14:11
Material color randomizer
/**
* Created by nikola on 11/14/14.
*/
public class MaterialColorRandomizer {
private Shade mNuance;
private Context mContext;
private MaterialColorRandomizer(Context context) {
mContext = context;
@NikolaDespotoski
NikolaDespotoski / BrickTransition
Created December 12, 2014 15:31
KitKat+ custom transition. It animates view coming from left or right depending if it is even or odd child in the ViewGroup.
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.annotation.TargetApi;
import android.os.Build;
import android.transition.TransitionValues;
import android.transition.Visibility;
import android.view.View;
import android.view.ViewGroup;
/**