From 50f364b86aa6d1a3682587bb79c6f6db934b57e3 Mon Sep 17 00:00:00 2001 From: mayarals Date: Mon, 29 Jul 2019 00:55:20 -0300 Subject: [PATCH 01/35] androidx + api --- app/build.gradle | 58 ++++-- .../com/dhnews/ExampleInstrumentedTest.java | 4 +- app/src/main/AndroidManifest.xml | 8 +- .../com/dhnews/adapters/NoticiasAdapter.java | 125 ------------ .../adapters/RecyclerViewNoticiasAdapter.java | 123 ++++++++++++ .../RecyclerViewLerDepoisAdapter.java | 7 +- .../detalhe/DetalheLerDepoisActivity.java | 8 +- .../lerdepois/views/LerDepoisActivity.java | 4 +- .../lerdepois/views/LerDepoisFragment.java | 6 +- .../java/br/com/dhnews/model/Article.java | 102 ++++++++++ .../br/com/dhnews/model/NoticiasResponse.java | 41 ++++ .../main/java/br/com/dhnews/model/Source.java | 30 +++ .../main/java/br/com/dhnews/network/API.java | 17 ++ .../br/com/dhnews/network/ApiService.java | 61 ++++++ .../com/dhnews/noticias/NoticiasFragment.java | 104 ---------- .../dhnews/repository/NoticiasRepository.java | 15 ++ .../main/java/br/com/dhnews/util/AppUtil.java | 22 +++ .../{cadastro => view}/CadastroFragment.java | 16 +- .../DetalheNoticiaActivity.java | 9 +- .../dhnews/{home => view}/HomeFragment.java | 19 +- .../dhnews/{login => view}/LoginFragment.java | 18 +- .../{MainActivy.java => MainActivity.java} | 18 +- .../br/com/dhnews/view/NoticiasFragment.java | 182 ++++++++++++++++++ .../{pesquisa => view}/PesquisaFragment.java | 10 +- .../Splash.java => view/SplashActivity.java} | 9 +- .../{usuario => }/view/UsuarioActivity.java | 11 +- .../dhnews/viewmodel/NoticiasViewModel.java | 62 ++++++ app/src/main/res/layout/activity_cadastro.xml | 24 +-- .../layout/activity_detalhe_ler_depois.xml | 4 +- .../res/layout/activity_detalhe_noticia.xml | 6 +- .../main/res/layout/activity_home_activy.xml | 12 +- .../main/res/layout/activity_ler_depois.xml | 4 +- app/src/main/res/layout/activity_login.xml | 6 +- app/src/main/res/layout/activity_main.xml | 6 +- app/src/main/res/layout/activity_pesquisa.xml | 6 +- app/src/main/res/layout/activity_splash.xml | 6 +- app/src/main/res/layout/activity_teste.xml | 6 +- app/src/main/res/layout/activity_usuario.xml | 6 +- .../main/res/layout/content_home_activy.xml | 6 +- app/src/main/res/layout/fragment_cadastro.xml | 20 +- app/src/main/res/layout/fragment_home.xml | 6 +- .../main/res/layout/fragment_ler_depois.xml | 4 +- app/src/main/res/layout/fragment_login.xml | 14 +- app/src/main/res/layout/fragment_noticias.xml | 6 +- app/src/main/res/layout/fragment_pesquisa.xml | 6 +- .../res/layout/layout_lista_item_noticias.xml | 8 +- .../recyclerview_ler_depois_adapter.xml | 8 +- gradle.properties | 2 + 48 files changed, 852 insertions(+), 403 deletions(-) delete mode 100644 app/src/main/java/br/com/dhnews/adapters/NoticiasAdapter.java create mode 100644 app/src/main/java/br/com/dhnews/adapters/RecyclerViewNoticiasAdapter.java create mode 100644 app/src/main/java/br/com/dhnews/model/Article.java create mode 100644 app/src/main/java/br/com/dhnews/model/NoticiasResponse.java create mode 100644 app/src/main/java/br/com/dhnews/model/Source.java create mode 100644 app/src/main/java/br/com/dhnews/network/API.java create mode 100644 app/src/main/java/br/com/dhnews/network/ApiService.java delete mode 100644 app/src/main/java/br/com/dhnews/noticias/NoticiasFragment.java create mode 100644 app/src/main/java/br/com/dhnews/repository/NoticiasRepository.java create mode 100644 app/src/main/java/br/com/dhnews/util/AppUtil.java rename app/src/main/java/br/com/dhnews/{cadastro => view}/CadastroFragment.java (89%) rename app/src/main/java/br/com/dhnews/{detalhenoticia => view}/DetalheNoticiaActivity.java (95%) rename app/src/main/java/br/com/dhnews/{home => view}/HomeFragment.java (85%) rename app/src/main/java/br/com/dhnews/{login => view}/LoginFragment.java (85%) rename app/src/main/java/br/com/dhnews/view/{MainActivy.java => MainActivity.java} (82%) create mode 100644 app/src/main/java/br/com/dhnews/view/NoticiasFragment.java rename app/src/main/java/br/com/dhnews/{pesquisa => view}/PesquisaFragment.java (88%) rename app/src/main/java/br/com/dhnews/{splash/Splash.java => view/SplashActivity.java} (79%) rename app/src/main/java/br/com/dhnews/{usuario => }/view/UsuarioActivity.java (93%) create mode 100644 app/src/main/java/br/com/dhnews/viewmodel/NoticiasViewModel.java diff --git a/app/build.gradle b/app/build.gradle index 59c4418..a35b059 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { targetSdkVersion 28 versionCode 1 versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { @@ -16,21 +16,55 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'com.android.support.constraint:constraint-layout:1.1.3' - implementation 'com.android.support:support-v4:28.0.0' - testImplementation 'junit:junit:4.12' - implementation 'de.hdodenhof:circleimageview:3.0.0' + implementation 'androidx.appcompat:appcompat:1.0.2' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'com.google.android.material:material:1.0.0' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' - implementation 'com.android.support:design:28.0.0' - implementation 'com.android.support:recyclerview-v7:28.0.0' - implementation 'com.android.support:cardview-v7:28.0.0' + // Dependecias Archutecture components + // Room database + implementation "androidx.room:room-runtime:2.1.0" + annotationProcessor "androidx.room:room-compiler:2.1.0" + implementation "androidx.room:room-rxjava2:2.1.0" + // ViewModel and LiveData + implementation "androidx.lifecycle:lifecycle-extensions:2.0.0" + implementation "androidx.lifecycle:lifecycle-common-java8:2.0.0" + implementation "androidx.lifecycle:lifecycle-reactivestreams:2.0.0" -} + /*############################ Gson: Json Converter ##########################*/ + implementation "com.google.code.gson:gson:2.8.5" + + /*########################### ReactiveX ######################################*/ + implementation "io.reactivex.rxjava2:rxandroid:2.0.2" + implementation "io.reactivex.rxjava2:rxjava:2.1.9" + /*############################################################################*/ + + /*############################ Retrofit ######################################*/ + implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0" + implementation "com.squareup.retrofit2:retrofit:2.4.0" + implementation "com.squareup.okhttp3:logging-interceptor:3.4.1" + // Facebook Sthetho + implementation "com.facebook.stetho:stetho:1.5.0" + implementation "com.facebook.stetho:stetho-okhttp3:1.5.0" + implementation "com.squareup.retrofit2:converter-gson:2.4.0" + /*############################################################################*/ + + implementation 'com.squareup.picasso:picasso:2.71828' + + /*############################# REDES SOCIAIS ##################################*/ + implementation 'com.google.android.gms:play-services-auth:17.0.0' + implementation 'com.facebook.android:facebook-android-sdk:[5,6)' + + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test:runner:1.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' +} \ No newline at end of file diff --git a/app/src/androidTest/java/br/com/dhnews/ExampleInstrumentedTest.java b/app/src/androidTest/java/br/com/dhnews/ExampleInstrumentedTest.java index f32b42e..6e87e99 100644 --- a/app/src/androidTest/java/br/com/dhnews/ExampleInstrumentedTest.java +++ b/app/src/androidTest/java/br/com/dhnews/ExampleInstrumentedTest.java @@ -1,8 +1,8 @@ package br.com.dhnews; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3b10362..156dffe 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,13 +11,13 @@ android:theme="@style/AppTheme"> - + @@ -30,7 +30,7 @@ android:name="preloaded_fonts" android:resource="@array/preloaded_fonts" /> - + \ No newline at end of file diff --git a/app/src/main/java/br/com/dhnews/adapters/NoticiasAdapter.java b/app/src/main/java/br/com/dhnews/adapters/NoticiasAdapter.java deleted file mode 100644 index 145fae3..0000000 --- a/app/src/main/java/br/com/dhnews/adapters/NoticiasAdapter.java +++ /dev/null @@ -1,125 +0,0 @@ -package br.com.dhnews.adapters; - -import android.support.annotation.NonNull; -import android.support.v4.content.ContextCompat; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import java.util.List; - -import br.com.dhnews.interfaces.RecyclerViewClickListener; -import br.com.dhnews.R; -import br.com.dhnews.model.Noticias; -import br.com.dhnews.model.Usuario; - - -public class NoticiasAdapter extends RecyclerView.Adapter { - - private List listaNoticias; - private RecyclerViewClickListener listener; - private Usuario usuario; - - - public NoticiasAdapter(List listaNoticias, RecyclerViewClickListener listener) { - this.listaNoticias = listaNoticias; - this.listener = listener; - } - - @NonNull - @Override - public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) { - - View view = LayoutInflater.from(viewGroup.getContext()).inflate - (R.layout.layout_lista_item_noticias, viewGroup, false); - - return new ViewHolder(view); - } - - - @Override - public void onBindViewHolder(@NonNull NoticiasAdapter.ViewHolder viewHolder, final int position) { - - final Noticias noticias = listaNoticias.get(position); - viewHolder.setaNoticiasNaTela(noticias); - - //Click na imagem da noticia para chamar o detalhe da noticia - viewHolder.imagemNoticias.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - listener.onClick(noticias); - } - }); - - //Click no titulo da noticia para chamar o detalhe da noticia - viewHolder.tituloNoticia.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - listener.onClick(noticias); - } - }); - - //Click na descrição da noticia para chamar o detalhe da noticia - viewHolder.descricaoNoticia.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - listener.onClick(noticias); - } - }); - - viewHolder.imagemBookMarkListaNoticia.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - - Usuario usuarioLocal = new Usuario(); - - if (usuario == null) { - usuarioLocal.setEmailUsuario("teste"); - } - - listener.onClick(usuarioLocal); - } - }); - } - - @Override - public int getItemCount() { - return listaNoticias.size(); - } - - - public class ViewHolder extends RecyclerView.ViewHolder { - TextView tituloNoticia; - TextView descricaoNoticia; - TextView horaNoticia; - TextView assuntoNoticia; - ImageView imagemNoticias; - ImageView imagemBookMarkListaNoticia; - - public ViewHolder(@NonNull View itemView) { - super(itemView); - - tituloNoticia = itemView.findViewById(R.id.txtTitulo); - descricaoNoticia = itemView.findViewById(R.id.txtDescricao); - horaNoticia = itemView.findViewById(R.id.txtHora); - assuntoNoticia = itemView.findViewById(R.id.txtAssunto); - imagemNoticias = itemView.findViewById(R.id.iconeNoticia); - imagemBookMarkListaNoticia = itemView.findViewById(R.id.imagemBookMarkListaNoticia); - } - - - //Atribui o as views os valores da variável contato - public void setaNoticiasNaTela(Noticias noticias) { - - tituloNoticia.setText(noticias.getTituloNoticia()); - descricaoNoticia.setText(noticias.getDescricaoNoticia()); - horaNoticia.setText(noticias.getHoraNoticia()); - assuntoNoticia.setText(noticias.getAssuntoNoticia()); - imagemNoticias.setImageDrawable(ContextCompat.getDrawable( - imagemNoticias.getContext(), noticias.getImagemNoticias())); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/br/com/dhnews/adapters/RecyclerViewNoticiasAdapter.java b/app/src/main/java/br/com/dhnews/adapters/RecyclerViewNoticiasAdapter.java new file mode 100644 index 0000000..40666c9 --- /dev/null +++ b/app/src/main/java/br/com/dhnews/adapters/RecyclerViewNoticiasAdapter.java @@ -0,0 +1,123 @@ +package br.com.dhnews.adapters; + +import androidx.annotation.NonNull; +import androidx.core.app.ActivityOptionsCompat; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.RecyclerView; + +import android.app.Activity; +import android.content.Intent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.facebook.stetho.common.android.FragmentCompat; +import com.squareup.picasso.Picasso; + +import java.util.List; + +import br.com.dhnews.interfaces.RecyclerViewClickListener; +import br.com.dhnews.R; +import br.com.dhnews.model.Article; +import br.com.dhnews.model.Noticias; +import br.com.dhnews.model.Usuario; +import br.com.dhnews.view.DetalheNoticiaActivity; + + +public class RecyclerViewNoticiasAdapter extends RecyclerView.Adapter { + + private List
listaNoticias; + + + public RecyclerViewNoticiasAdapter(List
listaNoticias) { + this.listaNoticias = listaNoticias; + } + + @Override + public long getItemId(int position) { + return position; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) { + View view = LayoutInflater.from(viewGroup.getContext()).inflate + (R.layout.layout_lista_item_noticias, viewGroup, false); + + return new ViewHolder(view); + } + + + @Override + public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) { + Article result = listaNoticias.get(position); + viewHolder.bind(result); + + viewHolder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String transitionName = "image_" + position; + Intent intent = new Intent(viewHolder.itemView.getContext(), + DetalheNoticiaActivity.class); + intent.putExtra("noticia", result); + intent.putExtra("transitionName", transitionName); + + viewHolder.imagemNoticias.setTransitionName(transitionName); + + ActivityOptionsCompat options = ActivityOptionsCompat. + makeSceneTransitionAnimation((Activity) viewHolder.itemView.getContext(), + viewHolder.imagemNoticias, transitionName); + + viewHolder.itemView.getContext().startActivity(intent, options.toBundle()); + } + }); + + } + + @Override + public int getItemCount() { + return listaNoticias.size(); + } + + + class ViewHolder extends RecyclerView.ViewHolder { + + private TextView tituloNoticia; + private TextView descricaoNoticia; + private TextView horaNoticia; + private TextView categoriaNoticia; + private ImageView imagemNoticias; + private ImageView imagemBookMarkListaNoticia; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + tituloNoticia = itemView.findViewById(R.id.txtTitulo); + descricaoNoticia = itemView.findViewById(R.id.txtDescricao); + horaNoticia = itemView.findViewById(R.id.txtHora); + categoriaNoticia = itemView.findViewById(R.id.txtAssunto); + imagemNoticias = itemView.findViewById(R.id.iconeNoticia); + imagemBookMarkListaNoticia = itemView.findViewById(R.id.imagemBookMarkListaNoticia); + } + + public void bind(Article result) { + Picasso.get().load(result.getUrlToImage() + + "/portrait_incredible." + result.getUrlToImage()) + .placeholder(R.drawable.ic_launcher_background) + .error(R.drawable.ic_launcher_background) + .into(imagemNoticias); + + tituloNoticia.setText(result.getTitle()); + horaNoticia.setText(result.getPublishedAt()); + descricaoNoticia.setText(result.getDescription()); + + } + } + public void update(List
resultList) { + this.listaNoticias = resultList; + notifyDataSetChanged(); + + } + } diff --git a/app/src/main/java/br/com/dhnews/lerdepois/adapters/RecyclerViewLerDepoisAdapter.java b/app/src/main/java/br/com/dhnews/lerdepois/adapters/RecyclerViewLerDepoisAdapter.java index 4a2afe6..90e964b 100644 --- a/app/src/main/java/br/com/dhnews/lerdepois/adapters/RecyclerViewLerDepoisAdapter.java +++ b/app/src/main/java/br/com/dhnews/lerdepois/adapters/RecyclerViewLerDepoisAdapter.java @@ -2,9 +2,9 @@ import android.app.AlertDialog; import android.content.DialogInterface; -import android.support.annotation.NonNull; -import android.support.v4.content.ContextCompat; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -16,7 +16,6 @@ import br.com.dhnews.R; import br.com.dhnews.interfaces.RecyclerViewClickListener; -import br.com.dhnews.lerdepois.views.LerDepoisFragment; import br.com.dhnews.model.Noticias; public class RecyclerViewLerDepoisAdapter extends RecyclerView.Adapter< diff --git a/app/src/main/java/br/com/dhnews/lerdepois/detalhe/DetalheLerDepoisActivity.java b/app/src/main/java/br/com/dhnews/lerdepois/detalhe/DetalheLerDepoisActivity.java index 75cffa9..e81e989 100644 --- a/app/src/main/java/br/com/dhnews/lerdepois/detalhe/DetalheLerDepoisActivity.java +++ b/app/src/main/java/br/com/dhnews/lerdepois/detalhe/DetalheLerDepoisActivity.java @@ -3,7 +3,7 @@ import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ImageView; @@ -11,7 +11,7 @@ import br.com.dhnews.R; import br.com.dhnews.model.Noticias; -import br.com.dhnews.view.MainActivy; +import br.com.dhnews.view.MainActivity; public class DetalheLerDepoisActivity extends AppCompatActivity { @@ -96,7 +96,7 @@ public void onClick(View v) { //Chama a Main Activity que verifica qual opcao do Menu Principal foi acionado para //chamar a tela/fragmento correspondente Intent intentListaLerDepois = new Intent( - DetalheLerDepoisActivity.this, MainActivy.class); + DetalheLerDepoisActivity.this, MainActivity.class); //Chama o fragmento da tela de Noticias Ler depois(atraves de um flag 'Tela' // com valor 'LERDEPOIS') para retornar para a lista de noticias ler depois @@ -172,7 +172,7 @@ public void onClick(DialogInterface dialog, int which) { //Chama a Main Activity que verifica qual opcao do Menu Principal foi // acionado para chamar a tela/fragmento correspondente Intent intentListaNoticias = new Intent( - DetalheLerDepoisActivity.this, MainActivy.class); + DetalheLerDepoisActivity.this, MainActivity.class); //Chama o fragmento da tela de Noticias(atraves de um flag 'Tela' com valor //'Noticia') para retornar para a lista de noticias diff --git a/app/src/main/java/br/com/dhnews/lerdepois/views/LerDepoisActivity.java b/app/src/main/java/br/com/dhnews/lerdepois/views/LerDepoisActivity.java index aad054f..892a49c 100644 --- a/app/src/main/java/br/com/dhnews/lerdepois/views/LerDepoisActivity.java +++ b/app/src/main/java/br/com/dhnews/lerdepois/views/LerDepoisActivity.java @@ -1,8 +1,8 @@ package br.com.dhnews.lerdepois.views; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v7.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.appcompat.app.AppCompatActivity; import br.com.dhnews.R; diff --git a/app/src/main/java/br/com/dhnews/lerdepois/views/LerDepoisFragment.java b/app/src/main/java/br/com/dhnews/lerdepois/views/LerDepoisFragment.java index 0a467ab..1ae333f 100644 --- a/app/src/main/java/br/com/dhnews/lerdepois/views/LerDepoisFragment.java +++ b/app/src/main/java/br/com/dhnews/lerdepois/views/LerDepoisFragment.java @@ -3,9 +3,9 @@ import android.content.Intent; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/br/com/dhnews/model/Article.java b/app/src/main/java/br/com/dhnews/model/Article.java new file mode 100644 index 0000000..31fe0bb --- /dev/null +++ b/app/src/main/java/br/com/dhnews/model/Article.java @@ -0,0 +1,102 @@ + +package br.com.dhnews.model; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.google.gson.annotations.Expose; + + +public class Article implements Parcelable { + + @Expose + private Object author; + @Expose + private String content; + @Expose + private String description; + @Expose + private String publishedAt; + @Expose + private Source source; + @Expose + private String title; + @Expose + private String url; + @Expose + private String urlToImage; + + public Object getAuthor() { + return author; + } + + public void setAuthor(Object author) { + this.author = author; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getPublishedAt() { + return publishedAt; + } + + public void setPublishedAt(String publishedAt) { + this.publishedAt = publishedAt; + } + + public Source getSource() { + return source; + } + + public void setSource(Source source) { + this.source = source; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getUrlToImage() { + return urlToImage; + } + + public void setUrlToImage(String urlToImage) { + this.urlToImage = urlToImage; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + + } +} diff --git a/app/src/main/java/br/com/dhnews/model/NoticiasResponse.java b/app/src/main/java/br/com/dhnews/model/NoticiasResponse.java new file mode 100644 index 0000000..b08e9b7 --- /dev/null +++ b/app/src/main/java/br/com/dhnews/model/NoticiasResponse.java @@ -0,0 +1,41 @@ + +package br.com.dhnews.model; + +import java.util.List; +import com.google.gson.annotations.Expose; + + +public class NoticiasResponse { + + @Expose + private List
articles; + @Expose + private String status; + @Expose + private Long totalResults; + + public List
getArticles() { + return articles; + } + + public void setArticles(List
articles) { + this.articles = articles; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Long getTotalResults() { + return totalResults; + } + + public void setTotalResults(Long totalResults) { + this.totalResults = totalResults; + } + +} diff --git a/app/src/main/java/br/com/dhnews/model/Source.java b/app/src/main/java/br/com/dhnews/model/Source.java new file mode 100644 index 0000000..49eb28c --- /dev/null +++ b/app/src/main/java/br/com/dhnews/model/Source.java @@ -0,0 +1,30 @@ + +package br.com.dhnews.model; + +import com.google.gson.annotations.Expose; + + +public class Source { + + @Expose + private Object id; + @Expose + private String name; + + public Object getId() { + return id; + } + + public void setId(Object id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/app/src/main/java/br/com/dhnews/network/API.java b/app/src/main/java/br/com/dhnews/network/API.java new file mode 100644 index 0000000..de9577e --- /dev/null +++ b/app/src/main/java/br/com/dhnews/network/API.java @@ -0,0 +1,17 @@ +package br.com.dhnews.network; + +import br.com.dhnews.model.NoticiasResponse; +import io.reactivex.Single; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface API { + + @GET("top-headlines?") + Single getNoticias(@Query("country") String country, + @Query("apikey") String apikey + // @Query("title") String title + ); + + +} diff --git a/app/src/main/java/br/com/dhnews/network/ApiService.java b/app/src/main/java/br/com/dhnews/network/ApiService.java new file mode 100644 index 0000000..fafb57e --- /dev/null +++ b/app/src/main/java/br/com/dhnews/network/ApiService.java @@ -0,0 +1,61 @@ +package br.com.dhnews.network; + + +import com.facebook.stetho.okhttp3.StethoInterceptor; + +import java.util.concurrent.TimeUnit; + +import br.com.dhnews.BuildConfig; +import okhttp3.OkHttpClient; +import okhttp3.logging.HttpLoggingInterceptor; +import retrofit2.Retrofit; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; +import retrofit2.converter.gson.GsonConverterFactory; + +public class ApiService { + + // Url da api + + private static final String BASE_URL = "https://newsapi.org/"; + public static final String PUBLIC_KEY = "47bee8f305194e94973f8881bf183b87"; + + + // Instancia que criaremos do retrofit + private static Retrofit retrofit; + + private static Retrofit getRetrofit() { + + if (retrofit == null) { + + // configurações da conexão + OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); + httpClient.readTimeout(30, TimeUnit.SECONDS); + httpClient.connectTimeout(30, TimeUnit.SECONDS); + httpClient.writeTimeout(30, TimeUnit.SECONDS); + + // Se for Debug habilitamos os logs + if (BuildConfig.DEBUG) { + HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); + httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); + httpClient.addInterceptor(httpLoggingInterceptor); + httpClient.addNetworkInterceptor(new StethoInterceptor()); + } + + // Inicializamos o retrofit + retrofit = new Retrofit.Builder() + .baseUrl(BASE_URL) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .addConverterFactory(GsonConverterFactory.create()) + .client(httpClient.build()) + .build(); + } + + return retrofit; + } + + // Retornamos a instancia da API criada com o retrofit + public static API getApiService() { + return getRetrofit().create(API.class); + } + +} diff --git a/app/src/main/java/br/com/dhnews/noticias/NoticiasFragment.java b/app/src/main/java/br/com/dhnews/noticias/NoticiasFragment.java deleted file mode 100644 index 65ea88c..0000000 --- a/app/src/main/java/br/com/dhnews/noticias/NoticiasFragment.java +++ /dev/null @@ -1,104 +0,0 @@ -package br.com.dhnews.noticias; - - -import android.content.Intent; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import java.util.ArrayList; -import java.util.List; - -import br.com.dhnews.interfaces.RecyclerViewClickListener; -import br.com.dhnews.R; -import br.com.dhnews.adapters.NoticiasAdapter; -import br.com.dhnews.detalhenoticia.DetalheNoticiaActivity; -import br.com.dhnews.model.Noticias; -import br.com.dhnews.model.Usuario; -import br.com.dhnews.view.MainActivy; - -/** - * A simple {@link Fragment} subclass. - */ -public class NoticiasFragment extends Fragment implements RecyclerViewClickListener { - - public NoticiasFragment() { - // Required empty public constructor - } - - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - - View view = inflater.inflate(R.layout.fragment_noticias, container, false); - - // Add findViewById para recycler - RecyclerView recyclerViewNoticias = view.findViewById(R.id.listaNoticiasRecyclerView); - - // Configurar recyclerview e adapater - NoticiasAdapter adapter = new NoticiasAdapter(getNoticias(), this); - - recyclerViewNoticias.setLayoutManager(new LinearLayoutManager(getContext())); - recyclerViewNoticias.setAdapter(adapter); - - return view; - } - - private List getNoticias() { - - List noticias = new ArrayList<>(); - - noticias.add(new Noticias("Vaga no Supremo", - "Bolsonaro nega que tenha feito 'acordo' para indicar Moro ao STF.", - "Há 2 horas — ", "Política", R.drawable.imagenoticias01)); - - noticias.add(new Noticias("Investigação no RJ", - "'Querem me atingir', diz Bolsonaro sobre quebra do sigilo de Flávio.", - "Há 2 horas — ", "Política", R.drawable.imagenoticias02)); - - noticias.add(new Noticias("Educação", - "Presidente do Inep pede demissão após menos de 1 mês no cargo.", - "Há 2 horas — ", "Educação", R.drawable.imagenoticia03)); - - noticias.add(new Noticias("Economia", - "Dólar fecha a R$ 4,03 e bolsa atinge menor pontuação do ano.", - "Há 5 horas — ", "Economia", R.drawable.imagenoticia04)); - - noticias.add(new Noticias("Vaga no Supremo", - "Bolsonaro nega que tenha feito 'acordo' para indicar Moro ao STF.", - "Há 2 horas — ", "Política", R.drawable.imagenoticias01)); - - noticias.add(new Noticias("Educação", - "Presidente do Inep pede demissão após menos de 1 mês no cargo.", - "Há 2 horas — ", "Educação", R.drawable.imagenoticia03)); - - return noticias; - } - - @Override - public void onClick(Noticias noticias) { - - Intent intent = new Intent(getContext(), DetalheNoticiaActivity.class); - - intent.putExtra("NOTICIAS", noticias); - - startActivity(intent); - - } - - @Override - public void onClick(Usuario usuario) { - - Intent intentLogin = new Intent(getContext(), MainActivy.class); - - intentLogin.putExtra("TELA", "LOGIN"); - - startActivity(intentLogin); - - } -} \ No newline at end of file diff --git a/app/src/main/java/br/com/dhnews/repository/NoticiasRepository.java b/app/src/main/java/br/com/dhnews/repository/NoticiasRepository.java new file mode 100644 index 0000000..d2e6a3a --- /dev/null +++ b/app/src/main/java/br/com/dhnews/repository/NoticiasRepository.java @@ -0,0 +1,15 @@ +package br.com.dhnews.repository; + +import br.com.dhnews.model.NoticiasResponse; +import br.com.dhnews.network.ApiService; +import io.reactivex.Single; + +import static br.com.dhnews.network.ApiService.PUBLIC_KEY; + +public class NoticiasRepository { + + public Single getNoticias() { + return ApiService.getApiService().getNoticias("br", PUBLIC_KEY); + + } +} diff --git a/app/src/main/java/br/com/dhnews/util/AppUtil.java b/app/src/main/java/br/com/dhnews/util/AppUtil.java new file mode 100644 index 0000000..48a9d9b --- /dev/null +++ b/app/src/main/java/br/com/dhnews/util/AppUtil.java @@ -0,0 +1,22 @@ +package br.com.dhnews.util; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; + +public class AppUtil { + + // Verifica se temos conexão com internet + public static boolean isNetworkConnected(Context context) { + ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo networkInfo; +// +// if (connectivityManager != null) { +// networkInfo = connectivityManager.getActiveNetworkInfo(); +// return networkInfo != null && networkInfo.isConnected() && +// (networkInfo.getType() == ConnectivityManager.TYPE_WIFI +// || networkInfo.getType() == ConnectivityManager.TYPE_MOBILE); +// } + return false; + } +} diff --git a/app/src/main/java/br/com/dhnews/cadastro/CadastroFragment.java b/app/src/main/java/br/com/dhnews/view/CadastroFragment.java similarity index 89% rename from app/src/main/java/br/com/dhnews/cadastro/CadastroFragment.java rename to app/src/main/java/br/com/dhnews/view/CadastroFragment.java index d628b84..f6099e0 100644 --- a/app/src/main/java/br/com/dhnews/cadastro/CadastroFragment.java +++ b/app/src/main/java/br/com/dhnews/view/CadastroFragment.java @@ -1,20 +1,20 @@ -package br.com.dhnews.cadastro; +package br.com.dhnews.view; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.design.widget.TextInputLayout; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.material.textfield.TextInputLayout; +import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; -import br.com.dhnews.view.MainActivy; +import br.com.dhnews.view.MainActivity; import br.com.dhnews.R; -import br.com.dhnews.home.HomeFragment; +import br.com.dhnews.view.HomeFragment; /** * A simple {@link Fragment} subclass. @@ -93,7 +93,7 @@ public void onClick(View v) { if (!(nomeCadastro.isEmpty()) && !(emailCadastro.isEmpty()) && !(senhaCadastro.isEmpty())) { - ((MainActivy) getActivity()).replaceFragment(new HomeFragment()); + ((MainActivity) getActivity()).replaceFragment(new HomeFragment()); } } diff --git a/app/src/main/java/br/com/dhnews/detalhenoticia/DetalheNoticiaActivity.java b/app/src/main/java/br/com/dhnews/view/DetalheNoticiaActivity.java similarity index 95% rename from app/src/main/java/br/com/dhnews/detalhenoticia/DetalheNoticiaActivity.java rename to app/src/main/java/br/com/dhnews/view/DetalheNoticiaActivity.java index 790b714..56b9242 100644 --- a/app/src/main/java/br/com/dhnews/detalhenoticia/DetalheNoticiaActivity.java +++ b/app/src/main/java/br/com/dhnews/view/DetalheNoticiaActivity.java @@ -1,14 +1,13 @@ -package br.com.dhnews.detalhenoticia; +package br.com.dhnews.view; import android.content.Intent; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import br.com.dhnews.model.Noticias; -import br.com.dhnews.view.MainActivy; import br.com.dhnews.R; public class DetalheNoticiaActivity extends AppCompatActivity { @@ -93,7 +92,7 @@ public void onClick(View v) { //Chama a Main Activity que verifica qual opcao do Menu Principal foi acionado para //chamar a tela/fragmento correspondente Intent intentListaNoticias = new Intent( - DetalheNoticiaActivity.this, MainActivy.class); + DetalheNoticiaActivity.this, MainActivity.class); //Chama o fragmento da tela de Noticias(atraves de um flag 'Tela' com valor //'Noticia') para retornar para a lista de noticias @@ -136,7 +135,7 @@ public void onClick(View v) { //Chama a Main Activity que verifica qual opcao do Menu Principal foi acionado para //chamar a tela/fragmento correspondente Intent intentLerDepois = new Intent( - DetalheNoticiaActivity.this, MainActivy.class); + DetalheNoticiaActivity.this, MainActivity.class); //Chama o fragmento da tela de LoginFragment(atraves de um flag 'Tela' com valor 'LoginFragment') //para cadastrar o ler noticia depois diff --git a/app/src/main/java/br/com/dhnews/home/HomeFragment.java b/app/src/main/java/br/com/dhnews/view/HomeFragment.java similarity index 85% rename from app/src/main/java/br/com/dhnews/home/HomeFragment.java rename to app/src/main/java/br/com/dhnews/view/HomeFragment.java index 1fe1d57..4244a6c 100644 --- a/app/src/main/java/br/com/dhnews/home/HomeFragment.java +++ b/app/src/main/java/br/com/dhnews/view/HomeFragment.java @@ -1,11 +1,11 @@ -package br.com.dhnews.home; +package br.com.dhnews.view; import android.content.Intent; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -15,11 +15,9 @@ import br.com.dhnews.interfaces.RecyclerViewClickListener; import br.com.dhnews.R; -import br.com.dhnews.adapters.NoticiasAdapter; -import br.com.dhnews.detalhenoticia.DetalheNoticiaActivity; +import br.com.dhnews.adapters.RecyclerViewNoticiasAdapter; import br.com.dhnews.model.Noticias; import br.com.dhnews.model.Usuario; -import br.com.dhnews.view.MainActivy; /** @@ -42,10 +40,11 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, RecyclerView recyclerViewNoticias = view.findViewById(R.id.listaNoticiasRecyclerView); // Configurar recyclerview e adapater - NoticiasAdapter adapter = new NoticiasAdapter(getNoticias(), this); + RecyclerViewNoticiasAdapter adapter; + // adapter = new RecyclerViewNoticiasAdapter(getNoticias()); recyclerViewNoticias.setLayoutManager(new LinearLayoutManager(getContext())); - recyclerViewNoticias.setAdapter(adapter); + // recyclerViewNoticias.setAdapter(adapter); return view; } @@ -95,7 +94,7 @@ public void onClick(Noticias noticias) { @Override public void onClick(Usuario usuario) { - Intent intentLogin = new Intent(getContext(), MainActivy.class); + Intent intentLogin = new Intent(getContext(), MainActivity.class); intentLogin.putExtra("TELA", "LOGIN"); diff --git a/app/src/main/java/br/com/dhnews/login/LoginFragment.java b/app/src/main/java/br/com/dhnews/view/LoginFragment.java similarity index 85% rename from app/src/main/java/br/com/dhnews/login/LoginFragment.java rename to app/src/main/java/br/com/dhnews/view/LoginFragment.java index 2b5f841..3b71cb0 100644 --- a/app/src/main/java/br/com/dhnews/login/LoginFragment.java +++ b/app/src/main/java/br/com/dhnews/view/LoginFragment.java @@ -1,24 +1,20 @@ -package br.com.dhnews.login; +package br.com.dhnews.view; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.design.widget.TextInputLayout; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.material.textfield.TextInputLayout; +import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; -import br.com.dhnews.view.MainActivy; -import br.com.dhnews.noticias.NoticiasFragment; import br.com.dhnews.R; -import br.com.dhnews.cadastro.CadastroFragment; -import br.com.dhnews.usuario.view.UsuarioActivity; import static android.content.Context.MODE_PRIVATE; @@ -89,7 +85,7 @@ public void onClick(View v) { Intent intent = new Intent(getContext(), UsuarioActivity.class); startActivity(intent); - ((MainActivy) getActivity()).replaceFragment(new NoticiasFragment()); + ((MainActivity) getActivity()).replaceFragment(new NoticiasFragment()); } } @@ -99,7 +95,7 @@ public void onClick(View v) { @Override public void onClick(View v) { - ((MainActivy) getActivity()).replaceFragment(new CadastroFragment()); + ((MainActivity) getActivity()).replaceFragment(new CadastroFragment()); } }); diff --git a/app/src/main/java/br/com/dhnews/view/MainActivy.java b/app/src/main/java/br/com/dhnews/view/MainActivity.java similarity index 82% rename from app/src/main/java/br/com/dhnews/view/MainActivy.java rename to app/src/main/java/br/com/dhnews/view/MainActivity.java index 5f4a600..3aa0efd 100644 --- a/app/src/main/java/br/com/dhnews/view/MainActivy.java +++ b/app/src/main/java/br/com/dhnews/view/MainActivity.java @@ -1,22 +1,18 @@ package br.com.dhnews.view; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.design.widget.BottomNavigationView; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentTransaction; -import android.support.v7.app.AppCompatActivity; +import androidx.annotation.NonNull; +import com.google.android.material.bottomnavigation.BottomNavigationView; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; +import androidx.appcompat.app.AppCompatActivity; import android.view.MenuItem; -import br.com.dhnews.login.LoginFragment; -import br.com.dhnews.noticias.NoticiasFragment; -import br.com.dhnews.pesquisa.PesquisaFragment; import br.com.dhnews.R; -import br.com.dhnews.home.HomeFragment; import br.com.dhnews.lerdepois.views.LerDepoisFragment; -public class MainActivy extends AppCompatActivity { +public class MainActivity extends AppCompatActivity { private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() { diff --git a/app/src/main/java/br/com/dhnews/view/NoticiasFragment.java b/app/src/main/java/br/com/dhnews/view/NoticiasFragment.java new file mode 100644 index 0000000..b628b81 --- /dev/null +++ b/app/src/main/java/br/com/dhnews/view/NoticiasFragment.java @@ -0,0 +1,182 @@ +package br.com.dhnews.view; + + +import android.content.Intent; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProviders; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import java.util.ArrayList; +import java.util.List; + +import br.com.dhnews.interfaces.RecyclerViewClickListener; +import br.com.dhnews.R; +import br.com.dhnews.adapters.RecyclerViewNoticiasAdapter; +import br.com.dhnews.model.Article; +import br.com.dhnews.model.Noticias; +import br.com.dhnews.model.Usuario; +import br.com.dhnews.viewmodel.NoticiasViewModel; + +/** + * A simple {@link Fragment} subclass. + */ +public class NoticiasFragment extends Fragment implements RecyclerViewClickListener { + + private List
noticiasList = new ArrayList<>(); + private RecyclerViewNoticiasAdapter noticiasAdapter; + private RecyclerView recyclerView; + private NoticiasViewModel viewModel; + + + + public NoticiasFragment() { + // Required empty public constructor + } + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + + View view = inflater.inflate(R.layout.fragment_noticias, container, false); + +// // Inicialização do DAO +// DatabaseRoom databaseRoom = DatabaseRoom.getDatabase(getContext()); +// dao = databaseRoom.noticiasDAO(); + + // Add findViewById para recycler + RecyclerView recyclerViewNoticias = view.findViewById(R.id.listaNoticiasRecyclerView); + + // Configurar recyclerview e adapater + RecyclerViewNoticiasAdapter adapter = new RecyclerViewNoticiasAdapter(noticiasList); + + // dao = DatabaseRoom.getDatabase(getContext()).noticiasDAO(); + + + recyclerViewNoticias.setLayoutManager(new LinearLayoutManager(getContext())); + recyclerViewNoticias.setAdapter(adapter); + + viewModel = ViewModelProviders.of(this).get(NoticiasViewModel.class); + + viewModel.getNoticias(); + + viewModel.getResults().observe(this, results -> + noticiasAdapter.update + (results)); + + return view; + } + + @Override + public void onClick(Noticias noticias) { + + } + + @Override + public void onClick(Usuario usuario) { + + } + + // private List getNoticias() { +// +// List noticias = new ArrayList<>(); +// +// noticias.add(new Noticias("Vaga no Supremo", +// "Bolsonaro nega que tenha feito 'acordo' para indicar Moro ao STF.", +// "Há 2 horas — ", "Política", R.drawable.imagenoticias01)); +// +// noticias.add(new Noticias("Investigação no RJ", +// "'Querem me atingir', diz Bolsonaro sobre quebra do sigilo de Flávio.", +// "Há 2 horas — ", "Política", R.drawable.imagenoticias02)); +// +// noticias.add(new Noticias("Educação", +// "Presidente do Inep pede demissão após menos de 1 mês no cargo.", +// "Há 2 horas — ", "Educação", R.drawable.imagenoticia03)); +// +// noticias.add(new Noticias("Economia", +// "Dólar fecha a R$ 4,03 e bolsa atinge menor pontuação do ano.", +// "Há 5 horas — ", "Economia", R.drawable.imagenoticia04)); +// +// noticias.add(new Noticias("Vaga no Supremo", +// "Bolsonaro nega que tenha feito 'acordo' para indicar Moro ao STF.", +// "Há 2 horas — ", "Política", R.drawable.imagenoticias01)); +// +// noticias.add(new Noticias("Educação", +// "Presidente do Inep pede demissão após menos de 1 mês no cargo.", +// "Há 2 horas — ", "Educação", R.drawable.imagenoticia03)); +// +// return noticias; +// } +// public void buscarTodasNoticias() { +// +// dao.getAllRxJava() +// .subscribeOn(Schedulers.newThread()) +// .observeOn(AndroidSchedulers.mainThread()) +// .subscribe(new Consumer>() { +// @Override +// public void accept(List contatos) throws Exception { +// adapter.update(noticiasList, noticiasList2); +// } +// }, new Consumer() { +// @Override +// public void accept(Throwable throwable) throws Exception { +// Log.i("TAG", "buscarTodosNoticias: " + throwable.getMessage()); +// } +// }); +// } +// +// @Override +// public void onClick(Noticias noticias) { +// +// Intent intent = new Intent(getContext(), DetalheNoticiaActivity.class); +// +// intent.putExtra("NOTICIAS", "DETALHE"); +// +// startActivity(intent); +// +// } +// +// @Override +// public void onClick(Usuario usuario) { +// +// Intent intentLogin = new Intent(getContext(), MainActivy.class); +// +// intentLogin.putExtra("TELA", "LOGIN"); +// +// startActivity(intentLogin); +// +// } + + + private void setScrollListener() { + recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + } + + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + + LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager(); + int totalItemCount = manager.getItemCount(); + int lastVisible = manager.findLastVisibleItemPosition(); + + boolean fimFoiEncontrado = lastVisible + 5 >= totalItemCount; + +// if (totalItemCount > 0 && fimFoiEncontrado) { +// pagina++; +// viewModel.searchItem(itemBusca, pagina, limite); +// } + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/br/com/dhnews/pesquisa/PesquisaFragment.java b/app/src/main/java/br/com/dhnews/view/PesquisaFragment.java similarity index 88% rename from app/src/main/java/br/com/dhnews/pesquisa/PesquisaFragment.java rename to app/src/main/java/br/com/dhnews/view/PesquisaFragment.java index 42b0a7d..94dcb68 100644 --- a/app/src/main/java/br/com/dhnews/pesquisa/PesquisaFragment.java +++ b/app/src/main/java/br/com/dhnews/view/PesquisaFragment.java @@ -1,10 +1,10 @@ -package br.com.dhnews.pesquisa; +package br.com.dhnews.view; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v7.widget.SearchView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.appcompat.widget.SearchView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/br/com/dhnews/splash/Splash.java b/app/src/main/java/br/com/dhnews/view/SplashActivity.java similarity index 79% rename from app/src/main/java/br/com/dhnews/splash/Splash.java rename to app/src/main/java/br/com/dhnews/view/SplashActivity.java index 7445f8a..dc82635 100644 --- a/app/src/main/java/br/com/dhnews/splash/Splash.java +++ b/app/src/main/java/br/com/dhnews/view/SplashActivity.java @@ -1,7 +1,7 @@ -package br.com.dhnews.splash; +package br.com.dhnews.view; import android.content.Intent; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ImageView; @@ -9,10 +9,9 @@ import java.util.Timer; import java.util.TimerTask; -import br.com.dhnews.view.MainActivy; import br.com.dhnews.R; -public class Splash extends AppCompatActivity { +public class SplashActivity extends AppCompatActivity { private Timer timer = new Timer(); @@ -41,7 +40,7 @@ public void run() { private void jump() { timer.cancel(); - Intent intent = new Intent(Splash.this, MainActivy.class); + Intent intent = new Intent(SplashActivity.this, MainActivity.class); startActivity(intent); finish(); } diff --git a/app/src/main/java/br/com/dhnews/usuario/view/UsuarioActivity.java b/app/src/main/java/br/com/dhnews/view/UsuarioActivity.java similarity index 93% rename from app/src/main/java/br/com/dhnews/usuario/view/UsuarioActivity.java rename to app/src/main/java/br/com/dhnews/view/UsuarioActivity.java index c9aa5a3..498fb8c 100644 --- a/app/src/main/java/br/com/dhnews/usuario/view/UsuarioActivity.java +++ b/app/src/main/java/br/com/dhnews/view/UsuarioActivity.java @@ -1,17 +1,16 @@ -package br.com.dhnews.usuario.view; +package br.com.dhnews.view; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.TextView; -import br.com.dhnews.view.MainActivy; import br.com.dhnews.R; public class UsuarioActivity extends AppCompatActivity { @@ -75,7 +74,7 @@ public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) { //Ao clicar em Desconectar, vai para Home(main activity) - Intent intent = new Intent(UsuarioActivity.this, MainActivy.class); + Intent intent = new Intent(UsuarioActivity.this, MainActivity.class); startActivity(intent); } @@ -85,7 +84,7 @@ public void onClick(DialogInterface dialog, int which) { } public void botaoVoltar() { - Intent intent = new Intent(UsuarioActivity.this, MainActivy.class); + Intent intent = new Intent(UsuarioActivity.this, MainActivity.class); startActivity(intent); } diff --git a/app/src/main/java/br/com/dhnews/viewmodel/NoticiasViewModel.java b/app/src/main/java/br/com/dhnews/viewmodel/NoticiasViewModel.java new file mode 100644 index 0000000..1ec6fed --- /dev/null +++ b/app/src/main/java/br/com/dhnews/viewmodel/NoticiasViewModel.java @@ -0,0 +1,62 @@ +package br.com.dhnews.viewmodel; + +import android.app.Application; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.lifecycle.AndroidViewModel; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; + +import java.util.List; + +import br.com.dhnews.model.Article; +import br.com.dhnews.repository.NoticiasRepository; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; + +public class NoticiasViewModel extends AndroidViewModel { + + private MutableLiveData> resultLiveData = new MutableLiveData<>(); + private CompositeDisposable disposable = new CompositeDisposable(); + private NoticiasRepository repository = new NoticiasRepository(); + private MutableLiveData loadingLiveData = new MutableLiveData<>(); + private MutableLiveData errorLiveData = new MutableLiveData<>(); + + + + public NoticiasViewModel(@NonNull Application application) { + super(application); + } + + public LiveData getErrorLiveData() { + + return errorLiveData; + + } + + public LiveData> getResults() { + return resultLiveData; + } + + public LiveData Loading(){ + return loadingLiveData; + } + + public void getNoticias() { + + disposable.add(repository.getNoticias() + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .doOnSubscribe((Disposable disposable) -> + loadingLiveData.setValue(true)) + .doAfterTerminate(() -> loadingLiveData.setValue(false)) + .subscribe(noticiasResponse -> resultLiveData.setValue(noticiasResponse.getArticles()) + , throwable -> { + Log.i("LOG", "Error: " + throwable.getMessage()); + })); + } + +} diff --git a/app/src/main/res/layout/activity_cadastro.xml b/app/src/main/res/layout/activity_cadastro.xml index 3962c84..fda457b 100644 --- a/app/src/main/res/layout/activity_cadastro.xml +++ b/app/src/main/res/layout/activity_cadastro.xml @@ -1,11 +1,11 @@ - + tools:context=".view.CadastroFragment"> - - - + - - - + - - - +