Guest User

Untitled

a guest
Nov 20th, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.31 KB | None | 0 0
  1. package com.sdzshn3.android.news247.Fragments;
  2.  
  3. import android.app.SearchManager;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.content.SharedPreferences;
  7. import android.net.ConnectivityManager;
  8. import android.net.NetworkInfo;
  9. import android.net.Uri;
  10. import android.os.Bundle;
  11. import android.preference.PreferenceManager;
  12. import android.support.annotation.NonNull;
  13. import android.support.annotation.Nullable;
  14. import android.support.customtabs.CustomTabsIntent;
  15. import android.support.v4.app.Fragment;
  16. import android.support.v4.app.LoaderManager;
  17. import android.support.v4.content.Loader;
  18. import android.support.v4.widget.SwipeRefreshLayout;
  19. import android.support.v7.widget.DefaultItemAnimator;
  20. import android.support.v7.widget.LinearLayoutManager;
  21. import android.support.v7.widget.RecyclerView;
  22. import android.util.Log;
  23. import android.view.LayoutInflater;
  24. import android.view.Menu;
  25. import android.view.MenuInflater;
  26. import android.view.MenuItem;
  27. import android.view.View;
  28. import android.view.ViewGroup;
  29. import android.widget.ImageView;
  30. import android.widget.ProgressBar;
  31. import android.widget.TextView;
  32. import android.widget.Toast;
  33.  
  34. import com.google.android.gms.ads.AdRequest;
  35. import com.google.android.gms.ads.AdView;
  36. import com.google.android.gms.ads.MobileAds;
  37. import com.sdzshn3.android.news247.Activities.LanguageSelectionActivity;
  38. import com.sdzshn3.android.news247.Activities.MainActivity;
  39. import com.sdzshn3.android.news247.Activities.NewsDetailsActivity;
  40. import com.sdzshn3.android.news247.Activities.SettingsActivity;
  41. import com.sdzshn3.android.news247.Adapters.NewsFeedAdapter;
  42. import com.sdzshn3.android.news247.BuildConfig;
  43. import com.sdzshn3.android.news247.SupportClasses.ItemClickSupport;
  44. import com.sdzshn3.android.news247.News;
  45. import com.sdzshn3.android.news247.NewsLoader;
  46. import com.sdzshn3.android.news247.R;
  47. import com.sdzshn3.android.news247.SupportClasses.PaginationScrollListener;
  48. import com.sdzshn3.android.news247.SupportClasses.WeatherIcon;
  49.  
  50. import java.util.ArrayList;
  51. import java.util.List;
  52. import java.util.Objects;
  53.  
  54. import static com.sdzshn3.android.news247.SupportClasses.DataHolder.holder;
  55.  
  56.  
  57. public class NewsFeedFragment extends Fragment implements LoaderManager.LoaderCallbacks<List<News>> {
  58.  
  59. LoaderManager loaderManager;
  60. SwipeRefreshLayout mSwipeRefreshLayout;
  61. RecyclerView newsRecyclerView;
  62. LinearLayoutManager layoutManager;
  63. Context mContext;
  64. String mSearchQuery;
  65. ProgressBar progressBar, footer;
  66. boolean isConnected;
  67. private boolean isLastPage = false;
  68. private boolean isLoading = false;
  69. TextView mEmptyStateTextView, noInternetConnectionTextView, weatherTemp;
  70. ImageView weatherIcon;
  71. int pageNumber = 1;
  72. private ArrayList<News> newsArray = new ArrayList<>();
  73. private NewsFeedAdapter mAdapter;
  74. boolean gotWeather;
  75.  
  76. public NewsFeedFragment() {
  77. //Required empty public constructor
  78. }
  79.  
  80. @Nullable
  81. @Override
  82. public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  83. View rootView = inflater.inflate(R.layout.list, container, false);
  84. mContext = getContext();
  85. setHasOptionsMenu(true);
  86. setRetainInstance(true);
  87.  
  88. //Test app id "ca-app-pub-3940256099942544~3347511713"
  89. //This app's genuine id "ca-app-pub-4795017891549742~7471582838"
  90. MobileAds.initialize(mContext, "ca-app-pub-4795017891549742~7471582838");
  91. AdRequest adRequest = new AdRequest.Builder().addTestDevice(AdRequest.DEVICE_ID_EMULATOR).addTestDevice("F5E71A24D5F33E8D35CFDF8B875D6E79").build();
  92. AdView adView = rootView.findViewById(R.id.banner_ad_news_feed);
  93. adView.loadAd(adRequest);
  94.  
  95. mAdapter = new NewsFeedAdapter(getActivity(), newsArray);
  96.  
  97. newsRecyclerView = rootView.findViewById(R.id.recycler_view_list);
  98. progressBar = rootView.findViewById(R.id.loading_circle);
  99. footer = rootView.findViewById(R.id.footer);
  100. mEmptyStateTextView = rootView.findViewById(R.id.no_data_found);
  101. noInternetConnectionTextView = rootView.findViewById(R.id.no_internet_connection);
  102. weatherTemp = rootView.findViewById(R.id.weather_temp);
  103. weatherIcon = rootView.findViewById(R.id.weather_icon);
  104. mSwipeRefreshLayout = rootView.findViewById(R.id.swipe_refresh);
  105. loaderManager = getLoaderManager();
  106.  
  107. loaderManager.initLoader(holder.NEWS_LOADER_ID, null, NewsFeedFragment.this);
  108. loaderManager.initLoader(holder.WEATHER_LOADER_ID, null, NewsFeedFragment.this);
  109.  
  110. footer.setVisibility(View.INVISIBLE);
  111.  
  112. mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
  113. @Override
  114. public void onRefresh() {
  115. newsArray.clear();
  116. mAdapter.notifyDataSetChanged();
  117. loaderManager.restartLoader(holder.NEWS_LOADER_ID, null, NewsFeedFragment.this);
  118. mSwipeRefreshLayout.setRefreshing(true);
  119. }
  120. });
  121.  
  122. layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
  123. newsRecyclerView.setLayoutManager(layoutManager);
  124. newsRecyclerView.setHasFixedSize(true);
  125. newsRecyclerView.setAdapter(mAdapter);
  126. newsRecyclerView.setNestedScrollingEnabled(false);
  127.  
  128. newsRecyclerView.setItemAnimator(new DefaultItemAnimator());
  129.  
  130. ItemClickSupport.addTo(newsRecyclerView).setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
  131. @Override
  132. public void onItemClicked(RecyclerView recyclerView, int position, View v) {
  133. SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
  134. String currentPref = preferences.getString(getString(R.string.show_article_in_key), getString(R.string.default_show_as_plain));
  135. if(currentPref.equals(getString(R.string.default_show_as_plain))) {
  136. News currentNews = mAdapter.getItem(position);
  137. String bodyHtml = currentNews.getBodyHtml();
  138. Intent intent = new Intent(getActivity(), NewsDetailsActivity.class);
  139. intent.setData(Uri.parse(bodyHtml));
  140. startActivity(intent);
  141. } else {
  142. News currentNews = mAdapter.getItem(position);
  143. Uri newsUri = Uri.parse(currentNews.getArticleUrl());
  144. CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
  145. CustomTabsIntent customTabsIntent = builder.build();
  146. builder.setToolbarColor(getResources().getColor(R.color.colorPrimary));
  147. customTabsIntent.launchUrl(mContext, newsUri);
  148. }
  149.  
  150. }
  151. });
  152.  
  153. newsRecyclerView.addOnScrollListener(new PaginationScrollListener(layoutManager) {
  154. @Override
  155. protected void loadMoreItems() {
  156. footer.setVisibility(View.VISIBLE);
  157. ConnectivityManager connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
  158. NetworkInfo activeNetwork = null;
  159. if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
  160. activeNetwork = Objects.requireNonNull(connectivityManager).getActiveNetworkInfo();
  161. } else {
  162. if (connectivityManager != null) {
  163. activeNetwork = connectivityManager.getActiveNetworkInfo();
  164. }
  165. }
  166. isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
  167. if(isConnected) {
  168. Toast.makeText(getContext(), "connected", Toast.LENGTH_SHORT).show();
  169. pageNumber ++;
  170. loaderManager.restartLoader(holder.NEWS_LOADER_ID, null, NewsFeedFragment.this);
  171. mAdapter.notifyDataSetChanged();
  172. } else {
  173. footer.setVisibility(View.GONE);
  174. }
  175. }
  176.  
  177. @Override
  178. public int getTotalPageCount() {
  179. return holder.TOTAL_PAGES;
  180. }
  181.  
  182. @Override
  183. public boolean isLastPage() {
  184. return isLastPage;
  185. }
  186.  
  187. @Override
  188. public boolean isLoading() {
  189. return isLoading;
  190. }
  191. });
  192.  
  193.  
  194.  
  195. return rootView;
  196. }
  197.  
  198. @NonNull
  199. @Override
  200. public Loader<List<News>> onCreateLoader(int id, @Nullable Bundle bundle) {
  201.  
  202. String url = null;
  203. switch (id) {
  204. case holder.NEWS_LOADER_ID:
  205. SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
  206.  
  207. String numberOfArticles = sharedPrefs.getString(
  208. getString(R.string.number_of_articles_key),
  209. getString(R.string.default_no_of_news_articles)
  210. );
  211.  
  212. if(numberOfArticles.trim().isEmpty()){
  213. SharedPreferences.Editor editor = sharedPrefs.edit();
  214. editor.putString(getString(R.string.number_of_articles_key), "10");
  215. editor.apply();
  216. numberOfArticles = sharedPrefs.getString(getString(R.string.number_of_articles_key),
  217. getString(R.string.default_no_of_news_articles));
  218. }
  219.  
  220. boolean showAuthorName = sharedPrefs.getBoolean(
  221. getString(R.string.author_name_key),
  222. Boolean.parseBoolean(getString(R.string.default_show_author_name))
  223. );
  224.  
  225. boolean showArticleImages = sharedPrefs.getBoolean(
  226. getString(R.string.show_article_images_key),
  227. Boolean.parseBoolean(getString(R.string.default_show_article_images))
  228. );
  229.  
  230. Uri baseUri;
  231. if (mSearchQuery == null) {
  232. baseUri = Uri.parse(holder.NEWS_FEED_REQUEST_URL);
  233. progressBar.setVisibility(View.VISIBLE);
  234. } else {
  235. baseUri = Uri.parse(holder.SEARCH_REQUEST_URL + mSearchQuery);
  236. progressBar.setVisibility(View.VISIBLE);
  237. }
  238. Uri.Builder uriBuilder = baseUri.buildUpon();
  239.  
  240. uriBuilder.appendQueryParameter(holder.apiKey, BuildConfig.GUARDIAN_API_KEY);
  241.  
  242. if (showAuthorName) {
  243. uriBuilder.appendQueryParameter(holder.showTags, holder.contributorTag);
  244. }
  245. uriBuilder.appendQueryParameter(holder.page, String.valueOf(pageNumber));
  246. if (showArticleImages) {
  247. uriBuilder.appendQueryParameter(holder.showFields, holder.thumbnailField + "," + holder.bodyField);
  248. } else {
  249. uriBuilder.appendQueryParameter(holder.showFields, holder.bodyField);
  250. }
  251. if(!numberOfArticles.isEmpty()) {
  252. if (Integer.parseInt(numberOfArticles) > 100) {
  253. numberOfArticles = "100";
  254. }
  255. }
  256. uriBuilder.appendQueryParameter(holder.pageSize, "10");
  257.  
  258. url = uriBuilder.toString();
  259. Log.d("URL", url);
  260. break;
  261. case holder.WEATHER_LOADER_ID:
  262. SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
  263.  
  264. String weatherCity = sharedPreferences.getString(
  265. getString(R.string.weather_city_key),
  266. getString(R.string.weather_city_default)
  267. );
  268. url = holder.WEATHER_REQUEST_URL + weatherCity + "&units=metric&APPID=" + BuildConfig.WEATHER_API_KEY;
  269. }
  270.  
  271. return new NewsLoader(mContext, id, url,0);
  272. }
  273.  
  274. @Override
  275. public void onLoadFinished(@NonNull Loader<List<News>> loader, List<News> newsList) {
  276. int id = loader.getId();
  277. switch (id) {
  278. case holder.NEWS_LOADER_ID:
  279. progressBar.setVisibility(View.GONE);
  280. mSwipeRefreshLayout.setRefreshing(false);
  281.  
  282. ConnectivityManager connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
  283. NetworkInfo activeNetwork = null;
  284. if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
  285. activeNetwork = Objects.requireNonNull(connectivityManager).getActiveNetworkInfo();
  286. } else {
  287. if (connectivityManager != null) {
  288. activeNetwork = connectivityManager.getActiveNetworkInfo();
  289. }
  290. }
  291. isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
  292.  
  293. if (newsList != null && !newsList.isEmpty()) {
  294. newsArray.addAll(newsList);
  295. mAdapter.notifyDataSetChanged();
  296. newsRecyclerView.setVisibility(View.VISIBLE);
  297. mEmptyStateTextView.setVisibility(View.GONE);
  298. noInternetConnectionTextView.setVisibility(View.GONE);
  299. footer.setVisibility(View.GONE);
  300. } else {
  301. if (isConnected) {
  302. newsRecyclerView.setVisibility(View.GONE);
  303. mEmptyStateTextView.setVisibility(View.VISIBLE);
  304. noInternetConnectionTextView.setVisibility(View.GONE);
  305. } else {
  306. newsRecyclerView.setVisibility(View.GONE);
  307. mEmptyStateTextView.setVisibility(View.GONE);
  308. noInternetConnectionTextView.setVisibility(View.VISIBLE);
  309. }
  310. }
  311. loaderManager.destroyLoader(holder.NEWS_LOADER_ID);
  312. break;
  313. case holder.WEATHER_LOADER_ID:
  314. if (newsList != null && !newsList.isEmpty()) {
  315. final News news = newsList.get(0);
  316. String temp = News.getTemp().split("\\.", 2)[0];
  317. weatherTemp.setText(getString(R.string.weather_temperature_concatenate, temp));
  318.  
  319. String iconId = news.getIconId();
  320. weatherIcon.setImageResource(WeatherIcon.getWeatherIcon(iconId));
  321. gotWeather = true;
  322. loaderManager.destroyLoader(holder.WEATHER_LOADER_ID);
  323. }
  324. }
  325. if (!gotWeather) {
  326. gotWeather = false;
  327. weatherTemp.setText(R.string.weather_city_not_supported_text);
  328. }
  329. }
  330.  
  331. @Override
  332. public void onLoaderReset(@NonNull Loader<List<News>> loader) {
  333. newsArray.clear();
  334. mAdapter.notifyDataSetChanged();
  335. }
  336.  
  337.  
  338. @Override
  339. public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
  340. inflater.inflate(R.menu.main, menu);
  341. MenuItem searchItem = menu.findItem(R.id.action_search);
  342. SearchManager searchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE);
  343. android.support.v7.widget.SearchView searchView = null;
  344. if (searchItem != null) {
  345. searchView = (android.support.v7.widget.SearchView) searchItem.getActionView();
  346. }
  347. if (searchView != null) {
  348. MainActivity mainActivity = new MainActivity();
  349. if (searchManager != null) {
  350. searchView.setSearchableInfo(searchManager.getSearchableInfo(mainActivity.getComponentName()));
  351. }
  352. searchView.setOnQueryTextListener(new android.support.v7.widget.SearchView.OnQueryTextListener() {
  353. @Override
  354. public boolean onQueryTextSubmit(String query) {
  355. mSearchQuery = query;
  356. newsArray.clear();
  357. mAdapter.notifyDataSetChanged();
  358. loaderManager.restartLoader(holder.NEWS_LOADER_ID, null, NewsFeedFragment.this);
  359. return true;
  360. }
  361.  
  362. @Override
  363. public boolean onQueryTextChange(String newText) {
  364. return false;
  365. }
  366. });
  367. searchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
  368. @Override
  369. public boolean onMenuItemActionExpand(MenuItem item) {
  370. return true;
  371. }
  372.  
  373. @Override
  374. public boolean onMenuItemActionCollapse(MenuItem item) {
  375. mSearchQuery = null;
  376. newsArray.clear();
  377. mAdapter.notifyDataSetChanged();
  378. loaderManager.restartLoader(holder.NEWS_LOADER_ID, null, NewsFeedFragment.this);
  379. return true;
  380. }
  381. });
  382. }
  383. super.onCreateOptionsMenu(menu, inflater);
  384. }
  385.  
  386. @Override
  387. public boolean onOptionsItemSelected(MenuItem item) {
  388. int id = item.getItemId();
  389. if (id == R.id.action_settings) {
  390. Intent settingsIntent = new Intent(mContext, SettingsActivity.class);
  391. startActivity(settingsIntent);
  392. return true;
  393. }
  394. else if(id == R.id.action_change_language){
  395. startActivity(new Intent(mContext, LanguageSelectionActivity.class));
  396. }
  397. return super.onOptionsItemSelected(item);
  398. }
  399. }
Add Comment
Please, Sign In to add comment