From 551a3c21a9367948326e989b39d9192a604d4a53 Mon Sep 17 00:00:00 2001 From: akaessens <24660231+akaessens@users.noreply.github.com> Date: Thu, 24 Sep 2020 22:00:48 +0200 Subject: [PATCH] update items, cleanup, add intents --- app/build.gradle | 2 + .../akdev/nofbeventscraper/EventAdapter.java | 185 ++++++++----- .../akdev/nofbeventscraper/MainActivity.java | 46 +--- app/src/main/res/drawable/divider.xml | 7 - app/src/main/res/drawable/ic_add_location.xml | 9 - app/src/main/res/drawable/ic_map.xml | 9 + app/src/main/res/drawable/ic_schedule.xml | 12 + app/src/main/res/layout/item_event.xml | 244 ++++++------------ 8 files changed, 227 insertions(+), 287 deletions(-) delete mode 100644 app/src/main/res/drawable/divider.xml delete mode 100644 app/src/main/res/drawable/ic_add_location.xml create mode 100644 app/src/main/res/drawable/ic_map.xml create mode 100644 app/src/main/res/drawable/ic_schedule.xml diff --git a/app/build.gradle b/app/build.gradle index 34636e1..5ddcf21 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -39,6 +39,8 @@ dependencies { implementation 'org.jsoup:jsoup:1.13.1' implementation 'com.squareup.picasso:picasso:2.71828' + implementation 'jp.wasabeef:picasso-transformations:2.2.1' + implementation 'androidx.preference:preference:1.1.1' implementation "androidx.webkit:webkit:1.3.0" diff --git a/app/src/main/java/com/akdev/nofbeventscraper/EventAdapter.java b/app/src/main/java/com/akdev/nofbeventscraper/EventAdapter.java index 7429e21..5273e08 100644 --- a/app/src/main/java/com/akdev/nofbeventscraper/EventAdapter.java +++ b/app/src/main/java/com/akdev/nofbeventscraper/EventAdapter.java @@ -4,20 +4,24 @@ package com.akdev.nofbeventscraper; import android.content.Context; import android.content.Intent; import android.net.Uri; +import android.provider.CalendarContract; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; import android.widget.ImageView; +import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; -import com.google.android.material.textfield.TextInputEditText; -import com.google.android.material.textfield.TextInputLayout; -import com.google.android.material.textview.MaterialTextView; import com.squareup.picasso.Picasso; import java.util.List; +import jp.wasabeef.picasso.transformations.CropCircleTransformation; + +import static com.akdev.nofbeventscraper.FbEvent.dateTimeToEpoch; + public class EventAdapter extends RecyclerView.Adapter { @@ -35,109 +39,148 @@ public class EventAdapter extends LayoutInflater inflater = LayoutInflater.from(context); // Inflate the custom layout - View contact_view = inflater.inflate(R.layout.item_event, parent, false); - + View view = inflater.inflate(R.layout.item_event, parent, false); // Return a new holder instance - final ViewHolder holder = new ViewHolder(contact_view); + final ViewHolder holder = new ViewHolder(view); + + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(final EventAdapter.ViewHolder holder, int position) { + // Get the data model based on position + final FbEvent event = events.get(position); + + + // Set item views based on your views and data model + if (!event.name.equals("")) { + holder.text_view_event_name.setText(event.name); + } + + if (event.start_date != null) { + String str = FbEvent.dateTimeToString(event.start_date); + holder.text_view_event_start.setText(str); + } + + if (event.end_date != null) { + String str = FbEvent.dateTimeToString(event.end_date); + holder.text_view_event_end.setText(str); + } + + if (!event.location.equals("")) { + holder.text_view_event_location.setText(event.location); + } + + if (!event.description.equals("")) { + holder.text_view_event_description.setText(event.description); + } + + try { + Picasso.get() + .load(event.image_url) + .placeholder(R.mipmap.ic_launcher) + .transform(new CropCircleTransformation()) + .into(holder.image_view_event_image); + } catch (Exception e) { + e.printStackTrace(); + } /* * Maps button: launch maps intent */ - - /*holder.layout_event_location.setEndIconOnClickListener(new View.OnClickListener() { + View.OnClickListener location_click_listener = new View.OnClickListener() { @Override public void onClick(View view) { - String map_search = "geo:0,0?q=" + holder.edit_text_event_location.getText(); + String map_search = "geo:0,0?q=" + event.location; Uri intent_uri = Uri.parse(map_search); Intent map_intent = new Intent(Intent.ACTION_VIEW, intent_uri); - if (map_intent.resolveActivity(context.getPackageManager()) != null) { - context.startActivity(map_intent); + if (map_intent.resolveActivity(view.getContext().getPackageManager()) != null) { + view.getContext().startActivity(map_intent); } } - });*/ + }; + holder.image_view_event_location.setOnClickListener(location_click_listener); + holder.text_view_event_location.setOnClickListener(location_click_listener); + /* + * Add to calendar button: launch calendar application with current event + */ + holder.button_add_to_calendar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { - return new ViewHolder(contact_view); - } - @Override - public void onBindViewHolder(EventAdapter.ViewHolder holder, int position) { - // Get the data model based on position - FbEvent event = events.get(position); + Long start_epoch = dateTimeToEpoch(event.start_date); + Long end_epoch = dateTimeToEpoch(event.end_date); - // Set item views based on your views and data model - if (event.name.equals("")) { - //holder.edit_text_event_name.setError(R.string.error_no_name); - } else { - holder.edit_text_event_name.setText(event.name); - } + Intent intent = new Intent(Intent.ACTION_EDIT); + intent.setType("vnd.android.cursor.item/event"); + intent.putExtra(CalendarContract.Events.TITLE, event.name); + intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, start_epoch); + intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end_epoch); + intent.putExtra(CalendarContract.Events.EVENT_LOCATION, event.location); - if (event.start_date == null) { - //holder.edit_text_event_start.setError(getString(R.string.error_no_start_date)); - } else { - String str = FbEvent.dateTimeToString(event.start_date); - holder.edit_text_event_start.setText(str); - } + // prepend url in description + String desc = event.url + "\n\n" + event.description; + intent.putExtra(CalendarContract.Events.DESCRIPTION, desc); - if (event.end_date == null) { - //edit_text_event_end.setError(getString(R.string.error_no_end_date)); - } else { - String str = FbEvent.dateTimeToString(event.end_date); - holder.edit_text_event_end.setText(str); - } + if (intent.resolveActivity(view.getContext().getPackageManager()) != null) { + view.getContext().startActivity(intent); + } + } + }); + /* + * Expand and collapse description + */ + holder.text_view_event_description.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (holder.description_collapsed) { + holder.description_collapsed = false; + holder.text_view_event_description.setMaxLines(Integer.MAX_VALUE); + } else { + holder.description_collapsed = true; + holder.text_view_event_description.setMaxLines(5); + } + } + }); - if (event.location.equals("")) { - //edit_text_event_location.setError(getString(R.string.error_no_location)); - } else { - holder.edit_text_event_location.setText(event.location); - //layout_event_location.setEndIconVisible(true); - } - - if (event.description.equals("")) { - //holder.edit_text_event_description.setError(getString(R.string.error_no_description)); - } else { - holder.edit_text_event_description.setText(event.description); - } - - if (event.image_url == null) { - holder.image_view_event_image.setVisibility(View.GONE); - } - else { - Picasso.get() - .load(event.image_url).into(holder.image_view_event_image); - } - //.placeholder(R.drawable.ic_banner_foreground)*/ } + // Returns the total count of items in the list @Override public int getItemCount() { return events.size(); } - public class ViewHolder extends RecyclerView.ViewHolder { + public static class ViewHolder extends RecyclerView.ViewHolder { - protected MaterialTextView edit_text_event_name; - protected MaterialTextView edit_text_event_start; - protected MaterialTextView edit_text_event_end; - protected MaterialTextView edit_text_event_location; - protected MaterialTextView edit_text_event_description; + protected TextView text_view_event_name; + protected TextView text_view_event_start; + protected TextView text_view_event_end; + protected TextView text_view_event_location; + protected TextView text_view_event_description; protected ImageView image_view_event_image; - //protected TextInputLayout layout_event_location; + protected ImageView image_view_event_location; + protected Button button_add_to_calendar; + protected boolean description_collapsed = true; public ViewHolder(View item_view) { super(item_view); - edit_text_event_name = (MaterialTextView) item_view.findViewById(R.id.edit_text_event_name); - edit_text_event_start = (MaterialTextView) item_view.findViewById(R.id.edit_text_event_start); - edit_text_event_end = (MaterialTextView) item_view.findViewById(R.id.edit_text_event_end); - edit_text_event_location = (MaterialTextView) item_view.findViewById(R.id.edit_text_event_location); - edit_text_event_description = (MaterialTextView) item_view.findViewById(R.id.edit_text_event_description); - image_view_event_image = (ImageView) item_view.findViewById(R.id.image_view_event_image); - //layout_event_location = (TextInputLayout) item_view.findViewById(R.id.layout_event_location); + text_view_event_name = item_view.findViewById(R.id.text_view_event_name); + text_view_event_start = item_view.findViewById(R.id.text_view_event_start); + text_view_event_end = item_view.findViewById(R.id.text_view_event_end); + text_view_event_location = item_view.findViewById(R.id.text_view_event_location); + text_view_event_description = item_view.findViewById(R.id.text_view_event_description); + image_view_event_image = item_view.findViewById(R.id.image_view_event_image); + image_view_event_location = item_view.findViewById(R.id.image_view_event_location); + button_add_to_calendar = item_view.findViewById(R.id.button_add_to_calendar); + } } } \ No newline at end of file diff --git a/app/src/main/java/com/akdev/nofbeventscraper/MainActivity.java b/app/src/main/java/com/akdev/nofbeventscraper/MainActivity.java index a399f63..05267d0 100644 --- a/app/src/main/java/com/akdev/nofbeventscraper/MainActivity.java +++ b/app/src/main/java/com/akdev/nofbeventscraper/MainActivity.java @@ -10,7 +10,6 @@ import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; -import android.widget.Button; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.view.menu.MenuBuilder; @@ -46,7 +45,7 @@ public class MainActivity extends AppCompatActivity { public void onRestoreInstanceState(Bundle state) { super.onRestoreInstanceState(state); - if (! state.getBoolean("events_empty") ) { + if (!state.getBoolean("events_empty")) { startScraping(); } @@ -66,28 +65,24 @@ public class MainActivity extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - edit_text_uri_input = (TextInputEditText) findViewById(R.id.edit_text_uri_input); - layout_uri_input = (TextInputLayout) findViewById(R.id.layout_uri_input); + edit_text_uri_input = findViewById(R.id.edit_text_uri_input); + layout_uri_input = findViewById(R.id.layout_uri_input); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - //ok_button = (Button) findViewById(R.id.ok_button); - paste_button = (ExtendedFloatingActionButton) findViewById(R.id.paste_button); - //ok_button.setEnabled(false); + paste_button = findViewById(R.id.paste_button); /* * initialize recycler view with empty list of events * scroll horizontal with snapping */ - RecyclerView recycler_view = (RecyclerView) findViewById(R.id.recycler_view); + RecyclerView recycler_view = findViewById(R.id.recycler_view); events = createEventList(); adapter = new EventAdapter(events); recycler_view.setAdapter(adapter); linear_layout_manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); recycler_view.setLayoutManager(linear_layout_manager); - //recycler_view.setHasFixedSize(true); - //SnapHelper snap_helper = new LinearSnapHelper(); - //snap_helper.attachToRecyclerView(recycler_view); + recycler_view.setHasFixedSize(true); /* @@ -125,35 +120,6 @@ public class MainActivity extends AppCompatActivity { layout_uri_input.setErrorIconOnClickListener(listener); - /* - * Add to calendar button: launch calendar application with current event - */ - /*ok_button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - - FbEvent event = events.get(linear_layout_manager.findFirstCompletelyVisibleItemPosition()); - - Long start_epoch = dateTimeToEpoch(event.start_date); - Long end_epoch = dateTimeToEpoch(event.end_date); - - Intent intent = new Intent(Intent.ACTION_EDIT); - intent.setType("vnd.android.cursor.item/event"); - intent.putExtra(CalendarContract.Events.TITLE, event.name); - intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, start_epoch); - intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end_epoch); - intent.putExtra(CalendarContract.Events.EVENT_LOCATION, event.location); - - // prepend url in description - String desc = event.url + "\n\n" + event.description; - intent.putExtra(CalendarContract.Events.DESCRIPTION, desc); - - if (intent.resolveActivity(getPackageManager()) != null) { - startActivity(intent); - } - } - }); - /* * Enter button in uri input: start scraping */ diff --git a/app/src/main/res/drawable/divider.xml b/app/src/main/res/drawable/divider.xml deleted file mode 100644 index f1c8778..0000000 --- a/app/src/main/res/drawable/divider.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_add_location.xml b/app/src/main/res/drawable/ic_add_location.xml deleted file mode 100644 index 0885174..0000000 --- a/app/src/main/res/drawable/ic_add_location.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_map.xml b/app/src/main/res/drawable/ic_map.xml new file mode 100644 index 0000000..b24b411 --- /dev/null +++ b/app/src/main/res/drawable/ic_map.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_schedule.xml b/app/src/main/res/drawable/ic_schedule.xml new file mode 100644 index 0000000..e4c467c --- /dev/null +++ b/app/src/main/res/drawable/ic_schedule.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/item_event.xml b/app/src/main/res/layout/item_event.xml index 0139988..ef96c46 100644 --- a/app/src/main/res/layout/item_event.xml +++ b/app/src/main/res/layout/item_event.xml @@ -4,7 +4,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/card" android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_height="wrap_content" android:layout_margin="16dp"> @@ -23,72 +24,110 @@ android:id="@+id/image_view_event_image" android:layout_width="80dp" android:layout_height="80dp" - android:layout_marginRight="8dp" + android:layout_marginEnd="8dp" android:contentDescription="thumbnail" android:scaleType="centerCrop" /> - + + + + + + + + + + + + + + + + + android:text="@string/error_no_start_date" + android:textAppearance="?attr/textAppearanceBody2" /> + android:text="@string/error_no_end_date" + android:textAppearance="?attr/textAppearanceBody2" /> + + + + - - - - - - - - - - -