[
  {
    "path": ".gitignore",
    "content": "# built application files\n/build\n*.apk\n*.ap_\n*.navigation\n\n# files for the dex VM\n*.dex\n\n# Java class files\n*.class\n\n# generated files\nbin/\ngen/\n\n# Local configuration file (sdk path, etc)\nlocal.properties\nsigning.properties\n\n# Eclipse project files\n.classpath\n.project\n\n# Proguard folder generated by Eclipse\nproguard/\n\n# Intellij project files\n*.iml\n*.ipr\n*.iws\n.idea/\n\n#gradle\n.gradle/\n\n#mac\n.DS_Store"
  },
  {
    "path": "Licence.md",
    "content": "Copyright 2015 Stephen Pengilley\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License."
  },
  {
    "path": "README.md",
    "content": "ActivityFragmentMVP\n===================\n\nA demonstration of handling Activities and Fragments using <a href=\"http://square.github.io/dagger/\">Dagger</a> dependency injection framework\n\nThe real benefit here is that you create an object graph only when you need it. This contributes to keeping the memory footprint of your app as low as possible.\n\nThe scoped object graph is created in the OnCreate() method of any Activity that extends BaseActivity. You just need to override the getModules() method in your concrete Activity implementations to load the module for that activity.\n \n Fragments, by way of the BaseFragment superclass method inject(), inject an instance of themselves into the Activities graph.\n\n\nFeatured on<br>\n[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-ActivityFragmentMVP-brightgreen.svg?style=flat)](https://android-arsenal.com/details/3/1535)\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 21\n    buildToolsVersion \"21.1.2\"\n\n    defaultConfig {\n        applicationId \"com.spengilley.activityfragmentmvp\"\n        minSdkVersion 14\n        targetSdkVersion 19\n        versionCode 1\n        versionName \"1.0\"\n    }\n    buildTypes {\n        release {\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    compile fileTree(dir: 'libs', include: ['*.jar'])\n    compile 'com.squareup.dagger:dagger-compiler:1.0.1'\n    compile 'com.squareup.dagger:dagger:1.0.1'\n\n}\n"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Users/stephenpengilley/Development/Android/sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.spengilley.activityfragmentmvp\" >\n\n    <application\n        android:name=\".App\"\n        android:allowBackup=\"true\"\n        android:icon=\"@drawable/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:theme=\"@style/AppTheme\" >\n        <activity\n            android:name=\".ui.main.MainActivity\"\n            android:label=\"@string/app_name\" >\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/App.java",
    "content": "package com.spengilley.activityfragmentmvp;\n\nimport android.app.Application;\nimport android.content.Context;\n\nimport dagger.ObjectGraph;\n\n\npublic class App extends Application {\n    private ObjectGraph objectGraph;\n\n\n    public static App get(Context context) {\n        return (App) context.getApplicationContext();\n    }\n\n\n    @Override\n    public void onTerminate() {\n        super.onTerminate();\n    }\n\n    /**\n     * Build object graph on creation so that objects are available\n     */\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        buildObjectGraphAndInject();\n    }\n\n\n    /**\n     * Used by Activities to create a scoped graph\n     */\n    public ObjectGraph createScopedGraph(Object... modules) {\n        return objectGraph.plus(modules);\n    }\n\n\n    public void buildObjectGraphAndInject() {\n        objectGraph = ObjectGraph.create(Modules.list(this));\n        inject(this);\n    }\n\n\n    public void inject(Object object) {\n\n        objectGraph.inject(object);\n    }\n\n\n    public ObjectGraph getApplicationGraph() {\n\n        return objectGraph;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/AppModule.java",
    "content": "package com.spengilley.activityfragmentmvp;\n\nimport android.app.Application;\n\nimport javax.inject.Singleton;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n@Module(\n        injects = {\n                App.class\n        },\n        library = true\n)\npublic class AppModule {\n    private final App app;\n\n    public AppModule(App app) {\n        this.app = app;\n    }\n\n\n    @Provides\n    @Singleton\n    Application provideApplication() {\n        return app;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/Modules.java",
    "content": "package com.spengilley.activityfragmentmvp;\n\n\nclass Modules {\n\n    private Modules() {\n        // No instances\n    }\n\n\n    static Object[] list(App ngswApp) {\n        return new Object[]{\n                new AppModule(ngswApp),\n        };\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/ui/common/BaseActivity.java",
    "content": "package com.spengilley.activityfragmentmvp.ui.common;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\nimport com.spengilley.activityfragmentmvp.App;\n\nimport java.util.List;\n\nimport dagger.ObjectGraph;\n\n\npublic abstract class BaseActivity extends Activity {\n    private ObjectGraph activityGraph;\n\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        activityGraph = ((App) getApplication()).createScopedGraph(getModules().toArray());\n        activityGraph.inject(this);\n    }\n\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        activityGraph = null;\n    }\n\n    protected abstract List<Object> getModules();\n\n    public void inject(Object object) {\n        activityGraph.inject(object);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/ui/common/BaseFragment.java",
    "content": "package com.spengilley.activityfragmentmvp.ui.common;\n\nimport android.app.Fragment;\nimport android.os.Bundle;\n\n\n\npublic class BaseFragment extends Fragment {\n\n\n    @Override\n    public void onActivityCreated(Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n\n        ((BaseActivity) getActivity()).inject(this);\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/ui/common/BaseFragmentPresenter.java",
    "content": "package com.spengilley.activityfragmentmvp.ui.common;\n\npublic interface BaseFragmentPresenter<T> {\n    void init(T view);\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/ui/main/DetailsFragment.java",
    "content": "package com.spengilley.activityfragmentmvp.ui.main;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Button;\nimport android.widget.TextView;\n\nimport com.spengilley.activityfragmentmvp.R;\nimport com.spengilley.activityfragmentmvp.ui.common.BaseFragment;\nimport com.spengilley.activityfragmentmvp.ui.main.presenters.DetailsPresenterImpl;\nimport com.spengilley.activityfragmentmvp.ui.main.views.DetailsView;\n\nimport javax.inject.Inject;\n\n\npublic class DetailsFragment extends BaseFragment implements DetailsView {\n    @Inject\n    DetailsPresenterImpl presenter;\n    private FragmentCallback callback;\n    private View view;\n    private Button getDetails, finishThis;\n    private TextView detailsText;\n\n\n    public static DetailsFragment newInstance() {\n        return new DetailsFragment();\n    }\n\n    public DetailsFragment() {\n        // Required empty public constructor\n    }\n\n\n    @Override\n    public void onResume() {\n        super.onResume();\n\n        presenter.init(this);\n    }\n\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        view = inflater.inflate(R.layout.fragment_details, container, false);\n        return view;\n    }\n\n    @Override\n    public void onViewCreated(View view, Bundle savedInstanceState) {\n        super.onViewCreated(view, savedInstanceState);\n\n        detailsText = (TextView) view.findViewById(R.id.details);\n\n        getDetails = (Button) view.findViewById(R.id.get_details);\n        getDetails.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                presenter.getDetails();\n            }\n        });\n\n        finishThis = (Button) view.findViewById(R.id.finish);\n        finishThis.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                presenter.doStuffThenFinish();\n            }\n        });\n    }\n\n    @Override\n    public void onAttach(Activity activity) {\n        super.onAttach(activity);\n        callback = (FragmentCallback) activity;\n    }\n\n\n    /**\n     * View implementation\n     */\n    @Override\n    public void finish() {\n        callback.finishProcess();\n    }\n\n    @Override\n    public void showDetails(String details) {\n        detailsText.setText(details);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/ui/main/FragmentCallback.java",
    "content": "package com.spengilley.activityfragmentmvp.ui.main;\n\n/**\n * Created by stephen pengilley on 29/06/2014.\n * Used by Fragments to communicate with MainActivity\n */\npublic interface FragmentCallback {\n\n    public void loadDetailFragment();\n    public void finishProcess();\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/ui/main/IntroFragment.java",
    "content": "package com.spengilley.activityfragmentmvp.ui.main;\n\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Button;\n\nimport com.spengilley.activityfragmentmvp.R;\nimport com.spengilley.activityfragmentmvp.ui.common.BaseFragment;\nimport com.spengilley.activityfragmentmvp.ui.main.presenters.IntroPresenterImpl;\nimport com.spengilley.activityfragmentmvp.ui.main.views.IntroView;\n\nimport javax.inject.Inject;\n\npublic class IntroFragment extends BaseFragment implements IntroView {\n    @Inject\n    IntroPresenterImpl presenter;\n    private FragmentCallback callback;\n    private View view;\n    private Button loadDetails;\n\n    public static IntroFragment newInstance() {\n        return new IntroFragment();\n    }\n\n    public IntroFragment() {\n        // Required empty public constructor\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n\n        presenter.init(this);\n    }\n\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container,\n                             Bundle savedInstanceState) {\n        // Inflate the layout for this fragment\n        view = inflater.inflate(R.layout.fragment_intro, container, false);\n        return view;\n    }\n\n\n    @Override\n    public void onViewCreated(View view, Bundle savedInstanceState) {\n        super.onViewCreated(view, savedInstanceState);\n\n        // Initialize button with listener\n        loadDetails = (Button) view.findViewById(R.id.load_details);\n        loadDetails.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                presenter.getDetails();\n            }\n        });\n    }\n\n    @Override\n    public void onAttach(Activity activity) {\n        super.onAttach(activity);\n\n        // Bit naughty but we know it will work!\n        callback = (FragmentCallback) activity;\n    }\n\n    /**\n     * View implementation\n     */\n    @Override\n    public void loadDetailsFragment() {\n        // Ask callback to load details fragment\n        callback.loadDetailFragment();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/ui/main/MainActivity.java",
    "content": "package com.spengilley.activityfragmentmvp.ui.main;\n\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.widget.Toast;\n\nimport com.spengilley.activityfragmentmvp.R;\nimport com.spengilley.activityfragmentmvp.ui.common.BaseActivity;\nimport com.spengilley.activityfragmentmvp.ui.main.presenters.MainPresenterImpl;\nimport com.spengilley.activityfragmentmvp.ui.main.views.MainView;\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimport javax.inject.Inject;\n\n\npublic class MainActivity extends BaseActivity implements MainView, FragmentCallback {\n    @Inject\n    MainPresenterImpl presenter;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n\n        // Load IntroFragment\n        getFragmentManager().beginTransaction()\n                .replace(R.id.fragment_container, IntroFragment.newInstance()).commit();\n\n\n        // Just for fun, display a delayed toast using presenter\n        new Handler().postDelayed(new Runnable() {\n            @Override\n            public void run() {\n                presenter.getImaginaryString();\n            }\n        }, 2000);\n\n\n    }\n\n\n    @Override\n    protected List<Object> getModules() {\n        return Arrays.<Object>asList(new MainModule(this));\n    }\n\n    /**\n     * FragmentCallback implementation\n     */\n    @Override\n    public void loadDetailFragment() {\n        getFragmentManager().beginTransaction()\n                .replace(R.id.fragment_container, DetailsFragment.newInstance()).commit();\n    }\n\n    @Override\n    public void finishProcess() {\n        finish();\n    }\n\n    // View method\n    @Override\n    public void showToast(String message) {\n        Toast.makeText(this, message, Toast.LENGTH_LONG).show();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/ui/main/MainModule.java",
    "content": "package com.spengilley.activityfragmentmvp.ui.main;\n\nimport com.spengilley.activityfragmentmvp.AppModule;\nimport com.spengilley.activityfragmentmvp.ui.main.presenters.DetailsPresenter;\nimport com.spengilley.activityfragmentmvp.ui.main.presenters.DetailsPresenterImpl;\nimport com.spengilley.activityfragmentmvp.ui.main.presenters.IntroPresenter;\nimport com.spengilley.activityfragmentmvp.ui.main.presenters.IntroPresenterImpl;\nimport com.spengilley.activityfragmentmvp.ui.main.presenters.MainPresenter;\nimport com.spengilley.activityfragmentmvp.ui.main.presenters.MainPresenterImpl;\nimport com.spengilley.activityfragmentmvp.ui.main.views.MainView;\n\nimport javax.inject.Singleton;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n@Module(\n        addsTo = AppModule.class,\n        injects = {\n                MainActivity.class,\n                IntroFragment.class,\n                DetailsFragment.class\n        },\n        complete = false,\n        library = true\n)\npublic class MainModule {\n    private MainActivity activity;\n\n    public MainModule(MainActivity activity) {\n        this.activity = activity;\n    }\n\n\n    /**\n     * Provide MainView\n     */\n    @Provides\n    @Singleton\n    public MainView provideMainView() {\n        return (MainView) activity;\n    }\n\n\n    /**\n     * Provide MainPresenter\n     */\n    @Provides\n    @Singleton\n    public MainPresenter provideMainPresenter(MainView view) {\n        return new MainPresenterImpl(view);\n    }\n\n    /**\n     * Provide IntroPresenter\n     */\n    @Provides\n    @Singleton\n    public IntroPresenter provideIntroPresenter() {\n        return new IntroPresenterImpl();\n    }\n\n\n    /**\n     * Provide DetailsPresenter\n     */\n    @Provides\n    @Singleton\n    public DetailsPresenter provideDetailsPresenter() {\n        return new DetailsPresenterImpl();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/ui/main/presenters/DetailsPresenter.java",
    "content": "package com.spengilley.activityfragmentmvp.ui.main.presenters;\n\n\nimport com.spengilley.activityfragmentmvp.ui.common.BaseFragmentPresenter;\nimport com.spengilley.activityfragmentmvp.ui.main.views.DetailsView;\n\npublic interface DetailsPresenter extends BaseFragmentPresenter<DetailsView> {\n\n    public void getDetails();\n    public void doStuffThenFinish();\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/ui/main/presenters/DetailsPresenterImpl.java",
    "content": "package com.spengilley.activityfragmentmvp.ui.main.presenters;\n\n\nimport com.spengilley.activityfragmentmvp.ui.main.views.DetailsView;\n\nimport javax.inject.Inject;\n\npublic class DetailsPresenterImpl implements DetailsPresenter {\n    private DetailsView view;\n\n\n    @Inject\n    public DetailsPresenterImpl() {\n    }\n\n    @Override\n    public void getDetails() {\n        String details = \"Details from some database or something\";\n        view.showDetails(details);\n    }\n\n    @Override\n    public void doStuffThenFinish() {\n        view.finish();\n    }\n\n    @Override\n    public void init(DetailsView view) {\n        this.view=view;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/ui/main/presenters/IntroPresenter.java",
    "content": "package com.spengilley.activityfragmentmvp.ui.main.presenters;\n\n\nimport com.spengilley.activityfragmentmvp.ui.common.BaseFragmentPresenter;\nimport com.spengilley.activityfragmentmvp.ui.main.views.IntroView;\n\npublic interface IntroPresenter extends BaseFragmentPresenter<IntroView> {\n\n    public void getDetails();\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/ui/main/presenters/IntroPresenterImpl.java",
    "content": "package com.spengilley.activityfragmentmvp.ui.main.presenters;\n\n\nimport com.spengilley.activityfragmentmvp.ui.main.views.IntroView;\n\nimport javax.inject.Inject;\n\npublic class IntroPresenterImpl implements IntroPresenter {\n    private IntroView view;\n\n    @Inject\n    public IntroPresenterImpl() {\n\n    }\n\n    @Override\n    public void init(IntroView view) {\n        this.view = view;\n    }\n\n\n    @Override\n    public void getDetails() {\n        // Do stuff to get details\n        // then report back to view\n        view.loadDetailsFragment();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/ui/main/presenters/MainPresenter.java",
    "content": "package com.spengilley.activityfragmentmvp.ui.main.presenters;\n\n\npublic interface MainPresenter {\n\n    public void getImaginaryString();\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/ui/main/presenters/MainPresenterImpl.java",
    "content": "package com.spengilley.activityfragmentmvp.ui.main.presenters;\n\n\nimport com.spengilley.activityfragmentmvp.ui.main.views.MainView;\n\nimport javax.inject.Inject;\n\npublic class MainPresenterImpl implements MainPresenter {\n    private MainView view;\n\n    @Inject\n    public MainPresenterImpl(MainView view) {\n        this.view = view;\n    }\n\n\n    @Override\n    public void getImaginaryString() {\n        // Could connect to our models to get stuff here\n        String message = \"Hello world, from Presenter\";\n        view.showToast(message);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/ui/main/views/DetailsView.java",
    "content": "package com.spengilley.activityfragmentmvp.ui.main.views;\n\n\npublic interface DetailsView {\n\n    public void showDetails(String details);\n    public void finish();\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/ui/main/views/IntroView.java",
    "content": "package com.spengilley.activityfragmentmvp.ui.main.views;\n\n\npublic interface IntroView {\n\n    public void loadDetailsFragment();\n}\n"
  },
  {
    "path": "app/src/main/java/com/spengilley/activityfragmentmvp/ui/main/views/MainView.java",
    "content": "package com.spengilley.activityfragmentmvp.ui.main.views;\n\n\npublic interface MainView {\n\n    // Fairly un necessary interface but if we wanted our\n    // MainActivity to actually do anything we would use this view in combination\n    // with a presenter\n\n    public void showToast(String message);\n}\n"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/fragment_container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\"\n    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n    tools:context=\".MainActivity\">\n\n\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_details.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:orientation=\"vertical\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <TextView\n        android:id=\"@+id/details\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_alignParentLeft=\"true\" />\n\n    <Button\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/finish\"\n        android:id=\"@+id/finish\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_centerHorizontal=\"true\" />\n\n    <Button\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/get_details\"\n        android:id=\"@+id/get_details\"\n        android:layout_below=\"@+id/details\" />\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_intro.xml",
    "content": "<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".ui.main.IntroFragment\">\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:text=\"@string/intro_text\" />\n\n    <Button\n        android:id=\"@+id/load_details\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/intro_button_label\"\n        android:layout_gravity=\"center_horizontal|bottom\" />\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/menu/main.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:context=\".MainActivity\" >\n    <item android:id=\"@+id/action_settings\"\n        android:title=\"@string/action_settings\"\n        android:orderInCategory=\"100\"\n        android:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"app_name\">ActivityFragmentMVP</string>\n    <string name=\"hello_blank_fragment\">Hello blank fragment</string>\n    <string name=\"intro_text\">This is an intro fragment with a simple button</string>\n    <string name=\"intro_button_label\">Go to details</string>\n    <string name=\"finish\">Finish</string>\n    <string name=\"get_details\">Get Details</string>\n    <string name=\"action_settings\">Settings</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"android:Theme.Holo.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    repositories {\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:1.0.0'\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        jcenter()\n    }\n}\n"
  },
  {
    "path": "composer.json",
    "content": "{\n    \"name\": \"stephen/activity-fragment-mvp\",\n    \"authors\": [\n        {\n            \"name\": \"stephen.pengilley\",\n            \"email\": \"spengilley@gmail.com\"\n        }\n    ],\n    \"require\": {}\n}\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Wed Apr 10 15:27:10 PDT 2013\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-2.2.1-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Settings specified in this file will override any Gradle settings\n# configured through the IDE.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# For Cygwin, ensure paths are in UNIX format before anything is touched.\nif $cygwin ; then\n    [ -n \"$JAVA_HOME\" ] && JAVA_HOME=`cygpath --unix \"$JAVA_HOME\"`\nfi\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >&-\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >&-\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windowz variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\ngoto execute\r\n\r\n:4NT_args\r\n@rem Get arguments from the 4NT Shell from JP Software\r\nset CMD_LINE_ARGS=%$\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app'\n"
  }
]