Skip to content
This repository was archived by the owner on Apr 20, 2021. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.lang.reflect.Method;


@SuppressWarnings("unused")
Expand Down Expand Up @@ -2698,6 +2699,16 @@ boolean isImmersive(final CallFun0<Boolean> superCall) {
}
}

boolean isMethodOverridden(final String methodName, final Class<?>... parameterTypes) {
try {
final Class<? extends ActivityPlugin> myClass = this.getClass();
final Method method = myClass.getMethod(methodName, parameterTypes);
return method.getDeclaringClass() != ActivityPlugin.class;
} catch (NoSuchMethodException ignore) {
return false;
}
}

boolean isRestricted(final CallFun0<Boolean> superCall) {
synchronized (mSuperListeners) {
mSuperListeners.push(superCall);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,20 @@
import android.view.KeyEvent;
import android.view.MenuItem;

import java.util.ArrayList;
import java.util.List;

import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.fail;
import static org.assertj.core.api.Java6Assertions.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

public class ActivityDelegateTest {

Expand Down Expand Up @@ -92,7 +98,7 @@ public void testCallMethodFromPlugin() throws Exception {
try {
b.setContentView(layoutResID);
fail("no exception thrown");
} catch (IllegalStateException e){
} catch (IllegalStateException e) {
assertThat(e).hasMessageContaining("setContentView")
.hasMessageContaining("Delegate");
}
Expand Down Expand Up @@ -121,7 +127,7 @@ public void setContentView(@LayoutRes final int layoutResID) {
try {
b.setContentView(layoutResID);
fail("no exception thrown");
} catch (IllegalStateException e){
} catch (IllegalStateException e) {
assertThat(e).hasMessageContaining("setContentView")
.hasMessageContaining("Delegate");
}
Expand Down Expand Up @@ -225,70 +231,114 @@ public void testNoPlugins() throws Exception {
}

@Test
public void testSingleEvent() throws Exception {
public void testNonConfigurationInstance() throws Exception {

final ActivityPlugin a = spy(new ActivityPlugin());
final ActivityPlugin b = spy(new ActivityPlugin() {

@Override
public CompositeNonConfigurationInstance onRetainNonConfigurationInstance() {
return new CompositeNonConfigurationInstance("testB", "b");
}
});
final ActivityPlugin c = spy(new ActivityPlugin() {
@Override
public CompositeNonConfigurationInstance onRetainNonConfigurationInstance() {
return new CompositeNonConfigurationInstance("testC", "c");
}
});

final ICompositeActivity activity = mock(ICompositeActivity.class);
doReturn("super").when(activity).onRetainCompositeCustomNonConfigurationInstance();
final ActivityDelegate delegate = new ActivityDelegate(activity);

delegate.addPlugin(a);
delegate.addPlugin(b);
delegate.addPlugin(c);

NonConfigurationInstanceWrapper nci = (NonConfigurationInstanceWrapper) delegate
.onRetainNonConfigurationInstance();
assertEquals("super", nci.getSuperNonConfigurationInstance());

when(activity.getLastCustomNonConfigurationInstance()).thenReturn(nci);

assertEquals("b", b.getLastNonConfigurationInstance("testB"));
assertEquals("c", c.getLastNonConfigurationInstance("testC"));
}

@Test
public void testOptimizedButCallsOverriddenPluginMethods_primitiveParameter() throws Exception {
final List calls = new ArrayList();
final ActivityPlugin a = new ActivityPlugin();
final ActivityPlugin b = new ActivityPlugin() {
@Override
public boolean onKeyDown(final int keyCode, final KeyEvent event) {
calls.add(keyCode);
calls.add(event);
return true;
}
};
final ActivityPlugin c = new ActivityPlugin();

final CompositeActivity activity = mock(CompositeActivity.class);
final ActivityDelegate delegate = new ActivityDelegate(activity);
delegate.CALL_COUNT_OPTIMIZATION_THRESHOLD = -1;

delegate.addPlugin(a);
delegate.addPlugin(b);
delegate.addPlugin(c);

final KeyEvent event = mock(KeyEvent.class);
delegate.onKeyDown(1, event);

verify(a).onKeyDown(1, event);
verify(activity).super_onKeyDown(1, event);
assertEquals(2, calls.size());
assertEquals(1, calls.get(0));
assertEquals(event, calls.get(1));
}
/*
@Test
public void testNonConfigurationInstance() throws Exception {

final ActivityPlugin a = spy(new ActivityPlugin());
final ActivityPlugin b = spy(new ActivityPlugin() {
@Override
public Object onRetainCustomNonConfigurationInstance() {
final Object superNic = super.onRetainCustomNonConfigurationInstance();
assertEquals("c", superNic.toString());
return new NonConfigurationInstanceWrapper(superNic) {
@Override
public String toString() {
return "b";
}
};
}
});
final ActivityPlugin c = spy(new ActivityPlugin() {
@Test
public void testOptimizedButCallsOverriddenPluginMethods_void() throws Exception {
final List calls = new ArrayList();
final ActivityPlugin a = new ActivityPlugin();
final ActivityPlugin b = new ActivityPlugin() {
@Override
public Object onRetainCustomNonConfigurationInstance() {
return new NonConfigurationInstanceWrapper(
super.onRetainCustomNonConfigurationInstance()) {
@Override
public String toString() {
return "c";
}
};
public void onResume() {
super.onResume();
calls.add("called");
}
});
};
final ActivityPlugin c = new ActivityPlugin();

final CompositeActivity activity = mock(CompositeActivity.class);
doReturn("SuperObject").when(activity).onRetainCustomNonConfigurationInstance_super();
final ActivityDelegate delegate = new ActivityDelegate(activity);
delegate.CALL_COUNT_OPTIMIZATION_THRESHOLD = -1;

delegate.addPlugin(a);
delegate.addPlugin(b);
delegate.addPlugin(c);

Object o = delegate.onRetainCustomNonConfigurationInstance();
assertEquals("b", o.toString());
delegate.onResume();

assertEquals(1, calls.size());
assertEquals("called", calls.get(0));
}

@Test
public void testSingleEvent() throws Exception {

final ActivityPlugin a = spy(new ActivityPlugin());

doReturn(o).when(activity).getLastCustomNonConfigurationInstance_super();
final CompositeActivity activity = mock(CompositeActivity.class);
final ActivityDelegate delegate = new ActivityDelegate(activity);

assertEquals("SuperObject", a.getLastCustomNonConfigurationInstance().toString());
assertEquals("b", b.getLastCustomNonConfigurationInstance().toString());
assertEquals("c", c.getLastCustomNonConfigurationInstance().toString());
}*/
delegate.addPlugin(a);

final KeyEvent event = mock(KeyEvent.class);
delegate.onKeyDown(1, event);

verify(a).onKeyDown(1, event);
verify(activity).super_onKeyDown(1, event);
}

@Test
public void testStopPropagatingEvent() throws Exception {
Expand All @@ -303,7 +353,7 @@ public boolean onKeyDown(final int keyCode, final KeyEvent event) {
return super.onKeyDown(keyCode, event);
}
});
final ActivityPlugin c = spy(new ActivityPlugin(){
final ActivityPlugin c = spy(new ActivityPlugin() {
@Override
public boolean onKeyDown(final int keyCode, final KeyEvent event) {
return super.onKeyDown(25, event);
Expand All @@ -317,7 +367,6 @@ public boolean onKeyDown(final int keyCode, final KeyEvent event) {
delegate.addPlugin(b);
delegate.addPlugin(c);


final KeyEvent event = mock(KeyEvent.class);
delegate.onKeyDown(1, event);

Expand Down
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ allprojects {

ext {
supportLibraryVersion = '24.2.0'
VERSION_NAME = "0.2.2"
VERSION_CODE = 7
VERSION_NAME = "0.3.0-SNAPSHOT"
VERSION_CODE = 8
MIN_SDK_VERSION = 14
TARGET_SDK_VERSION = 24
COMPILE_SDK_VERSION = 24
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,26 @@ public class AbstractDelegate<T, P extends AbstractPlugin> {

protected final T mOriginal;

protected List<P> mPlugins = new CopyOnWriteArrayList<>();
protected final List<P> mPlugins = new CopyOnWriteArrayList<>();

public AbstractDelegate(final T original) {
mOriginal = original;
}

@SuppressWarnings("unchecked")
public Removable addPlugin(final P plugin) {
plugin.addToDelegate(this, mOriginal);
mPlugins.add(plugin);
synchronized (mPlugins) {
plugin.addToDelegate(this, mOriginal);
mPlugins.add(plugin);
}

return new Removable() {
@Override
public void remove() {
mPlugins.remove(plugin);
plugin.removeFromDelegate();
synchronized (mPlugins) {
mPlugins.remove(plugin);
plugin.removeFromDelegate();
}
}
};
}
Expand Down
Loading