From 67da29acc9cbf9982ea3e93c72e5f1d380ff7ef3 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Thu, 24 Dec 2015 00:26:05 +0100 Subject: [PATCH 1/7] inject into services --- .../injection/helper/RClassHelper.java | 23 ++- .../injection/platform/ActivityInjector.java | 3 +- ...ctor.java => AndroidResourceInjector.java} | 66 ++------ .../platform/AndroidViewInjector.java | 77 ++++++++++ .../injection/platform/FragmentInjector.java | 12 +- .../injection/platform/IViewFinder.java | 8 - .../injection/platform/ServiceInjector.java | 12 ++ .../injection/platform/ViewGroupInjector.java | 2 +- .../WatchViewStubActivityInjector.java | 2 +- .../ui/InjectionAppCompatActivity.java | 142 +++++++++--------- .../injection/ui/InjectionApplication.java | 31 ++-- .../injection/ui/InjectionFragment.java | 136 ++++++++--------- .../injection/ui/InjectionService.java | 29 ++-- .../ui/InjectionWearableActivity.java | 68 ++++----- 14 files changed, 323 insertions(+), 288 deletions(-) rename injection/src/main/java/io/freefair/android/injection/platform/{AndroidInjector.java => AndroidResourceInjector.java} (82%) create mode 100644 injection/src/main/java/io/freefair/android/injection/platform/AndroidViewInjector.java delete mode 100644 injection/src/main/java/io/freefair/android/injection/platform/IViewFinder.java create mode 100644 injection/src/main/java/io/freefair/android/injection/platform/ServiceInjector.java diff --git a/injection/src/main/java/io/freefair/android/injection/helper/RClassHelper.java b/injection/src/main/java/io/freefair/android/injection/helper/RClassHelper.java index 2072b8f..2a07cd7 100644 --- a/injection/src/main/java/io/freefair/android/injection/helper/RClassHelper.java +++ b/injection/src/main/java/io/freefair/android/injection/helper/RClassHelper.java @@ -2,6 +2,8 @@ import android.app.Activity; import android.app.Application; +import android.app.Service; +import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.ViewGroup; @@ -12,19 +14,20 @@ public class RClassHelper { protected static Logger log = AndroidLogger.forClass(RClassHelper.class); + @Nullable static Class getRClassFromAnnotation(Object object) { if (object.getClass().isAnnotationPresent(RClass.class)) { Class rClass = object.getClass().getAnnotation(RClass.class).value(); String rClassName = rClass.getSimpleName(); - if (rClassName.equals("R")) { - return rClass; - } else { - log.error("The name of the class given via @RClass should be 'R', but was '" + rClassName + "'"); + if (!rClassName.equals("R")) { + log.warn("The name of the class given via @RClass should be 'R', but was '" + rClassName + "'"); } + return rClass; } return null; } + @Nullable public static Class getRClassFromFragment(Fragment fragment) { Class rClass = getRClassFromAnnotation(fragment); if (rClass != null) { @@ -33,6 +36,7 @@ public static Class getRClassFromFragment(Fragment fragment) { return getRClassFromActivity(fragment.getActivity()); } + @Nullable public static Class getRClassFromActivity(Activity activity) { Class rClass = getRClassFromAnnotation(activity); if (rClass != null) { @@ -41,6 +45,15 @@ public static Class getRClassFromActivity(Activity activity) { return getRClassFromApplication(activity.getApplication()); } + @Nullable + public static Class getRClassFromService(Service service){ + Class rClassFromAnnotation = getRClassFromAnnotation(service); + if(rClassFromAnnotation != null) + return rClassFromAnnotation; + return getRClassFromApplication(service.getApplication()); + } + + @Nullable private static Class getRClassFromApplication(Application application) { Class rClass = getRClassFromAnnotation(application); if (rClass != null) { @@ -49,6 +62,7 @@ private static Class getRClassFromApplication(Application application) { return getRClassFromPackageName(application.getPackageName()); } + @Nullable static Class getRClassFromPackageName(String packageName) { String rClassName = packageName + ".R"; try { @@ -59,6 +73,7 @@ static Class getRClassFromPackageName(String packageName) { return null; } + @Nullable public static Class getRClassFromViewGroup(ViewGroup object) { Class rClass = getRClassFromAnnotation(object); if (rClass != null) { diff --git a/injection/src/main/java/io/freefair/android/injection/platform/ActivityInjector.java b/injection/src/main/java/io/freefair/android/injection/platform/ActivityInjector.java index fd618da..84f633f 100644 --- a/injection/src/main/java/io/freefair/android/injection/platform/ActivityInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/platform/ActivityInjector.java @@ -6,10 +6,9 @@ import android.support.annotation.NonNull; import android.view.View; -import io.freefair.android.injection.Injector; import io.freefair.android.injection.helper.RClassHelper; -public class ActivityInjector extends AndroidInjector { +public class ActivityInjector extends AndroidViewInjector { public ActivityInjector(Activity activity){ super(null, activity, RClassHelper.getRClassFromActivity(activity)); diff --git a/injection/src/main/java/io/freefair/android/injection/platform/AndroidInjector.java b/injection/src/main/java/io/freefair/android/injection/platform/AndroidResourceInjector.java similarity index 82% rename from injection/src/main/java/io/freefair/android/injection/platform/AndroidInjector.java rename to injection/src/main/java/io/freefair/android/injection/platform/AndroidResourceInjector.java index 9ce6da3..cd69ec4 100644 --- a/injection/src/main/java/io/freefair/android/injection/platform/AndroidInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/platform/AndroidResourceInjector.java @@ -8,10 +8,8 @@ import android.content.res.XmlResourceParser; import android.graphics.Movie; import android.graphics.drawable.Drawable; -import android.support.annotation.IdRes; import android.support.annotation.NonNull; import android.util.TypedValue; -import android.view.View; import java.lang.reflect.Field; import java.util.HashMap; @@ -22,23 +20,22 @@ import io.freefair.android.injection.Injector; import io.freefair.android.injection.annotation.InjectAttribute; import io.freefair.android.injection.annotation.InjectResource; -import io.freefair.android.injection.annotation.InjectView; import io.freefair.android.injection.exceptions.InjectionException; -import io.freefair.android.injection.exceptions.ViewIdNotFoundException; import io.freefair.android.injection.reflection.Reflection; -import io.freefair.android.util.logging.*; import io.freefair.android.util.function.Optional; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; import static android.os.Build.VERSION.SDK_INT; import static android.os.Build.VERSION_CODES.LOLLIPOP; -public abstract class AndroidInjector extends Injector { +public class AndroidResourceInjector extends Injector { private T object; private Class rClass; - private Logger log = AndroidLogger.forClass(AndroidInjector.class); + private Logger log = AndroidLogger.forClass(AndroidResourceInjector.class); - public AndroidInjector(Injector parentInjector, T object, Class rClass) { + public AndroidResourceInjector(Injector parentInjector, T object, Class rClass) { super(parentInjector == null ? InjectionContainer.getInstance() : parentInjector); this.setObject(object); this.rClass = rClass; @@ -78,9 +75,7 @@ protected Class getObjectClass() { @Override protected void inject(@NonNull Object instance, @NonNull Field field) { - if (field.isAnnotationPresent(InjectView.class)) { - getBinding().views.put(field, findViewId(field)); - } else if (field.isAnnotationPresent(InjectResource.class)) { + if (field.isAnnotationPresent(InjectResource.class)) { getBinding().resources.put(field, field.getAnnotation(InjectResource.class)); } else if (field.isAnnotationPresent(InjectAttribute.class)) { getBinding().attributes.put(field, field.getAnnotation(InjectAttribute.class)); @@ -89,14 +84,6 @@ protected void inject(@NonNull Object instance, @NonNull Field field) { } } - public void injectViews() { - for (Map.Entry viewBinding : getBinding().views.entrySet()) { - View view = findViewById(viewBinding.getValue()); - inject(viewBinding.getKey(), view); - } - } - - protected void inject(Field field, Object value) { inject(getObject(), field, value); } @@ -343,49 +330,20 @@ public T resolveValue(@NonNull Class type, Object instance) { return super.resolveValue(type, instance); } - protected abstract View findViewById(@IdRes int viewId); - - @IdRes - protected int findViewId(Field field) throws ViewIdNotFoundException { - - if (field.isAnnotationPresent(InjectView.class)) { - InjectView injectViewAnnotation = field.getAnnotation(InjectView.class); - if (injectViewAnnotation.value() != InjectView.DEFAULT_ID) { - return injectViewAnnotation.value(); - } - } - - String fieldName = field.getName(); - if (isRAvailable()) { - try { - return getRid().getDeclaredField(fieldName).getInt(null); - } catch (NoSuchFieldException e) { - log.info("Field " + fieldName + " not found in R class"); - } catch (IllegalAccessException e) { //that should never happen - e.printStackTrace(); - throw new RuntimeException(e); - } - } - - throw new ViewIdNotFoundException(fieldName); - } - - private Binding getBinding() { - if (bindings.get(getObjectClass()) == null) { - bindings.put(getObjectClass(), new Binding()); - } - return bindings.get(getObjectClass()); - } + private Binding getBinding() { + if (!bindings.containsKey(getObjectClass())) { + bindings.put(getObjectClass(), new Binding()); + } + return bindings.get(getObjectClass()); + } private static WeakHashMap, Binding> bindings = new WeakHashMap<>(); public static class Binding { - Map views; Map attributes; Map resources; Binding() { - views = new HashMap<>(); attributes = new HashMap<>(); resources = new HashMap<>(); } diff --git a/injection/src/main/java/io/freefair/android/injection/platform/AndroidViewInjector.java b/injection/src/main/java/io/freefair/android/injection/platform/AndroidViewInjector.java new file mode 100644 index 0000000..56e8d33 --- /dev/null +++ b/injection/src/main/java/io/freefair/android/injection/platform/AndroidViewInjector.java @@ -0,0 +1,77 @@ +package io.freefair.android.injection.platform; + +import android.support.annotation.IdRes; +import android.support.annotation.NonNull; +import android.view.View; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; +import java.util.WeakHashMap; + +import io.freefair.android.injection.Injector; +import io.freefair.android.injection.annotation.InjectView; +import io.freefair.android.injection.exceptions.ViewIdNotFoundException; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + +public abstract class AndroidViewInjector extends AndroidResourceInjector { + + private Logger log = AndroidLogger.forObject(this); + + public AndroidViewInjector(Injector parentInjector, T object, Class rClass) { + super(parentInjector, object, rClass); + } + + @Override + protected void inject(@NonNull Object instance, @NonNull Field field) { + if (field.isAnnotationPresent(InjectView.class)) { + getViewBinding().put(field, findViewId(field)); + } else { + super.inject(instance, field); + } + } + + public void injectViews() { + for (Map.Entry viewBinding : getViewBinding().entrySet()) { + View view = findViewById(viewBinding.getValue()); + inject(viewBinding.getKey(), view); + } + } + + protected abstract View findViewById(@IdRes int viewId); + + @IdRes + protected int findViewId(Field field) throws ViewIdNotFoundException { + + if (field.isAnnotationPresent(InjectView.class)) { + InjectView injectViewAnnotation = field.getAnnotation(InjectView.class); + if (injectViewAnnotation.value() != InjectView.DEFAULT_ID) { + return injectViewAnnotation.value(); + } + } + + String fieldName = field.getName(); + if (isRAvailable()) { + try { + return getRid().getDeclaredField(fieldName).getInt(null); + } catch (NoSuchFieldException e) { + log.info("Field " + fieldName + " not found in R class"); + } catch (IllegalAccessException e) { //that should never happen + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + throw new ViewIdNotFoundException(fieldName); + } + + private Map getViewBinding() { + if (!viewBindings.containsKey(getObjectClass())) { + viewBindings.put(getObjectClass(), new HashMap()); + } + return viewBindings.get(getObjectClass()); + } + + private static WeakHashMap, Map> viewBindings = new WeakHashMap<>(); +} diff --git a/injection/src/main/java/io/freefair/android/injection/platform/FragmentInjector.java b/injection/src/main/java/io/freefair/android/injection/platform/FragmentInjector.java index ac6ead3..33d2459 100644 --- a/injection/src/main/java/io/freefair/android/injection/platform/FragmentInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/platform/FragmentInjector.java @@ -7,9 +7,7 @@ import io.freefair.android.injection.Injector; import io.freefair.android.injection.helper.RClassHelper; -public class FragmentInjector extends AndroidInjector { - - private IViewFinder viewFinder; +public class FragmentInjector extends AndroidViewInjector { public FragmentInjector(Fragment fragment, Injector parentInjector){ super(parentInjector, fragment, RClassHelper.getRClassFromFragment(fragment)); @@ -21,14 +19,6 @@ protected View findViewById(@IdRes int viewId) { if( getObject().getView() != null){ return getObject().getView().findViewById(viewId); } - else if(viewFinder != null){ - return viewFinder.findViewById(viewId); - } return null; } - - public void setViewFinder( IViewFinder viewFinder ) { - this.viewFinder = viewFinder; - } - } diff --git a/injection/src/main/java/io/freefair/android/injection/platform/IViewFinder.java b/injection/src/main/java/io/freefair/android/injection/platform/IViewFinder.java deleted file mode 100644 index 01f0d46..0000000 --- a/injection/src/main/java/io/freefair/android/injection/platform/IViewFinder.java +++ /dev/null @@ -1,8 +0,0 @@ -package io.freefair.android.injection.platform; - -import android.support.annotation.IdRes; -import android.view.View; - -public interface IViewFinder { - View findViewById(@IdRes int viewId); -} diff --git a/injection/src/main/java/io/freefair/android/injection/platform/ServiceInjector.java b/injection/src/main/java/io/freefair/android/injection/platform/ServiceInjector.java new file mode 100644 index 0000000..518d10b --- /dev/null +++ b/injection/src/main/java/io/freefair/android/injection/platform/ServiceInjector.java @@ -0,0 +1,12 @@ +package io.freefair.android.injection.platform; + +import android.app.Service; + +import io.freefair.android.injection.Injector; +import io.freefair.android.injection.helper.RClassHelper; + +public class ServiceInjector extends AndroidResourceInjector { + public ServiceInjector(Injector parentInjector, Service service) { + super(parentInjector, service, RClassHelper.getRClassFromService(service)); + } +} diff --git a/injection/src/main/java/io/freefair/android/injection/platform/ViewGroupInjector.java b/injection/src/main/java/io/freefair/android/injection/platform/ViewGroupInjector.java index 630fac8..8bd9e33 100644 --- a/injection/src/main/java/io/freefair/android/injection/platform/ViewGroupInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/platform/ViewGroupInjector.java @@ -10,7 +10,7 @@ /** * @author Dennis Fricke */ -public class ViewGroupInjector extends AndroidInjector { +public class ViewGroupInjector extends AndroidViewInjector { public ViewGroupInjector(ViewGroup object, Injector parentInjector) { super(parentInjector, object, RClassHelper.getRClassFromViewGroup(object)); } diff --git a/injection/src/main/java/io/freefair/android/injection/platform/WatchViewStubActivityInjector.java b/injection/src/main/java/io/freefair/android/injection/platform/WatchViewStubActivityInjector.java index 11807cb..ae84188 100644 --- a/injection/src/main/java/io/freefair/android/injection/platform/WatchViewStubActivityInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/platform/WatchViewStubActivityInjector.java @@ -13,7 +13,7 @@ /** * @author Dennis Fricke */ -public class WatchViewStubActivityInjector extends AndroidInjector { +public class WatchViewStubActivityInjector extends AndroidViewInjector { private final WatchViewStub stub; diff --git a/injection/src/main/java/io/freefair/android/injection/ui/InjectionAppCompatActivity.java b/injection/src/main/java/io/freefair/android/injection/ui/InjectionAppCompatActivity.java index 9090e72..a552dfa 100644 --- a/injection/src/main/java/io/freefair/android/injection/ui/InjectionAppCompatActivity.java +++ b/injection/src/main/java/io/freefair/android/injection/ui/InjectionAppCompatActivity.java @@ -7,7 +7,6 @@ import android.view.View; import android.view.ViewGroup; -import io.freefair.android.injection.Injector; import io.freefair.android.injection.InjectorProvider; import io.freefair.android.injection.annotation.Inject; import io.freefair.android.injection.annotation.XmlLayout; @@ -20,75 +19,74 @@ * An {@link AppCompatActivity} with support for dependency injection */ public class InjectionAppCompatActivity extends AppCompatActivity implements InjectorProvider { - ActivityInjector injector; - - @Inject protected Optional xmlMenuAnnotation; - @Inject protected Optional xmlLayoutAnnotation; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - injector = new ActivityInjector(this); - injector.inject(this); - - if(xmlLayoutAnnotation.isPresent()){ - setContentView(xmlLayoutAnnotation.get().value()); - } - - injector.injectResources(); - injector.injectAttributes(); - } - - @Override - public void setContentView(int layoutResID) { - super.setContentView(layoutResID); - tryInjectViews(); - } - - private void tryInjectViews() { - injector.injectViews(); - } - - @Override - public void setContentView(View view) { - super.setContentView(view); - tryInjectViews(); - } - - @Override - public void setContentView(View view, ViewGroup.LayoutParams params) { - super.setContentView(view, params); - tryInjectViews(); - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - injector.injectResources(); - injector.injectAttributes(); - } - - @Override - public void setTheme(int resid) { - super.setTheme(resid); - if (injector != null) { - injector.injectResources(); - injector.injectAttributes(); - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - if (xmlMenuAnnotation.isPresent()) { - getMenuInflater().inflate(xmlMenuAnnotation.get().value(), menu); - super.onCreateOptionsMenu(menu); - return true; - } - return super.onCreateOptionsMenu(menu); - } - - @Override - public ActivityInjector getInjector() { - return injector; - } + + private ActivityInjector injector; + + @Inject + protected Optional xmlMenuAnnotation; + @Inject + protected Optional xmlLayoutAnnotation; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + injector = new ActivityInjector(this); + injector.inject(this); + + if (xmlLayoutAnnotation.isPresent()) { + setContentView(xmlLayoutAnnotation.get().value()); + } + + injector.injectResources(); + injector.injectAttributes(); + } + + @Override + public void setContentView(int layoutResID) { + super.setContentView(layoutResID); + injector.injectViews(); + } + + @Override + public void setContentView(View view) { + super.setContentView(view); + injector.injectViews(); + } + + @Override + public void setContentView(View view, ViewGroup.LayoutParams params) { + super.setContentView(view, params); + injector.injectViews(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + injector.injectResources(); + injector.injectAttributes(); + } + + @Override + public void setTheme(int resid) { + super.setTheme(resid); + if (injector != null) { + injector.injectResources(); + injector.injectAttributes(); + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + if (xmlMenuAnnotation.isPresent()) { + getMenuInflater().inflate(xmlMenuAnnotation.get().value(), menu); + super.onCreateOptionsMenu(menu); + return true; + } + return super.onCreateOptionsMenu(menu); + } + + @Override + public ActivityInjector getInjector() { + return injector; + } } diff --git a/injection/src/main/java/io/freefair/android/injection/ui/InjectionApplication.java b/injection/src/main/java/io/freefair/android/injection/ui/InjectionApplication.java index f36b716..e0214e1 100644 --- a/injection/src/main/java/io/freefair/android/injection/ui/InjectionApplication.java +++ b/injection/src/main/java/io/freefair/android/injection/ui/InjectionApplication.java @@ -3,26 +3,29 @@ import android.app.Application; import io.freefair.android.injection.InjectionContainer; +import io.freefair.android.injection.InjectorProvider; import io.freefair.android.util.function.Suppliers; /** * An {@link Application} with support for dependency injection */ -public class InjectionApplication extends Application { - private InjectionContainer injector; +@SuppressWarnings("unused") +public class InjectionApplication extends Application implements InjectorProvider { - public InjectionApplication() { - injector = InjectionContainer.getInstance(); - injector.registerSupplier(InjectionApplication.class, Suppliers.of(this)); - } + private InjectionContainer injector; - @Override - public void onCreate() { - super.onCreate(); - injector.inject(this); - } + public InjectionApplication() { + injector = InjectionContainer.getInstance(); + injector.registerSupplier(InjectionApplication.class, Suppliers.of(this)); + } - public InjectionContainer getInjector() { - return injector; - } + @Override + public void onCreate() { + super.onCreate(); + injector.inject(this); + } + + public InjectionContainer getInjector() { + return injector; + } } diff --git a/injection/src/main/java/io/freefair/android/injection/ui/InjectionFragment.java b/injection/src/main/java/io/freefair/android/injection/ui/InjectionFragment.java index 878fbbe..f154861 100644 --- a/injection/src/main/java/io/freefair/android/injection/ui/InjectionFragment.java +++ b/injection/src/main/java/io/freefair/android/injection/ui/InjectionFragment.java @@ -2,7 +2,6 @@ import android.content.res.Configuration; import android.os.Bundle; -import android.support.annotation.IdRes; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; @@ -16,80 +15,69 @@ import io.freefair.android.injection.annotation.Inject; import io.freefair.android.injection.annotation.XmlLayout; import io.freefair.android.injection.annotation.XmlMenu; -import io.freefair.android.injection.exceptions.ViewIdNotFoundException; import io.freefair.android.injection.platform.FragmentInjector; -import io.freefair.android.injection.platform.IViewFinder; import io.freefair.android.util.function.Optional; - -public class InjectionFragment extends Fragment implements InjectorProvider{ - - @Inject Optional xmlMenuAnnotation; - @Inject Optional xmlLayoutAnnotation; - - FragmentInjector injector; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - Injector parentInjector = null; - if(getActivity() instanceof InjectorProvider) { - parentInjector = ((InjectorProvider) getActivity()).getInjector(); - } - injector = new FragmentInjector(this, parentInjector); - injector.inject(this); - if(xmlMenuAnnotation.isPresent()){ - setHasOptionsMenu(true); - } - - injector.injectResources(); - injector.injectAttributes(); - - - } - - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - if (xmlLayoutAnnotation.isPresent()) { - return inflater.inflate(xmlLayoutAnnotation.get().value(), container, false); - } - return super.onCreateView(inflater, container, savedInstanceState); - } - - @Override - public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - injector.setViewFinder(new IViewFinder() { - @Override - public View findViewById(@IdRes int viewId) { - return view.findViewById(viewId); - } - }); - try { - injector.injectViews(); - } catch (ViewIdNotFoundException e) { - throw new RuntimeException(e); - } - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - if (xmlMenuAnnotation.isPresent()) { - inflater.inflate(xmlMenuAnnotation.get().value(), menu); - } - super.onCreateOptionsMenu(menu, inflater); - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - injector.injectResources(); - injector.injectAttributes(); - } - - @Override - public Injector getInjector() { - return null; - } +@SuppressWarnings("unused") +public class InjectionFragment extends Fragment implements InjectorProvider { + + private FragmentInjector injector; + + @Inject + Optional xmlMenuAnnotation; + @Inject + Optional xmlLayoutAnnotation; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Injector parentInjector = null; + if (getActivity() instanceof InjectorProvider) { + parentInjector = ((InjectorProvider) getActivity()).getInjector(); + } + injector = new FragmentInjector(this, parentInjector); + injector.inject(this); + if (xmlMenuAnnotation.isPresent()) { + setHasOptionsMenu(true); + } + + injector.injectResources(); + injector.injectAttributes(); + + } + + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + if (xmlLayoutAnnotation.isPresent()) { + return inflater.inflate(xmlLayoutAnnotation.get().value(), container, false); + } + return super.onCreateView(inflater, container, savedInstanceState); + } + + @Override + public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + injector.injectViews(); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + if (xmlMenuAnnotation.isPresent()) { + inflater.inflate(xmlMenuAnnotation.get().value(), menu); + } + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + injector.injectResources(); + injector.injectAttributes(); + } + + @Override + public FragmentInjector getInjector() { + return injector; + } } diff --git a/injection/src/main/java/io/freefair/android/injection/ui/InjectionService.java b/injection/src/main/java/io/freefair/android/injection/ui/InjectionService.java index 492529c..71683d1 100644 --- a/injection/src/main/java/io/freefair/android/injection/ui/InjectionService.java +++ b/injection/src/main/java/io/freefair/android/injection/ui/InjectionService.java @@ -1,29 +1,32 @@ package io.freefair.android.injection.ui; import android.app.Service; -import android.content.Intent; -import io.freefair.android.injection.InjectionContainer; import io.freefair.android.injection.Injector; import io.freefair.android.injection.InjectorProvider; +import io.freefair.android.injection.platform.ServiceInjector; /** * A {@link Service} with support for dependency injection */ public abstract class InjectionService extends Service implements InjectorProvider { - @Override - public int onStartCommand(Intent intent, int flags, int startId) { + private ServiceInjector injector; - Injector injector = getInjector(); - if(injector != null) - injector.inject(this); + @Override + public void onCreate() { + super.onCreate(); - return super.onStartCommand(intent, flags, startId); - } + Injector parentInjector = null; + if (getApplication() instanceof InjectionApplication) { + parentInjector = ((InjectionApplication) getApplication()).getInjector(); + } + injector = new ServiceInjector(parentInjector, this); + injector.inject(this); + } - @Override - public Injector getInjector() { - return InjectionContainer.getInstance(); - } + @Override + public Injector getInjector() { + return injector; + } } diff --git a/injection/src/main/java/io/freefair/android/injection/ui/InjectionWearableActivity.java b/injection/src/main/java/io/freefair/android/injection/ui/InjectionWearableActivity.java index d9d6e91..9a0efe8 100644 --- a/injection/src/main/java/io/freefair/android/injection/ui/InjectionWearableActivity.java +++ b/injection/src/main/java/io/freefair/android/injection/ui/InjectionWearableActivity.java @@ -14,49 +14,49 @@ * @author Dennis Fricke */ public abstract class InjectionWearableActivity extends Activity implements InjectorProvider { - WatchViewStubActivityInjector injector; + WatchViewStubActivityInjector injector; - Injector parentInjector; + Injector parentInjector; - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - parentInjector = InjectionContainer.getInstance(); - parentInjector.inject(this); + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + parentInjector = InjectionContainer.getInstance(); + parentInjector.inject(this); - } + } - public void setContentView(int layoutResID, int viewStubID) { - super.setContentView(layoutResID); - final WatchViewStub stub = (WatchViewStub) findViewById(viewStubID); + public void setContentView(int layoutResID, int viewStubID) { + super.setContentView(layoutResID); + final WatchViewStub stub = (WatchViewStub) findViewById(viewStubID); - stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() { - @Override - public void onLayoutInflated(WatchViewStub stub) { - injector = new WatchViewStubActivityInjector(InjectionWearableActivity.this, stub, parentInjector); + stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() { + @Override + public void onLayoutInflated(WatchViewStub stub) { + injector = new WatchViewStubActivityInjector(InjectionWearableActivity.this, stub, parentInjector); - injector.injectResources(); - injector.injectAttributes(); + injector.injectResources(); + injector.injectAttributes(); - tryInjectViews(); + tryInjectViews(); - onLayoutReady(); - } - }); - } + onLayoutReady(); + } + }); + } - private void tryInjectViews() { - try { - injector.injectViews(); - } catch (ViewIdNotFoundException e) { - throw new RuntimeException(e); - } - } + private void tryInjectViews() { + try { + injector.injectViews(); + } catch (ViewIdNotFoundException e) { + throw new RuntimeException(e); + } + } - protected abstract void onLayoutReady(); + protected abstract void onLayoutReady(); - @Override - public WatchViewStubActivityInjector getInjector() { - return injector; - } + @Override + public WatchViewStubActivityInjector getInjector() { + return injector; + } } From ded6ca9c521a5c52e0f3a564ec3bdb9b061da5d4 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Thu, 24 Dec 2015 00:27:28 +0100 Subject: [PATCH 2/7] update @SuppressWarnings("unused") --- .../android/injection/ui/InjectionAppCompatActivity.java | 1 + .../java/io/freefair/android/injection/ui/InjectionService.java | 1 + .../freefair/android/injection/ui/InjectionWearableActivity.java | 1 + 3 files changed, 3 insertions(+) diff --git a/injection/src/main/java/io/freefair/android/injection/ui/InjectionAppCompatActivity.java b/injection/src/main/java/io/freefair/android/injection/ui/InjectionAppCompatActivity.java index a552dfa..854bb98 100644 --- a/injection/src/main/java/io/freefair/android/injection/ui/InjectionAppCompatActivity.java +++ b/injection/src/main/java/io/freefair/android/injection/ui/InjectionAppCompatActivity.java @@ -18,6 +18,7 @@ /** * An {@link AppCompatActivity} with support for dependency injection */ +@SuppressWarnings("unused") public class InjectionAppCompatActivity extends AppCompatActivity implements InjectorProvider { private ActivityInjector injector; diff --git a/injection/src/main/java/io/freefair/android/injection/ui/InjectionService.java b/injection/src/main/java/io/freefair/android/injection/ui/InjectionService.java index 71683d1..67b2102 100644 --- a/injection/src/main/java/io/freefair/android/injection/ui/InjectionService.java +++ b/injection/src/main/java/io/freefair/android/injection/ui/InjectionService.java @@ -9,6 +9,7 @@ /** * A {@link Service} with support for dependency injection */ +@SuppressWarnings("unused") public abstract class InjectionService extends Service implements InjectorProvider { private ServiceInjector injector; diff --git a/injection/src/main/java/io/freefair/android/injection/ui/InjectionWearableActivity.java b/injection/src/main/java/io/freefair/android/injection/ui/InjectionWearableActivity.java index 9a0efe8..ef23d71 100644 --- a/injection/src/main/java/io/freefair/android/injection/ui/InjectionWearableActivity.java +++ b/injection/src/main/java/io/freefair/android/injection/ui/InjectionWearableActivity.java @@ -13,6 +13,7 @@ /** * @author Dennis Fricke */ +@SuppressWarnings("unused") public abstract class InjectionWearableActivity extends Activity implements InjectorProvider { WatchViewStubActivityInjector injector; From 62cb020bb83da2a60c69ed79f91b8587d3d2cb69 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Thu, 24 Dec 2015 00:34:19 +0100 Subject: [PATCH 3/7] rename package --- .../java/io/freefair/android/injection/DefaultModule.java | 2 ++ .../java/io/freefair/android/injection/InjectionModule.java | 2 ++ .../io/freefair/android/injection/InjectionProvider.java | 2 ++ .../io/freefair/android/injection/InjectorProvider.java | 2 ++ .../io/freefair/android/injection/TypeRegistration.java | 4 +++- .../injection/{platform => injector}/ActivityInjector.java | 2 +- .../{platform => injector}/AndroidResourceInjector.java | 4 +--- .../{platform => injector}/AndroidViewInjector.java | 3 +-- .../injection/{platform => injector}/FragmentInjector.java | 3 +-- .../injection/{ => injector}/InjectionContainer.java | 5 ++++- .../freefair/android/injection/{ => injector}/Injector.java | 2 +- .../injection/{platform => injector}/ServiceInjector.java | 3 +-- .../injection/{platform => injector}/ViewGroupInjector.java | 3 +-- .../WatchViewStubActivityInjector.java | 3 +-- .../android/injection/ui/InjectionAppCompatActivity.java | 2 +- .../freefair/android/injection/ui/InjectionApplication.java | 2 +- .../io/freefair/android/injection/ui/InjectionFragment.java | 4 ++-- .../io/freefair/android/injection/ui/InjectionService.java | 4 ++-- .../android/injection/ui/InjectionWearableActivity.java | 6 +++--- .../java/io/freefair/android/injection/InjectorTest.java | 1 + .../{platform => injector}/AndroidInjectorTest.java | 2 +- .../android/injection/modules/AndroidLoggerModule.java | 2 +- .../injection/modules/logging/AndroidLoggerProvider.java | 2 +- .../io/freefair/android/injection/modules/OkHttpModule.java | 2 +- .../io/freefair/android/injection/modules/RealmModule.java | 2 +- .../android/injection/modules/realm/BaseRealmProvider.java | 2 +- .../injection/modules/realm/ContextRealmProvider.java | 4 +--- .../modules/realm/CustomConfigurationRealmProvider.java | 2 +- .../injection/modules/realm/DefaultRealmProvider.java | 2 +- .../freefair/android/injection/modules/RetrofitModule.java | 2 +- .../android/injection/modules/retrofit/ServiceProvider.java | 2 +- 31 files changed, 44 insertions(+), 39 deletions(-) rename injection/src/main/java/io/freefair/android/injection/{platform => injector}/ActivityInjector.java (90%) rename injection/src/main/java/io/freefair/android/injection/{platform => injector}/AndroidResourceInjector.java (95%) rename injection/src/main/java/io/freefair/android/injection/{platform => injector}/AndroidViewInjector.java (96%) rename injection/src/main/java/io/freefair/android/injection/{platform => injector}/FragmentInjector.java (82%) rename injection/src/main/java/io/freefair/android/injection/{ => injector}/InjectionContainer.java (94%) rename injection/src/main/java/io/freefair/android/injection/{ => injector}/Injector.java (99%) rename injection/src/main/java/io/freefair/android/injection/{platform => injector}/ServiceInjector.java (77%) rename injection/src/main/java/io/freefair/android/injection/{platform => injector}/ViewGroupInjector.java (81%) rename injection/src/main/java/io/freefair/android/injection/{platform => injector}/WatchViewStubActivityInjector.java (87%) rename injection/src/test/java/io/freefair/android/injection/{platform => injector}/AndroidInjectorTest.java (86%) diff --git a/injection/src/main/java/io/freefair/android/injection/DefaultModule.java b/injection/src/main/java/io/freefair/android/injection/DefaultModule.java index 627fccc..e4f0368 100644 --- a/injection/src/main/java/io/freefair/android/injection/DefaultModule.java +++ b/injection/src/main/java/io/freefair/android/injection/DefaultModule.java @@ -1,5 +1,7 @@ package io.freefair.android.injection; +import io.freefair.android.injection.injector.InjectionContainer; + public class DefaultModule implements InjectionModule { @Override public void configure(InjectionContainer injectionContainer) { diff --git a/injection/src/main/java/io/freefair/android/injection/InjectionModule.java b/injection/src/main/java/io/freefair/android/injection/InjectionModule.java index 09cb718..e064a9c 100644 --- a/injection/src/main/java/io/freefair/android/injection/InjectionModule.java +++ b/injection/src/main/java/io/freefair/android/injection/InjectionModule.java @@ -1,5 +1,7 @@ package io.freefair.android.injection; +import io.freefair.android.injection.injector.InjectionContainer; + public interface InjectionModule { void configure(InjectionContainer injectionContainer); } diff --git a/injection/src/main/java/io/freefair/android/injection/InjectionProvider.java b/injection/src/main/java/io/freefair/android/injection/InjectionProvider.java index b967492..532d841 100644 --- a/injection/src/main/java/io/freefair/android/injection/InjectionProvider.java +++ b/injection/src/main/java/io/freefair/android/injection/InjectionProvider.java @@ -1,5 +1,7 @@ package io.freefair.android.injection; +import io.freefair.android.injection.injector.Injector; + public interface InjectionProvider { boolean canProvide(Class clazz); diff --git a/injection/src/main/java/io/freefair/android/injection/InjectorProvider.java b/injection/src/main/java/io/freefair/android/injection/InjectorProvider.java index a507ba1..fe872e5 100644 --- a/injection/src/main/java/io/freefair/android/injection/InjectorProvider.java +++ b/injection/src/main/java/io/freefair/android/injection/InjectorProvider.java @@ -1,5 +1,7 @@ package io.freefair.android.injection; +import io.freefair.android.injection.injector.Injector; + public interface InjectorProvider { Injector getInjector(); } diff --git a/injection/src/main/java/io/freefair/android/injection/TypeRegistration.java b/injection/src/main/java/io/freefair/android/injection/TypeRegistration.java index 5c07ace..edee375 100644 --- a/injection/src/main/java/io/freefair/android/injection/TypeRegistration.java +++ b/injection/src/main/java/io/freefair/android/injection/TypeRegistration.java @@ -1,11 +1,13 @@ package io.freefair.android.injection; +import io.freefair.android.injection.injector.Injector; + public class TypeRegistration implements InjectionProvider { private final Class implClass; private final Class iFace; - TypeRegistration(Class implClass, Class iFace){ + public TypeRegistration(Class implClass, Class iFace){ this.implClass = implClass; this.iFace = iFace; } diff --git a/injection/src/main/java/io/freefair/android/injection/platform/ActivityInjector.java b/injection/src/main/java/io/freefair/android/injection/injector/ActivityInjector.java similarity index 90% rename from injection/src/main/java/io/freefair/android/injection/platform/ActivityInjector.java rename to injection/src/main/java/io/freefair/android/injection/injector/ActivityInjector.java index 84f633f..477622c 100644 --- a/injection/src/main/java/io/freefair/android/injection/platform/ActivityInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/injector/ActivityInjector.java @@ -1,4 +1,4 @@ -package io.freefair.android.injection.platform; +package io.freefair.android.injection.injector; import android.app.Activity; import android.content.res.Resources; diff --git a/injection/src/main/java/io/freefair/android/injection/platform/AndroidResourceInjector.java b/injection/src/main/java/io/freefair/android/injection/injector/AndroidResourceInjector.java similarity index 95% rename from injection/src/main/java/io/freefair/android/injection/platform/AndroidResourceInjector.java rename to injection/src/main/java/io/freefair/android/injection/injector/AndroidResourceInjector.java index cd69ec4..9278c95 100644 --- a/injection/src/main/java/io/freefair/android/injection/platform/AndroidResourceInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/injector/AndroidResourceInjector.java @@ -1,4 +1,4 @@ -package io.freefair.android.injection.platform; +package io.freefair.android.injection.injector; import android.annotation.TargetApi; import android.content.Context; @@ -16,8 +16,6 @@ import java.util.Map; import java.util.WeakHashMap; -import io.freefair.android.injection.InjectionContainer; -import io.freefair.android.injection.Injector; import io.freefair.android.injection.annotation.InjectAttribute; import io.freefair.android.injection.annotation.InjectResource; import io.freefair.android.injection.exceptions.InjectionException; diff --git a/injection/src/main/java/io/freefair/android/injection/platform/AndroidViewInjector.java b/injection/src/main/java/io/freefair/android/injection/injector/AndroidViewInjector.java similarity index 96% rename from injection/src/main/java/io/freefair/android/injection/platform/AndroidViewInjector.java rename to injection/src/main/java/io/freefair/android/injection/injector/AndroidViewInjector.java index 56e8d33..a10c07d 100644 --- a/injection/src/main/java/io/freefair/android/injection/platform/AndroidViewInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/injector/AndroidViewInjector.java @@ -1,4 +1,4 @@ -package io.freefair.android.injection.platform; +package io.freefair.android.injection.injector; import android.support.annotation.IdRes; import android.support.annotation.NonNull; @@ -9,7 +9,6 @@ import java.util.Map; import java.util.WeakHashMap; -import io.freefair.android.injection.Injector; import io.freefair.android.injection.annotation.InjectView; import io.freefair.android.injection.exceptions.ViewIdNotFoundException; import io.freefair.android.util.logging.AndroidLogger; diff --git a/injection/src/main/java/io/freefair/android/injection/platform/FragmentInjector.java b/injection/src/main/java/io/freefair/android/injection/injector/FragmentInjector.java similarity index 82% rename from injection/src/main/java/io/freefair/android/injection/platform/FragmentInjector.java rename to injection/src/main/java/io/freefair/android/injection/injector/FragmentInjector.java index 33d2459..4982eda 100644 --- a/injection/src/main/java/io/freefair/android/injection/platform/FragmentInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/injector/FragmentInjector.java @@ -1,10 +1,9 @@ -package io.freefair.android.injection.platform; +package io.freefair.android.injection.injector; import android.support.annotation.IdRes; import android.support.v4.app.Fragment; import android.view.View; -import io.freefair.android.injection.Injector; import io.freefair.android.injection.helper.RClassHelper; public class FragmentInjector extends AndroidViewInjector { diff --git a/injection/src/main/java/io/freefair/android/injection/InjectionContainer.java b/injection/src/main/java/io/freefair/android/injection/injector/InjectionContainer.java similarity index 94% rename from injection/src/main/java/io/freefair/android/injection/InjectionContainer.java rename to injection/src/main/java/io/freefair/android/injection/injector/InjectionContainer.java index 2b5ea44..712c4b1 100644 --- a/injection/src/main/java/io/freefair/android/injection/InjectionContainer.java +++ b/injection/src/main/java/io/freefair/android/injection/injector/InjectionContainer.java @@ -1,4 +1,4 @@ -package io.freefair.android.injection; +package io.freefair.android.injection.injector; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -10,6 +10,9 @@ import java.util.Map; import java.util.Set; +import io.freefair.android.injection.DefaultModule; +import io.freefair.android.injection.InjectionProvider; +import io.freefair.android.injection.TypeRegistration; import io.freefair.android.util.function.Supplier; import io.freefair.android.util.function.Optional; import io.freefair.android.injection.annotation.Inject; diff --git a/injection/src/main/java/io/freefair/android/injection/Injector.java b/injection/src/main/java/io/freefair/android/injection/injector/Injector.java similarity index 99% rename from injection/src/main/java/io/freefair/android/injection/Injector.java rename to injection/src/main/java/io/freefair/android/injection/injector/Injector.java index 8d65503..8a8d5f6 100644 --- a/injection/src/main/java/io/freefair/android/injection/Injector.java +++ b/injection/src/main/java/io/freefair/android/injection/injector/Injector.java @@ -1,4 +1,4 @@ -package io.freefair.android.injection; +package io.freefair.android.injection.injector; import android.app.Activity; import android.app.Application; diff --git a/injection/src/main/java/io/freefair/android/injection/platform/ServiceInjector.java b/injection/src/main/java/io/freefair/android/injection/injector/ServiceInjector.java similarity index 77% rename from injection/src/main/java/io/freefair/android/injection/platform/ServiceInjector.java rename to injection/src/main/java/io/freefair/android/injection/injector/ServiceInjector.java index 518d10b..6d33295 100644 --- a/injection/src/main/java/io/freefair/android/injection/platform/ServiceInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/injector/ServiceInjector.java @@ -1,8 +1,7 @@ -package io.freefair.android.injection.platform; +package io.freefair.android.injection.injector; import android.app.Service; -import io.freefair.android.injection.Injector; import io.freefair.android.injection.helper.RClassHelper; public class ServiceInjector extends AndroidResourceInjector { diff --git a/injection/src/main/java/io/freefair/android/injection/platform/ViewGroupInjector.java b/injection/src/main/java/io/freefair/android/injection/injector/ViewGroupInjector.java similarity index 81% rename from injection/src/main/java/io/freefair/android/injection/platform/ViewGroupInjector.java rename to injection/src/main/java/io/freefair/android/injection/injector/ViewGroupInjector.java index 8bd9e33..3071fea 100644 --- a/injection/src/main/java/io/freefair/android/injection/platform/ViewGroupInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/injector/ViewGroupInjector.java @@ -1,10 +1,9 @@ -package io.freefair.android.injection.platform; +package io.freefair.android.injection.injector; import android.support.annotation.IdRes; import android.view.View; import android.view.ViewGroup; -import io.freefair.android.injection.Injector; import io.freefair.android.injection.helper.RClassHelper; /** diff --git a/injection/src/main/java/io/freefair/android/injection/platform/WatchViewStubActivityInjector.java b/injection/src/main/java/io/freefair/android/injection/injector/WatchViewStubActivityInjector.java similarity index 87% rename from injection/src/main/java/io/freefair/android/injection/platform/WatchViewStubActivityInjector.java rename to injection/src/main/java/io/freefair/android/injection/injector/WatchViewStubActivityInjector.java index ae84188..06f1f06 100644 --- a/injection/src/main/java/io/freefair/android/injection/platform/WatchViewStubActivityInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/injector/WatchViewStubActivityInjector.java @@ -1,4 +1,4 @@ -package io.freefair.android.injection.platform; +package io.freefair.android.injection.injector; import android.app.Activity; import android.content.Context; @@ -7,7 +7,6 @@ import android.support.wearable.view.WatchViewStub; import android.view.View; -import io.freefair.android.injection.Injector; import io.freefair.android.injection.helper.RClassHelper; /** diff --git a/injection/src/main/java/io/freefair/android/injection/ui/InjectionAppCompatActivity.java b/injection/src/main/java/io/freefair/android/injection/ui/InjectionAppCompatActivity.java index 854bb98..71ddbaa 100644 --- a/injection/src/main/java/io/freefair/android/injection/ui/InjectionAppCompatActivity.java +++ b/injection/src/main/java/io/freefair/android/injection/ui/InjectionAppCompatActivity.java @@ -11,7 +11,7 @@ import io.freefair.android.injection.annotation.Inject; import io.freefair.android.injection.annotation.XmlLayout; import io.freefair.android.injection.annotation.XmlMenu; -import io.freefair.android.injection.platform.ActivityInjector; +import io.freefair.android.injection.injector.ActivityInjector; import io.freefair.android.util.function.Optional; diff --git a/injection/src/main/java/io/freefair/android/injection/ui/InjectionApplication.java b/injection/src/main/java/io/freefair/android/injection/ui/InjectionApplication.java index e0214e1..93961ea 100644 --- a/injection/src/main/java/io/freefair/android/injection/ui/InjectionApplication.java +++ b/injection/src/main/java/io/freefair/android/injection/ui/InjectionApplication.java @@ -2,7 +2,7 @@ import android.app.Application; -import io.freefair.android.injection.InjectionContainer; +import io.freefair.android.injection.injector.InjectionContainer; import io.freefair.android.injection.InjectorProvider; import io.freefair.android.util.function.Suppliers; diff --git a/injection/src/main/java/io/freefair/android/injection/ui/InjectionFragment.java b/injection/src/main/java/io/freefair/android/injection/ui/InjectionFragment.java index f154861..eeaa45f 100644 --- a/injection/src/main/java/io/freefair/android/injection/ui/InjectionFragment.java +++ b/injection/src/main/java/io/freefair/android/injection/ui/InjectionFragment.java @@ -10,12 +10,12 @@ import android.view.View; import android.view.ViewGroup; -import io.freefair.android.injection.Injector; +import io.freefair.android.injection.injector.Injector; import io.freefair.android.injection.InjectorProvider; import io.freefair.android.injection.annotation.Inject; import io.freefair.android.injection.annotation.XmlLayout; import io.freefair.android.injection.annotation.XmlMenu; -import io.freefair.android.injection.platform.FragmentInjector; +import io.freefair.android.injection.injector.FragmentInjector; import io.freefair.android.util.function.Optional; @SuppressWarnings("unused") diff --git a/injection/src/main/java/io/freefair/android/injection/ui/InjectionService.java b/injection/src/main/java/io/freefair/android/injection/ui/InjectionService.java index 67b2102..a29575a 100644 --- a/injection/src/main/java/io/freefair/android/injection/ui/InjectionService.java +++ b/injection/src/main/java/io/freefair/android/injection/ui/InjectionService.java @@ -2,9 +2,9 @@ import android.app.Service; -import io.freefair.android.injection.Injector; +import io.freefair.android.injection.injector.Injector; import io.freefair.android.injection.InjectorProvider; -import io.freefair.android.injection.platform.ServiceInjector; +import io.freefair.android.injection.injector.ServiceInjector; /** * A {@link Service} with support for dependency injection diff --git a/injection/src/main/java/io/freefair/android/injection/ui/InjectionWearableActivity.java b/injection/src/main/java/io/freefair/android/injection/ui/InjectionWearableActivity.java index ef23d71..6722b39 100644 --- a/injection/src/main/java/io/freefair/android/injection/ui/InjectionWearableActivity.java +++ b/injection/src/main/java/io/freefair/android/injection/ui/InjectionWearableActivity.java @@ -4,11 +4,11 @@ import android.os.Bundle; import android.support.wearable.view.WatchViewStub; -import io.freefair.android.injection.InjectionContainer; -import io.freefair.android.injection.Injector; +import io.freefair.android.injection.injector.InjectionContainer; +import io.freefair.android.injection.injector.Injector; import io.freefair.android.injection.InjectorProvider; import io.freefair.android.injection.exceptions.ViewIdNotFoundException; -import io.freefair.android.injection.platform.WatchViewStubActivityInjector; +import io.freefair.android.injection.injector.WatchViewStubActivityInjector; /** * @author Dennis Fricke diff --git a/injection/src/test/java/io/freefair/android/injection/InjectorTest.java b/injection/src/test/java/io/freefair/android/injection/InjectorTest.java index dd8814f..08766fa 100644 --- a/injection/src/test/java/io/freefair/android/injection/InjectorTest.java +++ b/injection/src/test/java/io/freefair/android/injection/InjectorTest.java @@ -4,6 +4,7 @@ import org.junit.Test; import io.freefair.android.injection.annotation.Inject; +import io.freefair.android.injection.injector.InjectionContainer; import io.freefair.android.util.function.Suppliers; import static org.junit.Assert.*; diff --git a/injection/src/test/java/io/freefair/android/injection/platform/AndroidInjectorTest.java b/injection/src/test/java/io/freefair/android/injection/injector/AndroidInjectorTest.java similarity index 86% rename from injection/src/test/java/io/freefair/android/injection/platform/AndroidInjectorTest.java rename to injection/src/test/java/io/freefair/android/injection/injector/AndroidInjectorTest.java index ccfbd3d..d445d87 100644 --- a/injection/src/test/java/io/freefair/android/injection/platform/AndroidInjectorTest.java +++ b/injection/src/test/java/io/freefair/android/injection/injector/AndroidInjectorTest.java @@ -1,4 +1,4 @@ -package io.freefair.android.injection.platform; +package io.freefair.android.injection.injector; import android.app.Activity; import android.content.Context; diff --git a/modules/logging/src/main/java/io/freefair/android/injection/modules/AndroidLoggerModule.java b/modules/logging/src/main/java/io/freefair/android/injection/modules/AndroidLoggerModule.java index a860996..67ad5d2 100644 --- a/modules/logging/src/main/java/io/freefair/android/injection/modules/AndroidLoggerModule.java +++ b/modules/logging/src/main/java/io/freefair/android/injection/modules/AndroidLoggerModule.java @@ -1,6 +1,6 @@ package io.freefair.android.injection.modules; -import io.freefair.android.injection.InjectionContainer; +import io.freefair.android.injection.injector.InjectionContainer; import io.freefair.android.injection.InjectionModule; import io.freefair.android.injection.modules.logging.AndroidLoggerProvider; diff --git a/modules/logging/src/main/java/io/freefair/android/injection/modules/logging/AndroidLoggerProvider.java b/modules/logging/src/main/java/io/freefair/android/injection/modules/logging/AndroidLoggerProvider.java index 1e601af..81920e8 100644 --- a/modules/logging/src/main/java/io/freefair/android/injection/modules/logging/AndroidLoggerProvider.java +++ b/modules/logging/src/main/java/io/freefair/android/injection/modules/logging/AndroidLoggerProvider.java @@ -1,7 +1,7 @@ package io.freefair.android.injection.modules.logging; import io.freefair.android.injection.InjectionProvider; -import io.freefair.android.injection.Injector; +import io.freefair.android.injection.injector.Injector; import io.freefair.android.util.logging.AndroidLogger; public class AndroidLoggerProvider implements InjectionProvider { diff --git a/modules/okhttp/src/main/java/io/freefair/android/injection/modules/OkHttpModule.java b/modules/okhttp/src/main/java/io/freefair/android/injection/modules/OkHttpModule.java index 58df5e8..ae0d32b 100644 --- a/modules/okhttp/src/main/java/io/freefair/android/injection/modules/OkHttpModule.java +++ b/modules/okhttp/src/main/java/io/freefair/android/injection/modules/OkHttpModule.java @@ -8,7 +8,7 @@ import java.io.File; -import io.freefair.android.injection.InjectionContainer; +import io.freefair.android.injection.injector.InjectionContainer; import io.freefair.android.injection.InjectionModule; import io.freefair.android.util.function.Consumer; import io.freefair.android.util.function.Supplier; diff --git a/modules/realm/src/main/java/io/freefair/android/injection/modules/RealmModule.java b/modules/realm/src/main/java/io/freefair/android/injection/modules/RealmModule.java index 2fd995e..2c790f2 100644 --- a/modules/realm/src/main/java/io/freefair/android/injection/modules/RealmModule.java +++ b/modules/realm/src/main/java/io/freefair/android/injection/modules/RealmModule.java @@ -3,7 +3,7 @@ import android.content.Context; import android.support.annotation.NonNull; -import io.freefair.android.injection.InjectionContainer; +import io.freefair.android.injection.injector.InjectionContainer; import io.freefair.android.injection.InjectionModule; import io.freefair.android.injection.modules.realm.ContextRealmProvider; import io.freefair.android.injection.modules.realm.CustomConfigurationRealmProvider; diff --git a/modules/realm/src/main/java/io/freefair/android/injection/modules/realm/BaseRealmProvider.java b/modules/realm/src/main/java/io/freefair/android/injection/modules/realm/BaseRealmProvider.java index 5a8c487..de348fe 100644 --- a/modules/realm/src/main/java/io/freefair/android/injection/modules/realm/BaseRealmProvider.java +++ b/modules/realm/src/main/java/io/freefair/android/injection/modules/realm/BaseRealmProvider.java @@ -1,7 +1,7 @@ package io.freefair.android.injection.modules.realm; import io.freefair.android.injection.InjectionProvider; -import io.freefair.android.injection.Injector; +import io.freefair.android.injection.injector.Injector; import io.realm.Realm; abstract class BaseRealmProvider implements InjectionProvider { diff --git a/modules/realm/src/main/java/io/freefair/android/injection/modules/realm/ContextRealmProvider.java b/modules/realm/src/main/java/io/freefair/android/injection/modules/realm/ContextRealmProvider.java index f44e6a6..99f5d62 100644 --- a/modules/realm/src/main/java/io/freefair/android/injection/modules/realm/ContextRealmProvider.java +++ b/modules/realm/src/main/java/io/freefair/android/injection/modules/realm/ContextRealmProvider.java @@ -2,9 +2,7 @@ import android.content.Context; -import io.freefair.android.injection.InjectionProvider; -import io.freefair.android.injection.Injector; -import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.injection.injector.Injector; import io.realm.Realm; public class ContextRealmProvider extends BaseRealmProvider { diff --git a/modules/realm/src/main/java/io/freefair/android/injection/modules/realm/CustomConfigurationRealmProvider.java b/modules/realm/src/main/java/io/freefair/android/injection/modules/realm/CustomConfigurationRealmProvider.java index 7a6b79f..1443a4f 100644 --- a/modules/realm/src/main/java/io/freefair/android/injection/modules/realm/CustomConfigurationRealmProvider.java +++ b/modules/realm/src/main/java/io/freefair/android/injection/modules/realm/CustomConfigurationRealmProvider.java @@ -1,6 +1,6 @@ package io.freefair.android.injection.modules.realm; -import io.freefair.android.injection.Injector; +import io.freefair.android.injection.injector.Injector; import io.freefair.android.util.function.Supplier; import io.realm.Realm; import io.realm.RealmConfiguration; diff --git a/modules/realm/src/main/java/io/freefair/android/injection/modules/realm/DefaultRealmProvider.java b/modules/realm/src/main/java/io/freefair/android/injection/modules/realm/DefaultRealmProvider.java index 2872e07..e2ec289 100644 --- a/modules/realm/src/main/java/io/freefair/android/injection/modules/realm/DefaultRealmProvider.java +++ b/modules/realm/src/main/java/io/freefair/android/injection/modules/realm/DefaultRealmProvider.java @@ -1,6 +1,6 @@ package io.freefair.android.injection.modules.realm; -import io.freefair.android.injection.Injector; +import io.freefair.android.injection.injector.Injector; import io.realm.Realm; public class DefaultRealmProvider extends BaseRealmProvider { diff --git a/modules/retrofit/src/main/java/io/freefair/android/injection/modules/RetrofitModule.java b/modules/retrofit/src/main/java/io/freefair/android/injection/modules/RetrofitModule.java index ea9b040..fcc7ed9 100644 --- a/modules/retrofit/src/main/java/io/freefair/android/injection/modules/RetrofitModule.java +++ b/modules/retrofit/src/main/java/io/freefair/android/injection/modules/RetrofitModule.java @@ -4,7 +4,7 @@ import com.squareup.okhttp.OkHttpClient; -import io.freefair.android.injection.InjectionContainer; +import io.freefair.android.injection.injector.InjectionContainer; import io.freefair.android.injection.InjectionModule; import io.freefair.android.injection.modules.retrofit.ServiceProvider; import io.freefair.android.util.function.Consumer; diff --git a/modules/retrofit/src/main/java/io/freefair/android/injection/modules/retrofit/ServiceProvider.java b/modules/retrofit/src/main/java/io/freefair/android/injection/modules/retrofit/ServiceProvider.java index 112b230..4308339 100644 --- a/modules/retrofit/src/main/java/io/freefair/android/injection/modules/retrofit/ServiceProvider.java +++ b/modules/retrofit/src/main/java/io/freefair/android/injection/modules/retrofit/ServiceProvider.java @@ -1,7 +1,7 @@ package io.freefair.android.injection.modules.retrofit; import io.freefair.android.injection.InjectionProvider; -import io.freefair.android.injection.Injector; +import io.freefair.android.injection.injector.Injector; import io.freefair.android.util.function.Predicate; import retrofit.Retrofit; From e63733a1a3c07e5d0ce54a470ca545a052e5f338 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Thu, 24 Dec 2015 00:35:41 +0100 Subject: [PATCH 4/7] rename package ui -> app --- .../android/injection/test/AppCompatInjectionActivityTest.java | 2 +- .../injection/{ui => app}/InjectionAppCompatActivity.java | 2 +- .../android/injection/{ui => app}/InjectionApplication.java | 2 +- .../android/injection/{ui => app}/InjectionFragment.java | 2 +- .../android/injection/{ui => app}/InjectionService.java | 2 +- .../injection/{ui => app}/InjectionWearableActivity.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) rename injection/src/main/java/io/freefair/android/injection/{ui => app}/InjectionAppCompatActivity.java (95%) rename injection/src/main/java/io/freefair/android/injection/{ui => app}/InjectionApplication.java (91%) rename injection/src/main/java/io/freefair/android/injection/{ui => app}/InjectionFragment.java (95%) rename injection/src/main/java/io/freefair/android/injection/{ui => app}/InjectionService.java (92%) rename injection/src/main/java/io/freefair/android/injection/{ui => app}/InjectionWearableActivity.java (94%) diff --git a/injection/src/androidTest/java/io/freefair/android/injection/test/AppCompatInjectionActivityTest.java b/injection/src/androidTest/java/io/freefair/android/injection/test/AppCompatInjectionActivityTest.java index 39e2502..1afaa9e 100644 --- a/injection/src/androidTest/java/io/freefair/android/injection/test/AppCompatInjectionActivityTest.java +++ b/injection/src/androidTest/java/io/freefair/android/injection/test/AppCompatInjectionActivityTest.java @@ -7,7 +7,7 @@ import io.freefair.android.injection.annotation.InjectView; import io.freefair.android.injection.annotation.XmlLayout; -import io.freefair.android.injection.ui.InjectionAppCompatActivity; +import io.freefair.android.injection.app.InjectionAppCompatActivity; /** * Created by larsgrefer on 13.10.15. diff --git a/injection/src/main/java/io/freefair/android/injection/ui/InjectionAppCompatActivity.java b/injection/src/main/java/io/freefair/android/injection/app/InjectionAppCompatActivity.java similarity index 95% rename from injection/src/main/java/io/freefair/android/injection/ui/InjectionAppCompatActivity.java rename to injection/src/main/java/io/freefair/android/injection/app/InjectionAppCompatActivity.java index 71ddbaa..510ff63 100644 --- a/injection/src/main/java/io/freefair/android/injection/ui/InjectionAppCompatActivity.java +++ b/injection/src/main/java/io/freefair/android/injection/app/InjectionAppCompatActivity.java @@ -1,4 +1,4 @@ -package io.freefair.android.injection.ui; +package io.freefair.android.injection.app; import android.content.res.Configuration; import android.os.Bundle; diff --git a/injection/src/main/java/io/freefair/android/injection/ui/InjectionApplication.java b/injection/src/main/java/io/freefair/android/injection/app/InjectionApplication.java similarity index 91% rename from injection/src/main/java/io/freefair/android/injection/ui/InjectionApplication.java rename to injection/src/main/java/io/freefair/android/injection/app/InjectionApplication.java index 93961ea..1e004a9 100644 --- a/injection/src/main/java/io/freefair/android/injection/ui/InjectionApplication.java +++ b/injection/src/main/java/io/freefair/android/injection/app/InjectionApplication.java @@ -1,4 +1,4 @@ -package io.freefair.android.injection.ui; +package io.freefair.android.injection.app; import android.app.Application; diff --git a/injection/src/main/java/io/freefair/android/injection/ui/InjectionFragment.java b/injection/src/main/java/io/freefair/android/injection/app/InjectionFragment.java similarity index 95% rename from injection/src/main/java/io/freefair/android/injection/ui/InjectionFragment.java rename to injection/src/main/java/io/freefair/android/injection/app/InjectionFragment.java index eeaa45f..74e59e3 100644 --- a/injection/src/main/java/io/freefair/android/injection/ui/InjectionFragment.java +++ b/injection/src/main/java/io/freefair/android/injection/app/InjectionFragment.java @@ -1,4 +1,4 @@ -package io.freefair.android.injection.ui; +package io.freefair.android.injection.app; import android.content.res.Configuration; import android.os.Bundle; diff --git a/injection/src/main/java/io/freefair/android/injection/ui/InjectionService.java b/injection/src/main/java/io/freefair/android/injection/app/InjectionService.java similarity index 92% rename from injection/src/main/java/io/freefair/android/injection/ui/InjectionService.java rename to injection/src/main/java/io/freefair/android/injection/app/InjectionService.java index a29575a..7105555 100644 --- a/injection/src/main/java/io/freefair/android/injection/ui/InjectionService.java +++ b/injection/src/main/java/io/freefair/android/injection/app/InjectionService.java @@ -1,4 +1,4 @@ -package io.freefair.android.injection.ui; +package io.freefair.android.injection.app; import android.app.Service; diff --git a/injection/src/main/java/io/freefair/android/injection/ui/InjectionWearableActivity.java b/injection/src/main/java/io/freefair/android/injection/app/InjectionWearableActivity.java similarity index 94% rename from injection/src/main/java/io/freefair/android/injection/ui/InjectionWearableActivity.java rename to injection/src/main/java/io/freefair/android/injection/app/InjectionWearableActivity.java index 6722b39..0be6c0f 100644 --- a/injection/src/main/java/io/freefair/android/injection/ui/InjectionWearableActivity.java +++ b/injection/src/main/java/io/freefair/android/injection/app/InjectionWearableActivity.java @@ -1,4 +1,4 @@ -package io.freefair.android.injection.ui; +package io.freefair.android.injection.app; import android.app.Activity; import android.os.Bundle; From c42372ef70f82ba11f58e7cfe4792f881abdd99c Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Thu, 24 Dec 2015 00:57:46 +0100 Subject: [PATCH 5/7] extract bindings storage --- .../android/injection/helper/Bindings.java | 40 +++++++++++++++++++ .../injector/AndroidResourceInjector.java | 35 ++++------------ .../injector/AndroidViewInjector.java | 16 ++------ .../android/injection/injector/Injector.java | 2 + 4 files changed, 53 insertions(+), 40 deletions(-) create mode 100644 injection/src/main/java/io/freefair/android/injection/helper/Bindings.java diff --git a/injection/src/main/java/io/freefair/android/injection/helper/Bindings.java b/injection/src/main/java/io/freefair/android/injection/helper/Bindings.java new file mode 100644 index 0000000..84cb6ce --- /dev/null +++ b/injection/src/main/java/io/freefair/android/injection/helper/Bindings.java @@ -0,0 +1,40 @@ +package io.freefair.android.injection.helper; + +import android.support.annotation.NonNull; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; +import java.util.WeakHashMap; + +import io.freefair.android.injection.annotation.InjectAttribute; +import io.freefair.android.injection.annotation.InjectResource; + +public class Bindings { + + private static WeakHashMap, Map> attributeBindings = new WeakHashMap<>(); + private static WeakHashMap, Map> resourceBindings = new WeakHashMap<>(); + private static WeakHashMap, Map> viewBindings = new WeakHashMap<>(); + + @NonNull + public static Map getAttributeBinding(Class clazz){ + if(!attributeBindings.containsKey(clazz)) + attributeBindings.put(clazz, new HashMap()); + return attributeBindings.get(clazz); + } + + @NonNull + public static Map getResourceBinding(Class clazz){ + if(!resourceBindings.containsKey(clazz)) + resourceBindings.put(clazz, new HashMap()); + return resourceBindings.get(clazz); + } + + @NonNull + public static Map getViewBinding(Class clazz){ + if(!viewBindings.containsKey(clazz)) + viewBindings.put(clazz, new HashMap()); + return viewBindings.get(clazz); + } + +} diff --git a/injection/src/main/java/io/freefair/android/injection/injector/AndroidResourceInjector.java b/injection/src/main/java/io/freefair/android/injection/injector/AndroidResourceInjector.java index 9278c95..4329967 100644 --- a/injection/src/main/java/io/freefair/android/injection/injector/AndroidResourceInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/injector/AndroidResourceInjector.java @@ -12,13 +12,12 @@ import android.util.TypedValue; import java.lang.reflect.Field; -import java.util.HashMap; import java.util.Map; -import java.util.WeakHashMap; import io.freefair.android.injection.annotation.InjectAttribute; import io.freefair.android.injection.annotation.InjectResource; import io.freefair.android.injection.exceptions.InjectionException; +import io.freefair.android.injection.helper.Bindings; import io.freefair.android.injection.reflection.Reflection; import io.freefair.android.util.function.Optional; import io.freefair.android.util.logging.AndroidLogger; @@ -74,9 +73,9 @@ protected Class getObjectClass() { @Override protected void inject(@NonNull Object instance, @NonNull Field field) { if (field.isAnnotationPresent(InjectResource.class)) { - getBinding().resources.put(field, field.getAnnotation(InjectResource.class)); + Bindings.getResourceBinding(getObjectClass()).put(field, field.getAnnotation(InjectResource.class)); } else if (field.isAnnotationPresent(InjectAttribute.class)) { - getBinding().attributes.put(field, field.getAnnotation(InjectAttribute.class)); + Bindings.getAttributeBinding(getObjectClass()).put(field, field.getAnnotation(InjectAttribute.class)); } else { super.inject(instance, field); } @@ -88,10 +87,11 @@ protected void inject(Field field, Object value) { public void injectAttributes() { - int[] attrIds = new int[getBinding().attributes.size()]; + Map attributeBinding = Bindings.getAttributeBinding(getObjectClass()); + int[] attrIds = new int[attributeBinding.size()]; int i = 0; - for (Map.Entry entry : getBinding().attributes.entrySet()) { + for (Map.Entry entry : attributeBinding.entrySet()) { InjectAttribute annotation = entry.getValue(); attrIds[i] = annotation.id(); @@ -105,7 +105,7 @@ public void injectAttributes() { TypedArray typedArray = resolveValue(Resources.Theme.class, getObject()).obtainStyledAttributes(attrIds); int index = 0; - for (Map.Entry entry : getBinding().attributes.entrySet()) { + for (Map.Entry entry : attributeBinding.entrySet()) { Field field = entry.getKey(); field.setAccessible(true); @@ -203,7 +203,7 @@ public void injectResources() { if (resources == null) throw new InjectionException("Resources.class not found"); - for (Map.Entry resourceBinding : getBinding().resources.entrySet()) { + for (Map.Entry resourceBinding : Bindings.getResourceBinding(getObjectClass()).entrySet()) { Field field = resourceBinding.getKey(); InjectResource annotation = resourceBinding.getValue(); int resourceId = annotation.id(); @@ -328,23 +328,4 @@ public T resolveValue(@NonNull Class type, Object instance) { return super.resolveValue(type, instance); } - private Binding getBinding() { - if (!bindings.containsKey(getObjectClass())) { - bindings.put(getObjectClass(), new Binding()); - } - return bindings.get(getObjectClass()); - } - - private static WeakHashMap, Binding> bindings = new WeakHashMap<>(); - - public static class Binding { - Map attributes; - Map resources; - - Binding() { - attributes = new HashMap<>(); - resources = new HashMap<>(); - } - } - } diff --git a/injection/src/main/java/io/freefair/android/injection/injector/AndroidViewInjector.java b/injection/src/main/java/io/freefair/android/injection/injector/AndroidViewInjector.java index a10c07d..77ab27c 100644 --- a/injection/src/main/java/io/freefair/android/injection/injector/AndroidViewInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/injector/AndroidViewInjector.java @@ -5,12 +5,11 @@ import android.view.View; import java.lang.reflect.Field; -import java.util.HashMap; import java.util.Map; -import java.util.WeakHashMap; import io.freefair.android.injection.annotation.InjectView; import io.freefair.android.injection.exceptions.ViewIdNotFoundException; +import io.freefair.android.injection.helper.Bindings; import io.freefair.android.util.logging.AndroidLogger; import io.freefair.android.util.logging.Logger; @@ -25,14 +24,14 @@ public AndroidViewInjector(Injector parentInjector, T object, Class rClass) { @Override protected void inject(@NonNull Object instance, @NonNull Field field) { if (field.isAnnotationPresent(InjectView.class)) { - getViewBinding().put(field, findViewId(field)); + Bindings.getViewBinding(getObjectClass()).put(field, findViewId(field)); } else { super.inject(instance, field); } } public void injectViews() { - for (Map.Entry viewBinding : getViewBinding().entrySet()) { + for (Map.Entry viewBinding : Bindings.getViewBinding(getObjectClass()).entrySet()) { View view = findViewById(viewBinding.getValue()); inject(viewBinding.getKey(), view); } @@ -64,13 +63,4 @@ protected int findViewId(Field field) throws ViewIdNotFoundException { throw new ViewIdNotFoundException(fieldName); } - - private Map getViewBinding() { - if (!viewBindings.containsKey(getObjectClass())) { - viewBindings.put(getObjectClass(), new HashMap()); - } - return viewBindings.get(getObjectClass()); - } - - private static WeakHashMap, Map> viewBindings = new WeakHashMap<>(); } diff --git a/injection/src/main/java/io/freefair/android/injection/injector/Injector.java b/injection/src/main/java/io/freefair/android/injection/injector/Injector.java index 8a8d5f6..48a6974 100644 --- a/injection/src/main/java/io/freefair/android/injection/injector/Injector.java +++ b/injection/src/main/java/io/freefair/android/injection/injector/Injector.java @@ -2,6 +2,7 @@ import android.app.Activity; import android.app.Application; +import android.app.Service; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; @@ -36,6 +37,7 @@ public Injector(@Nullable Injector parentInjector) { topClasses.add(Activity.class); topClasses.add(Fragment.class); topClasses.add(Application.class); + topClasses.add(Service.class); } private WeakHashMap> alreadyInjectedInstances = new WeakHashMap<>(); From 7babcf641aa0cde0fa01be5625104d981196f103 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Thu, 24 Dec 2015 01:01:45 +0100 Subject: [PATCH 6/7] rename methods --- .../injection/helper/RClassHelper.java | 34 +++++++++---------- .../injection/injector/ActivityInjector.java | 2 +- .../injection/injector/FragmentInjector.java | 2 +- .../injection/injector/ServiceInjector.java | 2 +- .../injection/injector/ViewGroupInjector.java | 2 +- .../WatchViewStubActivityInjector.java | 2 +- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/injection/src/main/java/io/freefair/android/injection/helper/RClassHelper.java b/injection/src/main/java/io/freefair/android/injection/helper/RClassHelper.java index 2a07cd7..e284282 100644 --- a/injection/src/main/java/io/freefair/android/injection/helper/RClassHelper.java +++ b/injection/src/main/java/io/freefair/android/injection/helper/RClassHelper.java @@ -15,7 +15,7 @@ public class RClassHelper { protected static Logger log = AndroidLogger.forClass(RClassHelper.class); @Nullable - static Class getRClassFromAnnotation(Object object) { + static Class fromAnnotation(Object object) { if (object.getClass().isAnnotationPresent(RClass.class)) { Class rClass = object.getClass().getAnnotation(RClass.class).value(); String rClassName = rClass.getSimpleName(); @@ -28,42 +28,42 @@ static Class getRClassFromAnnotation(Object object) { } @Nullable - public static Class getRClassFromFragment(Fragment fragment) { - Class rClass = getRClassFromAnnotation(fragment); + public static Class fromFragment(Fragment fragment) { + Class rClass = fromAnnotation(fragment); if (rClass != null) { return rClass; } - return getRClassFromActivity(fragment.getActivity()); + return fromActivity(fragment.getActivity()); } @Nullable - public static Class getRClassFromActivity(Activity activity) { - Class rClass = getRClassFromAnnotation(activity); + public static Class fromActivity(Activity activity) { + Class rClass = fromAnnotation(activity); if (rClass != null) { return rClass; } - return getRClassFromApplication(activity.getApplication()); + return fromApplication(activity.getApplication()); } @Nullable - public static Class getRClassFromService(Service service){ - Class rClassFromAnnotation = getRClassFromAnnotation(service); + public static Class fromService(Service service){ + Class rClassFromAnnotation = fromAnnotation(service); if(rClassFromAnnotation != null) return rClassFromAnnotation; - return getRClassFromApplication(service.getApplication()); + return fromApplication(service.getApplication()); } @Nullable - private static Class getRClassFromApplication(Application application) { - Class rClass = getRClassFromAnnotation(application); + private static Class fromApplication(Application application) { + Class rClass = fromAnnotation(application); if (rClass != null) { return rClass; } - return getRClassFromPackageName(application.getPackageName()); + return fromPackageName(application.getPackageName()); } @Nullable - static Class getRClassFromPackageName(String packageName) { + static Class fromPackageName(String packageName) { String rClassName = packageName + ".R"; try { return Class.forName(rClassName); @@ -74,11 +74,11 @@ static Class getRClassFromPackageName(String packageName) { } @Nullable - public static Class getRClassFromViewGroup(ViewGroup object) { - Class rClass = getRClassFromAnnotation(object); + public static Class fromViewGroup(ViewGroup object) { + Class rClass = fromAnnotation(object); if (rClass != null) { return rClass; } - return getRClassFromActivity((Activity) object.getContext()); + return fromActivity((Activity) object.getContext()); } } diff --git a/injection/src/main/java/io/freefair/android/injection/injector/ActivityInjector.java b/injection/src/main/java/io/freefair/android/injection/injector/ActivityInjector.java index 477622c..12f04de 100644 --- a/injection/src/main/java/io/freefair/android/injection/injector/ActivityInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/injector/ActivityInjector.java @@ -11,7 +11,7 @@ public class ActivityInjector extends AndroidViewInjector { public ActivityInjector(Activity activity){ - super(null, activity, RClassHelper.getRClassFromActivity(activity)); + super(null, activity, RClassHelper.fromActivity(activity)); } @Override diff --git a/injection/src/main/java/io/freefair/android/injection/injector/FragmentInjector.java b/injection/src/main/java/io/freefair/android/injection/injector/FragmentInjector.java index 4982eda..db1a8f8 100644 --- a/injection/src/main/java/io/freefair/android/injection/injector/FragmentInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/injector/FragmentInjector.java @@ -9,7 +9,7 @@ public class FragmentInjector extends AndroidViewInjector { public FragmentInjector(Fragment fragment, Injector parentInjector){ - super(parentInjector, fragment, RClassHelper.getRClassFromFragment(fragment)); + super(parentInjector, fragment, RClassHelper.fromFragment(fragment)); } @Override diff --git a/injection/src/main/java/io/freefair/android/injection/injector/ServiceInjector.java b/injection/src/main/java/io/freefair/android/injection/injector/ServiceInjector.java index 6d33295..ef837ad 100644 --- a/injection/src/main/java/io/freefair/android/injection/injector/ServiceInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/injector/ServiceInjector.java @@ -6,6 +6,6 @@ public class ServiceInjector extends AndroidResourceInjector { public ServiceInjector(Injector parentInjector, Service service) { - super(parentInjector, service, RClassHelper.getRClassFromService(service)); + super(parentInjector, service, RClassHelper.fromService(service)); } } diff --git a/injection/src/main/java/io/freefair/android/injection/injector/ViewGroupInjector.java b/injection/src/main/java/io/freefair/android/injection/injector/ViewGroupInjector.java index 3071fea..64bf7a0 100644 --- a/injection/src/main/java/io/freefair/android/injection/injector/ViewGroupInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/injector/ViewGroupInjector.java @@ -11,7 +11,7 @@ */ public class ViewGroupInjector extends AndroidViewInjector { public ViewGroupInjector(ViewGroup object, Injector parentInjector) { - super(parentInjector, object, RClassHelper.getRClassFromViewGroup(object)); + super(parentInjector, object, RClassHelper.fromViewGroup(object)); } @Override diff --git a/injection/src/main/java/io/freefair/android/injection/injector/WatchViewStubActivityInjector.java b/injection/src/main/java/io/freefair/android/injection/injector/WatchViewStubActivityInjector.java index 06f1f06..a139f8e 100644 --- a/injection/src/main/java/io/freefair/android/injection/injector/WatchViewStubActivityInjector.java +++ b/injection/src/main/java/io/freefair/android/injection/injector/WatchViewStubActivityInjector.java @@ -17,7 +17,7 @@ public class WatchViewStubActivityInjector extends AndroidViewInjector private final WatchViewStub stub; public WatchViewStubActivityInjector(Activity activity, WatchViewStub stub, Injector parentInjector) { - super(parentInjector, activity, RClassHelper.getRClassFromActivity(activity)); + super(parentInjector, activity, RClassHelper.fromActivity(activity)); this.stub = stub; } From 0a2dd2f5fb7b4898cdd5f7a5e55e3008b4afbc5d Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Thu, 24 Dec 2015 01:12:43 +0100 Subject: [PATCH 7/7] little cleanup --- .../android/injection/DefaultModule.java | 10 ------ .../android/injection/TypeRegistration.java | 25 --------------- .../injection/app/InjectionApplication.java | 8 +++-- .../android/injection/helper/Bindings.java | 3 ++ .../injector/InjectionContainer.java | 32 ++++++++++++++++--- 5 files changed, 36 insertions(+), 42 deletions(-) delete mode 100644 injection/src/main/java/io/freefair/android/injection/DefaultModule.java delete mode 100644 injection/src/main/java/io/freefair/android/injection/TypeRegistration.java diff --git a/injection/src/main/java/io/freefair/android/injection/DefaultModule.java b/injection/src/main/java/io/freefair/android/injection/DefaultModule.java deleted file mode 100644 index e4f0368..0000000 --- a/injection/src/main/java/io/freefair/android/injection/DefaultModule.java +++ /dev/null @@ -1,10 +0,0 @@ -package io.freefair.android.injection; - -import io.freefair.android.injection.injector.InjectionContainer; - -public class DefaultModule implements InjectionModule { - @Override - public void configure(InjectionContainer injectionContainer) { - - } -} diff --git a/injection/src/main/java/io/freefair/android/injection/TypeRegistration.java b/injection/src/main/java/io/freefair/android/injection/TypeRegistration.java deleted file mode 100644 index edee375..0000000 --- a/injection/src/main/java/io/freefair/android/injection/TypeRegistration.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.freefair.android.injection; - -import io.freefair.android.injection.injector.Injector; - -public class TypeRegistration implements InjectionProvider { - - private final Class implClass; - private final Class iFace; - - public TypeRegistration(Class implClass, Class iFace){ - this.implClass = implClass; - this.iFace = iFace; - } - - @Override - public boolean canProvide(Class clazz) { - return clazz.isAssignableFrom(iFace); - } - - @Override - @SuppressWarnings("unchecked") - public T provide(Class clazz, Object instance, Injector injector) { - return (T) injector.resolveValue(implClass, instance); - } -} diff --git a/injection/src/main/java/io/freefair/android/injection/app/InjectionApplication.java b/injection/src/main/java/io/freefair/android/injection/app/InjectionApplication.java index 1e004a9..28de31d 100644 --- a/injection/src/main/java/io/freefair/android/injection/app/InjectionApplication.java +++ b/injection/src/main/java/io/freefair/android/injection/app/InjectionApplication.java @@ -2,6 +2,7 @@ import android.app.Application; +import io.freefair.android.injection.InjectionModule; import io.freefair.android.injection.injector.InjectionContainer; import io.freefair.android.injection.InjectorProvider; import io.freefair.android.util.function.Suppliers; @@ -12,10 +13,9 @@ @SuppressWarnings("unused") public class InjectionApplication extends Application implements InjectorProvider { - private InjectionContainer injector; + private InjectionContainer injector = InjectionContainer.getInstance(); public InjectionApplication() { - injector = InjectionContainer.getInstance(); injector.registerSupplier(InjectionApplication.class, Suppliers.of(this)); } @@ -28,4 +28,8 @@ public void onCreate() { public InjectionContainer getInjector() { return injector; } + + public void addModule(InjectionModule injectionModule) { + injectionModule.configure(getInjector()); + } } diff --git a/injection/src/main/java/io/freefair/android/injection/helper/Bindings.java b/injection/src/main/java/io/freefair/android/injection/helper/Bindings.java index 84cb6ce..5555d5c 100644 --- a/injection/src/main/java/io/freefair/android/injection/helper/Bindings.java +++ b/injection/src/main/java/io/freefair/android/injection/helper/Bindings.java @@ -10,6 +10,9 @@ import io.freefair.android.injection.annotation.InjectAttribute; import io.freefair.android.injection.annotation.InjectResource; +/** + * Storage for Bindings between Fields and {@link android.view.View Views}, Fields and Attributes and Fields and Resources + */ public class Bindings { private static WeakHashMap, Map> attributeBindings = new WeakHashMap<>(); diff --git a/injection/src/main/java/io/freefair/android/injection/injector/InjectionContainer.java b/injection/src/main/java/io/freefair/android/injection/injector/InjectionContainer.java index 712c4b1..ca8ed6e 100644 --- a/injection/src/main/java/io/freefair/android/injection/injector/InjectionContainer.java +++ b/injection/src/main/java/io/freefair/android/injection/injector/InjectionContainer.java @@ -10,13 +10,11 @@ import java.util.Map; import java.util.Set; -import io.freefair.android.injection.DefaultModule; import io.freefair.android.injection.InjectionProvider; -import io.freefair.android.injection.TypeRegistration; -import io.freefair.android.util.function.Supplier; -import io.freefair.android.util.function.Optional; import io.freefair.android.injection.annotation.Inject; import io.freefair.android.injection.exceptions.InjectionException; +import io.freefair.android.util.function.Optional; +import io.freefair.android.util.function.Supplier; public class InjectionContainer extends Injector { @@ -25,7 +23,6 @@ public class InjectionContainer extends Injector { public static InjectionContainer getInstance() { if (instance == null) { instance = new InjectionContainer(); - new DefaultModule().configure(instance); } return instance; } @@ -39,14 +36,17 @@ private InjectionContainer() { injectionFactories = new HashSet<>(); } + @SuppressWarnings("unused") public void registerType(Class impl, final Class iFace) { this.registerProvider(new TypeRegistration<>(impl, iFace)); } + @SuppressWarnings("unused") public void registerSupplier(Class type, Supplier supplier) { injectionSupplier.put(type, supplier); } + @SuppressWarnings("unused") public void registerProvider(InjectionProvider injectionProvider) { injectionFactories.add(injectionProvider); } @@ -127,4 +127,26 @@ private Optional queryFactories(Class type, Object instance) { } return Optional.empty(); } + + public static class TypeRegistration implements InjectionProvider { + + private final Class implClass; + private final Class iFace; + + public TypeRegistration(Class implClass, Class iFace){ + this.implClass = implClass; + this.iFace = iFace; + } + + @Override + public boolean canProvide(Class clazz) { + return clazz.isAssignableFrom(iFace); + } + + @Override + @SuppressWarnings("unchecked") + public T provide(Class clazz, Object instance, Injector injector) { + return (T) injector.resolveValue(implClass, instance); + } + } }