diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..39fb081a --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 00000000..7ac24c77 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..62b2def5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + 1.8 + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..e1a75010 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 00000000..7f68460d --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..94a25f7f --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 00000000..5593f011 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,49 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 26 + defaultConfig { + applicationId "com.blankmemo.splashrev" + minSdkVersion 21 + targetSdkVersion 26 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.android.support:appcompat-v7:26.1.0' + implementation 'com.android.support.constraint:constraint-layout:1.1.2' + compile 'com.android.support:recyclerview-v7:26.1.0' + //Glide + compile 'com.github.bumptech.glide:glide:3.7.0' + compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar' + //OKhttp + implementation 'com.squareup.okhttp3:okhttp:3.10.0' + implementation 'com.squareup.okhttp3:logging-interceptor:3.8.1' + //Retrofit + compile 'com.squareup.retrofit2:retrofit:2.4.0' + implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' + implementation 'com.squareup.retrofit2:converter-gson:2.3.0' + implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' + //Rxjava + implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' + implementation 'io.reactivex.rxjava2:rxjava:2.1.12' + implementation 'com.squareup.retrofit2:adapter-rxjava:2.1.0' + + + compile 'com.jakewharton:butterknife:8.8.1' + annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + compile 'com.android.support:support-annotations:27.1.1' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/app/src/androidTest/java/com/blankmemo/splashrev/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/blankmemo/splashrev/ExampleInstrumentedTest.java new file mode 100755 index 00000000..a42ee211 --- /dev/null +++ b/app/src/androidTest/java/com/blankmemo/splashrev/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.blankmemo.splashrev; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.blankmemo.splashrev", appContext.getPackageName()); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100755 index 00000000..126cd5cd --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/blankmemo/splashrev/MainActivity.java b/app/src/main/java/com/blankmemo/splashrev/MainActivity.java new file mode 100755 index 00000000..0c706499 --- /dev/null +++ b/app/src/main/java/com/blankmemo/splashrev/MainActivity.java @@ -0,0 +1,164 @@ +package com.blankmemo.splashrev; + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityOptionsCompat; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.ProgressBar; + +import com.blankmemo.splashrev.adapter.ListItemClickListener; +import com.blankmemo.splashrev.adapter.PhotoGalleryAdapter; +import com.blankmemo.splashrev.api.ApiConstants; +import com.blankmemo.splashrev.api.ApiFactory; +import com.blankmemo.splashrev.constants.intentConstants; +import com.blankmemo.splashrev.datamodel.PhotoData; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import butterknife.BindView; +import butterknife.ButterKnife; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.observers.DisposableSingleObserver; +import io.reactivex.schedulers.Schedulers; +import okhttp3.OkHttpClient; +import okhttp3.logging.HttpLoggingInterceptor; +import retrofit2.Retrofit; + +public class MainActivity extends AppCompatActivity implements ListItemClickListener{ + @BindView(R.id.cl_splashrev_main) RecyclerView mSplashrevMain; + @BindView(R.id.progress_bar) ProgressBar mProgressBar; + + private CompositeDisposable compositeDisposable; + private PhotoGalleryAdapter mAdapter; + private List mPhotoData; + private ApiFactory ApiFactory; + + + private static final String TAG="Main Activity"; + private int defaultPosition = 0; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + ButterKnife.bind(this); + + + + //init variables, could use dagger to inject instead + mPhotoData=new ArrayList<>(); + compositeDisposable=new CompositeDisposable(); + Map photosMap=new HashMap<>(); + photosMap.put("client_id", ApiConstants.API_KEY); + photosMap.put("page", "1"); + + mProgressBar.setVisibility(View.VISIBLE); + + mSplashrevMain.setLayoutManager(new GridLayoutManager(this, 3)); + + //make API call + ApiFactory= + new ApiFactory(new Retrofit.Builder(),new OkHttpClient.Builder(),new HttpLoggingInterceptor()); + + + compositeDisposable.add( + ApiFactory.createApi(ApiConstants.API_END_POINT) + .getPhotoData(photosMap) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeWith(new DisposableSingleObserver>() { + @Override + public void onSuccess(List photoData) { + mPhotoData=photoData; + mAdapter=new PhotoGalleryAdapter(mPhotoData); + mAdapter.setOnItemClickListener(MainActivity.this); + mSplashrevMain.setAdapter(mAdapter); + mProgressBar.setVisibility(View.GONE); + } + + @Override + public void onError(Throwable e) { + e.printStackTrace(); + } + })); + + mSplashrevMain.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + if(!recyclerView.canScrollVertically(1)){ + onPageEnd(); + mProgressBar.setVisibility(View.VISIBLE); + } + } + }); + } + + public void onPageEnd() { + Map photosMap=new HashMap<>(); + photosMap.put("client_id", ApiConstants.API_KEY); + photosMap.put("page", Integer.toString(mPhotoData.size()/10)+1); + compositeDisposable.add(ApiFactory.createApi(ApiConstants.API_END_POINT) + .getPhotoData(photosMap) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeWith(new DisposableSingleObserver>() { + @Override + public void onSuccess(List photoData) { + mPhotoData.addAll(mPhotoData.size(),photoData); + mAdapter.notifyDataSetChanged(); + mProgressBar.setVisibility(View.GONE); + } + + @Override + public void onError(Throwable e) { + + } + })); + } + + @SuppressLint("RestrictedApi") + @Override + public void onItemClick(View v, int position) { + defaultPosition = position; + Intent intent = new Intent(getApplicationContext(), PhotoFullScreenActivity.class); + + intent.putExtra(intentConstants.FULL_SCREEN_PHOTO_DETAILS,(Serializable)mPhotoData); + intent.putExtra(intentConstants.FULL_SCREEN_PHOTO_POSITION, position); + ActivityOptionsCompat options = ActivityOptionsCompat. + makeSceneTransitionAnimation(this, v, "profile"); + startActivityForResult(intent, intentConstants.START_FULL_SCREEN_REQUEST_CODE, options.toBundle()); + + + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == intentConstants.START_FULL_SCREEN_REQUEST_CODE) { + //Log.d(TAG, "Default Position is " + defaultPosition); + if (resultCode == RESULT_OK) { + int gridPosition = data.getIntExtra(intentConstants.VIEW_PAGER_PHOTO_POSITION, defaultPosition); + mSplashrevMain.scrollToPosition(gridPosition); + } + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if(compositeDisposable!=null && !compositeDisposable.isDisposed()) + compositeDisposable.dispose(); + } + +} diff --git a/app/src/main/java/com/blankmemo/splashrev/PhotoFullScreenActivity.java b/app/src/main/java/com/blankmemo/splashrev/PhotoFullScreenActivity.java new file mode 100755 index 00000000..d7cb8268 --- /dev/null +++ b/app/src/main/java/com/blankmemo/splashrev/PhotoFullScreenActivity.java @@ -0,0 +1,48 @@ +package com.blankmemo.splashrev; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.view.ViewPager; +import android.support.v7.app.AppCompatActivity; + +import com.blankmemo.splashrev.adapter.PhotoFullScreenAdapter; +import com.blankmemo.splashrev.constants.intentConstants; +import com.blankmemo.splashrev.datamodel.PhotoData; + +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public class PhotoFullScreenActivity extends AppCompatActivity { + @BindView(R.id.rl_photo_full_screen_view_pager) + ViewPager mPhotoFullScreenViewPager; + List mPhotoData; + private static final String TAG="PhotoFull Activity"; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_photo_full_screen_view); + + ButterKnife.bind(this); + int position = getIntent().getIntExtra(intentConstants.FULL_SCREEN_PHOTO_POSITION,0); + mPhotoData = (List)getIntent().getSerializableExtra(intentConstants.FULL_SCREEN_PHOTO_DETAILS); + mPhotoFullScreenViewPager.setAdapter(new PhotoFullScreenAdapter(this, mPhotoData)); + //Log.d(TAG,"the position and url is " + position + url); + + // displaying selected image first + mPhotoFullScreenViewPager.setCurrentItem(position); + } + + @Override + public void onBackPressed() { + Intent position = new Intent(); + position.putExtra(intentConstants.VIEW_PAGER_PHOTO_POSITION, mPhotoFullScreenViewPager.getCurrentItem()); + setResult(RESULT_OK, position); + super.onBackPressed(); + } + + +} diff --git a/app/src/main/java/com/blankmemo/splashrev/adapter/ListItemClickListener.java b/app/src/main/java/com/blankmemo/splashrev/adapter/ListItemClickListener.java new file mode 100755 index 00000000..20696f34 --- /dev/null +++ b/app/src/main/java/com/blankmemo/splashrev/adapter/ListItemClickListener.java @@ -0,0 +1,7 @@ +package com.blankmemo.splashrev.adapter; + +import android.view.View; + +public interface ListItemClickListener { + void onItemClick(View view, int adapterPosition); +} diff --git a/app/src/main/java/com/blankmemo/splashrev/adapter/PhotoFullScreenAdapter.java b/app/src/main/java/com/blankmemo/splashrev/adapter/PhotoFullScreenAdapter.java new file mode 100755 index 00000000..cdde69be --- /dev/null +++ b/app/src/main/java/com/blankmemo/splashrev/adapter/PhotoFullScreenAdapter.java @@ -0,0 +1,73 @@ +package com.blankmemo.splashrev.adapter; + +import android.app.Activity; +import android.content.Context; +import android.support.v4.view.PagerAdapter; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.blankmemo.splashrev.R; +import com.blankmemo.splashrev.datamodel.PhotoData; +import com.blankmemo.splashrev.utils.CommonUtils; +import com.bumptech.glide.Glide; + +import java.util.List; + +/** + * Created by hongyuchen on 2018-08-27. + */ + +public class PhotoFullScreenAdapter extends PagerAdapter{ + private List mPhotoData; + private Activity mActivity; + private static final String TAG="PhotoFullScreen Adapter"; + + public PhotoFullScreenAdapter(Activity activity, List photoData) { + this.mActivity = activity; + this.mPhotoData = photoData; + } + + @Override + public int getCount() { + return mPhotoData.size(); + } + + @Override + public boolean isViewFromObject(View view, Object object) { + return view == object; + } + + @Override + public Object instantiateItem(ViewGroup container, int position) { + + LayoutInflater layoutInflater = (LayoutInflater)mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View view = layoutInflater.inflate(R.layout.photo_full_screen, container,false); + + ImageView photoFullScreenImageView = view.findViewById(R.id.rl_photo_full_screen_imageview); + TextView photoUser = view.findViewById(R.id.rl_photo_user); + //Log.d(TAG, "The URL is " + (mPhotoData.get(position)).getUrls().getRegular()); + + Glide.with(view.getContext()) + .load((mPhotoData.get(position)).getUrls().getRegular()) + .into(photoFullScreenImageView); + photoUser.setText("By: " + mPhotoData.get(position).getUser().getUsername() + + " " + +"Created on: " + CommonUtils.convertDate(mPhotoData.get(position).getCreatedAt())); + + container.addView(view); + + return view; + + } + + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + container.removeView((RelativeLayout) object); + } + + +} diff --git a/app/src/main/java/com/blankmemo/splashrev/adapter/PhotoGalleryAdapter.java b/app/src/main/java/com/blankmemo/splashrev/adapter/PhotoGalleryAdapter.java new file mode 100755 index 00000000..fc3047a8 --- /dev/null +++ b/app/src/main/java/com/blankmemo/splashrev/adapter/PhotoGalleryAdapter.java @@ -0,0 +1,57 @@ +package com.blankmemo.splashrev.adapter; + +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.blankmemo.splashrev.R; +import com.blankmemo.splashrev.datamodel.PhotoData; +import com.bumptech.glide.Glide; + +import java.util.List; + +/** + * Created by hongyuchen on 2018-08-26. + */ + +public class PhotoGalleryAdapter extends RecyclerView.Adapter{ + + private List mPhotoData; + private ListItemClickListener mListener; + + + public PhotoGalleryAdapter( List photoData) { + this.mPhotoData = photoData; + } + + + @NonNull + @Override + public PhotoGalleryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.activity_photo_viewholder, parent, false); + + return new PhotoGalleryViewHolder(view, mListener); + + } + + @Override + public void onBindViewHolder(@NonNull final PhotoGalleryViewHolder holder, int position) { + Glide.with(holder.mPhotoView.getContext()) + .load(mPhotoData.get(holder.getAdapterPosition()).getUrls().getSmall()) + .into(holder.mPhotoView); + } + + + @Override + public int getItemCount() { + return mPhotoData!=null?mPhotoData.size():0; + } + + public void setOnItemClickListener(ListItemClickListener listener){ + this.mListener = listener; + } + +} diff --git a/app/src/main/java/com/blankmemo/splashrev/adapter/PhotoGalleryViewHolder.java b/app/src/main/java/com/blankmemo/splashrev/adapter/PhotoGalleryViewHolder.java new file mode 100755 index 00000000..ac660564 --- /dev/null +++ b/app/src/main/java/com/blankmemo/splashrev/adapter/PhotoGalleryViewHolder.java @@ -0,0 +1,36 @@ +package com.blankmemo.splashrev.adapter; + +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.ImageView; + +import com.blankmemo.splashrev.R; + +import butterknife.BindView; +import butterknife.ButterKnife; + +/** + * Created by hongyuchen on 2018-08-26. + */ + +public class PhotoGalleryViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ + ImageView mPhotoView; + private ListItemClickListener mListener; + + + public PhotoGalleryViewHolder(@NonNull View itemView, ListItemClickListener mListener) { + super(itemView); + this.mListener=mListener; + mPhotoView = itemView.findViewById(R.id.ll_photo); + mPhotoView.setOnClickListener(this); + } + + + @Override + public void onClick(View view) { + if(mListener!=null) { + mListener.onItemClick(view, getAdapterPosition()); + } + }; +} \ No newline at end of file diff --git a/app/src/main/java/com/blankmemo/splashrev/api/ApiConstants.java b/app/src/main/java/com/blankmemo/splashrev/api/ApiConstants.java new file mode 100755 index 00000000..fbb7639f --- /dev/null +++ b/app/src/main/java/com/blankmemo/splashrev/api/ApiConstants.java @@ -0,0 +1,6 @@ +package com.blankmemo.splashrev.api; + +public final class ApiConstants { + public static final String API_KEY="6e7d2825e6e7df4702706df0ca599fa5c5f8685481709746eb8b47f06b15e8ff"; + public static final String API_END_POINT= "https://api.unsplash.com"; +} diff --git a/app/src/main/java/com/blankmemo/splashrev/api/ApiFactory.java b/app/src/main/java/com/blankmemo/splashrev/api/ApiFactory.java new file mode 100755 index 00000000..9b2796ec --- /dev/null +++ b/app/src/main/java/com/blankmemo/splashrev/api/ApiFactory.java @@ -0,0 +1,48 @@ +package com.blankmemo.splashrev.api; + +import com.blankmemo.splashrev.BuildConfig; + +import java.util.concurrent.TimeUnit; + +import okhttp3.OkHttpClient; +import okhttp3.logging.HttpLoggingInterceptor; +import retrofit2.Retrofit; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; +import retrofit2.converter.gson.GsonConverterFactory; +import retrofit2.converter.scalars.ScalarsConverterFactory; + +/** + * Created by hongyuchen on 2018-08-28. + */ + +public class ApiFactory { + private Retrofit.Builder mRetrofitBuilder; + private OkHttpClient.Builder mHttpClientBuilder; + private HttpLoggingInterceptor mLoggingInterceptor; + + + public ApiFactory(Retrofit.Builder retrofitBuilder,OkHttpClient.Builder okHttpClient,HttpLoggingInterceptor loggingInterceptor){ + this.mRetrofitBuilder=retrofitBuilder; + this.mHttpClientBuilder=okHttpClient; + this.mLoggingInterceptor=loggingInterceptor; + } + + public ApiInterface createApi(String url){ + //For debug only + if (BuildConfig.DEBUG) { + mLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); + if(!mHttpClientBuilder.interceptors().contains(mLoggingInterceptor)){ + mHttpClientBuilder.addInterceptor(mLoggingInterceptor); + } + } + //Connection Time Out + mHttpClientBuilder.connectTimeout(5, TimeUnit.SECONDS); + + return mRetrofitBuilder.baseUrl(url) + .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .addConverterFactory(ScalarsConverterFactory.create()) + .client(mHttpClientBuilder.build()) + .build().create(ApiInterface.class); + } +} diff --git a/app/src/main/java/com/blankmemo/splashrev/api/ApiInterface.java b/app/src/main/java/com/blankmemo/splashrev/api/ApiInterface.java new file mode 100755 index 00000000..7a89d729 --- /dev/null +++ b/app/src/main/java/com/blankmemo/splashrev/api/ApiInterface.java @@ -0,0 +1,21 @@ +package com.blankmemo.splashrev.api; + +import com.blankmemo.splashrev.datamodel.PhotoData; + +import java.util.List; +import java.util.Map; + +import io.reactivex.Single; +import retrofit2.http.GET; +import retrofit2.http.Query; +import retrofit2.http.QueryMap; + +/** + * Created by hongyuchen on 2018-08-28. + */ + +public interface ApiInterface { + @GET("/photos/curated/") + Single> getPhotoData(@QueryMap Map photosMap); + +} diff --git a/app/src/main/java/com/blankmemo/splashrev/constants/intentConstants.java b/app/src/main/java/com/blankmemo/splashrev/constants/intentConstants.java new file mode 100755 index 00000000..959d7e46 --- /dev/null +++ b/app/src/main/java/com/blankmemo/splashrev/constants/intentConstants.java @@ -0,0 +1,13 @@ +package com.blankmemo.splashrev.constants; + +/** + * Created by hongyuchen on 2018-08-26. + */ + +public final class intentConstants { + public static final String FULL_SCREEN_PHOTO_DETAILS = "full_screen_photo_details"; + public static final String FULL_SCREEN_PHOTO_POSITION = "position"; + public static final String VIEW_PAGER_PHOTO_POSITION = "view_pager_position"; + public static final int START_FULL_SCREEN_REQUEST_CODE = 1; + +} diff --git a/app/src/main/java/com/blankmemo/splashrev/datamodel/PhotoData.java b/app/src/main/java/com/blankmemo/splashrev/datamodel/PhotoData.java new file mode 100755 index 00000000..a96a11de --- /dev/null +++ b/app/src/main/java/com/blankmemo/splashrev/datamodel/PhotoData.java @@ -0,0 +1,71 @@ +package com.blankmemo.splashrev.datamodel; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +/** + * Created by hongyuchen on 2018-08-25. + */ + +public class PhotoData implements Serializable{ + @SerializedName("id") + @Expose + private String id; + @SerializedName("created_at") + @Expose + private String createdAt; + @SerializedName("updated_at") + @Expose + private String updatedAt; + @SerializedName("color") + @Expose + private String color; + @SerializedName("description") + @Expose + private String description; + @SerializedName("urls") + @Expose + private PhotoUrls urls; + @SerializedName("likes") + @Expose + private Integer likes; + @SerializedName("user") + @Expose + private UnSplashUser user; + + public String getId() { + return id; + } + + public String getCreatedAt() { + return createdAt; + } + + public String getUpdatedAt() { + return updatedAt; + } + + public String getColor() { + return color; + } + + public String getDescription() { + return description; + } + + public PhotoUrls getUrls() { + return urls; + } + + public Integer getLikes() { + return likes; + } + + public UnSplashUser getUser() { + return user; + } + + +} diff --git a/app/src/main/java/com/blankmemo/splashrev/datamodel/PhotoUrls.java b/app/src/main/java/com/blankmemo/splashrev/datamodel/PhotoUrls.java new file mode 100755 index 00000000..8772f7dc --- /dev/null +++ b/app/src/main/java/com/blankmemo/splashrev/datamodel/PhotoUrls.java @@ -0,0 +1,44 @@ +package com.blankmemo.splashrev.datamodel; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +public class PhotoUrls implements Serializable { + @SerializedName("raw") + @Expose + private String raw; + @SerializedName("full") + @Expose + private String full; + @SerializedName("regular") + @Expose + private String regular; + @SerializedName("small") + @Expose + private String small; + @SerializedName("thumb") + @Expose + private String thumb; + + public String getRaw() { + return raw; + } + + public String getFull() { + return full; + } + + public String getRegular() { + return regular; + } + + public String getSmall() { + return small; + } + + public String getThumb() { + return thumb; + } +} diff --git a/app/src/main/java/com/blankmemo/splashrev/datamodel/UnSplashUser.java b/app/src/main/java/com/blankmemo/splashrev/datamodel/UnSplashUser.java new file mode 100755 index 00000000..38cab0cb --- /dev/null +++ b/app/src/main/java/com/blankmemo/splashrev/datamodel/UnSplashUser.java @@ -0,0 +1,87 @@ +package com.blankmemo.splashrev.datamodel; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +public class UnSplashUser implements Serializable { + @SerializedName("id") + @Expose + private String id; + @SerializedName("username") + @Expose + private String username; + @SerializedName("name") + @Expose + private String name; + @SerializedName("twitter_username") + @Expose + private Object twitterUsername; + @SerializedName("portfolio_url") + @Expose + private String portfolioUrl; + @SerializedName("bio") + @Expose + private String bio; + @SerializedName("location") + @Expose + private String location; + @SerializedName("instagram_username") + @Expose + private String instagramUsername; + @SerializedName("total_collections") + @Expose + private Integer totalCollections; + @SerializedName("total_likes") + @Expose + private Integer totalLikes; + @SerializedName("total_photos") + @Expose + private Integer totalPhotos; + + + public String getId() { + return id; + } + + public String getUsername() { + return username; + } + + public String getName() { + return name; + } + + public Object getTwitterUsername() { + return twitterUsername; + } + + public String getPortfolioUrl() { + return portfolioUrl; + } + + public String getBio() { + return bio; + } + + public String getLocation() { + return location; + } + + public String getInstagramUsername() { + return instagramUsername; + } + + public Integer getTotalCollections() { + return totalCollections; + } + + public Integer getTotalLikes() { + return totalLikes; + } + + public Integer getTotalPhotos() { + return totalPhotos; + } +} diff --git a/app/src/main/java/com/blankmemo/splashrev/utils/CommonUtils.java b/app/src/main/java/com/blankmemo/splashrev/utils/CommonUtils.java new file mode 100644 index 00000000..4fd1bcdb --- /dev/null +++ b/app/src/main/java/com/blankmemo/splashrev/utils/CommonUtils.java @@ -0,0 +1,30 @@ +package com.blankmemo.splashrev.utils; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +/** + * Created by hongyuchen on 2018-08-29. + */ + +public class CommonUtils { + + /** + * convert Server Time Format into Local Time Format + */ + public static String convertDate (String date) { + String formattedDate; + try { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); + Date newDate = formatter.parse(date); + + SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); + formattedDate = dateFormatter.format(newDate); + } + catch (Exception e) { + formattedDate = "N/A"; + } + return formattedDate; + } +} diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100755 index 00000000..c7bd21db --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_cloud_off.xml b/app/src/main/res/drawable/ic_cloud_off.xml new file mode 100755 index 00000000..59458b02 --- /dev/null +++ b/app/src/main/res/drawable/ic_cloud_off.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100755 index 00000000..d5fccc53 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100755 index 00000000..d0dbb8ec --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,29 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/activity_photo_full_screen_view.xml b/app/src/main/res/layout/activity_photo_full_screen_view.xml new file mode 100755 index 00000000..08b27890 --- /dev/null +++ b/app/src/main/res/layout/activity_photo_full_screen_view.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_photo_viewholder.xml b/app/src/main/res/layout/activity_photo_viewholder.xml new file mode 100755 index 00000000..1337578f --- /dev/null +++ b/app/src/main/res/layout/activity_photo_viewholder.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/app/src/main/res/layout/photo_full_screen.xml b/app/src/main/res/layout/photo_full_screen.xml new file mode 100755 index 00000000..3b0a641b --- /dev/null +++ b/app/src/main/res/layout/photo_full_screen.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100755 index 00000000..eca70cfe --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100755 index 00000000..eca70cfe --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100755 index 00000000..a2f59082 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100755 index 00000000..1b523998 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100755 index 00000000..ff10afd6 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100755 index 00000000..115a4c76 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100755 index 00000000..dcd3cd80 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100755 index 00000000..459ca609 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100755 index 00000000..8ca12fe0 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100755 index 00000000..8e19b410 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100755 index 00000000..b824ebdd Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100755 index 00000000..4c19a13c Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100755 index 00000000..3ab3e9cb --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #3F51B5 + #303F9F + #FF4081 + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100755 index 00000000..c50ed321 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + SplashRev + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100755 index 00000000..9306f812 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/app/src/test/java/com/blankmemo/splashrev/ExampleUnitTest.java b/app/src/test/java/com/blankmemo/splashrev/ExampleUnitTest.java new file mode 100755 index 00000000..9f9047a0 --- /dev/null +++ b/app/src/test/java/com/blankmemo/splashrev/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.blankmemo.splashrev; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() throws Exception { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..e6b32bc7 --- /dev/null +++ b/build.gradle @@ -0,0 +1,27 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + + repositories { + google() + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.0.1' + + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..aac7c9b4 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,17 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..13372aef Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..bc98a5c1 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sat Aug 25 14:36:08 EDT 2018 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..9d82f789 --- /dev/null +++ b/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..aec99730 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..e7b4def4 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +include ':app'