├── .gitignore ├── .idea ├── .name ├── codeStyles │ └── Project.xml ├── gradle.xml ├── misc.xml ├── render.experimental.xml └── runConfigurations.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── developer │ │ └── arsltech │ │ └── covid_19tracker │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── developer │ │ │ └── arsltech │ │ │ └── covid_19tracker │ │ │ ├── AffectedCountries.java │ │ │ ├── CountryModel.java │ │ │ ├── DetailActivity.java │ │ │ ├── MainActivity.java │ │ │ └── MyCustomAdapter.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── edittext_shadow.xml │ │ ├── ic_launcher_background.xml │ │ └── ic_search_black_24dp.xml │ │ ├── layout │ │ ├── activity_affected_countries.xml │ │ ├── activity_detail.xml │ │ ├── activity_main.xml │ │ └── list_custom_item.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── developer │ └── arsltech │ └── covid_19tracker │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── image1.jpg ├── image2.jpg ├── image3.jpg └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | COVID-19 Tracker -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | xmlns:android 14 | 15 | ^$ 16 | 17 | 18 | 19 |
20 |
21 | 22 | 23 | 24 | xmlns:.* 25 | 26 | ^$ 27 | 28 | 29 | BY_NAME 30 | 31 |
32 |
33 | 34 | 35 | 36 | .*:id 37 | 38 | http://schemas.android.com/apk/res/android 39 | 40 | 41 | 42 |
43 |
44 | 45 | 46 | 47 | .*:name 48 | 49 | http://schemas.android.com/apk/res/android 50 | 51 | 52 | 53 |
54 |
55 | 56 | 57 | 58 | name 59 | 60 | ^$ 61 | 62 | 63 | 64 |
65 |
66 | 67 | 68 | 69 | style 70 | 71 | ^$ 72 | 73 | 74 | 75 |
76 |
77 | 78 | 79 | 80 | .* 81 | 82 | ^$ 83 | 84 | 85 | BY_NAME 86 | 87 |
88 |
89 | 90 | 91 | 92 | .* 93 | 94 | http://schemas.android.com/apk/res/android 95 | 96 | 97 | ANDROID_ATTRIBUTE_ORDER 98 | 99 |
100 |
101 | 102 | 103 | 104 | .* 105 | 106 | .* 107 | 108 | 109 | BY_NAME 110 | 111 |
112 |
113 |
114 |
115 |
116 |
-------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 19 | 20 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | 41 | 42 | 43 | 44 | 45 | 46 | 48 | 49 | 50 | 51 | 52 | 1.8 53 | 54 | 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /.idea/render.experimental.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # COVID-19 Tracker Android App 2 | Coronavirus (COVID-19) Tracker App Using REST API & Volley Library 3 | 4 | # Screenshots 5 |

6 | 7 | 8 | 9 | 10 |

11 | 12 | 13 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 29 5 | buildToolsVersion "29.0.3" 6 | 7 | defaultConfig { 8 | applicationId "com.developer.arsltech.covid_19tracker" 9 | minSdkVersion 21 10 | targetSdkVersion 29 11 | versionCode 1 12 | versionName "1.0" 13 | 14 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 15 | } 16 | 17 | buildTypes { 18 | release { 19 | minifyEnabled false 20 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 21 | } 22 | } 23 | 24 | } 25 | 26 | dependencies { 27 | implementation fileTree(dir: 'libs', include: ['*.jar']) 28 | 29 | implementation 'androidx.appcompat:appcompat:1.1.0' 30 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 31 | testImplementation 'junit:junit:4.12' 32 | androidTestImplementation 'androidx.test.ext:junit:1.1.1' 33 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' 34 | implementation 'androidx.cardview:cardview:1.0.0' 35 | implementation 'com.github.blackfizz:eazegraph:1.2.5l@aar' 36 | implementation 'com.nineoldandroids:library:2.4.0' 37 | implementation 'com.android.volley:volley:1.1.1' 38 | implementation 'com.leo.simplearcloader:simplearcloader:1.0.+' 39 | implementation 'com.github.bumptech.glide:glide:4.11.0' 40 | annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' 41 | } 42 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/developer/arsltech/covid_19tracker/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.developer.arsltech.covid_19tracker; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | 25 | assertEquals("com.developer.arsltech.covid_19tracker", appContext.getPackageName()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/developer/arsltech/covid_19tracker/AffectedCountries.java: -------------------------------------------------------------------------------- 1 | package com.developer.arsltech.covid_19tracker; 2 | 3 | import androidx.annotation.NonNull; 4 | import androidx.appcompat.app.AppCompatActivity; 5 | 6 | import android.content.Intent; 7 | import android.graphics.Color; 8 | import android.os.Bundle; 9 | import android.text.Editable; 10 | import android.text.TextWatcher; 11 | import android.view.MenuItem; 12 | import android.view.View; 13 | import android.widget.AdapterView; 14 | import android.widget.EditText; 15 | import android.widget.ListView; 16 | import android.widget.Toast; 17 | 18 | import com.android.volley.Request; 19 | import com.android.volley.RequestQueue; 20 | import com.android.volley.Response; 21 | import com.android.volley.VolleyError; 22 | import com.android.volley.toolbox.StringRequest; 23 | import com.android.volley.toolbox.Volley; 24 | import com.leo.simplearcloader.SimpleArcLoader; 25 | 26 | import org.eazegraph.lib.models.PieModel; 27 | import org.json.JSONArray; 28 | import org.json.JSONException; 29 | import org.json.JSONObject; 30 | 31 | import java.util.ArrayList; 32 | import java.util.List; 33 | 34 | public class AffectedCountries extends AppCompatActivity { 35 | 36 | EditText edtSearch; 37 | ListView listView; 38 | SimpleArcLoader simpleArcLoader; 39 | 40 | public static List countryModelsList = new ArrayList<>(); 41 | CountryModel countryModel; 42 | MyCustomAdapter myCustomAdapter; 43 | 44 | @Override 45 | protected void onCreate(Bundle savedInstanceState) { 46 | super.onCreate(savedInstanceState); 47 | setContentView(R.layout.activity_affected_countries); 48 | 49 | edtSearch = findViewById(R.id.edtSearch); 50 | listView = findViewById(R.id.listView); 51 | simpleArcLoader = findViewById(R.id.loader); 52 | 53 | getSupportActionBar().setTitle("Affected Countries"); 54 | getSupportActionBar().setDisplayHomeAsUpEnabled(true); 55 | getSupportActionBar().setDisplayShowHomeEnabled(true); 56 | 57 | fetchData(); 58 | 59 | listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 60 | @Override 61 | public void onItemClick(AdapterView parent, View view, int position, long id) { 62 | startActivity(new Intent(getApplicationContext(),DetailActivity.class).putExtra("position",position)); 63 | } 64 | }); 65 | 66 | 67 | edtSearch.addTextChangedListener(new TextWatcher() { 68 | @Override 69 | public void beforeTextChanged(CharSequence s, int start, int count, int after) { 70 | 71 | } 72 | 73 | @Override 74 | public void onTextChanged(CharSequence s, int start, int before, int count) { 75 | 76 | myCustomAdapter.getFilter().filter(s); 77 | myCustomAdapter.notifyDataSetChanged(); 78 | 79 | } 80 | 81 | @Override 82 | public void afterTextChanged(Editable s) { 83 | 84 | } 85 | }); 86 | } 87 | 88 | 89 | 90 | @Override 91 | public boolean onOptionsItemSelected(@NonNull MenuItem item) { 92 | if(item.getItemId()==android.R.id.home) 93 | finish(); 94 | return super.onOptionsItemSelected(item); 95 | } 96 | 97 | private void fetchData() { 98 | 99 | String url = "https://corona.lmao.ninja/v2/countries/"; 100 | 101 | simpleArcLoader.start(); 102 | 103 | StringRequest request = new StringRequest(Request.Method.GET, url, 104 | new Response.Listener() { 105 | @Override 106 | public void onResponse(String response) { 107 | 108 | try { 109 | JSONArray jsonArray = new JSONArray(response); 110 | 111 | for(int i=0;i() { 64 | @Override 65 | public void onResponse(String response) { 66 | 67 | try { 68 | JSONObject jsonObject = new JSONObject(response.toString()); 69 | 70 | tvCases.setText(jsonObject.getString("cases")); 71 | tvRecovered.setText(jsonObject.getString("recovered")); 72 | tvCritical.setText(jsonObject.getString("critical")); 73 | tvActive.setText(jsonObject.getString("active")); 74 | tvTodayCases.setText(jsonObject.getString("todayCases")); 75 | tvTotalDeaths.setText(jsonObject.getString("deaths")); 76 | tvTodayDeaths.setText(jsonObject.getString("todayDeaths")); 77 | tvAffectedCountries.setText(jsonObject.getString("affectedCountries")); 78 | 79 | 80 | pieChart.addPieSlice(new PieModel("Cases",Integer.parseInt(tvCases.getText().toString()), Color.parseColor("#FFA726"))); 81 | pieChart.addPieSlice(new PieModel("Recoverd",Integer.parseInt(tvRecovered.getText().toString()), Color.parseColor("#66BB6A"))); 82 | pieChart.addPieSlice(new PieModel("Deaths",Integer.parseInt(tvTotalDeaths.getText().toString()), Color.parseColor("#EF5350"))); 83 | pieChart.addPieSlice(new PieModel("Active",Integer.parseInt(tvActive.getText().toString()), Color.parseColor("#29B6F6"))); 84 | pieChart.startAnimation(); 85 | 86 | simpleArcLoader.stop(); 87 | simpleArcLoader.setVisibility(View.GONE); 88 | scrollView.setVisibility(View.VISIBLE); 89 | 90 | 91 | 92 | 93 | } catch (JSONException e) { 94 | e.printStackTrace(); 95 | simpleArcLoader.stop(); 96 | simpleArcLoader.setVisibility(View.GONE); 97 | scrollView.setVisibility(View.VISIBLE); 98 | } 99 | 100 | 101 | } 102 | }, new Response.ErrorListener() { 103 | @Override 104 | public void onErrorResponse(VolleyError error) { 105 | simpleArcLoader.stop(); 106 | simpleArcLoader.setVisibility(View.GONE); 107 | scrollView.setVisibility(View.VISIBLE); 108 | Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show(); 109 | } 110 | }); 111 | 112 | RequestQueue requestQueue = Volley.newRequestQueue(this); 113 | requestQueue.add(request); 114 | 115 | 116 | } 117 | 118 | public void goTrackCountries(View view) { 119 | 120 | startActivity(new Intent(getApplicationContext(),AffectedCountries.class)); 121 | 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /app/src/main/java/com/developer/arsltech/covid_19tracker/MyCustomAdapter.java: -------------------------------------------------------------------------------- 1 | package com.developer.arsltech.covid_19tracker; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.ArrayAdapter; 8 | import android.widget.Filter; 9 | import android.widget.ImageView; 10 | import android.widget.TextView; 11 | 12 | import androidx.annotation.NonNull; 13 | import androidx.annotation.Nullable; 14 | 15 | import com.bumptech.glide.Glide; 16 | 17 | import java.util.ArrayList; 18 | import java.util.List; 19 | 20 | public class MyCustomAdapter extends ArrayAdapter { 21 | 22 | private Context context; 23 | private List countryModelsList; 24 | private List countryModelsListFiltered; 25 | 26 | public MyCustomAdapter( Context context, List countryModelsList) { 27 | super(context, R.layout.list_custom_item,countryModelsList); 28 | 29 | this.context = context; 30 | this.countryModelsList = countryModelsList; 31 | this.countryModelsListFiltered = countryModelsList; 32 | 33 | } 34 | 35 | @NonNull 36 | @Override 37 | public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 38 | 39 | View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_custom_item,null,true); 40 | TextView tvCountryName = view.findViewById(R.id.tvCountryName); 41 | ImageView imageView = view.findViewById(R.id.imageFlag); 42 | 43 | tvCountryName.setText(countryModelsListFiltered.get(position).getCountry()); 44 | Glide.with(context).load(countryModelsListFiltered.get(position).getFlag()).into(imageView); 45 | 46 | return view; 47 | } 48 | 49 | @Override 50 | public int getCount() { 51 | return countryModelsListFiltered.size(); 52 | } 53 | 54 | @Nullable 55 | @Override 56 | public CountryModel getItem(int position) { 57 | return countryModelsListFiltered.get(position); 58 | } 59 | 60 | @Override 61 | public long getItemId(int position) { 62 | return position; 63 | } 64 | 65 | @Override 66 | public Filter getFilter() { 67 | Filter filter = new Filter() { 68 | @Override 69 | protected FilterResults performFiltering(CharSequence constraint) { 70 | 71 | FilterResults filterResults = new FilterResults(); 72 | if(constraint == null || constraint.length() == 0){ 73 | filterResults.count = countryModelsList.size(); 74 | filterResults.values = countryModelsList; 75 | 76 | }else{ 77 | List resultsModel = new ArrayList<>(); 78 | String searchStr = constraint.toString().toLowerCase(); 79 | 80 | for(CountryModel itemsModel:countryModelsList){ 81 | if(itemsModel.getCountry().toLowerCase().contains(searchStr)){ 82 | resultsModel.add(itemsModel); 83 | 84 | } 85 | filterResults.count = resultsModel.size(); 86 | filterResults.values = resultsModel; 87 | } 88 | 89 | 90 | } 91 | 92 | return filterResults; 93 | } 94 | 95 | @Override 96 | protected void publishResults(CharSequence constraint, FilterResults results) { 97 | 98 | countryModelsListFiltered = (List) results.values; 99 | AffectedCountries.countryModelsList = (List) results.values; 100 | notifyDataSetChanged(); 101 | 102 | } 103 | }; 104 | return filter; 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/edittext_shadow.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_affected_countries.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 22 | 23 | 29 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_detail.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 17 | 18 | 25 | 37 | 38 | 39 | 46 | 53 | 54 | 61 | 73 | 74 | 75 | 82 | 89 | 90 | 97 | 109 | 110 | 111 | 118 | 125 | 126 | 133 | 145 | 146 | 147 | 154 | 161 | 162 | 169 | 181 | 182 | 183 | 190 | 197 | 198 | 205 | 217 | 218 | 219 | 226 | 233 | 234 | 241 | 253 | 254 | 255 | 262 | 269 | 270 | 277 | 288 | 289 | 290 | 297 | 298 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 19 | 20 | 26 | 36 | 43 | 44 | 48 | 52 | 57 | 58 | 59 | 64 | 68 | 73 | 74 | 75 | 80 | 84 | 89 | 90 | 91 | 96 | 100 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 126 | 127 | 131 | 139 | 140 | 141 | 146 | 147 | 151 | 152 | 161 | 162 | 169 | 170 | 177 | 178 | 184 | 196 | 197 | 198 | 205 | 212 | 213 | 219 | 230 | 231 | 232 | 239 | 246 | 247 | 253 | 265 | 266 | 267 | 274 | 281 | 282 | 288 | 300 | 301 | 302 | 309 | 316 | 317 | 323 | 335 | 336 | 337 | 344 | 351 | 352 | 358 | 370 | 371 | 372 | 379 | 386 | 387 | 393 | 405 | 406 | 407 | 414 | 421 | 422 | 428 | 439 | 440 | 441 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 |