Skip to content

Commit

Permalink
fix leaking activity, make sub fabs generic (defined by the using app…
Browse files Browse the repository at this point in the history
…lication)
  • Loading branch information
matthias committed Nov 30, 2014
1 parent 4a00a4c commit 2fef9d5
Show file tree
Hide file tree
Showing 9 changed files with 161 additions and 74 deletions.
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Sun Nov 23 11:17:06 CET 2014
#Wed Nov 26 21:42:12 CET 2014
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
54 changes: 53 additions & 1 deletion library/src/main/java/de/mtthsfrdrch/faboverload/Fab.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,18 @@
package de.mtthsfrdrch.faboverload;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.widget.ImageButton;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class Fab extends ImageButton {
import static de.mtthsfrdrch.faboverload.Utils.setInvisible;

public class Fab extends RelativeLayout {

private ImageButton button;
private TextView title;

@SuppressWarnings("UnusedDeclaration")
public Fab(Context context) {
Expand All @@ -17,5 +25,49 @@ public Fab(Context context, AttributeSet attrs) {

public Fab(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
inflate(context, R.layout.fab, this);

title = (TextView) findViewById(R.id.fab_title);
button = (ImageButton) findViewById(R.id.fab_button);

final TypedArray attributes = context
.obtainStyledAttributes(attrs, R.styleable.fov);

final int buttonBackground = attributes.getResourceId(R.styleable.fov_buttonBackground,
R.drawable.btn_fab_background);
button.setBackgroundResource(buttonBackground);

final int buttonImage = attributes.getResourceId(R.styleable.fov_buttonImage,
R.drawable.ic_add);
button.setImageResource(buttonImage);

final int buttonId = attributes.getResourceId(R.styleable.fov_buttonId,
R.id.fov_btn_fab_sub);
button.setId(buttonId);

// title.setTextAppearance(context,
// attributes.getResourceId(R.styleable.fov_textAppearance,
// android.R.style.TextAppearance_Material_Button));
String titleText = attributes.getString(R.styleable.fov_titleText);
title.setText(titleText);

attributes.recycle();
setInvisible(this);
}

public void setTitle(String title) {
this.title.setText(title);
}

public void setButtonBackground(int backgroundRes) {
button.setBackgroundResource(backgroundRes);
}

public void setButtonImage(int imageRes) {
button.setImageDrawable(button.getContext().getDrawable(imageRes));
}

public void setButtonClickListener(OnClickListener clickListener) {
button.setOnClickListener(clickListener);
}
}
46 changes: 34 additions & 12 deletions library/src/main/java/de/mtthsfrdrch/faboverload/FabOverload.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,47 +4,53 @@
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.content.Context;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewAnimationUtils;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.PopupWindow;

import java.util.ArrayList;
import java.util.List;

import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
import static de.mtthsfrdrch.faboverload.Utils.isVisible;

public class FabOverload extends PopupWindow {

private View root;

private Fab fab;
private ImageButton fab;
private LinearLayout subFabContainer;
private List<Fab> subFabs = new ArrayList<>();
private View.OnClickListener fabClickListener;

public FabOverload(Context context) {
super(LayoutInflater.from(context).inflate(R.layout.popup_fab, null),
super(LayoutInflater.from(context).inflate(R.layout.faboverload, null),
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);

// setOutsideTouchable(false);
setAnimationStyle(0);

root = getContentView();

fab = (Fab) root.findViewById(R.id.btn_fab);
Fab subFab = (Fab) root.findViewById(R.id.btn_fab_sub_1);
subFabs.add(subFab);
subFab = (Fab) root.findViewById(R.id.btn_fab_sub_2);
subFabs.add(subFab);
subFabContainer = (LinearLayout) root.findViewById(R.id.sub_fab_container);
fab = (ImageButton) root.findViewById(R.id.btn_fab);

// Fab subFab = (Fab) root.findViewById(R.id.btn_fab_sub_1);
// subFabs.add(subFab);
// subFab = (Fab) root.findViewById(R.id.btn_fab_sub_2);
// subFabs.add(subFab);
// subFab = (Fab) root.findViewById(R.id.btn_fab_sub_3);
// subFabs.add(subFab);
}

public void setFabClickListener(View.OnClickListener clickListener) {
fabClickListener = clickListener;
fab.setOnClickListener(clickListener);
for (Fab subFab : subFabs) {
subFab.setOnClickListener(clickListener);
subFab.setButtonClickListener(clickListener);
}
}

Expand Down Expand Up @@ -75,7 +81,7 @@ public void showSubFabs() {
int finalRadius = Math.max(view.getWidth(), view.getHeight());

// create the animator for this view (the start radius is zero)
Animator animator = ViewAnimationUtils.createCircularReveal(view, cx, cy, 0,
Animator animator = ViewAnimationUtils.createCircularReveal(view, cx, cy, finalRadius / 2,
finalRadius);
animator.setStartDelay(0);
animator.setDuration(100);
Expand Down Expand Up @@ -132,4 +138,20 @@ public boolean isFabVisible() {
public boolean isOverloadVisible() {
return getWidth() == ViewGroup.LayoutParams.MATCH_PARENT;
}

public void inflateSubFabs(int mergeLayout) {
subFabContainer.removeAllViews();
LinearLayout.inflate(getContentView().getContext(), mergeLayout, subFabContainer);
int subFabCount = subFabContainer.getChildCount();
subFabs = new ArrayList<>(subFabCount);
for (int i = 0; i < subFabCount; i++) {
subFabs.add((Fab) subFabContainer.getChildAt(i));
}
setFabClickListener(fabClickListener);
getContentView().invalidate();
}

public void addFab(Fab fab) {
subFabContainer.addView(fab);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
import android.content.res.Resources;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

public class FabOverloadController {

Expand All @@ -21,6 +22,14 @@ public FabOverloadController(Context context, View container) {
this.container = container;
}

public FabOverloadController(Context context, View container, int mergeLayout) {
fabOverload = new FabOverload(context);
fabOverload.inflateSubFabs(mergeLayout);
// fabOverload.setWindowLayoutMode();
buttonDistance = context.getResources().getDimensionPixelSize(R.dimen.margin_medium);
this.container = container;
}

public void switchOverload() {
if (fabOverload.isOverloadVisible()) {
fabOverload.hideSubFabs(null);
Expand All @@ -33,6 +42,8 @@ public void showFAB() {
if (!fabOverload.isShowing()) {
container.post(new Runnable() {
public void run() {
// navigationbar is overlaying the app's window, so we need extra margin
// on lollipop
int lollipopMargin = (int) Utils.dipsToPixels(Resources.getSystem(), 50);
if (Utils.isLandscape(Resources.getSystem()))
fabOverload.showAtLocation(container, Gravity.BOTTOM | Gravity.RIGHT, lollipopMargin, 0);
Expand All @@ -59,7 +70,6 @@ public void onAnimationEnd(Animator animation) {
} else {
if (fabOverload.isShowing()) {
fabOverload.hideFab(null);

}
}
}
Expand All @@ -71,4 +81,25 @@ public boolean isFabVisible() {
public void setOnClickListener(View.OnClickListener fabClickListener) {
fabOverload.setFabClickListener(fabClickListener);
}

public void addFab(FabData data) {
Fab fab = new Fab(fabOverload.getContentView().getContext(), null, R.style.Widget_FAB_sub);
fab.setId(data.getId());
fab.setTitle(data.getTitle());
if (data.getBackgroundRes() != 0) fab.setButtonBackground(data.getBackgroundRes());
if (data.getImageRes() != 0) fab.setButtonImage(data.getImageRes());
fabOverload.addFab(fab);
}

public void addAll(List<FabData> data) {
for (FabData fabData : data) addFab(fabData);
}

public void inflateSubFabs(int mergeLayout) {
fabOverload.inflateSubFabs(mergeLayout);
}

public void remove() {
fabOverload.dismiss();
}
}
52 changes: 0 additions & 52 deletions library/src/main/res/layout/popup_fab.xml

This file was deleted.

4 changes: 2 additions & 2 deletions library/src/main/res/values/styles.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
<item name="android:background">@drawable/btn_fab_background</item>
<item name="android:layout_height">@dimen/fab_sub_size</item>
<item name="android:layout_width">@dimen/fab_sub_size</item>
<item name="android:layout_marginBottom">@dimen/margin_small</item>
<item name="android:visibility">invisible</item>
<item name="android:layout_marginBottom">@dimen/margin_medium</item>
<item name="android:layout_marginRight">@dimen/margin_medium</item>
</style>


Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,25 @@
package de.mtthsfrdrch.faboverload.sample;

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.transition.TransitionManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import de.mtthsfrdrch.faboverload.FabOverloadController;
import de.mtthsfrdrch.faboverload.Utils;


public class SampleActivity extends Activity implements View.OnClickListener {

private FabOverloadController fabController;
private TextView text;

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand All @@ -22,7 +28,7 @@ protected void onCreate(Bundle savedInstanceState) {

View root = findViewById(R.id.container);

fabController = new FabOverloadController(this, root);
fabController = new FabOverloadController(this, root, R.layout.sub_fabs);
fabController.setOnClickListener(this);

Button toggle = (Button) findViewById(R.id.btn_toggle);
Expand All @@ -34,6 +40,8 @@ public void onClick(View v) {
else fabController.showFAB();
}
});

text = (TextView) findViewById(R.id.text);
}

@Override
Expand All @@ -48,6 +56,12 @@ protected void onPause() {
super.onPause();
}

@Override
protected void onDestroy() {
fabController.remove();
super.onDestroy();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
Expand Down Expand Up @@ -78,7 +92,10 @@ public void onClick(View view) {
fabController.switchOverload();
break;
case R.id.btn_fab_sub_1:
Toast.makeText(this, "Pressed Sub Fab 1", Toast.LENGTH_LONG).show();

tryShowDefaultTransitions( (ViewGroup) findViewById(R.id.container));
Utils.setVisible(text);

break;
case R.id.btn_fab_sub_2:
Toast.makeText(this, "Pressed Sub Fab 2", Toast.LENGTH_LONG).show();
Expand All @@ -87,4 +104,10 @@ public void onClick(View view) {
// NOP
}
}

public static void tryShowDefaultTransitions(ViewGroup viewGroup) {
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) {
TransitionManager.beginDelayedTransition(viewGroup);
}
}
}
Loading

0 comments on commit 2fef9d5

Please sign in to comment.