diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 000000000..53994f239 --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,26 @@ +name: Android CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Build with Gradle + run: ./gradlew build diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 000000000..e9969a1c2 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 000000000..a5f05cd8c --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0d17b9380..e1558670d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,4 +26,4 @@ dependencies { testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' -} +} \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 000000000..228129634 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,39 @@ +{ + "project_info": { + "project_number": "520311220155", + "project_id": "cmput301firestore", + "storage_bucket": "cmput301firestore.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:520311220155:android:c59c1e78e27e014953869e", + "android_client_info": { + "package_name": "com.example.simpleparadox.listycity" + } + }, + "oauth_client": [ + { + "client_id": "520311220155-nh05qmeo58vsv948in26lcdtpjcnu3i1.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCBO4K4e_EdJRN4ePt5WIwl29e_kBAbv5U" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "520311220155-nh05qmeo58vsv948in26lcdtpjcnu3i1.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7c224868e..ba929cf71 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,7 +9,8 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> - + diff --git a/app/src/main/java/com/example/simpleparadox/listycity/City.java b/app/src/main/java/com/example/simpleparadox/listycity/City.java index fb6fbd1d1..969fbce4c 100644 --- a/app/src/main/java/com/example/simpleparadox/listycity/City.java +++ b/app/src/main/java/com/example/simpleparadox/listycity/City.java @@ -4,7 +4,7 @@ public class City { private String city; private String province; - City(String city, String province){ + public City(String city, String province){ this.city = city; this.province = province; } diff --git a/app/src/main/java/com/example/simpleparadox/listycity/CustomList.java b/app/src/main/java/com/example/simpleparadox/listycity/CustomList.java index 1a7af1f60..3607faef3 100644 --- a/app/src/main/java/com/example/simpleparadox/listycity/CustomList.java +++ b/app/src/main/java/com/example/simpleparadox/listycity/CustomList.java @@ -47,4 +47,21 @@ public View getView(int position, @Nullable View convertView, @NonNull ViewGroup return view; } + + /** + * this function will get the size of list + * @return + */ + public int getCount() { + return cities.size(); + } + + /** + * this function will add a city object into the list + * @param city + */ + public void addCity(City city) { + cities.add(city); + return; + } } diff --git a/app/src/main/java/com/example/simpleparadox/listycity/MainActivity.java b/app/src/main/java/com/example/simpleparadox/listycity/MainActivity.java index 5d276ec77..8279723dd 100644 --- a/app/src/main/java/com/example/simpleparadox/listycity/MainActivity.java +++ b/app/src/main/java/com/example/simpleparadox/listycity/MainActivity.java @@ -1,15 +1,31 @@ package com.example.simpleparadox.listycity; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; +import android.util.Log; +import android.view.View; import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.EditText; import android.widget.ListAdapter; import android.widget.ListView; +import com.google.android.gms.tasks.OnFailureListener; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.firebase.firestore.CollectionReference; +import com.google.firebase.firestore.EventListener; +import com.google.firebase.firestore.FirebaseFirestore; +import com.google.firebase.firestore.FirebaseFirestoreException; +import com.google.firebase.firestore.QueryDocumentSnapshot; +import com.google.firebase.firestore.QuerySnapshot; + import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; public class MainActivity extends AppCompatActivity { @@ -20,6 +36,12 @@ public class MainActivity extends AppCompatActivity { CustomList customList; + final String TAG = "Sample"; + Button addCityButton; + EditText addCityEditText; + EditText addProvinceEditText; + FirebaseFirestore db; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -27,28 +49,76 @@ protected void onCreate(Bundle savedInstanceState) { cityList = findViewById(R.id.city_list); - String []cities ={"Edmonton", "Vancouver", "Toronto", "Hamilton", "Denver", "Los Angeles"}; - String []provinces = {"AB", "BC", "ON", "ON", "CO", "CA"}; + addCityButton = findViewById(R.id.add_city_button); + addCityEditText = findViewById(R.id.add_city_field); + addProvinceEditText = findViewById(R.id.add_province_edit_text); cityDataList = new ArrayList<>(); - for(int i=0;i(); -// dataList.addAll(Arrays.asList(cities)); -// -// cityAdapter = new ArrayAdapter<>(this, R.layout.content, dataList); -// -// cityList.setAdapter(cityAdapter); - - + db = FirebaseFirestore.getInstance(); + + final CollectionReference collectionReference = db.collection("Cities"); + + + addCityButton.setOnClickListener( new View.OnClickListener() { + @Override + public void onClick(View view) { // or Firestore View? + + final String cityName = addCityEditText.getText().toString(); + final String provinceName = addProvinceEditText.getText().toString(); + + HashMap data = new HashMap<>(); + + if (cityName.length()>0 && provinceName.length()>0) { + data.put("Province Name", provinceName); + collectionReference + .document(cityName) + .set(data) + .addOnSuccessListener(new OnSuccessListener() { + @Override + public void onSuccess(Void aVoid) { +// These are a method which gets executed when the task is succeeded + Log.d(TAG, "Data has been added successfully!"); + } + }) + .addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception e) { +// These are a method which gets executed if there’s any problem + Log.d(TAG, "Data could not be added!" + e.toString()); + + addCityEditText.setText(""); + addProvinceEditText.setText(""); + } + }); + } + + } + }); + + collectionReference.addSnapshotListener(new EventListener() { + @Override + public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable + FirebaseFirestoreException error) { + + // Clear the old list + cityDataList.clear(); + for(QueryDocumentSnapshot doc: queryDocumentSnapshots) + { + Log.d(TAG, String.valueOf(doc.getData().get("Province Name"))); + String city = doc.getId(); + String province = (String) doc.getData().get("Province Name"); + cityDataList.add(new City(city, province)); // Adding the cities and provinces from FireStore + } + cityAdapter.notifyDataSetChanged(); // Notifying the adapter to render any new data fetched + // from the cloud + } + }); } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index e7ecd0fe3..878ba59fa 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,12 +6,32 @@ android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> - + + + + + + + - - \ No newline at end of file diff --git a/app/src/test/java/TestListyCity.java b/app/src/test/java/TestListyCity.java new file mode 100644 index 000000000..b0710c883 --- /dev/null +++ b/app/src/test/java/TestListyCity.java @@ -0,0 +1,26 @@ +import com.example.simpleparadox.listycity.City; +import com.example.simpleparadox.listycity.CustomList; + +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; + +import java.util.ArrayList; + +public class TestListyCity { + + private CustomList list; + + @Before + public void createList() { + list = new CustomList(null, new ArrayList()); + } + + @Test + public void addCityTest() { + int listSize = list.getCount(); + list.addCity(new City("Halifax", "NS")); + assertEquals(list.getCount(), listSize+1); + } + +} diff --git a/build.gradle b/build.gradle index 5509623ab..31c6146ed 100644 --- a/build.gradle +++ b/build.gradle @@ -7,8 +7,8 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.5.0' - + classpath 'com.android.tools.build:gradle:7.0.2' + classpath 'com.google.gms:google-services:4.3.10' // 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 36854e580..39b076627 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip