Skip to content
This repository has been archived by the owner on Feb 4, 2022. It is now read-only.

Commit

Permalink
Merge pull request #1 from freefair/develop
Browse files Browse the repository at this point in the history
develop -> master
  • Loading branch information
larsgrefer committed Dec 24, 2015
2 parents cd0afe1 + 0a2dd2f commit 7af93e7
Show file tree
Hide file tree
Showing 41 changed files with 558 additions and 508 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package io.freefair.android.injection;

import io.freefair.android.injection.injector.InjectionContainer;

public interface InjectionModule {
void configure(InjectionContainer injectionContainer);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package io.freefair.android.injection;

import io.freefair.android.injection.injector.Injector;

public interface InjectionProvider
{
boolean canProvide(Class<?> clazz);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package io.freefair.android.injection;

import io.freefair.android.injection.injector.Injector;

public interface InjectorProvider {
Injector getInjector();
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package io.freefair.android.injection.app;

import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;

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.injector.ActivityInjector;
import io.freefair.android.util.function.Optional;


/**
* An {@link AppCompatActivity} with support for dependency injection
*/
@SuppressWarnings("unused")
public class InjectionAppCompatActivity extends AppCompatActivity implements InjectorProvider {

private ActivityInjector injector;

@Inject
protected Optional<XmlMenu> xmlMenuAnnotation;
@Inject
protected Optional<XmlLayout> 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;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package io.freefair.android.injection.app;

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;

/**
* An {@link Application} with support for dependency injection
*/
@SuppressWarnings("unused")
public class InjectionApplication extends Application implements InjectorProvider {

private InjectionContainer injector = InjectionContainer.getInstance();

public InjectionApplication() {
injector.registerSupplier(InjectionApplication.class, Suppliers.of(this));
}

@Override
public void onCreate() {
super.onCreate();
injector.inject(this);
}

public InjectionContainer getInjector() {
return injector;
}

public void addModule(InjectionModule injectionModule) {
injectionModule.configure(getInjector());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package io.freefair.android.injection.app;

import android.content.res.Configuration;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;

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.injector.FragmentInjector;
import io.freefair.android.util.function.Optional;

@SuppressWarnings("unused")
public class InjectionFragment extends Fragment implements InjectorProvider {

private FragmentInjector injector;

@Inject
Optional<XmlMenu> xmlMenuAnnotation;
@Inject
Optional<XmlLayout> 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;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package io.freefair.android.injection.app;

import android.app.Service;

import io.freefair.android.injection.injector.Injector;
import io.freefair.android.injection.InjectorProvider;
import io.freefair.android.injection.injector.ServiceInjector;

/**
* A {@link Service} with support for dependency injection
*/
@SuppressWarnings("unused")
public abstract class InjectionService extends Service implements InjectorProvider {

private ServiceInjector injector;

@Override
public void onCreate() {
super.onCreate();

Injector parentInjector = null;
if (getApplication() instanceof InjectionApplication) {
parentInjector = ((InjectionApplication) getApplication()).getInjector();
}
injector = new ServiceInjector(parentInjector, this);
injector.inject(this);
}

@Override
public Injector getInjector() {
return injector;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package io.freefair.android.injection.app;

import android.app.Activity;
import android.os.Bundle;
import android.support.wearable.view.WatchViewStub;

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.injector.WatchViewStubActivityInjector;

/**
* @author Dennis Fricke
*/
@SuppressWarnings("unused")
public abstract class InjectionWearableActivity extends Activity implements InjectorProvider {
WatchViewStubActivityInjector injector;

Injector parentInjector;

@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);

stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
@Override
public void onLayoutInflated(WatchViewStub stub) {
injector = new WatchViewStubActivityInjector(InjectionWearableActivity.this, stub, parentInjector);

injector.injectResources();
injector.injectAttributes();

tryInjectViews();

onLayoutReady();
}
});
}

private void tryInjectViews() {
try {
injector.injectViews();
} catch (ViewIdNotFoundException e) {
throw new RuntimeException(e);
}
}

protected abstract void onLayoutReady();

@Override
public WatchViewStubActivityInjector getInjector() {
return injector;
}
}
Loading

0 comments on commit 7af93e7

Please sign in to comment.