commit f647630db5d89badcadfa7963b36cd1317f0725e
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sat May 11 23:33:01 2019 +0100

    Simplify the way applications can get notifications when an effect finishes.
    
    Now, instead of the 'DistortedEffects.(de)registerForNotifications()' 2 APIs, we call a single 'Effect.notifyWhenFinished()'.

diff --git a/src/main/java/org/distorted/effect/AppearEffect.java b/src/main/java/org/distorted/effect/AppearEffect.java
index e37b2c49..6ccdc737 100644
--- a/src/main/java/org/distorted/effect/AppearEffect.java
+++ b/src/main/java/org/distorted/effect/AppearEffect.java
@@ -22,7 +22,6 @@ package org.distorted.effect;
 import org.distorted.library.effect.Effect;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.message.EffectListener;
-import org.distorted.library.message.EffectMessage;
 import org.distorted.magic.RubikCube;
 
 import java.lang.reflect.Method;
@@ -95,7 +94,7 @@ public abstract class AppearEffect implements EffectListener
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void effectMessage(final EffectMessage em, final long effectID, final long objectID)
+  public void effectFinished(final long effectID)
     {
     for(int i=0; i<mCubeEffectNumber; i++)
       {
@@ -107,12 +106,7 @@ public abstract class AppearEffect implements EffectListener
 
         if( mCubeEffectReturned == mCubeEffectFinished )
           {
-          mListener.effectMessage(null, FAKE_EFFECT_ID, 0);
-          }
-
-        if( mCubeEffectReturned == mCubeEffectNumber )
-          {
-          mCube.deregisterForMessages(this);
+          mListener.effectFinished(FAKE_EFFECT_ID);
           }
 
         mCube.remove(id);
@@ -143,9 +137,9 @@ public abstract class AppearEffect implements EffectListener
     for(int i=0; i<mCubeEffectNumber; i++)
       {
       mCube.apply(mCubeEffects[i],mCubeEffectPosition[i]);
+      mCubeEffects[i].notifyWhenFinished(this);
       }
 
-    mCube.registerForMessages(this);
     mScreen.attach(mCube);
 
     return FAKE_EFFECT_ID;
diff --git a/src/main/java/org/distorted/effect/DisappearEffect.java b/src/main/java/org/distorted/effect/DisappearEffect.java
index 610749fc..4e19b874 100644
--- a/src/main/java/org/distorted/effect/DisappearEffect.java
+++ b/src/main/java/org/distorted/effect/DisappearEffect.java
@@ -22,7 +22,6 @@ package org.distorted.effect;
 import org.distorted.library.effect.Effect;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.message.EffectListener;
-import org.distorted.library.message.EffectMessage;
 import org.distorted.magic.RubikCube;
 
 import java.lang.reflect.Method;
@@ -95,7 +94,7 @@ public abstract class DisappearEffect implements EffectListener
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void effectMessage(final EffectMessage em, final long effectID, final long objectID)
+  public void effectFinished(final long effectID)
     {
     for(int i=0; i<mCubeEffectNumber; i++)
       {
@@ -107,13 +106,12 @@ public abstract class DisappearEffect implements EffectListener
 
         if( mCubeEffectReturned == mCubeEffectFinished )
           {
-          mListener.effectMessage(null, FAKE_EFFECT_ID, 0);
+          mListener.effectFinished(FAKE_EFFECT_ID);
           }
 
         if( mCubeEffectReturned == mCubeEffectNumber )
           {
           mScreen.detach(mCube);
-          mCube.deregisterForMessages(this);
           }
 
         mCube.remove(id);
@@ -144,10 +142,9 @@ public abstract class DisappearEffect implements EffectListener
     for(int i=0; i<mCubeEffectNumber; i++)
       {
       mCube.apply(mCubeEffects[i],mCubeEffectPosition[i]);
+      mCubeEffects[i].notifyWhenFinished(this);
       }
 
-    mCube.registerForMessages(this);
-
     return FAKE_EFFECT_ID;
     }
 
diff --git a/src/main/java/org/distorted/magic/RubikCube.java b/src/main/java/org/distorted/magic/RubikCube.java
index 3be9007d..c481e568 100644
--- a/src/main/java/org/distorted/magic/RubikCube.java
+++ b/src/main/java/org/distorted/magic/RubikCube.java
@@ -63,7 +63,6 @@ public class RubikCube extends DistortedNode
     private Static1D mRotationAngleStatic, mRotationAngleMiddle, mRotationAngleFinal;
     private Static3D mMove, mScale, mNodeMove, mNodeScale;
     private DistortedTexture mTexture;
-    private DistortedEffects mEffectsListeningForNow;
 
     private int mRotAxis, mRotRow;
     private int mSize;
@@ -217,20 +216,6 @@ public class RubikCube extends DistortedNode
       return mEffects[0][0][0].getNumEffects(type);
       }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-    public void registerForMessages(EffectListener listener)
-      {
-      mEffects[0][0][0].registerForMessages(listener);
-      }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-    public void deregisterForMessages(EffectListener listener)
-      {
-      mEffects[0][0][0].deregisterForMessages(listener);
-      }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // all DistortedTextures, DistortedNodes, DistortedFramebuffers, DistortedScreens and all types of
 // Meshes HAVE TO be markedForDeletion when they are no longer needed- otherwise we have a major
@@ -328,8 +313,7 @@ public class RubikCube extends DistortedNode
                 if( first )
                   {
                   first = false;
-                  mEffectsListeningForNow = mEffects[x][y][z];
-                  mEffectsListeningForNow.registerForMessages(listener);
+                  mRotateEffect[x][y][z].notifyWhenFinished(listener);
                   effectID = mRotateEffect[x][y][z].getID();
                   }
                 }
@@ -340,10 +324,8 @@ public class RubikCube extends DistortedNode
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    void removeRotationNow(EffectListener listener)
+    void removeRotationNow()
       {
-      mEffectsListeningForNow.deregisterForMessages(listener);
-
       int nearestAngleInDegrees = computeNearestAngle(mRotationAngleStatic.get1());
       double nearestAngleInRadians = nearestAngleInDegrees*Math.PI/180;
       float sinA =-(float)Math.sin(nearestAngleInRadians*0.5);
diff --git a/src/main/java/org/distorted/magic/RubikRenderer.java b/src/main/java/org/distorted/magic/RubikRenderer.java
index ebe4511f..e8a774b5 100644
--- a/src/main/java/org/distorted/magic/RubikRenderer.java
+++ b/src/main/java/org/distorted/magic/RubikRenderer.java
@@ -30,7 +30,6 @@ import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.main.DistortedTexture;
 import org.distorted.library.mesh.MeshQuad;
 import org.distorted.library.message.EffectListener;
-import org.distorted.library.message.EffectMessage;
 import org.distorted.library.type.Static4D;
 
 import javax.microedition.khronos.egl.EGLConfig;
@@ -126,7 +125,7 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
       if( mRemoveRotation )
         {
         mRemoveRotation=false;
-        mNewCube.removeRotationNow(this);
+        mNewCube.removeRotationNow();
         mCanRotate = true;
         }
 
@@ -185,9 +184,9 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   public void effectMessage(final EffectMessage em, final long effectID, final long objectID)
+   public void effectFinished(final long effectID)
      {
-     if(      effectID == mRotationFinishedID )
+     if(      effectID == mRotationFinishedID)
        {
        mRemoveRotation = true;
        }
diff --git a/src/main/res/layout/numberpicker.xml b/src/main/res/layout/numberpicker.xml
index bc6a5507..945bcbe3 100644
--- a/src/main/res/layout/numberpicker.xml
+++ b/src/main/res/layout/numberpicker.xml
@@ -9,22 +9,22 @@
         android:layout_width="0sp"
         android:layout_height="match_parent"
         android:layout_weight="1"
-        android:text="-" />
+        android:text="-"
+        android:textSize="30sp" />
 
     <TextView
         android:id="@+id/textNumber"
         android:layout_width="0sp"
         android:layout_height="match_parent"
         android:layout_weight="1"
-        android:inputType="number"
-        android:text="0"
         android:textAlignment="center"
-        android:textSize="48sp" />
+        android:textSize="46sp" />
 
     <Button
         android:id="@+id/buttonMore"
         android:layout_width="0sp"
         android:layout_height="match_parent"
         android:layout_weight="1"
-        android:text="+" />
+        android:text="+"
+        android:textSize="30sp" />
 </LinearLayout>
\ No newline at end of file
