diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 50d2340..35b34ad 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -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 diff --git a/library/src/main/java/de/mtthsfrdrch/faboverload/Fab.java b/library/src/main/java/de/mtthsfrdrch/faboverload/Fab.java index acad32c..195b3e0 100644 --- a/library/src/main/java/de/mtthsfrdrch/faboverload/Fab.java +++ b/library/src/main/java/de/mtthsfrdrch/faboverload/Fab.java @@ -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) { @@ -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); } } diff --git a/library/src/main/java/de/mtthsfrdrch/faboverload/FabOverload.java b/library/src/main/java/de/mtthsfrdrch/faboverload/FabOverload.java index 6e62bca..5c6e77b 100644 --- a/library/src/main/java/de/mtthsfrdrch/faboverload/FabOverload.java +++ b/library/src/main/java/de/mtthsfrdrch/faboverload/FabOverload.java @@ -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 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); } } @@ -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); @@ -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); + } } diff --git a/library/src/main/java/de/mtthsfrdrch/faboverload/FabOverloadController.java b/library/src/main/java/de/mtthsfrdrch/faboverload/FabOverloadController.java index 6d11eb4..9e9f13e 100644 --- a/library/src/main/java/de/mtthsfrdrch/faboverload/FabOverloadController.java +++ b/library/src/main/java/de/mtthsfrdrch/faboverload/FabOverloadController.java @@ -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 { @@ -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); @@ -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); @@ -59,7 +70,6 @@ public void onAnimationEnd(Animator animation) { } else { if (fabOverload.isShowing()) { fabOverload.hideFab(null); - } } } @@ -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 data) { + for (FabData fabData : data) addFab(fabData); + } + + public void inflateSubFabs(int mergeLayout) { + fabOverload.inflateSubFabs(mergeLayout); + } + + public void remove() { + fabOverload.dismiss(); + } } diff --git a/library/src/main/res/layout/popup_fab.xml b/library/src/main/res/layout/popup_fab.xml deleted file mode 100644 index 13115d1..0000000 --- a/library/src/main/res/layout/popup_fab.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/library/src/main/res/values/styles.xml b/library/src/main/res/values/styles.xml index 829f2aa..8ff4d22 100644 --- a/library/src/main/res/values/styles.xml +++ b/library/src/main/res/values/styles.xml @@ -17,8 +17,8 @@ @drawable/btn_fab_background @dimen/fab_sub_size @dimen/fab_sub_size - @dimen/margin_small - invisible + @dimen/margin_medium + @dimen/margin_medium diff --git a/sample/src/main/java/de/mtthsfrdrch/faboverload/sample/SampleActivity.java b/sample/src/main/java/de/mtthsfrdrch/faboverload/sample/SampleActivity.java index f5cdc45..baa2aee 100644 --- a/sample/src/main/java/de/mtthsfrdrch/faboverload/sample/SampleActivity.java +++ b/sample/src/main/java/de/mtthsfrdrch/faboverload/sample/SampleActivity.java @@ -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) { @@ -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); @@ -34,6 +40,8 @@ public void onClick(View v) { else fabController.showFAB(); } }); + + text = (TextView) findViewById(R.id.text); } @Override @@ -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. @@ -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(); @@ -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); + } + } } diff --git a/sample/src/main/res/layout/activity_sample.xml b/sample/src/main/res/layout/activity_sample.xml index 89c5693..6aab7c5 100644 --- a/sample/src/main/res/layout/activity_sample.xml +++ b/sample/src/main/res/layout/activity_sample.xml @@ -3,11 +3,22 @@ android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" + android:orientation="vertical" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".SampleActivity"> + +