From f8213fef7332a831c2883c1fbc1cb8e02cfd9a40 Mon Sep 17 00:00:00 2001 From: Floens Date: Sun, 15 Mar 2015 19:29:59 +0100 Subject: [PATCH] Added controller presenting --- .../floens/chan/controller/Controller.java | 34 ++++++++++++++- .../chan/controller/ControllerLogic.java | 28 +++++++------ .../chan/controller/ControllerTransition.java | 2 +- .../chan/controller/FadeInTransition.java | 28 +++++++++++++ .../chan/controller/FadeOutTransition.java | 28 +++++++++++++ .../chan/controller/NavigationController.java | 10 ++--- .../controller/PopControllerTransition.java | 4 ++ .../chan/ui/activity/BoardActivity.java | 41 ++++++++++++++++--- .../chan/ui/controller/BrowseController.java | 3 +- .../ui/controller/ImageViewController.java | 39 ++++++++++++++++++ .../ui/controller/PassSettingsController.java | 4 +- .../controller/WatchSettingsController.java | 2 +- .../ui/view/TouchBlockingFrameLayout.java | 25 +++++++++++ .../main/res/layout/controller_view_image.xml | 29 +++++++++++++ 14 files changed, 248 insertions(+), 29 deletions(-) create mode 100644 Clover/app/src/main/java/org/floens/chan/controller/FadeInTransition.java create mode 100644 Clover/app/src/main/java/org/floens/chan/controller/FadeOutTransition.java create mode 100644 Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewController.java create mode 100644 Clover/app/src/main/java/org/floens/chan/ui/view/TouchBlockingFrameLayout.java create mode 100644 Clover/app/src/main/res/layout/controller_view_image.xml diff --git a/Clover/app/src/main/java/org/floens/chan/controller/Controller.java b/Clover/app/src/main/java/org/floens/chan/controller/Controller.java index 41188cfe..fe6bea3a 100644 --- a/Clover/app/src/main/java/org/floens/chan/controller/Controller.java +++ b/Clover/app/src/main/java/org/floens/chan/controller/Controller.java @@ -21,7 +21,9 @@ import android.content.Context; import android.content.res.Configuration; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; +import org.floens.chan.ui.activity.BoardActivity; import org.floens.chan.ui.toolbar.NavigationItem; public abstract class Controller { @@ -29,9 +31,14 @@ public abstract class Controller { public View view; public NavigationItem navigationItem = new NavigationItem(); - public Controller previousSibling; + + // NavigationControllers members + public Controller previousSiblingController; public NavigationController navigationController; + // Controller (for presenting) members + public Controller presentingController; + public Controller(Context context) { this.context = context; } @@ -60,7 +67,32 @@ public abstract class Controller { } public void presentController(Controller controller) { + ViewGroup contentView = ((BoardActivity) context).getContentView(); + controller.presentingController = this; + + ControllerTransition transition = new FadeInTransition(); + transition.setCallback(new ControllerTransition.Callback() { + @Override + public void onControllerTransitionCompleted(ControllerTransition transition) { + ControllerLogic.finishTransition(transition); + } + }); + ControllerLogic.startTransition(null, controller, false, true, contentView, transition); + ((BoardActivity) context).addController(controller); + } + + public void stopPresenting() { + ViewGroup contentView = ((BoardActivity) context).getContentView(); + ControllerTransition transition = new FadeOutTransition(); + transition.setCallback(new ControllerTransition.Callback() { + @Override + public void onControllerTransitionCompleted(ControllerTransition transition) { + ControllerLogic.finishTransition(transition); + } + }); + ControllerLogic.startTransition(this, null, true, false, contentView, transition); + ((BoardActivity) context).removeController(Controller.this); } public View inflateRes(int resId) { diff --git a/Clover/app/src/main/java/org/floens/chan/controller/ControllerLogic.java b/Clover/app/src/main/java/org/floens/chan/controller/ControllerLogic.java index 25f4e5bb..a1d37c8c 100644 --- a/Clover/app/src/main/java/org/floens/chan/controller/ControllerLogic.java +++ b/Clover/app/src/main/java/org/floens/chan/controller/ControllerLogic.java @@ -21,13 +21,15 @@ public class ControllerLogic { AndroidUtils.removeFromParentView(controller.view); } - public static void transition(Controller from, Controller to, boolean destroyFrom, boolean createTo, ViewGroup toView, boolean viewOver) { - if (createTo) { - to.onCreate(); - } + public static void transition(Controller from, Controller to, boolean destroyFrom, boolean createTo, ViewGroup toView) { + if (to != null) { + if (createTo) { + to.onCreate(); + } - attach(to, toView, viewOver); - to.onShow(); + attach(to, toView, true); + to.onShow(); + } if (from != null) { from.onHide(); @@ -39,17 +41,19 @@ public class ControllerLogic { } } - public static void startTransition(Controller from, Controller to, boolean destroyFrom, boolean createTo, ViewGroup toView, boolean viewOver, ControllerTransition transition) { + public static void startTransition(Controller from, Controller to, boolean destroyFrom, boolean createTo, ViewGroup toView, ControllerTransition transition) { transition.destroyFrom = destroyFrom; transition.from = from; transition.to = to; - if (createTo) { - to.onCreate(); - } + if (to != null) { + if (createTo) { + to.onCreate(); + } - attach(to, toView, viewOver); - to.onShow(); + attach(to, toView, transition.viewOver); + to.onShow(); + } transition.perform(); } diff --git a/Clover/app/src/main/java/org/floens/chan/controller/ControllerTransition.java b/Clover/app/src/main/java/org/floens/chan/controller/ControllerTransition.java index b3571073..0cda6d5d 100644 --- a/Clover/app/src/main/java/org/floens/chan/controller/ControllerTransition.java +++ b/Clover/app/src/main/java/org/floens/chan/controller/ControllerTransition.java @@ -23,7 +23,7 @@ public abstract class ControllerTransition { public Controller from; public Controller to; public boolean destroyFrom; - public boolean viewOver; + public boolean viewOver = true; public abstract void perform(); diff --git a/Clover/app/src/main/java/org/floens/chan/controller/FadeInTransition.java b/Clover/app/src/main/java/org/floens/chan/controller/FadeInTransition.java new file mode 100644 index 00000000..af74af72 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/controller/FadeInTransition.java @@ -0,0 +1,28 @@ +package org.floens.chan.controller; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.view.View; +import android.view.animation.DecelerateInterpolator; + +public class FadeInTransition extends ControllerTransition { + @Override + public void perform() { + Animator toAlpha = ObjectAnimator.ofFloat(to.view, View.ALPHA, 0f, 1f); + toAlpha.setDuration(200); + toAlpha.setInterpolator(new DecelerateInterpolator(2f)); + + toAlpha.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + onCompleted(); + } + }); + + AnimatorSet set = new AnimatorSet(); + set.playTogether(toAlpha); + set.start(); + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/controller/FadeOutTransition.java b/Clover/app/src/main/java/org/floens/chan/controller/FadeOutTransition.java new file mode 100644 index 00000000..e823ae8c --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/controller/FadeOutTransition.java @@ -0,0 +1,28 @@ +package org.floens.chan.controller; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.view.View; +import android.view.animation.DecelerateInterpolator; + +public class FadeOutTransition extends ControllerTransition { + @Override + public void perform() { + Animator toAlpha = ObjectAnimator.ofFloat(from.view, View.ALPHA, 1f, 0f); + toAlpha.setDuration(200); + toAlpha.setInterpolator(new DecelerateInterpolator(2f)); + + toAlpha.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + onCompleted(); + } + }); + + AnimatorSet set = new AnimatorSet(); + set.playTogether(toAlpha); + set.start(); + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java b/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java index 831ce22c..6cb407e8 100644 --- a/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java +++ b/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java @@ -58,7 +58,7 @@ public abstract class NavigationController extends Controller implements Control final Controller from = controllerList.size() > 0 ? controllerList.get(controllerList.size() - 1) : null; to.navigationController = this; - to.previousSibling = from; + to.previousSiblingController = from; controllerList.add(to); @@ -67,10 +67,10 @@ public abstract class NavigationController extends Controller implements Control this.controllerTransition = controllerTransition; controllerTransition.setCallback(this); - ControllerLogic.startTransition(from, to, false, true, container, true, controllerTransition); + ControllerLogic.startTransition(from, to, false, true, container, controllerTransition); toolbar.setNavigationItem(true, true, to.navigationItem); } else { - ControllerLogic.transition(from, to, false, true, container, true); + ControllerLogic.transition(from, to, false, true, container); toolbar.setNavigationItem(false, true, to.navigationItem); } @@ -104,10 +104,10 @@ public abstract class NavigationController extends Controller implements Control this.controllerTransition = controllerTransition; controllerTransition.setCallback(this); - ControllerLogic.startTransition(from, to, true, false, container, false, controllerTransition); + ControllerLogic.startTransition(from, to, true, false, container, controllerTransition); toolbar.setNavigationItem(true, false, to.navigationItem); } else { - ControllerLogic.transition(from, to, true, false, container, false); + ControllerLogic.transition(from, to, true, false, container); toolbar.setNavigationItem(false, false, to.navigationItem); } diff --git a/Clover/app/src/main/java/org/floens/chan/controller/PopControllerTransition.java b/Clover/app/src/main/java/org/floens/chan/controller/PopControllerTransition.java index 34c7f85f..5daef0a7 100644 --- a/Clover/app/src/main/java/org/floens/chan/controller/PopControllerTransition.java +++ b/Clover/app/src/main/java/org/floens/chan/controller/PopControllerTransition.java @@ -26,6 +26,10 @@ import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; public class PopControllerTransition extends ControllerTransition { + public PopControllerTransition() { + viewOver = false; + } + @Override public void perform() { Animator toAlpha = ObjectAnimator.ofFloat(to.view, View.ALPHA, to.view.getAlpha(), 1f); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java index 4b7836a3..5d6906ae 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java @@ -20,19 +20,27 @@ package org.floens.chan.ui.activity; import android.app.Activity; import android.content.res.Configuration; import android.os.Bundle; +import android.view.ViewGroup; +import org.floens.chan.controller.Controller; import org.floens.chan.ui.controller.BrowseController; import org.floens.chan.ui.controller.RootNavigationController; import org.floens.chan.utils.ThemeHelper; +import java.util.ArrayList; +import java.util.List; + /** - * Not called StartActivity because than the launcher icon would disappear. - * Instead it's called like the old launcher activity, BoardActivity. + * StartActivity + *

+ * (Not actually called StartActivity because then the launcher icon would disappear. + * Instead it's called like the old launcher activity, BoardActivity.) */ public class BoardActivity extends Activity { private static final String TAG = "StartActivity"; - private RootNavigationController rootNavigationController; + private ViewGroup contentView; + private List stack = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { @@ -40,10 +48,13 @@ public class BoardActivity extends Activity { ThemeHelper.getInstance().reloadPostViewColors(this); - rootNavigationController = new RootNavigationController(this); + contentView = (ViewGroup) findViewById(android.R.id.content); + + RootNavigationController rootNavigationController = new RootNavigationController(this); rootNavigationController.onCreate(); setContentView(rootNavigationController.view); + addController(rootNavigationController); rootNavigationController.pushController(new BrowseController(this), false); @@ -54,19 +65,37 @@ public class BoardActivity extends Activity { getWindow().setBackgroundDrawable(null); } + public void addController(Controller controller) { + stack.add(controller); + } + + public void removeController(Controller controller) { + stack.remove(controller); + } + + public ViewGroup getContentView() { + return contentView; + } + @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); - rootNavigationController.onConfigurationChanged(newConfig); + for (Controller controller : stack) { + controller.onConfigurationChanged(newConfig); + } } @Override public void onBackPressed() { - if (!rootNavigationController.onBack()) { + if (!stackTop().onBack()) { super.onBackPressed(); } } + private Controller stackTop() { + return stack.get(stack.size() - 1); + } + /* @Override protected void onCreate(Bundle savedInstanceState) { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java index 914c40b1..86e1ae66 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java @@ -149,7 +149,8 @@ public class BrowseController extends Controller implements ToolbarMenuItem.Tool @Override public void showImages(List images, int index) { - + ImageViewController imageViewController = new ImageViewController(context); + presentController(imageViewController); } @Override diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewController.java new file mode 100644 index 00000000..aca3cc4a --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewController.java @@ -0,0 +1,39 @@ +package org.floens.chan.ui.controller; + +import android.content.Context; +import android.view.View; +import android.widget.Button; + +import org.floens.chan.R; +import org.floens.chan.controller.Controller; + +public class ImageViewController extends Controller implements View.OnClickListener { + private Button button; + + public ImageViewController(Context context) { + super(context); + } + + @Override + public void onCreate() { + super.onCreate(); + + view = inflateRes(R.layout.controller_view_image); + + button = (Button) view.findViewById(R.id.button); + button.setOnClickListener(this); + } + + @Override + public boolean onBack() { + stopPresenting(); + return true; + } + + @Override + public void onClick(View v) { + if (v == button) { + stopPresenting(); + } + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/PassSettingsController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/PassSettingsController.java index b63bfeb2..aff3f0ac 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/PassSettingsController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/PassSettingsController.java @@ -83,7 +83,7 @@ public class PassSettingsController extends Controller implements View.OnClickLi crossfadeView.toggle(true, true); button.setText(R.string.setting_pass_login); hideError(); - ((PassSettingControllerListener) previousSibling).onPassEnabledChanged(false); + ((PassSettingControllerListener) previousSiblingController).onPassEnabledChanged(false); } else { auth(); } @@ -124,7 +124,7 @@ public class PassSettingsController extends Controller implements View.OnClickLi button.setText(R.string.setting_pass_logout); ChanSettings.passId.set(response.passId); authenticated.setText(response.message); - ((PassSettingControllerListener) previousSibling).onPassEnabledChanged(true); + ((PassSettingControllerListener) previousSiblingController).onPassEnabledChanged(true); } button.setEnabled(true); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/WatchSettingsController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/WatchSettingsController.java index 1701a407..f2a8becf 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/WatchSettingsController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/WatchSettingsController.java @@ -62,7 +62,7 @@ public class WatchSettingsController extends SettingsController implements Compo @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { ChanSettings.watchEnabled.set(isChecked); - ((WatchSettingControllerListener) previousSibling).onWatchEnabledChanged(isChecked); + ((WatchSettingControllerListener) previousSiblingController).onWatchEnabledChanged(isChecked); crossfadeView.toggle(isChecked, true); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/view/TouchBlockingFrameLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/view/TouchBlockingFrameLayout.java new file mode 100644 index 00000000..da899715 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/ui/view/TouchBlockingFrameLayout.java @@ -0,0 +1,25 @@ +package org.floens.chan.ui.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.widget.FrameLayout; + +public class TouchBlockingFrameLayout extends FrameLayout { + public TouchBlockingFrameLayout(Context context) { + super(context); + } + + public TouchBlockingFrameLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public TouchBlockingFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + return true; + } +} diff --git a/Clover/app/src/main/res/layout/controller_view_image.xml b/Clover/app/src/main/res/layout/controller_view_image.xml new file mode 100644 index 00000000..0eeae2ee --- /dev/null +++ b/Clover/app/src/main/res/layout/controller_view_image.xml @@ -0,0 +1,29 @@ + + + + + + + +