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.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) {

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

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

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

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

@ -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
* <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 {
private static final String TAG = "StartActivity";
private RootNavigationController rootNavigationController;
private ViewGroup contentView;
private List<Controller> 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) {

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

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

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