From 376d0a256c077d9774684efc6a8c08033a4384f3 Mon Sep 17 00:00:00 2001 From: Alice Yuan Date: Mon, 3 May 2021 20:29:28 -1000 Subject: [PATCH 1/4] Convert initial lab1 to kotlin --- app/build.gradle | 25 +++-- .../BestSellerBooksFragment.java | 93 ------------------- .../BestSellerBooksFragment.kt | 66 +++++++++++++ .../BestSellerBooksRecyclerViewAdapter.java | 76 --------------- .../BestSellerBooksRecyclerViewAdapter.kt | 53 +++++++++++ .../bestsellerlistapp/MainActivity.java | 19 ---- .../bestsellerlistapp/MainActivity.kt | 16 ++++ .../OnListFragmentInteractionListener.java | 8 -- .../OnListFragmentInteractionListener.kt | 7 ++ .../models/BestSellerBook.java | 27 ------ .../models/BestSellerBook.kt | 28 ++++++ .../models/BestSellerResults.java | 14 --- .../models/BestSellerResults.kt | 12 +++ .../models/NYTimesAPIResponse.java | 12 --- .../models/NYTimesAPIResponse.kt | 12 +++ .../networking/CallbackResponse.java | 7 -- .../networking/CallbackResponse.kt | 7 ++ .../networking/NYTimesApiClient.java | 61 ------------ .../networking/NYTimesApiClient.kt | 59 ++++++++++++ .../networking/NYTimesService.java | 14 --- .../networking/NYTimesService.kt | 15 +++ build.gradle | 8 +- gradle/wrapper/gradle-wrapper.properties | 4 +- 23 files changed, 299 insertions(+), 344 deletions(-) delete mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/BestSellerBooksFragment.java create mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/BestSellerBooksFragment.kt delete mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/BestSellerBooksRecyclerViewAdapter.java create mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/BestSellerBooksRecyclerViewAdapter.kt delete mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/MainActivity.java create mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/MainActivity.kt delete mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/OnListFragmentInteractionListener.java create mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/OnListFragmentInteractionListener.kt delete mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/models/BestSellerBook.java create mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/models/BestSellerBook.kt delete mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/models/BestSellerResults.java create mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/models/BestSellerResults.kt delete mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/models/NYTimesAPIResponse.java create mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/models/NYTimesAPIResponse.kt delete mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/networking/CallbackResponse.java create mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/networking/CallbackResponse.kt delete mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesApiClient.java create mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesApiClient.kt delete mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesService.java create mode 100644 app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesService.kt diff --git a/app/build.gradle b/app/build.gradle index ef6d929..6539e3e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,13 +1,14 @@ apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' android { - compileSdkVersion 29 + compileSdkVersion 30 buildToolsVersion "29.0.3" defaultConfig { applicationId "com.codepath.uiandgitlab" minSdkVersion 19 - targetSdkVersion 29 + targetSdkVersion 30 versionCode 1 versionName "1.0" @@ -20,16 +21,24 @@ 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 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - implementation 'com.squareup.retrofit2:retrofit:2.1.0' - implementation 'com.squareup.retrofit2:converter-gson:2.1.0' + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'androidx.recyclerview:recyclerview:1.1.0' + implementation 'androidx.recyclerview:recyclerview:1.2.0' + implementation "androidx.core:core-ktx:1.3.2" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} +repositories { + mavenCentral() } diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/BestSellerBooksFragment.java b/app/src/main/java/com/codepath/bestsellerlistapp/BestSellerBooksFragment.java deleted file mode 100644 index e6293c6..0000000 --- a/app/src/main/java/com/codepath/bestsellerlistapp/BestSellerBooksFragment.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.codepath.bestsellerlistapp; - -import android.content.Context; -import android.os.Bundle; - -import androidx.core.widget.ContentLoadingProgressBar; -import androidx.fragment.app.Fragment; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Toast; - -import com.codepath.bestsellerlistapp.models.BestSellerBook; -import com.codepath.bestsellerlistapp.networking.CallbackResponse; -import com.codepath.bestsellerlistapp.networking.NYTimesApiClient; - -import java.util.List; - -/** - * A fragment representing a list of Items. - */ -public class BestSellerBooksFragment extends Fragment implements OnListFragmentInteractionListener{ - - /** - * Mandatory empty constructor for the fragment manager to instantiate the - * fragment (e.g. upon screen orientation changes). - */ - public BestSellerBooksFragment() { - } - - @SuppressWarnings("unused") - public static BestSellerBooksFragment newInstance(int columnCount) { - BestSellerBooksFragment fragment = new BestSellerBooksFragment(); - Bundle args = new Bundle(); - fragment.setArguments(args); - return fragment; - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_best_seller_books_list, container, false); - ContentLoadingProgressBar progressBar = (ContentLoadingProgressBar) view.findViewById(R.id.progress); - RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.list); - - Context context = view.getContext(); - recyclerView.setLayoutManager(new GridLayoutManager(context, 2)); - updateAdapter(progressBar, recyclerView); - return view; - } - - - private void updateAdapter(final ContentLoadingProgressBar progressBar, final RecyclerView recyclerView) { - progressBar.show(); - NYTimesApiClient nyTimesApiClient = new NYTimesApiClient(); - nyTimesApiClient.getBestSellersList(new CallbackResponse>() { - @Override - public void onSuccess(List models) { - progressBar.hide(); - recyclerView.setAdapter(new BestSellerBooksRecyclerViewAdapter(models, BestSellerBooksFragment.this)); - Log.d("BestSellerBooksFragment", "response successful"); - } - - @Override - public void onFailure(Throwable error) { - progressBar.hide(); - Log.e("BestSellerBooksFragment", error.getMessage()); - } - }); - - } - - - @Override - public void onAttach(Context context) { - super.onAttach(context); - } - - @Override - public void onDetach() { - super.onDetach(); - } - - @Override - public void onItemClick(BestSellerBook item) { - Toast.makeText(getContext(), "test", Toast.LENGTH_LONG).show(); - } -} diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/BestSellerBooksFragment.kt b/app/src/main/java/com/codepath/bestsellerlistapp/BestSellerBooksFragment.kt new file mode 100644 index 0000000..6edcff2 --- /dev/null +++ b/app/src/main/java/com/codepath/bestsellerlistapp/BestSellerBooksFragment.kt @@ -0,0 +1,66 @@ +package com.codepath.bestsellerlistapp + +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.core.widget.ContentLoadingProgressBar +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.codepath.bestsellerlistapp.R.layout +import com.codepath.bestsellerlistapp.models.BestSellerBook +import com.codepath.bestsellerlistapp.networking.CallbackResponse +import com.codepath.bestsellerlistapp.networking.NYTimesApiClient + +/** + * A fragment representing a list of Items. + */ +class BestSellerBooksFragment : Fragment(), OnListFragmentInteractionListener { + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val view = inflater.inflate(layout.fragment_best_seller_books_list, container, false) + val progressBar = view.findViewById(R.id.progress) as ContentLoadingProgressBar + val recyclerView = view.findViewById(R.id.list) as RecyclerView + val context = view.context + recyclerView.layoutManager = GridLayoutManager(context, 2) + updateAdapter(progressBar, recyclerView) + return view + } + + private fun updateAdapter(progressBar: ContentLoadingProgressBar, recyclerView: RecyclerView) { + progressBar.show() + val nyTimesApiClient = NYTimesApiClient() + nyTimesApiClient.getBestSellersList(object : CallbackResponse> { + override fun onSuccess(models: List) { + progressBar.hide() + recyclerView.adapter = BestSellerBooksRecyclerViewAdapter(models, this@BestSellerBooksFragment) + Log.d("BestSellerBooksFragment", "response successful") + } + + override fun onFailure(error: Throwable?) { + progressBar.hide() + error?.message?.let { message -> + Log.e("BestSellerBooksFragment", message) + } + } + }) + } + + override fun onItemClick(item: BestSellerBook) { + Toast.makeText(context, "test", Toast.LENGTH_LONG).show() + } + + companion object { + fun newInstance(columnCount: Int): BestSellerBooksFragment { + val fragment = BestSellerBooksFragment() + val args = Bundle() + fragment.arguments = args + return fragment + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/BestSellerBooksRecyclerViewAdapter.java b/app/src/main/java/com/codepath/bestsellerlistapp/BestSellerBooksRecyclerViewAdapter.java deleted file mode 100644 index b958a6e..0000000 --- a/app/src/main/java/com/codepath/bestsellerlistapp/BestSellerBooksRecyclerViewAdapter.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.codepath.bestsellerlistapp; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.recyclerview.widget.RecyclerView; - -import com.codepath.bestsellerlistapp.models.BestSellerBook; - -import java.util.List; - -/** - * {@link RecyclerView.Adapter} that can display a {@link BestSellerBook} and makes a call to the - * specified {@link OnListFragmentInteractionListener}. - */ -public class BestSellerBooksRecyclerViewAdapter extends RecyclerView.Adapter { - - private final List books; - private final OnListFragmentInteractionListener mListener; - - public BestSellerBooksRecyclerViewAdapter(List items, OnListFragmentInteractionListener listener) { - books = items; - mListener = listener; - } - - @Override - public BookViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.fragment_best_seller_book, parent, false); - return new BookViewHolder(view); - } - - @Override - public void onBindViewHolder(final BookViewHolder holder, int position) { - holder.mItem = books.get(position); - holder.mBookTitle.setText(books.get(position).title); - holder.mBookAuthor.setText(books.get(position).author); - - holder.mView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (null != mListener) { - // Notify the active callbacks interface (the activity, if the - // fragment is attached to one) that an item has been selected. - mListener.onItemClick(holder.mItem); - } - } - }); - } - - @Override - public int getItemCount() { - return books.size(); - } - - public class BookViewHolder extends RecyclerView.ViewHolder { - public final View mView; - public final TextView mBookTitle; - public final TextView mBookAuthor; - public BestSellerBook mItem; - - public BookViewHolder(View view) { - super(view); - mView = view; - mBookTitle = (TextView) view.findViewById(R.id.book_title); - mBookAuthor = (TextView) view.findViewById(R.id.book_author); - } - - @Override - public String toString() { - return mBookTitle.toString() + " '" + mBookAuthor.getText() + "'"; - } - } -} diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/BestSellerBooksRecyclerViewAdapter.kt b/app/src/main/java/com/codepath/bestsellerlistapp/BestSellerBooksRecyclerViewAdapter.kt new file mode 100644 index 0000000..a991e0e --- /dev/null +++ b/app/src/main/java/com/codepath/bestsellerlistapp/BestSellerBooksRecyclerViewAdapter.kt @@ -0,0 +1,53 @@ +package com.codepath.bestsellerlistapp + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView.Adapter +import androidx.recyclerview.widget.RecyclerView.ViewHolder +import com.codepath.bestsellerlistapp.BestSellerBooksRecyclerViewAdapter.BookViewHolder +import com.codepath.bestsellerlistapp.R.id +import com.codepath.bestsellerlistapp.R.layout +import com.codepath.bestsellerlistapp.models.BestSellerBook + +/** + * [RecyclerView.Adapter] that can display a [BestSellerBook] and makes a call to the + * specified [OnListFragmentInteractionListener]. + */ +class BestSellerBooksRecyclerViewAdapter( + private val books: List, + private val mListener: OnListFragmentInteractionListener? +) : Adapter() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BookViewHolder { + val view = LayoutInflater.from(parent.context) + .inflate(layout.fragment_best_seller_book, parent, false) + return BookViewHolder(view) + } + + override fun onBindViewHolder(holder: BookViewHolder, position: Int) { + holder.mItem = books[position] + holder.mBookTitle.text = books[position].title + holder.mBookAuthor.text = books[position].author + holder.mView.setOnClickListener { + holder.mItem?.let { book -> + mListener?.onItemClick(book) + } + } + } + + override fun getItemCount(): Int { + return books.size + } + + inner class BookViewHolder(val mView: View) : ViewHolder(mView) { + val mBookTitle: TextView = mView.findViewById(id.book_title) as TextView + val mBookAuthor: TextView = mView.findViewById(id.book_author) as TextView + var mItem: BestSellerBook? = null + + override fun toString(): String { + return mBookTitle.toString() + " '" + mBookAuthor.text + "'" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/MainActivity.java b/app/src/main/java/com/codepath/bestsellerlistapp/MainActivity.java deleted file mode 100644 index 2bdd672..0000000 --- a/app/src/main/java/com/codepath/bestsellerlistapp/MainActivity.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.codepath.bestsellerlistapp; - -import androidx.appcompat.app.AppCompatActivity; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentTransaction; - -import android.os.Bundle; - -public class MainActivity extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - FragmentManager supportFragmentManager = getSupportFragmentManager(); - FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction(); - fragmentTransaction.replace(R.id.content, new BestSellerBooksFragment(), null).commit(); - } -} diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/MainActivity.kt b/app/src/main/java/com/codepath/bestsellerlistapp/MainActivity.kt new file mode 100644 index 0000000..92867d3 --- /dev/null +++ b/app/src/main/java/com/codepath/bestsellerlistapp/MainActivity.kt @@ -0,0 +1,16 @@ +package com.codepath.bestsellerlistapp + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.codepath.bestsellerlistapp.R.id +import com.codepath.bestsellerlistapp.R.layout + +class MainActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(layout.activity_main) + val supportFragmentManager = supportFragmentManager + val fragmentTransaction = supportFragmentManager.beginTransaction() + fragmentTransaction.replace(id.content, BestSellerBooksFragment(), null).commit() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/OnListFragmentInteractionListener.java b/app/src/main/java/com/codepath/bestsellerlistapp/OnListFragmentInteractionListener.java deleted file mode 100644 index b394f73..0000000 --- a/app/src/main/java/com/codepath/bestsellerlistapp/OnListFragmentInteractionListener.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.codepath.bestsellerlistapp; - -import com.codepath.bestsellerlistapp.models.BestSellerBook; - -public interface OnListFragmentInteractionListener { - - void onItemClick(BestSellerBook item); -} diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/OnListFragmentInteractionListener.kt b/app/src/main/java/com/codepath/bestsellerlistapp/OnListFragmentInteractionListener.kt new file mode 100644 index 0000000..5ff2348 --- /dev/null +++ b/app/src/main/java/com/codepath/bestsellerlistapp/OnListFragmentInteractionListener.kt @@ -0,0 +1,7 @@ +package com.codepath.bestsellerlistapp + +import com.codepath.bestsellerlistapp.models.BestSellerBook + +interface OnListFragmentInteractionListener { + fun onItemClick(item: BestSellerBook) +} \ No newline at end of file diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/models/BestSellerBook.java b/app/src/main/java/com/codepath/bestsellerlistapp/models/BestSellerBook.java deleted file mode 100644 index b9da537..0000000 --- a/app/src/main/java/com/codepath/bestsellerlistapp/models/BestSellerBook.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.codepath.bestsellerlistapp.models; - -import com.google.gson.annotations.SerializedName; - -public class BestSellerBook { - - @SerializedName("rank") - public int rank; - - @SerializedName("title") - public String title; - - @SerializedName("author") - public String author; - - @SerializedName("book_image") - public String bookImageUrl; - - @SerializedName("publisher") - public String publisher; - - @SerializedName("description") - public String description; - - @SerializedName("amazon_product_url") - public String amazonUrl; -} diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/models/BestSellerBook.kt b/app/src/main/java/com/codepath/bestsellerlistapp/models/BestSellerBook.kt new file mode 100644 index 0000000..f437ba4 --- /dev/null +++ b/app/src/main/java/com/codepath/bestsellerlistapp/models/BestSellerBook.kt @@ -0,0 +1,28 @@ +package com.codepath.bestsellerlistapp.models + +import com.google.gson.annotations.SerializedName + +class BestSellerBook { + @SerializedName("rank") + var rank = 0 + + @JvmField + @SerializedName("title") + var title: String? = null + + @JvmField + @SerializedName("author") + var author: String? = null + + @SerializedName("book_image") + var bookImageUrl: String? = null + + @SerializedName("publisher") + var publisher: String? = null + + @SerializedName("description") + var description: String? = null + + @SerializedName("amazon_product_url") + var amazonUrl: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/models/BestSellerResults.java b/app/src/main/java/com/codepath/bestsellerlistapp/models/BestSellerResults.java deleted file mode 100644 index 6083618..0000000 --- a/app/src/main/java/com/codepath/bestsellerlistapp/models/BestSellerResults.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.codepath.bestsellerlistapp.models; - -import com.google.gson.annotations.SerializedName; - -import java.util.List; - -public class BestSellerResults { - - @SerializedName("list_name") - public String listName; - - @SerializedName("books") - public List books; -} diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/models/BestSellerResults.kt b/app/src/main/java/com/codepath/bestsellerlistapp/models/BestSellerResults.kt new file mode 100644 index 0000000..917dccf --- /dev/null +++ b/app/src/main/java/com/codepath/bestsellerlistapp/models/BestSellerResults.kt @@ -0,0 +1,12 @@ +package com.codepath.bestsellerlistapp.models + +import com.google.gson.annotations.SerializedName + +class BestSellerResults { + @SerializedName("list_name") + var listName: String? = null + + @JvmField + @SerializedName("books") + var books: List? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/models/NYTimesAPIResponse.java b/app/src/main/java/com/codepath/bestsellerlistapp/models/NYTimesAPIResponse.java deleted file mode 100644 index 425b378..0000000 --- a/app/src/main/java/com/codepath/bestsellerlistapp/models/NYTimesAPIResponse.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.codepath.bestsellerlistapp.models; - -import com.google.gson.annotations.SerializedName; - -public class NYTimesAPIResponse { - - @SerializedName("status") - public String status; - - @SerializedName("results") - public BestSellerResults results; -} diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/models/NYTimesAPIResponse.kt b/app/src/main/java/com/codepath/bestsellerlistapp/models/NYTimesAPIResponse.kt new file mode 100644 index 0000000..e9dd003 --- /dev/null +++ b/app/src/main/java/com/codepath/bestsellerlistapp/models/NYTimesAPIResponse.kt @@ -0,0 +1,12 @@ +package com.codepath.bestsellerlistapp.models + +import com.google.gson.annotations.SerializedName + +class NYTimesAPIResponse { + @SerializedName("status") + var status: String? = null + + @JvmField + @SerializedName("results") + var results: BestSellerResults? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/networking/CallbackResponse.java b/app/src/main/java/com/codepath/bestsellerlistapp/networking/CallbackResponse.java deleted file mode 100644 index 0bc46b1..0000000 --- a/app/src/main/java/com/codepath/bestsellerlistapp/networking/CallbackResponse.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.codepath.bestsellerlistapp.networking; - -public interface CallbackResponse { - void onSuccess(T model); - - void onFailure(Throwable error); -} diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/networking/CallbackResponse.kt b/app/src/main/java/com/codepath/bestsellerlistapp/networking/CallbackResponse.kt new file mode 100644 index 0000000..7689b07 --- /dev/null +++ b/app/src/main/java/com/codepath/bestsellerlistapp/networking/CallbackResponse.kt @@ -0,0 +1,7 @@ +package com.codepath.bestsellerlistapp.networking + +interface CallbackResponse { + fun onSuccess(model: T) + + fun onFailure(error: Throwable?) +} \ No newline at end of file diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesApiClient.java b/app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesApiClient.java deleted file mode 100644 index 374e6d9..0000000 --- a/app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesApiClient.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.codepath.bestsellerlistapp.networking; - -import com.codepath.bestsellerlistapp.models.BestSellerBook; -import com.codepath.bestsellerlistapp.models.NYTimesAPIResponse; - -import java.util.List; - -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; -import retrofit2.Retrofit; -import retrofit2.converter.gson.GsonConverterFactory; - -/** - * This code represents the networking layer of the application, - * Other than updating the API key, you will NOT need to touch this code for the lab, - * However it may be useful to reference the logic for your future projects - * - * - * IMPORTANT INSTRUCTIONS BELOW =========================================================== - * TODO: You have to update API_KEY variable with your own NY-Times developer api key, see - * https://developer.nytimes.com/get-started to create your own developer account, - * after copy and paste the API key under your Account -> Apps -> -> API Keys - */ -public class NYTimesApiClient { - - // TODO: Replace the below API key with your own generated key - private static final String API_KEY = ""; - private NYTimesService nyTimesService; - - public NYTimesApiClient() { - Retrofit retrofit = new Retrofit.Builder() - .baseUrl("https://api.nytimes.com/") - .addConverterFactory(GsonConverterFactory.create()) - .build(); - nyTimesService = retrofit.create(NYTimesService.class); - } - - public void getBestSellersList(final CallbackResponse> booksListResponse) { - - // this hard codes to only the current date's hardcover fiction best selling books - // see https://developer.nytimes.com/docs/books-product/1/overview for more information on API documentation - Call current = nyTimesService.getBestSellingBooks("current", "hardcover-fiction", API_KEY); - current.enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - NYTimesAPIResponse model = response.body(); - if (response.isSuccessful() && model != null) { - booksListResponse.onSuccess(model.results.books); - } else { - booksListResponse.onFailure(new Throwable("error with response code " + response.code() + " " + response.message())); - } - } - - @Override - public void onFailure(Call call, Throwable t) { - booksListResponse.onFailure(t); - } - }); - } -} diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesApiClient.kt b/app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesApiClient.kt new file mode 100644 index 0000000..056c71f --- /dev/null +++ b/app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesApiClient.kt @@ -0,0 +1,59 @@ +package com.codepath.bestsellerlistapp.networking + +import com.codepath.bestsellerlistapp.models.BestSellerBook +import com.codepath.bestsellerlistapp.models.NYTimesAPIResponse +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import retrofit2.Retrofit.Builder +import retrofit2.converter.gson.GsonConverterFactory + +/** + * This code represents the networking layer of the application, + * Other than updating the API key, you will NOT need to touch this code for the lab, + * However it may be useful to reference the logic for your future projects + * + * + * IMPORTANT INSTRUCTIONS BELOW =========================================================== + * TODO: You have to update API_KEY variable with your own NY-Times developer api key, see + * https://developer.nytimes.com/get-started to create your own developer account, + * after copy and paste the API key under your Account -> Apps -> -> API Keys + */ +class NYTimesApiClient { + private val nyTimesService: NYTimesService + + init { + val retrofit = Builder() + .baseUrl("https://api.nytimes.com/") + .addConverterFactory(GsonConverterFactory.create()) + .build() + nyTimesService = retrofit.create(NYTimesService::class.java) + } + fun getBestSellersList(booksListResponse: CallbackResponse>) { + + // this hard codes to only the current date's hardcover fiction best selling books + // see https://developer.nytimes.com/docs/books-product/1/overview for more information on API documentation + val current = nyTimesService.getBestSellingBooks("current", "hardcover-fiction", API_KEY) + current?.enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + val model = response.body() + val books = model?.results?.books + if (response.isSuccessful && books != null) { + booksListResponse.onSuccess(books) + } else { + booksListResponse.onFailure(Throwable("error with response code " + response.code() + " " + response.message())) + } + } + + override fun onFailure(call: Call, t: Throwable) { + booksListResponse.onFailure(t) + } + }) + } + + companion object { + // TODO: Replace the below API key with your own generated key + private const val API_KEY = "" + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesService.java b/app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesService.java deleted file mode 100644 index 2d16238..0000000 --- a/app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesService.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.codepath.bestsellerlistapp.networking; - -import com.codepath.bestsellerlistapp.models.NYTimesAPIResponse; - -import retrofit2.Call; -import retrofit2.http.GET; -import retrofit2.http.Path; -import retrofit2.http.Query; - -public interface NYTimesService { - - @GET("svc/books/v3/lists/{date}/{list}.json") - Call getBestSellingBooks(@Path("date") String date, @Path("list") String list, @Query("api-key") String apikey); -} diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesService.kt b/app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesService.kt new file mode 100644 index 0000000..92f3f9d --- /dev/null +++ b/app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesService.kt @@ -0,0 +1,15 @@ +package com.codepath.bestsellerlistapp.networking + +import com.codepath.bestsellerlistapp.models.NYTimesAPIResponse +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.Path +import retrofit2.http.Query + +interface NYTimesService { + @GET("svc/books/v3/lists/{date}/{list}.json") fun getBestSellingBooks( + @Path("date") date: String?, + @Path("list") list: String?, + @Query("api-key") apikey: String? + ): Call? +} \ No newline at end of file diff --git a/build.gradle b/build.gradle index a88f623..8ca4e30 100644 --- a/build.gradle +++ b/build.gradle @@ -1,15 +1,17 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - + ext.kotlin_version = '1.5.0' + repositories { google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.6.3' - + classpath 'com.android.tools.build:gradle:4.1.3' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d97433a..e167388 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Jun 18 14:02:08 CDT 2020 +#Tue May 04 01:57:09 EDT 2021 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip From f2e01435980b54810d4c1451636869e1001b4a3f Mon Sep 17 00:00:00 2001 From: Alice Yuan Date: Sun, 9 May 2021 19:17:02 -1000 Subject: [PATCH 2/4] build.gradle update --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 6539e3e..4707d74 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,7 +7,7 @@ android { defaultConfig { applicationId "com.codepath.uiandgitlab" - minSdkVersion 19 + minSdkVersion 21 targetSdkVersion 30 versionCode 1 versionName "1.0" From 3ec18005dd13960d1271ac255d0cb1c93858545f Mon Sep 17 00:00:00 2001 From: Alice Yuan Date: Wed, 7 Jul 2021 18:42:43 -0400 Subject: [PATCH 3/4] update api logic to follow kotlin style guides --- .../bestsellerlistapp/networking/NYTimesApiClient.kt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesApiClient.kt b/app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesApiClient.kt index 056c71f..211dd01 100644 --- a/app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesApiClient.kt +++ b/app/src/main/java/com/codepath/bestsellerlistapp/networking/NYTimesApiClient.kt @@ -19,6 +19,8 @@ import retrofit2.converter.gson.GsonConverterFactory * https://developer.nytimes.com/get-started to create your own developer account, * after copy and paste the API key under your Account -> Apps -> -> API Keys */ +// TODO: Replace the below API key with your own generated key +private const val API_KEY = "" class NYTimesApiClient { private val nyTimesService: NYTimesService @@ -50,10 +52,4 @@ class NYTimesApiClient { } }) } - - companion object { - // TODO: Replace the below API key with your own generated key - private const val API_KEY = "" - } - } \ No newline at end of file From 6ebdf291f40c4e7402b05c2deb05710a4464e4e9 Mon Sep 17 00:00:00 2001 From: Alice Yuan Date: Sun, 12 Sep 2021 18:30:38 -0400 Subject: [PATCH 4/4] update build.gradle --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 4707d74..a40352e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -36,7 +36,7 @@ dependencies { implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.recyclerview:recyclerview:1.2.0' - implementation "androidx.core:core-ktx:1.3.2" + implementation "androidx.core:core-ktx:1.6.0" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" } repositories {