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