mirror of
https://github.com/akaessens/NoFbEventScraper
synced 2025-06-05 23:29:13 +02:00
Compare commits
21 Commits
v0.4.2
...
gradle-plu
Author | SHA1 | Date | |
---|---|---|---|
01c221181e | |||
43458af11c | |||
2a67c74f57 | |||
8f8d0d07a8 | |||
7fdfd38cdc | |||
b4d37fbc3f | |||
2b035b6975 | |||
32da94c275 | |||
866889db27 | |||
6248e79021 | |||
e8893fd712 | |||
6c00e63d1f | |||
b37fa14d96 | |||
c6e25fdcfb | |||
1ec5c5ea41 | |||
e051e66188 | |||
42882b7aa8 | |||
62742fd1aa | |||
3299001d9b | |||
ad9bf21b68 | |||
0a20102678 |
8
.github/workflows/android.yml
vendored
8
.github/workflows/android.yml
vendored
@ -2,9 +2,7 @@ name: Android CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@ -13,9 +11,9 @@ jobs:
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: set up JDK 1.8
|
||||
uses: actions/setup-java@v1
|
||||
- uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: 1.8
|
||||
distribution: 'adopt'
|
||||
java-version: '11'
|
||||
- name: Build with Gradle
|
||||
run: ./gradlew build
|
||||
|
@ -1,4 +1,12 @@
|
||||
# Changelog
|
||||
## v0.4.4 (14)
|
||||
- Fix Android 11 intents (to open Calendar or Maps)
|
||||
## v0.4.3 (13)
|
||||
- Add spanish translation thanks to @sguinetti
|
||||
- update dependencies
|
||||
## v0.4.2 (12)
|
||||
- Fix scraping not working when cookies need to be accepted
|
||||
- Android 11 ready
|
||||
## v0.4.1 (11)
|
||||
- Fix events not displaying correctly after activity resume
|
||||
- add share action on each event
|
||||
|
@ -2,14 +2,13 @@ apply plugin: 'com.android.application'
|
||||
|
||||
android {
|
||||
compileSdkVersion 30
|
||||
buildToolsVersion "29.0.3"
|
||||
|
||||
defaultConfig {
|
||||
applicationId "com.akdev.nofbeventscraper"
|
||||
minSdkVersion 23
|
||||
targetSdkVersion 30
|
||||
versionCode 12
|
||||
versionName "0.4.2"
|
||||
versionCode 14
|
||||
versionName "0.4.4"
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
@ -26,31 +25,31 @@ android {
|
||||
dependencies {
|
||||
// androidx
|
||||
implementation 'androidx.coordinatorlayout:coordinatorlayout:1.1.0'
|
||||
implementation 'androidx.recyclerview:recyclerview:1.1.0'
|
||||
implementation 'androidx.recyclerview:recyclerview:1.2.1'
|
||||
implementation 'androidx.cardview:cardview:1.0.0'
|
||||
implementation 'androidx.navigation:navigation-fragment:2.3.4'
|
||||
implementation 'androidx.navigation:navigation-ui:2.3.4'
|
||||
implementation 'androidx.appcompat:appcompat:1.2.0'
|
||||
implementation 'androidx.navigation:navigation-fragment:2.3.5'
|
||||
implementation 'androidx.navigation:navigation-ui:2.3.5'
|
||||
implementation 'androidx.appcompat:appcompat:1.3.1'
|
||||
implementation 'androidx.preference:preference:1.1.1'
|
||||
implementation "androidx.webkit:webkit:1.4.0"
|
||||
|
||||
// JSON save/restore shared preference
|
||||
implementation 'com.google.code.gson:gson:2.8.5'
|
||||
implementation 'com.google.code.gson:gson:2.8.6'
|
||||
|
||||
// Theme
|
||||
implementation 'com.google.android.material:material:1.3.0'
|
||||
implementation 'com.google.android.material:material:1.4.0'
|
||||
|
||||
// Scraping
|
||||
implementation 'org.jsoup:jsoup:1.13.1'
|
||||
implementation 'org.jsoup:jsoup:1.14.1'
|
||||
|
||||
// Image loading and transforming
|
||||
implementation 'com.squareup.picasso:picasso:2.71828'
|
||||
|
||||
// animations and transformations
|
||||
implementation 'jp.wasabeef:picasso-transformations:2.2.1'
|
||||
implementation 'jp.wasabeef:recyclerview-animators:3.0.0'
|
||||
implementation 'jp.wasabeef:picasso-transformations:2.4.0'
|
||||
implementation 'jp.wasabeef:recyclerview-animators:4.0.2'
|
||||
// tests
|
||||
testImplementation 'junit:junit:4.12'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
||||
}
|
||||
|
@ -1,52 +1,58 @@
|
||||
package com.akdev.nofbeventscraper;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import org.jsoup.Connection;
|
||||
import org.jsoup.HttpStatusException;
|
||||
import org.jsoup.Jsoup;
|
||||
import org.jsoup.nodes.Document;
|
||||
import org.jsoup.nodes.Element;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class DocumentReceiver {
|
||||
|
||||
public static org.jsoup.nodes.Document getDocument(String url) {
|
||||
public static org.jsoup.nodes.Document getDocument(String url) throws HttpStatusException, IOException {
|
||||
|
||||
org.jsoup.nodes.Document document;
|
||||
|
||||
// use default android user agent
|
||||
String user_agent = "Mozilla/5.0 (X11; Linux x86_64)";
|
||||
|
||||
Log.d("scraperLog", "DocumentReceiver: " + url);
|
||||
|
||||
Connection connection = Jsoup.connect(url).userAgent(user_agent).followRedirects(true);
|
||||
|
||||
Connection.Response response = connection.execute();
|
||||
|
||||
document = response.parse();
|
||||
|
||||
Log.d("scraperLog", "Document title: " + document.title());
|
||||
|
||||
try {
|
||||
// use default android user agent
|
||||
String user_agent = "Mozilla/5.0 (X11; Linux x86_64)";
|
||||
// accept cookies needed?
|
||||
Element form = document.select("form[method=post]").first();
|
||||
String action = form.attr("action");
|
||||
|
||||
Connection connection = Jsoup.connect(url).userAgent(user_agent).followRedirects(true);
|
||||
List<String> names = form.select("input").eachAttr("name");
|
||||
List<String> values = form.select("input").eachAttr("value");
|
||||
|
||||
Connection.Response response = connection.execute();
|
||||
Map<String, String> data = new HashMap<String, String>();
|
||||
|
||||
document = response.parse();
|
||||
|
||||
try {
|
||||
// accept cookies needed?
|
||||
Element form = document.select("form[method=post]").first();
|
||||
String action = form.attr("action");
|
||||
|
||||
List<String> names = form.select("input").eachAttr("name");
|
||||
List<String> values = form.select("input").eachAttr("value");
|
||||
|
||||
Map<String, String> data = new HashMap<String, String>();
|
||||
|
||||
for (int i = 0; i < names.size(); i++) {
|
||||
data.put(names.get(i), values.get(i));
|
||||
}
|
||||
|
||||
document = connection.url("https://mbasic.facebook.com" + action)
|
||||
.cookies(response.cookies())
|
||||
.method(Connection.Method.POST)
|
||||
.data(data)
|
||||
.post();
|
||||
|
||||
} catch (Exception ignore) {
|
||||
for (int i = 0; i < names.size(); i++) {
|
||||
data.put(names.get(i), values.get(i));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
|
||||
document = connection.url("https://mbasic.facebook.com" + action)
|
||||
.cookies(response.cookies())
|
||||
.method(Connection.Method.POST)
|
||||
.data(data)
|
||||
.post();
|
||||
|
||||
} catch (Exception ignore) {
|
||||
}
|
||||
return document;
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package com.akdev.nofbeventscraper;
|
||||
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
@ -14,6 +15,7 @@ import android.view.WindowManager;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
@ -116,8 +118,12 @@ public class EventAdapter extends
|
||||
|
||||
Uri intent_uri = Uri.parse(map_search);
|
||||
Intent map_intent = new Intent(Intent.ACTION_VIEW, intent_uri);
|
||||
if (map_intent.resolveActivity(view.getContext().getPackageManager()) != null) {
|
||||
|
||||
try {
|
||||
view.getContext().startActivity(map_intent);
|
||||
} catch (ActivityNotFoundException e) {
|
||||
Toast toast=Toast.makeText(view.getContext(),"no App installed", Toast.LENGTH_SHORT);
|
||||
toast.show();
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -145,8 +151,11 @@ public class EventAdapter extends
|
||||
String desc = event.url + "\n\n" + event.description;
|
||||
intent.putExtra(CalendarContract.Events.DESCRIPTION, desc);
|
||||
|
||||
if (intent.resolveActivity(view.getContext().getPackageManager()) != null) {
|
||||
try {
|
||||
view.getContext().startActivity(intent);
|
||||
} catch (ActivityNotFoundException e) {
|
||||
Toast toast=Toast.makeText(view.getContext(),"no App installed", Toast.LENGTH_SHORT);
|
||||
toast.show();
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -213,7 +222,12 @@ public class EventAdapter extends
|
||||
share_intent.setType("text/plain");
|
||||
share_intent.putExtra(Intent.EXTRA_TEXT, event.url);
|
||||
|
||||
view.getContext().startActivity(Intent.createChooser(share_intent, null));
|
||||
try {
|
||||
view.getContext().startActivity(share_intent);
|
||||
} catch (ActivityNotFoundException e) {
|
||||
Toast toast=Toast.makeText(view.getContext(),"no App installed", Toast.LENGTH_SHORT);
|
||||
toast.show();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -1,9 +1,11 @@
|
||||
package com.akdev.nofbeventscraper;
|
||||
|
||||
import android.os.AsyncTask;
|
||||
import android.util.Log;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.jsoup.HttpStatusException;
|
||||
import org.jsoup.nodes.Document;
|
||||
|
||||
import java.io.IOException;
|
||||
@ -143,9 +145,10 @@ public class FbEventScraper extends AsyncTask<Void, Void, Void> {
|
||||
@Override
|
||||
protected Void doInBackground(Void... voids) {
|
||||
|
||||
Document document = DocumentReceiver.getDocument(url);
|
||||
Log.d("scraperLog", "doInBackground: "+url);
|
||||
|
||||
try {
|
||||
Document document = DocumentReceiver.getDocument(url);
|
||||
if (document == null) {
|
||||
throw new IOException();
|
||||
}
|
||||
@ -188,7 +191,10 @@ public class FbEventScraper extends AsyncTask<Void, Void, Void> {
|
||||
|
||||
this.event = new FbEvent(url, name, start_date, end_date, description, location, image_url);
|
||||
|
||||
} catch (IOException e) {
|
||||
} catch (HttpStatusException e) {
|
||||
this.error = R.string.error_url;
|
||||
}
|
||||
catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
this.error = R.string.error_connection;
|
||||
} catch (Exception e) {
|
||||
|
@ -5,6 +5,7 @@ import android.os.AsyncTask;
|
||||
|
||||
import androidx.preference.PreferenceManager;
|
||||
|
||||
import org.jsoup.HttpStatusException;
|
||||
import org.jsoup.nodes.Document;
|
||||
|
||||
import java.io.IOException;
|
||||
@ -95,13 +96,17 @@ public class FbPageScraper extends AsyncTask<Void, Void, Void> {
|
||||
url = null;
|
||||
event_links = event_links.subList(0, max);
|
||||
}
|
||||
|
||||
} catch (HttpStatusException e) {
|
||||
this.error = R.string.error_url;
|
||||
return null;
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
this.error = R.string.error_connection;
|
||||
return null;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
this.error = R.string.error_unknown;
|
||||
return null;
|
||||
}
|
||||
} while (url != null);
|
||||
|
||||
|
@ -2,6 +2,7 @@ package com.akdev.nofbeventscraper;
|
||||
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.AsyncTask;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.preference.PreferenceManager;
|
||||
|
||||
@ -152,8 +153,10 @@ public class FbScraper {
|
||||
*/
|
||||
void scrapeEvent(String event_url) {
|
||||
FbEventScraper scraper = new FbEventScraper(this, event_url);
|
||||
|
||||
Log.d("scraperLog", "scrapeEvent: "+event_url);
|
||||
tasks.add(scraper);
|
||||
scraper.execute();
|
||||
scraper.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -165,6 +168,7 @@ public class FbScraper {
|
||||
void scrapeEventResultCallback(FbEvent event, int error) {
|
||||
|
||||
if (event != null) {
|
||||
Log.d("scraperLog", "scrapeEventResultCallback: "+event.url);
|
||||
main.get().addEvent(event);
|
||||
main.get().input_helper(main.get().getString(R.string.done), false);
|
||||
} else if (url_type == url_type_enum.EVENT) {
|
||||
@ -180,8 +184,10 @@ public class FbScraper {
|
||||
void scrapePage(String page_url) {
|
||||
FbPageScraper scraper = new FbPageScraper(this, page_url);
|
||||
|
||||
Log.d("scraperLog", "scrapePage: "+page_url);
|
||||
|
||||
tasks.add(scraper);
|
||||
scraper.execute();
|
||||
scraper.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -193,10 +199,11 @@ public class FbScraper {
|
||||
protected void scrapePageResultCallback(List<String> event_urls, int error) {
|
||||
|
||||
if (event_urls.size() > 0) {
|
||||
|
||||
Log.d("scraperLog", "scrapePageResultCallback: "+event_urls.toString());
|
||||
for (String event_url : event_urls) {
|
||||
try {
|
||||
String url = getEventUrl(event_url);
|
||||
Log.d("scraperLog", "scrapePageResultCallback: "+url);
|
||||
scrapeEvent(url);
|
||||
} catch (URISyntaxException | MalformedURLException e) {
|
||||
// ignore this event
|
||||
@ -210,11 +217,15 @@ public class FbScraper {
|
||||
protected void redirectUrl (String url) {
|
||||
FbRedirectionResolver resolver = new FbRedirectionResolver(this, url);
|
||||
|
||||
resolver.execute();
|
||||
Log.d("scraperLog", "redirectUrl: "+url);
|
||||
|
||||
resolver.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||
}
|
||||
protected void redirectionResultCallback(String url) {
|
||||
this.input_url = url;
|
||||
|
||||
Log.d("scraperLog", "redirectUrlCb: "+url);
|
||||
|
||||
// now try again with expanded url
|
||||
this.run();
|
||||
}
|
||||
@ -253,6 +264,17 @@ public class FbScraper {
|
||||
url_type = url_type_enum.PAGE;
|
||||
scrapePage(page_url);
|
||||
|
||||
return;
|
||||
|
||||
} catch (URISyntaxException | MalformedURLException e) {
|
||||
url_type = url_type_enum.INVALID;
|
||||
}
|
||||
// check if only page name without prefix
|
||||
try {
|
||||
String page_url = getPageUrl("https://mbasic.facebook.com/"+input_url);
|
||||
url_type = url_type_enum.PAGE;
|
||||
scrapePage(page_url);
|
||||
|
||||
} catch (URISyntaxException | MalformedURLException e) {
|
||||
url_type = url_type_enum.INVALID;
|
||||
main.get().input_helper(main.get().getString(R.string.error_url), true);
|
||||
|
12
app/src/main/res/raw-es/about.html
Normal file
12
app/src/main/res/raw-es/about.html
Normal file
@ -0,0 +1,12 @@
|
||||
<!doctype html>
|
||||
<h3>Código abierto</h3>.
|
||||
<p>El código fuente de esta aplicación está disponible en <a href=" https://github.com/akaessens/NoFbEventScraper">GitHub</a>.<strong><br /></strong></p>
|
||||
<p>Si encuentras un problema, por favor, infórmame de forma anónima a través del <a href="https://gitreports.com/issue/akaessens/NoFbEventScraper">bug tracker</a> o directamente en <a href="https://github.com/akaessens/NoFbEventScraper/issues">GitHub</a>.</p>
|
||||
<h3>Actualizaciones</h3>.
|
||||
<p>Esta aplicación está disponible para su descarga en <a href="https://f-droid.org/de/packages/com.akdev.nofbeventscraper">F-Droid</a>. El registro de cambios está disponible en <a href="https://github.com/akaessens/NoFbEventScraper/blob/master/CHANGELOG.md">GitHub</a>.</p>.
|
||||
<p><a href="https://f-droid.org/en/packages/com.akdev.nofbeventscraper"> <img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" height="75" /> </a></p>
|
||||
<h3>Aviso legal</h3>.
|
||||
<p>Esta aplicación está pensada para almacenar eventos individuales y públicos en un calendario personal. No lo utilices para la recopilación automática de datos y respeta las <a href="http://www.facebook.com/apps/site_scraping_tos_terms.php">Condiciones de recopilación automática de datos</a> de Facebook.
|
||||
<h3>Donación</h3>
|
||||
<p>Estoy desarrollando esta aplicación en mi tiempo libre. Si te gusta, puedes donar en <a href="https://www.paypal.me/andreaskaessens">PayPal</a>.</p>
|
||||
<p><a title="PayPal" href="https://www.paypal.me/andreaskaessens"><img src="https://raw.githubusercontent.com/stefan-niedermann/paypal-donate-button/master/paypal-donate-button.png" height="75" /></a></p>
|
14
app/src/main/res/raw-es/help.html
Normal file
14
app/src/main/res/raw-es/help.html
Normal file
@ -0,0 +1,14 @@
|
||||
<!doctype html>
|
||||
<h3>¿Qué enlaces se pueden utilizar con esta aplicación?</h3>
|
||||
<p>Se admiten todos los subdominios de facebook, ya sean móviles (m.facebook.com) o específicos del idioma (de-de.facebook.com). El enlace debe contener un ID de evento.</p>
|
||||
<h3>¿Cómo utilizar esta aplicación?</h3>
|
||||
<ul>
|
||||
<li><strong>Botón pegar</strong>: Basta con pegar un enlace copiado desde el portapapeles en la barra de URL.</li>
|
||||
<li><strong>Compartir vía</strong>: La función de compartir incorporada en Android, por ejemplo, desde un navegador.</li>
|
||||
<li><strong>Abrir con</strong>: La función integrada de Android de abrir con, por ejemplo, al hacer clic desde un servicio de mensajería.</li>
|
||||
</ul>
|
||||
<h3>¿Por qué no funciona el evento X?</h3>
|
||||
<p>Esta app se basa en la información del evento que está disponible públicamente. Si el evento no ofrece, por ejemplo, la ubicación sin necesidad de iniciar sesión, no se encontrará disponible en esta aplicación. Además, algunos eventos simplemente no proporcionan la información en un formato legible por la máquina. Los eventos con múltiples instancias son problemáticos porque no proporcionan la fecha correcta de inicio y fin cuando se extraen de m.facebook.com.</p>
|
||||
<p>Si encuentras problemas con un evento específico, por favor, házmelo saber a través de <a href="https://gitreports.com/issue/akaessens/NoFbEventScraper">bugtracker anónimo</a> o en la <a href="https://github.com/akaessens/NoFbEventScraper/issues/">página de incidentes de GitHub</a>.</p>
|
||||
<h3>¿Esta app se integra con mi aplicación de calendario?</h3>
|
||||
<p>Sí. Esta aplicación hace uso de funciones de calendario independientes de la aplicación, lo que la hace compatible con cualquier app de calendario. Sin embargo, en lo personal recomiendo <a href="https://play.google.com/store/apps/details?id=ws.xsoh.etar">Calendario de Etar</a> porque es Open Source.</p>
|
26
app/src/main/res/values-es/strings.xml
Normal file
26
app/src/main/res/values-es/strings.xml
Normal file
@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">NoFb Event Scraper</string>
|
||||
<string name="action_about">Acerca de</string>
|
||||
<string name="action_help">Ayuda</string>
|
||||
<string name="action_settings">Ajustes</string>
|
||||
<string name="hint_add_link">Enlace del evento</string>
|
||||
<string name="helper_add_link">Pegue el enlace del evento en Facebook</string>
|
||||
<string name="button_add">Añadir al calendario</string>
|
||||
<string name="tooltip_paste">Pegue el contenido del portapapeles en el cuadro de entrada de la URL</string>
|
||||
<string name="preferences_url_setting">Prefijo de URL que debe utilizarse</string>
|
||||
<string name="preferences_url_setting_summary">mbasic es el más rápida, www carga la vista previa de la imagen en alta resolución, touch es una herramienta de respaldo</string>
|
||||
<string name="error_clipboard_empty">Error: Portapapeles vacío</string>
|
||||
<string name="error_scraping">Error: No se han encontrado los datos del evento</string>
|
||||
<string name="error_url">Error: URL no válida</string>
|
||||
<string name="error_connection">Error: No es posible la conexión</string>
|
||||
<string name="error_unknown">Error: Error desconocido</string>
|
||||
<string name="preferences_events_header">Eventos</string>
|
||||
<string name="preferences_event_setting">Limpiar lista de eventos</string>
|
||||
<string name="preferences_event_snackbar">"Lista de eventos limpiada "</string>
|
||||
<string name="done">Aceptar</string>
|
||||
<string name="undo">Deshacer</string>
|
||||
<string name="preferences_page_event_max_summary">Número máximo de eventos a cargar en una sola página.</string>
|
||||
<string name="preferences_page_event_max">Límite de eventos por página</string>
|
||||
<string name="error_no_events">Error: no hay próximos eventos</string>
|
||||
</resources>
|
@ -20,7 +20,7 @@
|
||||
android:defaultValue="5"
|
||||
app:showSeekBarValue="true"
|
||||
app:min="1"
|
||||
android:max="30"
|
||||
android:max="100"
|
||||
android:summary="@string/preferences_page_event_max_summary"
|
||||
android:key="page_event_max"
|
||||
android:title="@string/preferences_page_event_max" />
|
||||
|
@ -4,11 +4,10 @@ buildscript {
|
||||
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:4.0.0'
|
||||
classpath 'com.android.tools.build:gradle:7.0.0'
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
@ -18,8 +17,7 @@ buildscript {
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
|
2
fastlane/metadata/android/en-US/changelogs/13.txt
Normal file
2
fastlane/metadata/android/en-US/changelogs/13.txt
Normal file
@ -0,0 +1,2 @@
|
||||
- Add spanish translation thanks to @sguinetti
|
||||
- update dependencies
|
1
fastlane/metadata/android/en-US/changelogs/14.txt
Normal file
1
fastlane/metadata/android/en-US/changelogs/14.txt
Normal file
@ -0,0 +1 @@
|
||||
- Fix Android 11 intents (to open Calendar or Maps)
|
12
fastlane/metadata/android/es/full_description.txt
Normal file
12
fastlane/metadata/android/es/full_description.txt
Normal file
@ -0,0 +1,12 @@
|
||||
El propósito de esta aplicación es obtener acceso a los eventos de Facebook sin necesidad de una cuenta.
|
||||
Por lo tanto, no recurre a la API de Facebook.
|
||||
Como alternativa, abre el URI del evento de Facebook y descarga el código HTML del sitio web.
|
||||
Esta fuente debe contener la información del evento en forma de datos estructurados.
|
||||
Esos datos al extraerse se crean eventos en Android.
|
||||
|
||||
Características:
|
||||
* No recurre a la API de Facebook
|
||||
* Soporta "abrir con" y "compartir via"
|
||||
* Funciona con todas las URLs de los subdominios regionales de Facebook
|
||||
* Guarda el historial de eventos extraídos
|
||||
* Maneja los próximos eventos de las páginas
|
1
fastlane/metadata/android/es/short_description.txt
Normal file
1
fastlane/metadata/android/es/short_description.txt
Normal file
@ -0,0 +1 @@
|
||||
Importa los eventos de Facebook al calendario
|
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
@ -3,5 +3,5 @@ distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
|
||||
distributionSha256Sum=23e7d37e9bb4f8dabb8a3ea7fdee9dd0428b9b1a71d298aefd65b11dccea220f
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip
|
||||
distributionSha256Sum=bf8b869948901d422e9bb7d1fa61da6a6e19411baa7ad6ee929073df85d6365d
|
||||
|
Reference in New Issue
Block a user