Added controller presenting

tempwork
Floens 10 years ago
parent a2561ff860
commit f8213fef73
  1. 34
      Clover/app/src/main/java/org/floens/chan/controller/Controller.java
  2. 28
      Clover/app/src/main/java/org/floens/chan/controller/ControllerLogic.java
  3. 2
      Clover/app/src/main/java/org/floens/chan/controller/ControllerTransition.java
  4. 28
      Clover/app/src/main/java/org/floens/chan/controller/FadeInTransition.java
  5. 28
      Clover/app/src/main/java/org/floens/chan/controller/FadeOutTransition.java
  6. 10
      Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java
  7. 4
      Clover/app/src/main/java/org/floens/chan/controller/PopControllerTransition.java
  8. 41
      Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java
  9. 3
      Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java
  10. 39
      Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewController.java
  11. 4
      Clover/app/src/main/java/org/floens/chan/ui/controller/PassSettingsController.java
  12. 2
      Clover/app/src/main/java/org/floens/chan/ui/controller/WatchSettingsController.java
  13. 25
      Clover/app/src/main/java/org/floens/chan/ui/view/TouchBlockingFrameLayout.java
  14. 29
      Clover/app/src/main/res/layout/controller_view_image.xml

@ -21,7 +21,9 @@ import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import org.floens.chan.ui.activity.BoardActivity;
import org.floens.chan.ui.toolbar.NavigationItem; import org.floens.chan.ui.toolbar.NavigationItem;
public abstract class Controller { public abstract class Controller {
@ -29,9 +31,14 @@ public abstract class Controller {
public View view; public View view;
public NavigationItem navigationItem = new NavigationItem(); public NavigationItem navigationItem = new NavigationItem();
public Controller previousSibling;
// NavigationControllers members
public Controller previousSiblingController;
public NavigationController navigationController; public NavigationController navigationController;
// Controller (for presenting) members
public Controller presentingController;
public Controller(Context context) { public Controller(Context context) {
this.context = context; this.context = context;
} }
@ -60,7 +67,32 @@ public abstract class Controller {
} }
public void presentController(Controller 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) { public View inflateRes(int resId) {

@ -21,13 +21,15 @@ public class ControllerLogic {
AndroidUtils.removeFromParentView(controller.view); AndroidUtils.removeFromParentView(controller.view);
} }
public static void transition(Controller from, Controller to, boolean destroyFrom, boolean createTo, ViewGroup toView, boolean viewOver) { public static void transition(Controller from, Controller to, boolean destroyFrom, boolean createTo, ViewGroup toView) {
if (createTo) { if (to != null) {
to.onCreate(); if (createTo) {
} to.onCreate();
}
attach(to, toView, viewOver); attach(to, toView, true);
to.onShow(); to.onShow();
}
if (from != null) { if (from != null) {
from.onHide(); 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.destroyFrom = destroyFrom;
transition.from = from; transition.from = from;
transition.to = to; transition.to = to;
if (createTo) { if (to != null) {
to.onCreate(); if (createTo) {
} to.onCreate();
}
attach(to, toView, viewOver); attach(to, toView, transition.viewOver);
to.onShow(); to.onShow();
}
transition.perform(); transition.perform();
} }

@ -23,7 +23,7 @@ public abstract class ControllerTransition {
public Controller from; public Controller from;
public Controller to; public Controller to;
public boolean destroyFrom; public boolean destroyFrom;
public boolean viewOver; public boolean viewOver = true;
public abstract void perform(); public abstract void perform();

@ -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();
}
}

@ -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();
}
}

@ -58,7 +58,7 @@ public abstract class NavigationController extends Controller implements Control
final Controller from = controllerList.size() > 0 ? controllerList.get(controllerList.size() - 1) : null; final Controller from = controllerList.size() > 0 ? controllerList.get(controllerList.size() - 1) : null;
to.navigationController = this; to.navigationController = this;
to.previousSibling = from; to.previousSiblingController = from;
controllerList.add(to); controllerList.add(to);
@ -67,10 +67,10 @@ public abstract class NavigationController extends Controller implements Control
this.controllerTransition = controllerTransition; this.controllerTransition = controllerTransition;
controllerTransition.setCallback(this); 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); toolbar.setNavigationItem(true, true, to.navigationItem);
} else { } else {
ControllerLogic.transition(from, to, false, true, container, true); ControllerLogic.transition(from, to, false, true, container);
toolbar.setNavigationItem(false, true, to.navigationItem); toolbar.setNavigationItem(false, true, to.navigationItem);
} }
@ -104,10 +104,10 @@ public abstract class NavigationController extends Controller implements Control
this.controllerTransition = controllerTransition; this.controllerTransition = controllerTransition;
controllerTransition.setCallback(this); 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); toolbar.setNavigationItem(true, false, to.navigationItem);
} else { } else {
ControllerLogic.transition(from, to, true, false, container, false); ControllerLogic.transition(from, to, true, false, container);
toolbar.setNavigationItem(false, false, to.navigationItem); toolbar.setNavigationItem(false, false, to.navigationItem);
} }

@ -26,6 +26,10 @@ import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator; import android.view.animation.DecelerateInterpolator;
public class PopControllerTransition extends ControllerTransition { public class PopControllerTransition extends ControllerTransition {
public PopControllerTransition() {
viewOver = false;
}
@Override @Override
public void perform() { public void perform() {
Animator toAlpha = ObjectAnimator.ofFloat(to.view, View.ALPHA, to.view.getAlpha(), 1f); Animator toAlpha = ObjectAnimator.ofFloat(to.view, View.ALPHA, to.view.getAlpha(), 1f);

@ -20,19 +20,27 @@ package org.floens.chan.ui.activity;
import android.app.Activity; import android.app.Activity;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.Bundle; 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.BrowseController;
import org.floens.chan.ui.controller.RootNavigationController; import org.floens.chan.ui.controller.RootNavigationController;
import org.floens.chan.utils.ThemeHelper; import org.floens.chan.utils.ThemeHelper;
import java.util.ArrayList;
import java.util.List;
/** /**
* Not called StartActivity because than the launcher icon would disappear. * StartActivity
* Instead it's called like the old launcher activity, BoardActivity. * <p/>
* (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 { public class BoardActivity extends Activity {
private static final String TAG = "StartActivity"; private static final String TAG = "StartActivity";
private RootNavigationController rootNavigationController; private ViewGroup contentView;
private List<Controller> stack = new ArrayList<>();
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -40,10 +48,13 @@ public class BoardActivity extends Activity {
ThemeHelper.getInstance().reloadPostViewColors(this); ThemeHelper.getInstance().reloadPostViewColors(this);
rootNavigationController = new RootNavigationController(this); contentView = (ViewGroup) findViewById(android.R.id.content);
RootNavigationController rootNavigationController = new RootNavigationController(this);
rootNavigationController.onCreate(); rootNavigationController.onCreate();
setContentView(rootNavigationController.view); setContentView(rootNavigationController.view);
addController(rootNavigationController);
rootNavigationController.pushController(new BrowseController(this), false); rootNavigationController.pushController(new BrowseController(this), false);
@ -54,19 +65,37 @@ public class BoardActivity extends Activity {
getWindow().setBackgroundDrawable(null); 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 @Override
public void onConfigurationChanged(Configuration newConfig) { public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig); super.onConfigurationChanged(newConfig);
rootNavigationController.onConfigurationChanged(newConfig); for (Controller controller : stack) {
controller.onConfigurationChanged(newConfig);
}
} }
@Override @Override
public void onBackPressed() { public void onBackPressed() {
if (!rootNavigationController.onBack()) { if (!stackTop().onBack()) {
super.onBackPressed(); super.onBackPressed();
} }
} }
private Controller stackTop() {
return stack.get(stack.size() - 1);
}
/* /*
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {

@ -149,7 +149,8 @@ public class BrowseController extends Controller implements ToolbarMenuItem.Tool
@Override @Override
public void showImages(List<PostImage> images, int index) { public void showImages(List<PostImage> images, int index) {
ImageViewController imageViewController = new ImageViewController(context);
presentController(imageViewController);
} }
@Override @Override

@ -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();
}
}
}

@ -83,7 +83,7 @@ public class PassSettingsController extends Controller implements View.OnClickLi
crossfadeView.toggle(true, true); crossfadeView.toggle(true, true);
button.setText(R.string.setting_pass_login); button.setText(R.string.setting_pass_login);
hideError(); hideError();
((PassSettingControllerListener) previousSibling).onPassEnabledChanged(false); ((PassSettingControllerListener) previousSiblingController).onPassEnabledChanged(false);
} else { } else {
auth(); auth();
} }
@ -124,7 +124,7 @@ public class PassSettingsController extends Controller implements View.OnClickLi
button.setText(R.string.setting_pass_logout); button.setText(R.string.setting_pass_logout);
ChanSettings.passId.set(response.passId); ChanSettings.passId.set(response.passId);
authenticated.setText(response.message); authenticated.setText(response.message);
((PassSettingControllerListener) previousSibling).onPassEnabledChanged(true); ((PassSettingControllerListener) previousSiblingController).onPassEnabledChanged(true);
} }
button.setEnabled(true); button.setEnabled(true);

@ -62,7 +62,7 @@ public class WatchSettingsController extends SettingsController implements Compo
@Override @Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
ChanSettings.watchEnabled.set(isChecked); ChanSettings.watchEnabled.set(isChecked);
((WatchSettingControllerListener) previousSibling).onWatchEnabledChanged(isChecked); ((WatchSettingControllerListener) previousSiblingController).onWatchEnabledChanged(isChecked);
crossfadeView.toggle(isChecked, true); crossfadeView.toggle(isChecked, true);
} }

@ -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;
}
}

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<org.floens.chan.ui.view.TouchBlockingFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffffff"
android:padding="16dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, world!"
android:textColor="#dd000000"
android:textSize="20sp" />
<Button
android:id="@+id/button"
android:text="Back"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</org.floens.chan.ui.view.TouchBlockingFrameLayout>
Loading…
Cancel
Save