Skip to content

Commit

Permalink
Added Java sample example
Browse files Browse the repository at this point in the history
Added more tests
  • Loading branch information
idanatz committed Sep 5, 2020
1 parent 3e3c4f7 commit 541494d
Show file tree
Hide file tree
Showing 3 changed files with 195 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
@file:Suppress("ClassName")

package com.idanatz.oneadapter.tests.modules.selection.state

import androidx.test.ext.junit.runners.AndroidJUnit4
import com.idanatz.oneadapter.external.modules.ItemSelectionModule
import com.idanatz.oneadapter.external.states.SelectionState
import com.idanatz.oneadapter.helpers.getViewLocationOnScreen
import com.idanatz.oneadapter.helpers.BaseTest
import com.idanatz.oneadapter.models.TestModel
import org.amshove.kluent.shouldEqualTo
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class WhenDisabled_ThenOnSelected_ShouldNotBeCalled : BaseTest() {

private var onSelectedCalls = 0

@Test
fun test() {
configure {
prepareOnActivity {
oneAdapter.apply {
attachItemModule(modulesGenerator.generateValidItemModule().apply { states += TestSelectionState() })
attachItemSelectionModule(ItemSelectionModule())
oneAdapter.internalAdapter.data = mutableListOf(modelGenerator.generateModel())
}
}
actOnActivity {
runWithDelay {
val holderRootView = recyclerView.findViewHolderForAdapterPosition(0)?.itemView
holderRootView?.post {
val (x, y) = holderRootView.getViewLocationOnScreen()

touchSimulator.simulateLongTouch(recyclerView, x, y)
}
}
}
untilAsserted(assertDelay = 750) {
onSelectedCalls shouldEqualTo 0
}
}
}

private inner class TestSelectionState : SelectionState<TestModel>() {
init {
config {
enabled = false
}
onSelected { _, _ ->
onSelectedCalls++
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
@file:Suppress("ClassName")

package com.idanatz.oneadapter.tests.modules.selection.state

import androidx.test.ext.junit.runners.AndroidJUnit4
import com.idanatz.oneadapter.external.modules.ItemSelectionModule
import com.idanatz.oneadapter.external.states.SelectionState
import com.idanatz.oneadapter.external.states.SelectionStateConfig
import com.idanatz.oneadapter.helpers.getViewLocationOnScreen
import com.idanatz.oneadapter.helpers.BaseTest
import com.idanatz.oneadapter.models.TestModel
import org.amshove.kluent.shouldEqualTo
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class WhenTriggerIsLongClick_ThenLongClickingOnItem_ShouldTriggerOnSelected : BaseTest() {

private var onSelectedCalls = 0

@Test
fun test() {
configure {
prepareOnActivity {
oneAdapter.apply {
attachItemModule(modulesGenerator.generateValidItemModule().apply { states += TestSelectionState() })
attachItemSelectionModule(ItemSelectionModule())
oneAdapter.internalAdapter.data = mutableListOf(modelGenerator.generateModel())
}
}
actOnActivity {
runWithDelay {
val holderRootView = recyclerView.findViewHolderForAdapterPosition(0)?.itemView
holderRootView?.post {
val (x, y) = holderRootView.getViewLocationOnScreen()

touchSimulator.simulateTouch(recyclerView, x, y) // should not do anything in this config
touchSimulator.simulateLongTouch(recyclerView, x, y)
}
}
}
untilAsserted(assertDelay = 750) {
onSelectedCalls shouldEqualTo 1
}
}
}

private inner class TestSelectionState : SelectionState<TestModel>() {
init {
config {
selectionTrigger = SelectionStateConfig.SelectionTrigger.LongClick
}
onSelected { _, _ ->
onSelectedCalls++
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package com.idanatz.sample.examples;

import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.airbnb.lottie.LottieAnimationView;
import com.bumptech.glide.Glide;
import com.idanatz.oneadapter.OneAdapter;
import com.idanatz.oneadapter.external.event_hooks.ClickEventHook;
import com.idanatz.oneadapter.external.modules.EmptinessModule;
import com.idanatz.oneadapter.external.modules.ItemModule;
import com.idanatz.oneadapter.sample.R;
import com.idanatz.sample.models.MessageModel;

import androidx.annotation.Nullable;

class BasicJavaExampleActivity
extends BaseExampleActivity {

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

OneAdapter oneAdapter = new OneAdapter(recyclerView)
.attachItemModule(new MessageItem())
.attachEmptinessModule(new EmptinessModuleImpl());

oneAdapter.setItems(getModelGenerator().generateMessages(10));
}

private static class MessageItem extends ItemModule<MessageModel> {

public MessageItem() {
config(builder -> {
builder.setLayoutResource(R.layout.message_model);
return null;
});
onBind((model, viewBinder, metadata) -> {
TextView title = viewBinder.findViewById(R.id.title);
TextView body = viewBinder.findViewById(R.id.body);
ImageView image = viewBinder.findViewById(R.id.avatarImage);

title.setText(model.title);
body.setText(model.body);
Glide.with(viewBinder.getRootView())
.load(model.avatarImageId)
.into(image);
return null;
});
eventHooks.add(new ClickEventHook<MessageModel>() {{
onClick((model, viewBinder, metadata) -> {
Toast.makeText(viewBinder.getRootView().getContext(), model.title + " clicked", Toast.LENGTH_SHORT).show();
return null;
});
}});
}
}

private static class EmptinessModuleImpl extends EmptinessModule {

public EmptinessModuleImpl() {
config(builder -> {
builder.setLayoutResource(R.layout.empty_state);
return null;
});
onBind((viewBinder, metadata) -> {
LottieAnimationView animation = viewBinder.findViewById(R.id.animation_view);
animation.setAnimation(R.raw.empty_list);
animation.playAnimation();
return null;
});
onUnbind((viewBinder, metadata) -> {
LottieAnimationView animation = viewBinder.findViewById(R.id.animation_view);
animation.pauseAnimation();
return null;
});
}
}
}

0 comments on commit 541494d

Please sign in to comment.