diff --git a/adapter/.gitignore b/adapter/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/adapter/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/adapter/build.gradle b/adapter/build.gradle
new file mode 100644
index 0000000..74091cf
--- /dev/null
+++ b/adapter/build.gradle
@@ -0,0 +1,31 @@
+apply plugin: 'com.android.library'
+
+android {
+ compileSdkVersion 26
+ buildToolsVersion '26.0.2'
+
+ defaultConfig {
+ minSdkVersion 16
+ targetSdkVersion 26
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ compile fileTree(dir: 'libs', include: ['*.jar'])
+ androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
+ exclude group: 'com.android.support', module: 'support-annotations'
+ })
+ compile 'com.android.support:appcompat-v7:26.1.0'
+ testCompile 'junit:junit:4.12'
+}
diff --git a/adapter/proguard-rules.pro b/adapter/proguard-rules.pro
new file mode 100644
index 0000000..2f9a0d8
--- /dev/null
+++ b/adapter/proguard-rules.pro
@@ -0,0 +1,25 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /Users/tiwiz/Library/Android/sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/adapter/src/androidTest/java/it/ennova/adapter/ExampleInstrumentedTest.java b/adapter/src/androidTest/java/it/ennova/adapter/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..24d2613
--- /dev/null
+++ b/adapter/src/androidTest/java/it/ennova/adapter/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package it.ennova.adapter;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumentation test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() throws Exception {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getTargetContext();
+
+ assertEquals("it.ennova.adapter.test", appContext.getPackageName());
+ }
+}
diff --git a/adapter/src/main/AndroidManifest.xml b/adapter/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..acbc2ca
--- /dev/null
+++ b/adapter/src/main/AndroidManifest.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/adapter/src/main/java/it/ennova/adapter/LegacyData.java b/adapter/src/main/java/it/ennova/adapter/LegacyData.java
new file mode 100644
index 0000000..db3f909
--- /dev/null
+++ b/adapter/src/main/java/it/ennova/adapter/LegacyData.java
@@ -0,0 +1,8 @@
+package it.ennova.adapter;
+
+public interface LegacyData {
+
+ long getByteCount();
+
+ String getDataAsString();
+}
diff --git a/adapter/src/main/java/it/ennova/adapter/LegacySystem.java b/adapter/src/main/java/it/ennova/adapter/LegacySystem.java
new file mode 100644
index 0000000..6373454
--- /dev/null
+++ b/adapter/src/main/java/it/ennova/adapter/LegacySystem.java
@@ -0,0 +1,7 @@
+package it.ennova.adapter;
+
+
+public interface LegacySystem {
+
+ void accept(LegacyData legacyData);
+}
diff --git a/adapter/src/main/java/it/ennova/adapter/NewData.java b/adapter/src/main/java/it/ennova/adapter/NewData.java
new file mode 100644
index 0000000..876d416
--- /dev/null
+++ b/adapter/src/main/java/it/ennova/adapter/NewData.java
@@ -0,0 +1,7 @@
+package it.ennova.adapter;
+
+public interface NewData {
+
+ String dataRepresentation();
+
+}
diff --git a/adapter/src/main/java/it/ennova/adapter/NewToLegacyAdapter.java b/adapter/src/main/java/it/ennova/adapter/NewToLegacyAdapter.java
new file mode 100644
index 0000000..9ba7b3d
--- /dev/null
+++ b/adapter/src/main/java/it/ennova/adapter/NewToLegacyAdapter.java
@@ -0,0 +1,20 @@
+package it.ennova.adapter;
+
+
+public class NewToLegacyAdapter implements LegacyData{
+ private final NewData wrapped;
+
+ public NewToLegacyAdapter(NewData wrapped) {
+ this.wrapped = wrapped;
+ }
+
+ @Override
+ public long getByteCount() {
+ return wrapped.dataRepresentation().getBytes().length;
+ }
+
+ @Override
+ public String getDataAsString() {
+ return wrapped.dataRepresentation();
+ }
+}
diff --git a/adapter/src/main/res/values/strings.xml b/adapter/src/main/res/values/strings.xml
new file mode 100644
index 0000000..6c0502c
--- /dev/null
+++ b/adapter/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ adapter
+
diff --git a/adapter/src/test/java/it/ennova/adapter/ExampleUnitTest.java b/adapter/src/test/java/it/ennova/adapter/ExampleUnitTest.java
new file mode 100644
index 0000000..c7d8090
--- /dev/null
+++ b/adapter/src/test/java/it/ennova/adapter/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package it.ennova.adapter;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() throws Exception {
+ assertEquals(4, 2 + 2);
+ }
+}
diff --git a/app/build.gradle b/app/build.gradle
index 2f623eb..d732491 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,7 @@ dependencies {
compile project(':decorator')
compile 'com.android.support:appcompat-v7:26.1.0'
compile 'com.android.support:recyclerview-v7:26.1.0'
- compile 'com.android.support.constraint:constraint-layout:1.1.0-beta2'
+ compile 'com.android.support.constraint:constraint-layout:1.1.0-beta4'
compile 'com.android.support:design:26.1.0'
testCompile 'junit:junit:4.12'
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f6cacfd..cc4ca8e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -41,6 +41,15 @@
android:name="android.support.PARENT_ACTIVITY"
android:value="io.caster.designpatterns.MainActivity" />
+
+
+
diff --git a/app/src/main/java/io/caster/designpatterns/adapter/AdapterActivity.java b/app/src/main/java/io/caster/designpatterns/adapter/AdapterActivity.java
new file mode 100644
index 0000000..9c5f705
--- /dev/null
+++ b/app/src/main/java/io/caster/designpatterns/adapter/AdapterActivity.java
@@ -0,0 +1,50 @@
+package io.caster.designpatterns.adapter;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.Toolbar;
+import android.view.View;
+
+import io.caster.designpatterns.R;
+
+public class AdapterActivity extends AppCompatActivity implements View.OnClickListener{
+
+ private RecyclerView patternList;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_adapter);
+ Toolbar toolbar = findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+
+ patternList = findViewById(R.id.patternList);
+ patternList.setLayoutManager(new LinearLayoutManager(this));
+
+ createDataSource();
+ }
+
+ private void createDataSource() {
+ DataSource source = new DataSource(this);
+ SimpleAdapter adapter = new SimpleAdapter(source);
+
+ patternList.setAdapter(adapter);
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v.getId() == R.id.btnLmLinear) {
+ updateTo(new LinearLayoutManager(this));
+ } else {
+ updateTo(new GridLayoutManager(this, 2));
+ }
+ }
+
+ private void updateTo(RecyclerView.LayoutManager newLayoutManager) {
+ patternList.setLayoutManager(newLayoutManager);
+ }
+}
diff --git a/app/src/main/java/io/caster/designpatterns/adapter/DataSource.java b/app/src/main/java/io/caster/designpatterns/adapter/DataSource.java
new file mode 100644
index 0000000..eed85a6
--- /dev/null
+++ b/app/src/main/java/io/caster/designpatterns/adapter/DataSource.java
@@ -0,0 +1,18 @@
+package io.caster.designpatterns.adapter;
+
+
+import android.content.Context;
+import io.caster.designpatterns.R;
+
+public class DataSource {
+
+ private final String[] patterns;
+
+ public DataSource(Context context) {
+ patterns = context.getResources().getStringArray(R.array.implemented_patterns);
+ }
+
+ public String[] getPatterns() {
+ return patterns;
+ }
+}
diff --git a/app/src/main/java/io/caster/designpatterns/adapter/SimpleAdapter.java b/app/src/main/java/io/caster/designpatterns/adapter/SimpleAdapter.java
new file mode 100644
index 0000000..cb52b18
--- /dev/null
+++ b/app/src/main/java/io/caster/designpatterns/adapter/SimpleAdapter.java
@@ -0,0 +1,34 @@
+package io.caster.designpatterns.adapter;
+
+
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import io.caster.designpatterns.R;
+
+public class SimpleAdapter extends RecyclerView.Adapter{
+ private final DataSource dataSource;
+
+ public SimpleAdapter(DataSource dataSource) {
+ this.dataSource = dataSource;
+ }
+
+ @Override
+ public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ View view = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.view_adapter_activity_element, parent, false);
+ return new SimpleViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(SimpleViewHolder holder, int position) {
+ holder.bindTo(dataSource.getPatterns()[position]);
+ }
+
+ @Override
+ public int getItemCount() {
+ return dataSource.getPatterns().length;
+ }
+}
diff --git a/app/src/main/java/io/caster/designpatterns/adapter/SimpleViewHolder.java b/app/src/main/java/io/caster/designpatterns/adapter/SimpleViewHolder.java
new file mode 100644
index 0000000..fa1fc3f
--- /dev/null
+++ b/app/src/main/java/io/caster/designpatterns/adapter/SimpleViewHolder.java
@@ -0,0 +1,17 @@
+package io.caster.designpatterns.adapter;
+
+
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.widget.TextView;
+
+public class SimpleViewHolder extends RecyclerView.ViewHolder {
+
+ public SimpleViewHolder(View itemView) {
+ super(itemView);
+ }
+
+ public void bindTo(String pattern) {
+ ((TextView) itemView).setText(pattern);
+ }
+}
diff --git a/app/src/main/java/io/caster/designpatterns/chain/ActivityChainManager.java b/app/src/main/java/io/caster/designpatterns/chain/ActivityChainManager.java
index 3460c1a..0f06768 100644
--- a/app/src/main/java/io/caster/designpatterns/chain/ActivityChainManager.java
+++ b/app/src/main/java/io/caster/designpatterns/chain/ActivityChainManager.java
@@ -5,6 +5,7 @@
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
+import io.caster.designpatterns.adapter.AdapterActivity;
import io.caster.designpatterns.builder.BuilderActivity;
import io.caster.designpatterns.decorator.DecoratorActivity;
import io.caster.designpatterns.observer.ObserverActivity;
@@ -17,10 +18,12 @@ public ActivityChainManager(@NonNull AppCompatActivity host) {
ActivityChainElement chainOfResponsibility = new ActivityChainElement(1, new Intent(host, ChainOfResponsibilityActivity.class), host);
ActivityChainElement builder = new ActivityChainElement(2, new Intent(host, BuilderActivity.class), host);
ActivityChainElement decorator = new ActivityChainElement(3, new Intent(host, DecoratorActivity.class), host);
+ ActivityChainElement adapter = new ActivityChainElement(4, new Intent(host, AdapterActivity.class), host);
head.setNext(chainOfResponsibility);
chainOfResponsibility.setNext(builder);
builder.setNext(decorator);
+ decorator.setNext(adapter);
}
public void onPatternReceived(int patternId) {
diff --git a/app/src/main/java/io/caster/designpatterns/main/MainView.java b/app/src/main/java/io/caster/designpatterns/main/MainView.java
index d823afc..dea44e9 100644
--- a/app/src/main/java/io/caster/designpatterns/main/MainView.java
+++ b/app/src/main/java/io/caster/designpatterns/main/MainView.java
@@ -35,7 +35,7 @@ public static MainView with(@NonNull final Activity target) {
private MainView(@NonNull final Activity target) {
patterns = target.getResources().getStringArray(R.array.implemented_patterns);
listener = bindListenerFrom(target);
- patternsList = (ListView) target.findViewById(R.id.patternList);
+ patternsList = target.findViewById(R.id.patternList);
}
private OnPatternSelectedListener bindListenerFrom(Context context) {
diff --git a/app/src/main/res/layout/activity_adapter.xml b/app/src/main/res/layout/activity_adapter.xml
new file mode 100644
index 0000000..290358d
--- /dev/null
+++ b/app/src/main/res/layout/activity_adapter.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/content_adapter.xml b/app/src/main/res/layout/content_adapter.xml
new file mode 100644
index 0000000..83a617c
--- /dev/null
+++ b/app/src/main/res/layout/content_adapter.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/view_adapter_activity_element.xml b/app/src/main/res/layout/view_adapter_activity_element.xml
new file mode 100644
index 0000000..eb2cf49
--- /dev/null
+++ b/app/src/main/res/layout/view_adapter_activity_element.xml
@@ -0,0 +1,5 @@
+
+
diff --git a/app/src/main/res/values/patterns.xml b/app/src/main/res/values/patterns.xml
index 4b66dda..7a1e64f 100644
--- a/app/src/main/res/values/patterns.xml
+++ b/app/src/main/res/values/patterns.xml
@@ -4,11 +4,13 @@
Chain of Responsibility
Builder
Decorator
+ Adapter
- @string/observer_pattern
- @string/chain_of_responsibility
- @string/builder
- @string/decorator
+ - @string/adapter
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e0d0b21..4661353 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -10,4 +10,7 @@
Negative
Neutral
Cancelable
+ AdapterActivity
+ Linear
+ Grid
diff --git a/settings.gradle b/settings.gradle
index c127e32..e6ded33 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1 @@
-include ':app', ':observer', ':chain-of-responsibility', ':builder', ':decorator'
+include ':app', ':observer', ':chain-of-responsibility', ':builder', ':decorator', ':adapter'