Skip to content

Commit

Permalink
V2.7 Implement Search by Country name
Browse files Browse the repository at this point in the history
  • Loading branch information
shatrix committed Mar 8, 2020
1 parent 3d173ce commit 4125bb9
Show file tree
Hide file tree
Showing 6 changed files with 101 additions and 85 deletions.
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ android {
applicationId "com.shatrix.coronatracker"
minSdkVersion 16
targetSdkVersion 29
versionCode 8
versionName "2.6"
versionCode 9
versionName "2.7"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.shatrix.coronatracker;

import android.app.Activity;
import android.graphics.Color;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
Expand All @@ -10,22 +9,18 @@
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class ListCountriesAdapter extends BaseAdapter implements Filterable {
public class ListCountriesAdapter extends BaseAdapter {

Activity context;
ArrayList<CountryLine> allCountriesResults;
ArrayList<CountryLine> mDisplayedValues;
LayoutInflater inflater;

public ListCountriesAdapter(Activity context, ArrayList<CountryLine> allCountriesResults) {
super();
this.context = context;
this.allCountriesResults = allCountriesResults;

inflater = context.getLayoutInflater();
}

Expand All @@ -45,60 +40,6 @@ public long getItemId(int position) {
return position;
}

@Override
public Filter getFilter() {
Filter filter = new Filter() {

@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,FilterResults results) {

mDisplayedValues = (ArrayList<CountryLine>) results.values; // has the filtered values
notifyDataSetChanged(); // notifies the data with new filtered values
}

@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults(); // Holds the results of a filtering operation in values
ArrayList<CountryLine> FilteredArrList = new ArrayList<CountryLine>();

if (allCountriesResults == null) {
allCountriesResults = new ArrayList<CountryLine>(mDisplayedValues); // saves the original data in mOriginalValues
}

/********
*
* If constraint(CharSequence that is received) is null returns the mOriginalValues(Original) values
* else does the Filtering and returns FilteredArrList(Filtered)
*
********/
if (constraint == null || constraint.length() == 0) {

// set the Original result to return
results.count = allCountriesResults.size();
results.values = allCountriesResults;
} else {
constraint = constraint.toString().toLowerCase();
for (int i = 0; i < allCountriesResults.size(); i++) {
String data = allCountriesResults.get(i).countryName;
if (data.toLowerCase().startsWith(constraint.toString())) {
FilteredArrList.add(new CountryLine(
allCountriesResults.get(i).countryName,
allCountriesResults.get(i).cases,
allCountriesResults.get(i).recovered,
allCountriesResults.get(i).deaths));
}
}
// set the Filtered result to return
results.count = FilteredArrList.size();
results.values = FilteredArrList;
}
return results;
}
};
return filter;
}

private class ViewHolder {
TextView colCountryName;
TextView colCases;
Expand Down
58 changes: 46 additions & 12 deletions app/src/main/java/com/shatrix/coronatracker/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,19 @@
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AbsListView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.os.Handler;
import android.widget.Toast;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
Expand All @@ -32,20 +33,18 @@
import android.preference.PreferenceManager;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

TextView textViewCases, textViewRecovered, textViewDeaths, textViewDate, textViewDeathsTitle, textViewRecoveredTitle ;
EditText textSearchBox;
Handler handler;
String url = "https://www.worldometers.info/coronavirus/";
String body, tmpString, tmpCountry, tmpCases, tmpRecovered, tmpDeaths, tmpPercentage;
String tmpCountry, tmpCases, tmpRecovered, tmpDeaths, tmpPercentage;
Document doc;
Element countriesTable, row;
Elements countriesRows, cols;
Pattern p, p1;
Matcher m;
SharedPreferences preferences;
SharedPreferences.Editor editor;
Calendar myCalender;
Expand All @@ -55,7 +54,7 @@ public class MainActivity extends AppCompatActivity {
DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.US);
ListView listViewCountries;
ListCountriesAdapter listCountriesAdapter;
ArrayList<CountryLine> allCountriesResults = new ArrayList<CountryLine>();
ArrayList<CountryLine> allCountriesResults, FilteredArrList;
Intent sharingIntent;
int colNumCountry, colNumCases, colNumRecovered, colNumDeaths;
SwipeRefreshLayout mySwipeRefreshLayout;
Expand All @@ -74,13 +73,15 @@ protected void onCreate(Bundle savedInstanceState) {
textViewRecoveredTitle = (TextView)findViewById(R.id.textViewRecoveredTitle);
textViewDeathsTitle = (TextView)findViewById(R.id.textViewDeathsTitle);
listViewCountries = (ListView)findViewById(R.id.listViewCountries);
textSearchBox = (EditText)findViewById(R.id.textSearchBox);
colNumCountry = 0; colNumCases = 1; colNumRecovered = 0; colNumDeaths = 0;
preferences = PreferenceManager.getDefaultSharedPreferences(this);
editor = preferences.edit();
myFormat = new SimpleDateFormat("MMMM dd, yyyy, hh:mm:ss aaa", Locale.US);
myCalender = Calendar.getInstance();
handler = new Handler() ;
generalDecimalFormat = new DecimalFormat("0.00", symbols);
allCountriesResults = new ArrayList<CountryLine>();

// Implement Swipe to Refresh
mySwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.coronaMainSwipeRefresh);
Expand Down Expand Up @@ -123,7 +124,6 @@ private boolean listIsAtTop() {
return listViewCountries.getChildAt(0).getTop() == 0;
}
});
listViewCountries.setTextFilterEnabled(true);

// fetch previously saved data in SharedPreferences, if any
if(preferences.getString("textViewCases", null) != null ){
Expand All @@ -133,6 +133,41 @@ private boolean listIsAtTop() {
textViewDate.setText(preferences.getString("textViewDate", null));
calculate_percentages();
}

// Add Text Change Listener to textSearchBox to filter by Country
textSearchBox.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence searchSequense, int start, int before, int count) {
ArrayList<CountryLine> FilteredArrList = new ArrayList<CountryLine>();
if (searchSequense == null || searchSequense.length() == 0) {
// back to original
setListViewCountries(allCountriesResults);
} else {
searchSequense = searchSequense.toString().toLowerCase();
for (int i = 0; i < allCountriesResults.size(); i++) {
String data = allCountriesResults.get(i).countryName;
if (data.toLowerCase().startsWith(searchSequense.toString())) {
FilteredArrList.add(new CountryLine(
allCountriesResults.get(i).countryName,
allCountriesResults.get(i).cases,
allCountriesResults.get(i).recovered,
allCountriesResults.get(i).deaths));
}
}
// set the Filtered result to return
setListViewCountries(FilteredArrList);
}
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,int after) {
}

@Override
public void afterTextChanged(Editable s) {
}
});
}

@Override
Expand All @@ -151,7 +186,6 @@ public boolean onCreateOptionsMenu(Menu menu) {

void setListViewCountries(ArrayList<CountryLine> allCountriesResults) {
listCountriesAdapter = new ListCountriesAdapter(this, allCountriesResults);
//listCountriesAdapter.getFilter().filter("E");
listViewCountries.setAdapter(listCountriesAdapter);
}

Expand All @@ -163,7 +197,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
.setTitle("Corona COVID-19 Monitor")
.setCancelable(true)
.setMessage("COVID-19 CORONAVIRUS Latest Global Updates\n\n" +
"Numbers are based on:\nhttps://www.worldometers.info/coronavirus\n" +
"Source:\nhttps://www.worldometers.info/coronavirus\n" +
"\n\n" +
"Developer: Sherif Mousa (Shatrix)" +
"\n" +
Expand Down Expand Up @@ -210,7 +244,6 @@ public void run() {
try {
doc = null; // Fetches the HTML document
doc = Jsoup.connect(url).timeout(10000).get();
//body = doc.body().text();
// table id main_table_countries
countriesTable = doc.getElementById("main_table_countries");
countriesRows = countriesTable.select("tr");
Expand All @@ -221,7 +254,6 @@ public void run() {
public void run() {
// get countries
Iterator<Element> rowIterator = countriesRows.iterator();
//rowIterator.next();
allCountriesResults = new ArrayList<CountryLine>();

// read table header and find correct column number for each category
Expand Down Expand Up @@ -278,6 +310,8 @@ else if (cols.get(i).text().contains("Total") && cols.get(i).text().contains("De
}

setListViewCountries(allCountriesResults);
textSearchBox.setText(null);
textSearchBox.clearFocus();

// save results
editor.putString("textViewCases", textViewCases.getText().toString());
Expand Down
18 changes: 18 additions & 0 deletions app/src/main/res/drawable-v24/back_search_text.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<gradient
android:startColor="@color/colorBackMiddle"
android:centerColor="@color/colorBackMiddle"
android:endColor="@color/colorBackMiddle"
android:type="linear"
android:angle="90" />
<corners
android:radius="3dp" />
<stroke
android:width="1dp"
android:color="@color/colorStrokeSearch" />
</shape>
</item>
</selector>
Loading

0 comments on commit 4125bb9

Please sign in to comment.