diff --git a/app/build.gradle b/app/build.gradle index ad1e505..350a376 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -29,12 +29,70 @@ android { } } +android { + packagingOptions { + exclude 'META-INF/DEPENDENCIES.txt' + exclude 'META-INF/LICENSE.txt' + exclude 'META-INF/NOTICE.txt' + exclude 'META-INF/NOTICE' + exclude 'META-INF/LICENSE' + exclude 'META-INF/DEPENDENCIES' + exclude 'META-INF/notice.txt' + exclude 'META-INF/license.txt' + exclude 'META-INF/dependencies.txt' + exclude 'META-INF/LGPL2.1' + } +} + +repositories { + jcenter() + mavenCentral() + maven { url "https://maven.google.com" } + maven { url "https://jitpack.io" } +} + dependencies { - compile "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion" - compile "com.android.support:recyclerview-v7:$rootProject.supportLibraryVersion" - compile "com.android.support:cardview-v7:$rootProject.supportLibraryVersion" - compile "com.android.support:palette-v7:$rootProject.supportLibraryVersion" - compile "com.android.support:design:$rootProject.supportLibraryVersion" - compile "com.squareup.picasso:picasso:2.4.0" compile fileTree(dir: "libs", include: ["*.jar"]) + + compile 'com.android.support:appcompat-v7:' + rootProject.ext.supportLibraryVersion + compile 'com.android.support:cardview-v7:' + rootProject.ext.supportLibraryVersion + compile 'com.android.support:recyclerview-v7:' + rootProject.ext.supportLibraryVersion + compile 'com.android.support:support-v4:' + rootProject.ext.supportLibraryVersion + compile 'com.android.support:design:' + rootProject.ext.supportLibraryVersion + compile 'com.android.support:percent:' + rootProject.ext.supportLibraryVersion + compile 'com.android.support:palette-v7:' + rootProject.ext.supportLibraryVersion + compile 'com.android.support:support-vector-drawable:' + rootProject.ext.supportLibraryVersion + compile 'com.android.support:animated-vector-drawable:' + rootProject.ext.supportLibraryVersion + compile 'com.android.support:support-annotations:' + rootProject.ext.supportLibraryVersion + compile 'com.android.support:support-compat:' + rootProject.ext.supportLibraryVersion + compile 'com.android.support:support-core-ui:' + rootProject.ext.supportLibraryVersion + compile 'com.android.support:support-v13:' + rootProject.ext.supportLibraryVersion + compile 'com.android.support:support-v4:' + rootProject.ext.supportLibraryVersion + + compile 'com.flipboard:bottomsheet-core:1.5.3' + compile 'com.flipboard:bottomsheet-commons:1.5.3' + compile 'com.facebook.android:facebook-android-sdk:4.23.+' + compile 'com.github.coyarzun89:fabtransitionactivity:0.2.0' + compile 'com.github.bumptech.glide:glide:3.7.0' + compile 'com.squareup.picasso:picasso:2.5.2' + compile 'de.hdodenhof:circleimageview:2.0.0' + compile 'com.jakewharton:butterknife:8.6.0' + compile 'joda-time:joda-time:2.9.9' + compile 'com.android.support:multidex:1.0.1' + compile 'com.firebaseui:firebase-ui-database:0.4.0' + compile 'pub.devrel:easypermissions:0.1.5' + compile 'com.fasterxml.jackson.core:jackson-databind:2.7.3' + compile 'com.danikula:videocache:2.6.4' + compile 'com.dinuscxj:circleprogressbar:1.1.1' + compile 'com.afollestad.material-dialogs:core:0.9.4.5' + compile 'com.googlecode.mp4parser:isoparser:1.1.22' + compile 'javax.inject:javax.inject:1' + compile 'com.android.support:support-v4:26.+' + compile 'com.android.support.constraint:constraint-layout:1.0.2' + compile 'me.riddhimanadib.bottom-nav-bar:bottom-nav-bar:1.0.1' + compile 'com.android.support:design:26.+' + compile 'com.android.support:recyclerview-v7:26.+' + compile 'com.jakewharton:butterknife:8.6.0' + annotationProcessor 'com.jakewharton:butterknife-compiler:8.6.0' + testCompile 'junit:junit:4.12' } diff --git a/app/src/main/java/com/antonioleiva/materializeyourapp/DetailActivity.java b/app/src/main/java/com/antonioleiva/materializeyourapp/DetailActivity.java index d9a420d..e7e06f2 100644 --- a/app/src/main/java/com/antonioleiva/materializeyourapp/DetailActivity.java +++ b/app/src/main/java/com/antonioleiva/materializeyourapp/DetailActivity.java @@ -22,11 +22,13 @@ import android.graphics.drawable.BitmapDrawable; import android.os.Build; import android.os.Bundle; +import android.support.design.widget.AppBarLayout; import android.support.design.widget.CollapsingToolbarLayout; import android.support.design.widget.FloatingActionButton; import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.view.ViewCompat; +import android.support.v4.widget.NestedScrollView; import android.support.v7.app.AppCompatActivity; import android.support.v7.graphics.Palette; import android.support.v7.widget.Toolbar; @@ -36,14 +38,26 @@ import android.widget.ImageView; import android.widget.TextView; +import com.antonioleiva.materializeyourapp.widgets.SquareImageView; import com.squareup.picasso.Callback; import com.squareup.picasso.Picasso; +import butterknife.BindView; +import butterknife.ButterKnife; + public class DetailActivity extends AppCompatActivity { private static final String EXTRA_IMAGE = "com.antonioleiva.materializeyourapp.extraImage"; private static final String EXTRA_TITLE = "com.antonioleiva.materializeyourapp.extraTitle"; - private CollapsingToolbarLayout collapsingToolbarLayout; + + @BindView(R.id.image) SquareImageView image; + @BindView(R.id.toolbar) Toolbar toolbar; + @BindView(R.id.collapsing_toolbar) CollapsingToolbarLayout collapsingToolbar; + @BindView(R.id.app_bar_layout) AppBarLayout appBarLayout; + @BindView(R.id.title) TextView title; + @BindView(R.id.description) TextView description; + @BindView(R.id.scroll) NestedScrollView scroll; + @BindView(R.id.fab) FloatingActionButton fab; public static void navigate(AppCompatActivity activity, View transitionImage, ViewModel viewModel) { Intent intent = new Intent(activity, DetailActivity.class); @@ -55,25 +69,26 @@ public static void navigate(AppCompatActivity activity, View transitionImage, Vi } @SuppressWarnings("ConstantConditions") - @Override protected void onCreate(Bundle savedInstanceState) { + @Override + protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initActivityTransitions(); setContentView(R.layout.activity_detail); + ButterKnife.bind(this); - ViewCompat.setTransitionName(findViewById(R.id.app_bar_layout), EXTRA_IMAGE); + ViewCompat.setTransitionName(appBarLayout, EXTRA_IMAGE); supportPostponeEnterTransition(); - setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); + setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); String itemTitle = getIntent().getStringExtra(EXTRA_TITLE); - collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar); - collapsingToolbarLayout.setTitle(itemTitle); - collapsingToolbarLayout.setExpandedTitleColor(getResources().getColor(android.R.color.transparent)); + collapsingToolbar.setTitle(itemTitle); + collapsingToolbar.setExpandedTitleColor(getResources().getColor(android.R.color.transparent)); - final ImageView image = (ImageView) findViewById(R.id.image); Picasso.with(this).load(getIntent().getStringExtra(EXTRA_IMAGE)).into(image, new Callback() { - @Override public void onSuccess() { + @Override + public void onSuccess() { Bitmap bitmap = ((BitmapDrawable) image.getDrawable()).getBitmap(); Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() { public void onGenerated(Palette palette) { @@ -82,16 +97,17 @@ public void onGenerated(Palette palette) { }); } - @Override public void onError() { + @Override + public void onError() { } }); - TextView title = (TextView) findViewById(R.id.title); title.setText(itemTitle); } - @Override public boolean dispatchTouchEvent(MotionEvent motionEvent) { + @Override + public boolean dispatchTouchEvent(MotionEvent motionEvent) { try { return super.dispatchTouchEvent(motionEvent); } catch (NullPointerException e) { @@ -111,17 +127,17 @@ private void initActivityTransitions() { private void applyPalette(Palette palette) { int primaryDark = getResources().getColor(R.color.primary_dark); int primary = getResources().getColor(R.color.primary); - collapsingToolbarLayout.setContentScrimColor(palette.getMutedColor(primary)); - collapsingToolbarLayout.setStatusBarScrimColor(palette.getDarkMutedColor(primaryDark)); - updateBackground((FloatingActionButton) findViewById(R.id.fab), palette); + collapsingToolbar.setContentScrimColor(palette.getMutedColor(primary)); + collapsingToolbar.setStatusBarScrimColor(palette.getDarkMutedColor(primaryDark)); + updateBackground(fab, palette); supportStartPostponedEnterTransition(); } private void updateBackground(FloatingActionButton fab, Palette palette) { int lightVibrantColor = palette.getLightVibrantColor(getResources().getColor(android.R.color.white)); int vibrantColor = palette.getVibrantColor(getResources().getColor(R.color.accent)); - fab.setRippleColor(lightVibrantColor); fab.setBackgroundTintList(ColorStateList.valueOf(vibrantColor)); } + } diff --git a/app/src/main/java/com/antonioleiva/materializeyourapp/MainActivity.java b/app/src/main/java/com/antonioleiva/materializeyourapp/MainActivity.java index f95af87..895b976 100644 --- a/app/src/main/java/com/antonioleiva/materializeyourapp/MainActivity.java +++ b/app/src/main/java/com/antonioleiva/materializeyourapp/MainActivity.java @@ -16,8 +16,10 @@ package com.antonioleiva.materializeyourapp; -import android.os.Build; import android.os.Bundle; +import android.support.design.widget.AppBarLayout; +import android.support.design.widget.CoordinatorLayout; +import android.support.design.widget.FloatingActionButton; import android.support.design.widget.NavigationView; import android.support.design.widget.Snackbar; import android.support.v4.view.GravityCompat; @@ -25,99 +27,92 @@ import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.Toolbar; +import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; +import android.widget.Toast; import com.antonioleiva.materializeyourapp.picasso.CircleTransform; +import com.antonioleiva.materializeyourapp.widgets.GridRecyclerView; import com.squareup.picasso.Picasso; import java.util.ArrayList; import java.util.List; +import butterknife.BindView; +import butterknife.ButterKnife; -public class MainActivity extends AppCompatActivity implements RecyclerViewAdapter.OnItemClickListener { - public static final String AVATAR_URL = "http://lorempixel.com/200/200/people/1/"; +public class MainActivity extends AppCompatActivity { + public static final String AVATAR_URL = "http://lorempixel.com/200/200/people/1/"; private static List items = new ArrayList<>(); - static { - for (int i = 1; i <= 10; i++) { - items.add(new ViewModel("Item " + i, "http://lorempixel.com/500/500/animals/" + i)); - } - } + @BindView(R.id.toolbar) Toolbar toolbar; + @BindView(R.id.appBarLayout) AppBarLayout appBarLayout; + @BindView(R.id.recycler_view) GridRecyclerView recyclerView; + @BindView(R.id.fab) FloatingActionButton fab; + @BindView(R.id.content) CoordinatorLayout content; + @BindView(R.id.navigation_view) NavigationView navigationView; + @BindView(R.id.drawer_layout) DrawerLayout drawerLayout; + + private GridLayoutManager layoutManager; + private RecyclerViewAdapter adapter; + private ImageView avatar; - private DrawerLayout drawerLayout; - private View content; - private RecyclerView recyclerView; - private NavigationView navigationView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + ButterKnife.bind(this); - initRecyclerView(); - initFab(); - initToolbar(); - setupDrawerLayout(); + initializeUI(); - content = findViewById(R.id.content); - - final ImageView avatar = (ImageView) navigationView.getHeaderView(0).findViewById(R.id.avatar); + avatar = (ImageView) navigationView.getHeaderView(0).findViewById(R.id.avatar); Picasso.with(this).load(AVATAR_URL).transform(new CircleTransform()).into(avatar); - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - setRecyclerAdapter(recyclerView); - } } - @Override public void onEnterAnimationComplete() { + @Override + public void onEnterAnimationComplete() { super.onEnterAnimationComplete(); - setRecyclerAdapter(recyclerView); - recyclerView.scheduleLayoutAnimation(); - } - - private void initRecyclerView() { - recyclerView = (RecyclerView) findViewById(R.id.recycler); - recyclerView.setLayoutManager(new GridLayoutManager(this, 2)); - - } - - private void setRecyclerAdapter(RecyclerView recyclerView) { - RecyclerViewAdapter adapter = new RecyclerViewAdapter(items); - adapter.setOnItemClickListener(this); + adapter = new RecyclerViewAdapter(items); recyclerView.setAdapter(adapter); - } - - private void initFab() { - findViewById(R.id.fab).setOnClickListener(new View.OnClickListener() { - @Override public void onClick(View v) { - Snackbar.make(content, "FAB Clicked", Snackbar.LENGTH_SHORT).show(); + recyclerView.scheduleLayoutAnimation(); + adapter.setOnItemClickListener(new RecyclerViewAdapter.OnItemClickListener() { + @Override + public void onItemClick(View view, ViewModel viewModel) { + DetailActivity.navigate(MainActivity.this, view.findViewById(R.id.image), viewModel); } }); } - private void initToolbar() { - final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + @Override + protected void onStart() { + super.onStart(); + for (int i = 1; i <= 10; i++) { + items.add(new ViewModel("Item " + i, "http://lorempixel.com/500/500/animals/" + i)); + } + } + + private void initializeUI() { setSupportActionBar(toolbar); final ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { actionBar.setHomeAsUpIndicator(R.drawable.ic_menu_black_24dp); actionBar.setDisplayHomeAsUpEnabled(true); } - } - private void setupDrawerLayout() { - drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + layoutManager = new GridLayoutManager(this, 3, LinearLayoutManager.VERTICAL, false); + recyclerView.setHasFixedSize(true); + recyclerView.setLayoutManager(layoutManager); - navigationView = (NavigationView) findViewById(R.id.navigation_view); navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { - @Override public boolean onNavigationItemSelected(MenuItem menuItem) { + @Override + public boolean onNavigationItemSelected(MenuItem menuItem) { Snackbar.make(content, menuItem.getTitle() + " pressed", Snackbar.LENGTH_LONG).show(); menuItem.setChecked(true); drawerLayout.closeDrawers(); @@ -126,6 +121,12 @@ private void setupDrawerLayout() { }); } + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.drawer, menu); + return true; + } + @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { @@ -133,11 +134,7 @@ public boolean onOptionsItemSelected(MenuItem item) { drawerLayout.openDrawer(GravityCompat.START); return true; } - return super.onOptionsItemSelected(item); } - @Override public void onItemClick(View view, ViewModel viewModel) { - DetailActivity.navigate(this, view.findViewById(R.id.image), viewModel); - } } diff --git a/app/src/main/java/com/antonioleiva/materializeyourapp/RecyclerViewAdapter.java b/app/src/main/java/com/antonioleiva/materializeyourapp/RecyclerViewAdapter.java index d722e66..f959f19 100644 --- a/app/src/main/java/com/antonioleiva/materializeyourapp/RecyclerViewAdapter.java +++ b/app/src/main/java/com/antonioleiva/materializeyourapp/RecyclerViewAdapter.java @@ -28,7 +28,7 @@ import java.util.List; -public class RecyclerViewAdapter extends RecyclerView.Adapter implements View.OnClickListener { +public class RecyclerViewAdapter extends RecyclerView.Adapter{ private List items; private OnItemClickListener onItemClickListener; @@ -42,8 +42,13 @@ public void setOnItemClickListener(OnItemClickListener onItemClickListener) { } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycler, parent, false); - v.setOnClickListener(this); + final View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycler, parent, false); + v.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + onItemClickListener.onItemClick(v, (ViewModel) v.getTag()); + } + }); return new ViewHolder(v); } @@ -59,9 +64,6 @@ public void setOnItemClickListener(OnItemClickListener onItemClickListener) { return items.size(); } - @Override public void onClick(final View v) { - onItemClickListener.onItemClick(v, (ViewModel) v.getTag()); - } protected static class ViewHolder extends RecyclerView.ViewHolder { public ImageView image; diff --git a/app/src/main/java/com/antonioleiva/materializeyourapp/ViewModel.java b/app/src/main/java/com/antonioleiva/materializeyourapp/ViewModel.java index ab88905..07563da 100644 --- a/app/src/main/java/com/antonioleiva/materializeyourapp/ViewModel.java +++ b/app/src/main/java/com/antonioleiva/materializeyourapp/ViewModel.java @@ -1,19 +1,3 @@ -/* - * Copyright (C) 2015 Antonio Leiva - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package com.antonioleiva.materializeyourapp; public class ViewModel { diff --git a/app/src/main/java/com/antonioleiva/materializeyourapp/picasso/CircleTransform.java b/app/src/main/java/com/antonioleiva/materializeyourapp/picasso/CircleTransform.java index 597483e..1a19b3a 100644 --- a/app/src/main/java/com/antonioleiva/materializeyourapp/picasso/CircleTransform.java +++ b/app/src/main/java/com/antonioleiva/materializeyourapp/picasso/CircleTransform.java @@ -1,19 +1,3 @@ -/* - * Copyright (C) 2015 Antonio Leiva - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package com.antonioleiva.materializeyourapp.picasso; import android.graphics.Bitmap; diff --git a/app/src/main/java/com/antonioleiva/materializeyourapp/widgets/GridRecyclerView.java b/app/src/main/java/com/antonioleiva/materializeyourapp/widgets/GridRecyclerView.java index 0e1ab04..93f9fc8 100644 --- a/app/src/main/java/com/antonioleiva/materializeyourapp/widgets/GridRecyclerView.java +++ b/app/src/main/java/com/antonioleiva/materializeyourapp/widgets/GridRecyclerView.java @@ -48,15 +48,6 @@ public GridRecyclerView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } - @Override - public void setLayoutManager(LayoutManager layout) { - if (layout instanceof GridLayoutManager) { - super.setLayoutManager(layout); - } else { - throw new ClassCastException("You should only use a GridLayoutManager with GridRecyclerView."); - } - } - @Override protected void attachLayoutAnimationParameters(View child, @NonNull ViewGroup.LayoutParams params, int index, int count) { diff --git a/app/src/main/res/anim/grid_layout_animation.xml b/app/src/main/res/anim/grid_layout_animation.xml index ad29ac2..99667a8 100644 --- a/app/src/main/res/anim/grid_layout_animation.xml +++ b/app/src/main/res/anim/grid_layout_animation.xml @@ -1,19 +1,4 @@ - + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_in_bottom.xml b/app/src/main/res/anim/slide_in_bottom.xml index 5b87007..6b84198 100644 --- a/app/src/main/res/anim/slide_in_bottom.xml +++ b/app/src/main/res/anim/slide_in_bottom.xml @@ -1,20 +1,11 @@ - - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0efe124..dea3897 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,19 +1,4 @@ - - + + android:fitsSystemWindows="true"> - - + +