diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 556dfb11..0badb7f8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,7 +7,7 @@ to contribute to mTHMMY in a way that is efficient for everyone. **Important!** Instead of creating publicly viewable issues for suspected security vulnerabilities, please report them in private to -`thmmynolife@gmail.com`. +[thmmynolife@gmail.com](mailto:thmmynolife@gmail.com). ## I want to contribute! @@ -18,7 +18,7 @@ There are many ways of contributing to mTHMMY: - Submitting bugs and ideas to our [issue tracker][github-issues] - Forking mTHMMY and submitting [pull requests](#pull-requests) - Joining our core team -- Contacting us by email at `thmmynolife@gmail.com` +- Contacting us by email at [thmmynolife@gmail.com](mailto:thmmynolife@gmail.com) ## Issue tracker @@ -27,17 +27,17 @@ Before creating a new issue make sure to **search the tracker** for similar ones ## Compiling -Due to the app's integration with Firebase, a `google-services.json` is required inside the `app` directory. To get one, either [set up your own Firebase project][firebase-console] (with or without a self hosted [backend][sisyphus]), or ask us to provide you the one we use for development. +Due to the app's integration with Firebase, a *google-services.json* file is required inside the *app* directory. To get one, either [set up your own Firebase project][firebase-console] (with or without a self hosted [backend][sisyphus]), or ask us to provide you the one we use for development. ## Pull requests Pull requests with fixes and improvements to mTHMMY are most welcome. Any developer that wants to work independently from the core team can simply -follow the workflow below to make a pull request: +follow the workflow below to make a pull request (PR): 1. Fork the project into your personal space on Github -1. Create a feature branch, away from `develop` +1. Create a feature branch, away from [develop](https://github.com/ThmmyNoLife/mTHMMY/tree/develop) 1. Push the commit(s) to your fork -1. Create a pull request (PR) targeting `develop` [at mTHMMY](https://github.com/ThmmyNoLife/mTHMMY/tree/develop) +1. Create a PR targeting [develop at mTHMMY](https://github.com/ThmmyNoLife/mTHMMY/tree/develop) 1. Fill the PR title describing the change you want to make 1. Fill the PR description with a brief motive for your change and the method you used to achieve it 1. Submit the PR. diff --git a/PRIVACY.md b/PRIVACY.md new file mode 100644 index 00000000..8e69038c --- /dev/null +++ b/PRIVACY.md @@ -0,0 +1,76 @@ +# Privacy Policy + +*Effective date: 13/10/2018* + +Thmmy No Life ("us", "we", or "our") developed the mTHMMY mobile app (the "App") as an open source application. It is provided by us at no cost and is intended for use as is. + +As a user of the App, your privacy is protected and we feel a strong commitment to protect your privacy. The purpose of this Privacy Policy is to inform you about the collection, use and disclosure of your data, and the choices you have associated with them. + +## Data processing + +To be able to offer you all functions and services of the App in the most convenient way possible and to continuously improve it, we use a number of different cloud services. This means we will transfer your data to a third party – the cloud services provider. + +Google Ireland Limited ("Google"), with offices at Gordon House, Barrow Street, Dublin 4, Ireland and, more specifically, Firebase, a Google subsidiary with its registered office in San Francisco, CA, U.S.A., is a third party – the cloud services provider – that stores and processes your data on our behalf (the "processor", as defined in Article 4, GDPR). + +### Location of processing + +The majority of Firebase services run on global Google infrastructure. They could process data at any of the Google Cloud Platform locations or Google data center locations, within or outside the European Union (EU). + +The Commission Decision (EU) 2016/1250 of 12.07.2016 allows the transfer of data from an EU controller or processor of orders to organizations in the US that have committed themselves to adhere to the framework principles of the EU-US Privacy Shield (), including the additional principles, by way of self-certification with the US Department of Commerce. Google is subject to these principles through self-certification with the U.S. Department of Commerce. + +### General Information + +* The Firebase services that we use collect and further process anonymized information, data with no personally identifiable information which can be used to trace its source so that the people whom it describes can remain anonymous. These data are not subject to the same treatment as are personal data, particularly with regards to any desire you might have for accessing it, rectifying it or erasing it (Article 11, GDPR). +* Firebase uses the Instance ID of your mobile device to identify individual installations of this mobile app. Since each Instance ID is unique to a particular application and device, they give Firebase a way to refer to specific instances of the App. +* Your IP address transmitted by the App in the context of Firebase will not be merged with other collected data. +* Legal basis for the use of Firebase is Article 6 Par. 1 S. 1 letter (a) or (f), GDPR. + +The use of each Firebase service is explained below: + +### Firebase Cloud Messaging + +* **Purpose**: This service is essential for the funcionality of the App. It uses anonymous push notification tokens in order to determine which devices to deliver the appropriate messages to. +* **Data collected**: Instance IDs. +* **Consent**: You will be prompted to agree to the use of this service when you open the App for the first time. +* **Retention**: Firebase retains Instance IDs until we make an API call for deletion. After the call, data are removed from live and backup systems within 180 days. + +### Firebase Crashlytics + +* **Purpose**: This service automatically collects and delivers analyses of errors and system crashes in real time and displays them in the Firebase Console. This helps us maintain the App and improve its stability. +* **Data collected**: Instance IDs and crash reports with information about register codes and your device, e.g. type of device and version of operating system. For more information: +* **Consent**: You will be prompted to choose if you want this service enabled when you open the App for the first time. After that, you can enable or disable it from the Settings inside the App. +* **Retention**: Crash traces and their associated identifiers are kept for 90 days. + +### Google Analytics for Firebase + +* **Purpose**: This service provides analytics and attribution information for statistical purposes. The precise information collected can vary by the device and environment. +* **Data collected**: Instance IDs, Android IDs, Analytics App Instance IDs and custom events created by us. For more information: +* **Consent**: You will be prompted to choose if you want this service enabled when you open the App for the first time. After that, you can enable or disable (and clear all collected data) from the Settings inside the App. +* **Retention**: ID-associated data are retained for 60 days. Aggregate reporting and campaign data are retained without automatic expiration. + +You can find further information on the data use by Google through Firebase following the links below: + + + + + +## Other data + +* When downloading the mobile app, the necessary information is transferred to the App Store (Google Play), i.e. in particular the name, e-mail address and customer number of your customer account, time of download, payment information and the individual device identification number. We have no influence on this data collection and shall not be responsible for it. We only process the data if it is necessary for downloading the mobile app to your mobile device. +* The App provides functionality to login to thmmy.gr through an encrypted connection. This process generates session cookies that are stored on your device. Those cookies contain the same information as those that would be generated if you logged in using a web browser and we have no influence on them. Any other personal information that the App collects from you from thmmy.gr is only stored locally and never transmitted. You can delete all the data related to thmmy.gr anytime you wish, by logging out or clearing the App's data from your device's Settings. + +## About thmmy.gr + +We have neither influence, nor responsibility on anything you read, write, download or upload by interacting with thmmy.gr through the App. For more information you can also read the Terms of Service of thmmy.gr at . + +## Third-Party Links + +mTHMMY may contain links to third-party websites. Any access to and use of such linked websites is not governed by this Policy, but instead is governed by the privacy policies of those third party websites. We are not responsible for the information practices of such third party websites. + +## Policy Updates + +We may update this Privacy Policy from time to time and, thus, you are advised to review it periodically. The most recent version of our Privacy Policy can be found at . + +## Contact Us + +If you have any questions about our Privacy Policy, please contact us at [thmmynolife@gmail.com](mailto:thmmynolife@gmail.com). diff --git a/README.md b/README.md index c69fe09d..1dfb2197 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,9 @@ [![API](https://img.shields.io/badge/API-19%2B-blue.svg?style=flat)](https://android-arsenal.com/api?level=19) [![Discord Channel](https://img.shields.io/badge/discord-public@mTHMMY-738bd7.svg?style=flat)][discord-server] +![mTHMMY logo](app/src/main/res/mipmap-xhdpi/ic_launcher.png) -mTHMMY is a mobile app for the [thmmy.gr](https://www.thmmy.gr) community. +A mobile app for [thmmy.gr](https://www.thmmy.gr). ## Requirements @@ -20,9 +21,13 @@ The latest release version is available on Google Play: Please refer to [CONTRIBUTING.md](/CONTRIBUTING.md) for details. +## Privacy Policy + +Our Privacy Policy can be found [here](/PRIVACY.md). + ## Contact -Do not hesitate to contact us for any matter, either by sending an email to `thmmynolife@gmail.com`, or by joining our [Discord server][discord-server]. +Do not hesitate to contact us for any matter, either by sending an email to [thmmynolife@gmail.com](mailto:thmmynolife@gmail.com), or by joining our [Discord server][discord-server]. **Legal attribution: Google Play and the Google Play logo are trademarks of Google Inc.* diff --git a/app/build.gradle b/app/build.gradle index 35194bae..ecbd4dbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,43 +1,65 @@ +import groovy.json.JsonSlurper + apply plugin: 'com.android.application' apply plugin: 'io.fabric' - android { - compileSdkVersion 27 + compileSdkVersion 28 defaultConfig { vectorDrawables.useSupportLibrary = true applicationId "gr.thmmy.mthmmy" minSdkVersion 19 - targetSdkVersion 27 - versionCode 13 - versionName "1.4.1" + targetSdkVersion 28 + versionCode 14 + versionName "1.5.0" archivesBaseName = "mTHMMY-v$versionName" } buildTypes { release { minifyEnabled true + shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { def date = new Date().format('ddMMyy_HHmmss') archivesBaseName = archivesBaseName + "-$date" + // Disable fabric build ID generation for debug builds + ext.enableCrashlytics = false } } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +tasks.whenTaskAdded { task -> + if (task.name.contains("assembleRelease")) { + task.getDependsOn().add({ + def inputFile = new File("app/google-services.json") + def json = new JsonSlurper().parseText(inputFile.text) + if(json.project_info.project_id != "mthmmy-release-3aef0") + throw new GradleException('Please supply the correct google-services.json for release or manually change the id above!') + }) + } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.android.support:appcompat-v7:27.1.1' - implementation 'com.android.support:design:27.1.1' - implementation 'com.android.support:support-v4:27.1.1' - implementation 'com.android.support:cardview-v7:27.1.1' - implementation 'com.android.support:recyclerview-v7:27.1.1' - implementation 'com.google.firebase:firebase-core:16.0.1' - implementation 'com.google.firebase:firebase-messaging:17.0.0' - implementation 'com.crashlytics.sdk.android:crashlytics:2.9.4' - implementation 'com.squareup.okhttp3:okhttp:3.10.0' + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.android.support:design:28.0.0' + implementation 'com.android.support:preference-v7:28.0.0' + implementation 'com.android.support:preference-v14:28.0.0' + implementation 'com.android.support:support-v4:28.0.0' + implementation 'com.android.support:cardview-v7:28.0.0' + implementation 'com.android.support:recyclerview-v7:28.0.0' + implementation 'com.google.firebase:firebase-core:16.0.4' + implementation 'com.google.firebase:firebase-messaging:17.3.3' + implementation 'com.crashlytics.sdk.android:crashlytics:2.9.5' + implementation 'com.squareup.okhttp3:okhttp:3.11.0' implementation 'com.squareup.picasso:picasso:2.5.2' implementation 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0' implementation 'org.jsoup:jsoup:1.10.3' //TODO: Warning: upgrading from 1.10.3 will break stuff! @@ -48,10 +70,14 @@ dependencies { } implementation 'com.mikepenz:fontawesome-typeface:4.7.0.0@aar' implementation 'com.mikepenz:google-material-typeface:3.0.1.2.original@aar' - implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.12' + implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.15' implementation 'com.bignerdranch.android:expandablerecyclerview:3.0.0-RC1'//TODO: deprecated! implementation 'me.zhanghai.android.materialprogressbar:library:1.4.2' - implementation 'com.jakewharton.timber:timber:4.7.0' + implementation 'com.jakewharton.timber:timber:4.7.1' + implementation "ru.noties:markwon:2.0.0" + implementation 'net.gotev:uploadservice:3.4.2' + implementation 'net.gotev:uploadservice-okhttp:3.4.2' + implementation 'android.arch.lifecycle:extensions:1.1.1' } apply plugin: 'com.google.gms.google-services' diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index c06e027a..9cde3150 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,6 +1,6 @@ # Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified -# in C:\Users\Ragnar\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt +# in sdk/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the proguardFiles # directive in build.gradle. # @@ -26,6 +26,8 @@ -dontwarn org.conscrypt.** # A resource is loaded with a relative path so the package of this class must be preserved. -keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase +# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java. +-dontwarn org.codehaus.mojo.animal_sniffer.* # Picasso -dontwarn com.squareup.okhttp.** @@ -40,4 +42,8 @@ -keep public class pl.droidsonroids.gif.GifIOException{(int, java.lang.String);} # JSoup --keep class org.jsoup.** \ No newline at end of file +-keep class org.jsoup.** + +# Markwon +-keep class com.caverock.androidsvg.** { *; } +-dontwarn com.caverock.androidsvg.** \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7417185a..19f47c62 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,6 +17,12 @@ android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> + + + + + + - - - @@ -97,14 +100,40 @@ android:name="android.support.PARENT_ACTIVITY" android:value=".activities.main.MainActivity" /> + + + + + + + + + - + + + \ No newline at end of file diff --git a/app/src/main/assets/PRIVACY.md b/app/src/main/assets/PRIVACY.md new file mode 100644 index 00000000..8e69038c --- /dev/null +++ b/app/src/main/assets/PRIVACY.md @@ -0,0 +1,76 @@ +# Privacy Policy + +*Effective date: 13/10/2018* + +Thmmy No Life ("us", "we", or "our") developed the mTHMMY mobile app (the "App") as an open source application. It is provided by us at no cost and is intended for use as is. + +As a user of the App, your privacy is protected and we feel a strong commitment to protect your privacy. The purpose of this Privacy Policy is to inform you about the collection, use and disclosure of your data, and the choices you have associated with them. + +## Data processing + +To be able to offer you all functions and services of the App in the most convenient way possible and to continuously improve it, we use a number of different cloud services. This means we will transfer your data to a third party – the cloud services provider. + +Google Ireland Limited ("Google"), with offices at Gordon House, Barrow Street, Dublin 4, Ireland and, more specifically, Firebase, a Google subsidiary with its registered office in San Francisco, CA, U.S.A., is a third party – the cloud services provider – that stores and processes your data on our behalf (the "processor", as defined in Article 4, GDPR). + +### Location of processing + +The majority of Firebase services run on global Google infrastructure. They could process data at any of the Google Cloud Platform locations or Google data center locations, within or outside the European Union (EU). + +The Commission Decision (EU) 2016/1250 of 12.07.2016 allows the transfer of data from an EU controller or processor of orders to organizations in the US that have committed themselves to adhere to the framework principles of the EU-US Privacy Shield (), including the additional principles, by way of self-certification with the US Department of Commerce. Google is subject to these principles through self-certification with the U.S. Department of Commerce. + +### General Information + +* The Firebase services that we use collect and further process anonymized information, data with no personally identifiable information which can be used to trace its source so that the people whom it describes can remain anonymous. These data are not subject to the same treatment as are personal data, particularly with regards to any desire you might have for accessing it, rectifying it or erasing it (Article 11, GDPR). +* Firebase uses the Instance ID of your mobile device to identify individual installations of this mobile app. Since each Instance ID is unique to a particular application and device, they give Firebase a way to refer to specific instances of the App. +* Your IP address transmitted by the App in the context of Firebase will not be merged with other collected data. +* Legal basis for the use of Firebase is Article 6 Par. 1 S. 1 letter (a) or (f), GDPR. + +The use of each Firebase service is explained below: + +### Firebase Cloud Messaging + +* **Purpose**: This service is essential for the funcionality of the App. It uses anonymous push notification tokens in order to determine which devices to deliver the appropriate messages to. +* **Data collected**: Instance IDs. +* **Consent**: You will be prompted to agree to the use of this service when you open the App for the first time. +* **Retention**: Firebase retains Instance IDs until we make an API call for deletion. After the call, data are removed from live and backup systems within 180 days. + +### Firebase Crashlytics + +* **Purpose**: This service automatically collects and delivers analyses of errors and system crashes in real time and displays them in the Firebase Console. This helps us maintain the App and improve its stability. +* **Data collected**: Instance IDs and crash reports with information about register codes and your device, e.g. type of device and version of operating system. For more information: +* **Consent**: You will be prompted to choose if you want this service enabled when you open the App for the first time. After that, you can enable or disable it from the Settings inside the App. +* **Retention**: Crash traces and their associated identifiers are kept for 90 days. + +### Google Analytics for Firebase + +* **Purpose**: This service provides analytics and attribution information for statistical purposes. The precise information collected can vary by the device and environment. +* **Data collected**: Instance IDs, Android IDs, Analytics App Instance IDs and custom events created by us. For more information: +* **Consent**: You will be prompted to choose if you want this service enabled when you open the App for the first time. After that, you can enable or disable (and clear all collected data) from the Settings inside the App. +* **Retention**: ID-associated data are retained for 60 days. Aggregate reporting and campaign data are retained without automatic expiration. + +You can find further information on the data use by Google through Firebase following the links below: + + + + + +## Other data + +* When downloading the mobile app, the necessary information is transferred to the App Store (Google Play), i.e. in particular the name, e-mail address and customer number of your customer account, time of download, payment information and the individual device identification number. We have no influence on this data collection and shall not be responsible for it. We only process the data if it is necessary for downloading the mobile app to your mobile device. +* The App provides functionality to login to thmmy.gr through an encrypted connection. This process generates session cookies that are stored on your device. Those cookies contain the same information as those that would be generated if you logged in using a web browser and we have no influence on them. Any other personal information that the App collects from you from thmmy.gr is only stored locally and never transmitted. You can delete all the data related to thmmy.gr anytime you wish, by logging out or clearing the App's data from your device's Settings. + +## About thmmy.gr + +We have neither influence, nor responsibility on anything you read, write, download or upload by interacting with thmmy.gr through the App. For more information you can also read the Terms of Service of thmmy.gr at . + +## Third-Party Links + +mTHMMY may contain links to third-party websites. Any access to and use of such linked websites is not governed by this Policy, but instead is governed by the privacy policies of those third party websites. We are not responsible for the information practices of such third party websites. + +## Policy Updates + +We may update this Privacy Policy from time to time and, thus, you are advised to review it periodically. The most recent version of our Privacy Policy can be found at . + +## Contact Us + +If you have any questions about our Privacy Policy, please contact us at [thmmynolife@gmail.com](mailto:thmmynolife@gmail.com). diff --git a/app/src/main/assets/apache_libraries.html b/app/src/main/assets/apache_libraries.html index fd866258..a8ff5d90 100644 --- a/app/src/main/assets/apache_libraries.html +++ b/app/src/main/assets/apache_libraries.html @@ -39,7 +39,7 @@
  • -
    OkHttp v3.10.0 (Copyright ©2016 Square, Inc.)
    +
    OkHttp v3.11.0 (Copyright ©2016 Square, Inc.)
  • Picasso v2.5.2 (Copyright ©2013 Square, Inc.)
    @@ -60,7 +60,13 @@
    MaterialProgressBar v1.4.2 (Copyright ©2015 Zhang Hai)
  • -
    Timber v4.7.0 (Copyright ©2013 Jake Wharton)
    +
    Timber v4.7.1 (Copyright ©2013 Jake Wharton)
    +
  • +
  • +
    Android Upload Service v3.4.2 (Copyright ©2013-2018 Aleksandar Gotev)
    +
  • +
  • +
    Markwon v2.0.0 (Copyright ©2017 Dimitry Ivanov)
diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/AboutActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/AboutActivity.java index 896a5fb5..34ed4c32 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/AboutActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/AboutActivity.java @@ -6,6 +6,9 @@ import android.support.design.widget.AppBarLayout; import android.support.design.widget.CoordinatorLayout; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.AlertDialog; +import android.text.SpannableString; +import android.text.method.LinkMovementMethod; +import android.text.style.UnderlineSpan; import android.view.LayoutInflater; import android.view.View; import android.webkit.WebView; @@ -81,6 +84,13 @@ public class AboutActivity extends BaseActivity { }); } + TextView privacyPolicy = findViewById(R.id.privacy_policy_header); + privacyPolicy.setMovementMethod(new LinkMovementMethod()); + SpannableString spannableString = new SpannableString(privacyPolicy.getText()); + spannableString.setSpan(new UnderlineSpan(), 0, spannableString.length(), 0); + privacyPolicy.setText(spannableString); + privacyPolicy.setOnClickListener(view -> showPrivacyPolicyDialog()); + } @Override diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/LoginActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/LoginActivity.java index 6f632f97..1a5ad05f 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/LoginActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/LoginActivity.java @@ -3,6 +3,7 @@ package gr.thmmy.mthmmy.activities; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; +import android.support.v7.preference.PreferenceManager; import android.support.v7.widget.AppCompatButton; import android.view.View; import android.view.inputmethod.InputMethodManager; @@ -11,10 +12,12 @@ import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.Toast; +import com.google.firebase.analytics.FirebaseAnalytics; + import gr.thmmy.mthmmy.R; import gr.thmmy.mthmmy.activities.main.MainActivity; import gr.thmmy.mthmmy.base.BaseActivity; -import timber.log.Timber; +import gr.thmmy.mthmmy.base.BaseApplication; import static gr.thmmy.mthmmy.session.SessionManager.BANNED_USER; import static gr.thmmy.mthmmy.session.SessionManager.CONNECTION_ERROR; @@ -36,12 +39,17 @@ public class LoginActivity extends BaseActivity { /* --Graphics End-- */ private LoginTask loginTask; + private boolean initialRedirect; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); + initialRedirect = getIntent().getBooleanExtra("REDIRECT", false); + + PreferenceManager.setDefaultValues(this, R.xml.app_preferences_user, false); + //Variables initialization inputUsername = findViewById(R.id.username); inputPassword = findViewById(R.id.password); @@ -49,50 +57,44 @@ public class LoginActivity extends BaseActivity { AppCompatButton btnGuest = findViewById(R.id.btnContinueAsGuest); //Login button Click Event - btnLogin.setOnClickListener(new View.OnClickListener() { - - public void onClick(View view) { - Timber.d("Login"); - - //Get username and password strings - username = inputUsername.getText().toString().trim(); - password = inputPassword.getText().toString().trim(); + btnLogin.setOnClickListener(view -> { - //Check for empty data in the form - if (!validate()) { - onLoginFailed(); - return; - } + //Get username and password strings + username = inputUsername.getText().toString().trim(); + password = inputPassword.getText().toString().trim(); - //Login user - loginTask = new LoginTask(); - loginTask.execute(username, password); + //Check for empty data in the form + if (!validate()) { + onLoginFailed(); + return; } + + //Login user + loginTask = new LoginTask(); + loginTask.execute(username, password); }); //Guest Button Action - btnGuest.setOnClickListener(new View.OnClickListener() { - - public void onClick(View view) { - //Session data update - sessionManager.guestLogin(); - - //Go to main - Intent intent = new Intent(LoginActivity.this, MainActivity.class); - startActivity(intent); - finish(); - overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out); - } + btnGuest.setOnClickListener(view -> { + //Session data update + sessionManager.guestLogin(); + + //Go to main + Intent intent = new Intent(LoginActivity.this, MainActivity.class); + startActivity(intent); + finish(); + overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out); }); } @Override public void onBackPressed() { - // Disable going back to the MainActivity - moveTaskToBack(true); + super.onBackPressed(); if (loginTask != null && loginTask.getStatus() == AsyncTask.Status.RUNNING) { loginTask.cancel(true); } + if(!isTaskRoot()) + overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out); } private void onLoginFailed() { @@ -160,9 +162,13 @@ public class LoginActivity extends BaseActivity { Toast.makeText(getApplicationContext(), "Welcome, " + sessionManager.getUsername() + "!", Toast.LENGTH_LONG) .show(); - //Go to main - Intent intent = new Intent(LoginActivity.this, MainActivity.class); - startActivity(intent); + BaseApplication.getInstance().logFirebaseAnalyticsEvent(FirebaseAnalytics.Event.LOGIN, null); + if(initialRedirect){ + Intent intent = new Intent(LoginActivity.this, MainActivity.class); + startActivity(intent); + } else + onBackPressed(); + finish(); overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out); break; diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardActivity.java index 251c7c2b..d3a74098 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardActivity.java @@ -1,14 +1,15 @@ package gr.thmmy.mthmmy.activities.board; +import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; +import android.support.v7.app.AlertDialog; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; -import android.widget.ImageButton; import android.widget.ProgressBar; import android.widget.Toast; @@ -20,6 +21,8 @@ import java.util.ArrayList; import java.util.Objects; import gr.thmmy.mthmmy.R; +import gr.thmmy.mthmmy.activities.LoginActivity; +import gr.thmmy.mthmmy.activities.create_content.CreateContentActivity; import gr.thmmy.mthmmy.base.BaseActivity; import gr.thmmy.mthmmy.model.Board; import gr.thmmy.mthmmy.model.Bookmark; @@ -51,6 +54,7 @@ public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMo private String boardUrl; private String boardTitle; private String parsedTitle; + private String newTopicUrl; private int numberOfPages = -1; private int pagesLoaded = 0; @@ -89,43 +93,36 @@ public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMo getSupportActionBar().setDisplayShowHomeEnabled(true); } - thisPageBookmark = new Bookmark(boardTitle, ThmmyPage.getBoardId(boardUrl), false); - setBoardBookmark((ImageButton) findViewById(R.id.bookmark)); + thisPageBookmark = new Bookmark(boardTitle, ThmmyPage.getBoardId(boardUrl), true); + setBoardBookmark(findViewById(R.id.bookmark)); createDrawer(); progressBar = findViewById(R.id.progressBar); newTopicFAB = findViewById(R.id.board_fab); - newTopicFAB.setEnabled(false); - newTopicFAB.hide(); - /*if (!sessionManager.isLoggedIn()) newTopicFAB.hide(); + if (!sessionManager.isLoggedIn()) newTopicFAB.hide(); else { - newTopicFAB.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (sessionManager.isLoggedIn()) { - //TODO PM - } else { - new AlertDialog.Builder(BoardActivity.this) - .setMessage("You need to be logged in to create a new topic!") - .setPositiveButton("Login", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - Intent intent = new Intent(BoardActivity.this, LoginActivity.class); - startActivity(intent); - finish(); - overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out); - } - }) - .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - } - }) - .show(); + newTopicFAB.setOnClickListener(view -> { + if (sessionManager.isLoggedIn()) { + if (newTopicUrl != null) { + Intent intent = new Intent(this, CreateContentActivity.class); + intent.putExtra(CreateContentActivity.EXTRA_NEW_TOPIC_URL, newTopicUrl); + startActivity(intent); } + } else { + new AlertDialog.Builder(BoardActivity.this) + .setMessage("You need to be logged in to create a new topic!") + .setPositiveButton("Login", (dialogInterface, i) -> { + Intent intent = new Intent(BoardActivity.this, LoginActivity.class); + startActivity(intent); + finish(); + overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out); + }) + .setNegativeButton("Cancel", (dialogInterface, i) -> { + }) + .show(); } }); - }*/ + } boardAdapter = new BoardAdapter(getApplicationContext(), parsedSubBoards, parsedTopics); RecyclerView mainContent = findViewById(R.id.board_recycler_view); @@ -156,7 +153,7 @@ public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMo @Override public void onLoadMore() { - if (pagesLoaded < numberOfPages) { + if (pagesLoaded < numberOfPages && parsedTopics.get(parsedTopics.size() - 1) != null) { parsedTopics.add(null); boardAdapter.notifyItemInserted(parsedSubBoards.size() + parsedTopics.size()); @@ -169,7 +166,7 @@ public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMo @Override public void onResume() { super.onResume(); - refreshBoardBookmark((ImageButton) findViewById(R.id.bookmark)); + refreshBoardBookmark(findViewById(R.id.bookmark)); } @Override @@ -185,6 +182,9 @@ public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMo * parameter!

*/ private class BoardTask extends ParseTask { + ArrayList tempSubboards = new ArrayList<>(); + ArrayList tempTopics = new ArrayList<>(); + @Override protected void onPreExecute() { if (!isLoadingMore) progressBar.setVisibility(ProgressBar.VISIBLE); @@ -193,12 +193,14 @@ public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMo @Override //TODO should throw ParseException public void parse(Document boardPage) throws ParseException { - parsedTitle = boardPage.select("div.nav a.nav").last().text(); - + tempSubboards.addAll(parsedSubBoards); + tempTopics.addAll(parsedTopics); //Removes loading item if (isLoadingMore) { - if (parsedTopics.size() > 0) parsedTopics.remove(parsedTopics.size() - 1); + if (tempTopics.size() > 0) tempTopics.remove(tempTopics.size() - 1); } + parsedTitle = boardPage.select("div.nav a.nav").last().text(); + //Finds number of pages if (numberOfPages == -1) { numberOfPages = 1; @@ -215,6 +217,13 @@ public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMo //It just means this board has only one page of topics. } } + + //Finds the url needed to create a new topic + Element newTopicButton = boardPage.select("a:has(img[alt=Start new topic])").first(); + if (newTopicButton == null) + newTopicButton = boardPage.select("a:has(img[alt=Νέο θέμα])").first(); + if (newTopicButton != null) newTopicUrl = newTopicButton.attr("href"); + { //Finds sub boards Elements subBoardRows = boardPage.select("div.tborder>table>tbody>tr"); if (subBoardRows != null && !subBoardRows.isEmpty()) { @@ -254,7 +263,7 @@ public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMo } } } - parsedSubBoards.add(new Board(pUrl, pTitle, pMods, pStats, pLastPost, pLastPostUrl)); + tempSubboards.add(new Board(pUrl, pTitle, pMods, pStats, pLastPost, pLastPostUrl)); } } } @@ -265,7 +274,7 @@ public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMo for (Element topicRow : topicRows) { if (!Objects.equals(topicRow.className(), "titlebg")) { String pTopicUrl, pSubject, pStartedBy, pLastPost, pLastPostUrl, pStats; - boolean pLocked = false, pSticky = false; + boolean pLocked = false, pSticky = false, pUnread = false; Elements topicColumns = topicRow.select(">td"); { Element column = topicColumns.get(2); @@ -276,6 +285,8 @@ public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMo pSticky = true; if (column.select("img[id^=lockicon]").first() != null) pLocked = true; + if (column.select("a[id^=newicon]").first() != null) + pUnread = true; } pStartedBy = topicColumns.get(3).text(); pStats = "Replies " + topicColumns.get(4).text() + ", Views " + topicColumns.get(5).text(); @@ -284,13 +295,15 @@ public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMo if (pLastPost.contains("by")) { pLastPost = pLastPost.substring(0, pLastPost.indexOf("by")) + "\n" + pLastPost.substring(pLastPost.indexOf("by")); - } else { + } else if (pLastPost.contains("από")) { pLastPost = pLastPost.substring(0, pLastPost.indexOf("από")) + "\n" + pLastPost.substring(pLastPost.indexOf("από")); + } else { + Timber.wtf("Board parsing about to fail. pLastPost came with: %s", pLastPost); } pLastPostUrl = topicColumns.last().select("a:has(img)").first().attr("href"); - parsedTopics.add(new Topic(pTopicUrl, pSubject, pStartedBy, pLastPost, pLastPostUrl, - pStats, pLocked, pSticky)); + tempTopics.add(new Topic(pTopicUrl, pSubject, pStartedBy, pLastPost, pLastPostUrl, + pStats, pLocked, pSticky, pUnread)); } } } @@ -299,19 +312,27 @@ public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMo @Override protected void postExecution(ResultCode result) { - //TODO if (result == ResultCode.SUCCESS)... - if (boardTitle == null || Objects.equals(boardTitle, "") - || !Objects.equals(boardTitle, parsedTitle)) { - boardTitle = parsedTitle; - toolbar.setTitle(boardTitle); - thisPageBookmark = new Bookmark(boardTitle, ThmmyPage.getBoardId(boardUrl), false); + if (result == ResultCode.SUCCESS) { + if (boardTitle == null || Objects.equals(boardTitle, "") + || !Objects.equals(boardTitle, parsedTitle)) { + boardTitle = parsedTitle; + toolbar.setTitle(boardTitle); + thisPageBookmark = new Bookmark(boardTitle, ThmmyPage.getBoardId(boardUrl), true); + setBoardBookmark(findViewById(R.id.bookmark)); + } + + parsedTopics.clear(); + parsedSubBoards.clear(); + parsedTopics.addAll(tempTopics); + parsedSubBoards.addAll(tempSubboards); + boardAdapter.notifyDataSetChanged(); + + //Parse was successful + ++pagesLoaded; + if (newTopicFAB.getVisibility() != View.GONE) newTopicFAB.setEnabled(true); } - //Parse was successful - ++pagesLoaded; - if (newTopicFAB.getVisibility() != View.GONE) newTopicFAB.setEnabled(true); progressBar.setVisibility(ProgressBar.INVISIBLE); - boardAdapter.notifyDataSetChanged(); isLoadingMore = false; } } diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardAdapter.java b/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardAdapter.java index bb43c065..09734606 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardAdapter.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardAdapter.java @@ -147,10 +147,10 @@ class BoardAdapter extends RecyclerView.Adapter { }); if (boardExpandableVisibility.get(subBoardViewHolder.getAdapterPosition() - 1)) { subBoardViewHolder.boardExpandable.setVisibility(View.VISIBLE); - subBoardViewHolder.showHideExpandable.setImageResource(R.drawable.ic_arrow_drop_up); + subBoardViewHolder.showHideExpandable.setImageResource(R.drawable.ic_arrow_drop_up_accent_24dp); } else { subBoardViewHolder.boardExpandable.setVisibility(View.GONE); - subBoardViewHolder.showHideExpandable.setImageResource(R.drawable.ic_arrow_drop_down); + subBoardViewHolder.showHideExpandable.setImageResource(R.drawable.ic_arrow_drop_down_accent_24dp); } subBoardViewHolder.showHideExpandable.setOnClickListener(new View.OnClickListener() { @Override @@ -158,10 +158,10 @@ class BoardAdapter extends RecyclerView.Adapter { final boolean visible = boardExpandableVisibility.get(subBoardViewHolder.getAdapterPosition() - 1); if (visible) { subBoardViewHolder.boardExpandable.setVisibility(View.GONE); - subBoardViewHolder.showHideExpandable.setImageResource(R.drawable.ic_arrow_drop_down); + subBoardViewHolder.showHideExpandable.setImageResource(R.drawable.ic_arrow_drop_down_accent_24dp); } else { subBoardViewHolder.boardExpandable.setVisibility(View.VISIBLE); - subBoardViewHolder.showHideExpandable.setImageResource(R.drawable.ic_arrow_drop_up); + subBoardViewHolder.showHideExpandable.setImageResource(R.drawable.ic_arrow_drop_up_accent_24dp); } boardExpandableVisibility.set(subBoardViewHolder.getAdapterPosition() - 1, !visible); } @@ -208,10 +208,10 @@ class BoardAdapter extends RecyclerView.Adapter { if (topicExpandableVisibility.get(topicViewHolder.getAdapterPosition() - parsedSubBoards .size() - 2)) { topicViewHolder.topicExpandable.setVisibility(View.VISIBLE); - topicViewHolder.showHideExpandable.setImageResource(R.drawable.ic_arrow_drop_up); + topicViewHolder.showHideExpandable.setImageResource(R.drawable.ic_arrow_drop_up_accent_24dp); } else { topicViewHolder.topicExpandable.setVisibility(View.GONE); - topicViewHolder.showHideExpandable.setImageResource(R.drawable.ic_arrow_drop_down); + topicViewHolder.showHideExpandable.setImageResource(R.drawable.ic_arrow_drop_down_accent_24dp); } topicViewHolder.showHideExpandable.setOnClickListener(new View.OnClickListener() { @Override @@ -220,10 +220,10 @@ class BoardAdapter extends RecyclerView.Adapter { getAdapterPosition() - parsedSubBoards.size() - 2); if (visible) { topicViewHolder.topicExpandable.setVisibility(View.GONE); - topicViewHolder.showHideExpandable.setImageResource(R.drawable.ic_arrow_drop_down); + topicViewHolder.showHideExpandable.setImageResource(R.drawable.ic_arrow_drop_down_accent_24dp); } else { topicViewHolder.topicExpandable.setVisibility(View.VISIBLE); - topicViewHolder.showHideExpandable.setImageResource(R.drawable.ic_arrow_drop_up); + topicViewHolder.showHideExpandable.setImageResource(R.drawable.ic_arrow_drop_up_accent_24dp); } topicExpandableVisibility.set(topicViewHolder.getAdapterPosition() - parsedSubBoards.size() - 2, !visible); @@ -231,12 +231,18 @@ class BoardAdapter extends RecyclerView.Adapter { }); topicViewHolder.topicSubject.setTypeface(Typeface.createFromAsset(context.getAssets() , "fonts/fontawesome-webfont.ttf")); + topicViewHolder.topicUnreadDot.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/fontawesome-webfont.ttf")); + if (topic.isUnread()) + topicViewHolder.topicUnreadDot.setVisibility(View.VISIBLE); + else { + topicViewHolder.topicUnreadDot.setVisibility(View.GONE); + } String lockedSticky = topic.getSubject(); if (topic.isLocked()) lockedSticky += " " + context.getResources().getString(R.string.fa_lock); if (topic.isSticky()) { //topicViewHolder.topicSubject.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_pin, 0); - lockedSticky += " " + context.getResources().getString(R.string.fa_sticky); + lockedSticky += " " + context.getResources().getString(R.string.fa_thumbtack); } topicViewHolder.topicSubject.setText(lockedSticky); topicViewHolder.topicStartedBy.setText(context.getString(R.string.topic_started_by, topic.getStarter())); @@ -287,7 +293,7 @@ class BoardAdapter extends RecyclerView.Adapter { private static class TopicViewHolder extends RecyclerView.ViewHolder { final LinearLayout topicRow, topicExpandable; - final TextView topicSubject, topicStartedBy, topicStats, topicLastPost; + final TextView topicSubject, topicStartedBy, topicStats, topicLastPost, topicUnreadDot; final ImageButton showHideExpandable; TopicViewHolder(View topic) { @@ -295,6 +301,7 @@ class BoardAdapter extends RecyclerView.Adapter { topicRow = topic.findViewById(R.id.topic_row_linear); topicExpandable = topic.findViewById(R.id.topic_expandable); showHideExpandable = topic.findViewById(R.id.topic_expand_collapse_button); + topicUnreadDot = topic.findViewById(R.id.topic_unread_dot); topicSubject = topic.findViewById(R.id.topic_subject); topicStartedBy = topic.findViewById(R.id.topic_started_by); topicStats = topic.findViewById(R.id.topic_stats); diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/bookmarks/BoardBookmarksFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/bookmarks/BoardBookmarksFragment.java index 6b7dee26..6c7db47f 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/bookmarks/BoardBookmarksFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/bookmarks/BoardBookmarksFragment.java @@ -2,13 +2,16 @@ package gr.thmmy.mthmmy.activities.bookmarks; import android.app.Activity; import android.graphics.Typeface; +import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.graphics.drawable.VectorDrawableCompat; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; @@ -27,10 +30,14 @@ public class BoardBookmarksFragment extends Fragment { protected static final String ARG_BOARD_BOOKMARKS = "BOARD_BOOKMARKS"; public static final String INTERACTION_CLICK_BOARD_BOOKMARK = "CLICK_BOARD_BOOKMARK"; + public static final String INTERACTION_TOGGLE_BOARD_NOTIFICATION = "TOGGLE_BOARD_NOTIFICATION"; public static final String INTERACTION_REMOVE_BOARD_BOOKMARK= "REMOVE_BOARD_BOOKMARK"; ArrayList boardBookmarks = null; + private static Drawable notificationsEnabledButtonImage; + private static Drawable notificationsDisabledButtonImage; + // Required empty public constructor public BoardBookmarksFragment() { } @@ -59,6 +66,16 @@ public class BoardBookmarksFragment extends Fragment { boardBookmarks = Bookmark.arrayFromString(bundledBoardBookmarks); } } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) + notificationsEnabledButtonImage = getResources().getDrawable(R.drawable.ic_notification_on, null); + else + notificationsEnabledButtonImage = VectorDrawableCompat.create(getResources(), R.drawable.ic_notification_on, null); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) + notificationsDisabledButtonImage = getResources().getDrawable(R.drawable.ic_notification_off, null); + else + notificationsDisabledButtonImage = VectorDrawableCompat.create(getResources(), R.drawable.ic_notification_off, null); } @Override @@ -73,32 +90,43 @@ public class BoardBookmarksFragment extends Fragment { for (final Bookmark bookmarkedBoard : boardBookmarks) { if (bookmarkedBoard != null && bookmarkedBoard.getTitle() != null) { final LinearLayout row = (LinearLayout) layoutInflater.inflate( - R.layout.fragment_bookmarks_board_row, bookmarksLinearView, false); - row.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Activity activity = getActivity(); - if (activity instanceof BookmarkActivity){ - ((BookmarkActivity) activity).onBoardInteractionListener(INTERACTION_CLICK_BOARD_BOOKMARK, bookmarkedBoard); - } + R.layout.fragment_bookmarks_row, bookmarksLinearView, false); + row.setOnClickListener(view -> { + Activity activity = getActivity(); + if (activity instanceof BookmarkActivity){ + ((BookmarkActivity) activity).onBoardInteractionListener(INTERACTION_CLICK_BOARD_BOOKMARK, bookmarkedBoard); } }); ((TextView) row.findViewById(R.id.bookmark_title)).setText(bookmarkedBoard.getTitle()); - (row.findViewById(R.id.remove_bookmark)).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Activity activity = getActivity(); - if (activity instanceof BookmarkActivity){ - ((BookmarkActivity) activity).onBoardInteractionListener(INTERACTION_REMOVE_BOARD_BOOKMARK, bookmarkedBoard); - boardBookmarks.remove(bookmarkedBoard); - } - row.setVisibility(View.GONE); - if (boardBookmarks.isEmpty()){ - bookmarksLinearView.addView(bookmarksListEmptyMessage()); + final ImageButton notificationsEnabledButton = row.findViewById(R.id.toggle_notification); + if (!bookmarkedBoard.isNotificationsEnabled()) { + notificationsEnabledButton.setImageDrawable(notificationsDisabledButtonImage); + } + + notificationsEnabledButton.setOnClickListener(view -> { + Activity activity = getActivity(); + if (activity instanceof BookmarkActivity) { + if (((BookmarkActivity) activity).onBoardInteractionListener(INTERACTION_TOGGLE_BOARD_NOTIFICATION, bookmarkedBoard)) { + notificationsEnabledButton.setImageDrawable(notificationsEnabledButtonImage); + } else { + notificationsEnabledButton.setImageDrawable(notificationsDisabledButtonImage); } } }); + + (row.findViewById(R.id.remove_bookmark)).setOnClickListener(view -> { + Activity activity = getActivity(); + if (activity instanceof BookmarkActivity){ + ((BookmarkActivity) activity).onBoardInteractionListener(INTERACTION_REMOVE_BOARD_BOOKMARK, bookmarkedBoard); + boardBookmarks.remove(bookmarkedBoard); + } + row.setVisibility(View.GONE); + + if (boardBookmarks.isEmpty()){ + bookmarksLinearView.addView(bookmarksListEmptyMessage()); + } + }); bookmarksLinearView.addView(row); } } diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/bookmarks/BookmarkActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/bookmarks/BookmarkActivity.java index 0408db44..164e8f3f 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/bookmarks/BookmarkActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/bookmarks/BookmarkActivity.java @@ -1,7 +1,6 @@ package gr.thmmy.mthmmy.activities.bookmarks; import android.content.Intent; -import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; @@ -63,39 +62,48 @@ public class BookmarkActivity extends BaseActivity { super.onResume(); } - public boolean onTopicInteractionListener(String interactionType, Bookmark bookmarkedTopic){ - if (interactionType.equals(TopicBookmarksFragment.INTERACTION_CLICK_TOPIC_BOOKMARK)){ - Intent intent = new Intent(BookmarkActivity.this, TopicActivity.class); - Bundle extras = new Bundle(); - extras.putString(BUNDLE_TOPIC_URL, "https://www.thmmy.gr/smf/index.php?topic=" - + bookmarkedTopic.getId() + "." + 2147483647); - extras.putString(BUNDLE_TOPIC_TITLE, bookmarkedTopic.getTitle()); - intent.putExtras(extras); - startActivity(intent); - finish(); - } else if (interactionType.equals(TopicBookmarksFragment.INTERACTION_TOGGLE_TOPIC_NOTIFICATION)) { - return toggleNotification(bookmarkedTopic); - } else if (interactionType.equals(TopicBookmarksFragment.INTERACTION_REMOVE_TOPIC_BOOKMARK)){ - removeBookmark(bookmarkedTopic); - Toast.makeText(BookmarkActivity.this, "Bookmark removed", Toast.LENGTH_SHORT).show(); + public boolean onTopicInteractionListener(String interactionType, Bookmark bookmarkedTopic) { + switch (interactionType) { + case TopicBookmarksFragment.INTERACTION_CLICK_TOPIC_BOOKMARK: + Intent intent = new Intent(BookmarkActivity.this, TopicActivity.class); + Bundle extras = new Bundle(); + extras.putString(BUNDLE_TOPIC_URL, "https://www.thmmy.gr/smf/index.php?topic=" + + bookmarkedTopic.getId() + "." + 2147483647); + extras.putString(BUNDLE_TOPIC_TITLE, bookmarkedTopic.getTitle()); + intent.putExtras(extras); + startActivity(intent); + finish(); + break; + case TopicBookmarksFragment.INTERACTION_TOGGLE_TOPIC_NOTIFICATION: + return toggleNotification(bookmarkedTopic); + case TopicBookmarksFragment.INTERACTION_REMOVE_TOPIC_BOOKMARK: + removeBookmark(bookmarkedTopic); + Toast.makeText(BookmarkActivity.this, "Bookmark removed", Toast.LENGTH_SHORT).show(); + break; } return true; } - public void onBoardInteractionListener(String interactionType, Bookmark bookmarkedBoard){ - if (interactionType.equals(BoardBookmarksFragment.INTERACTION_CLICK_BOARD_BOOKMARK)){ - Intent intent = new Intent(BookmarkActivity.this, BoardActivity.class); - Bundle extras = new Bundle(); - extras.putString(BUNDLE_BOARD_URL, "https://www.thmmy.gr/smf/index.php?board=" - + bookmarkedBoard.getId() + ".0"); - extras.putString(BUNDLE_BOARD_TITLE, bookmarkedBoard.getTitle()); - intent.putExtras(extras); - startActivity(intent); - finish(); - } else if (interactionType.equals(BoardBookmarksFragment.INTERACTION_REMOVE_BOARD_BOOKMARK)){ - removeBookmark(bookmarkedBoard); - Toast.makeText(BookmarkActivity.this, "Bookmark removed", Toast.LENGTH_SHORT).show(); + public boolean onBoardInteractionListener(String interactionType, Bookmark bookmarkedBoard) { + switch (interactionType) { + case BoardBookmarksFragment.INTERACTION_CLICK_BOARD_BOOKMARK: + Intent intent = new Intent(BookmarkActivity.this, BoardActivity.class); + Bundle extras = new Bundle(); + extras.putString(BUNDLE_BOARD_URL, "https://www.thmmy.gr/smf/index.php?board=" + + bookmarkedBoard.getId() + ".0"); + extras.putString(BUNDLE_BOARD_TITLE, bookmarkedBoard.getTitle()); + intent.putExtras(extras); + startActivity(intent); + finish(); + break; + case BoardBookmarksFragment.INTERACTION_TOGGLE_BOARD_NOTIFICATION: + return toggleNotification(bookmarkedBoard); + case BoardBookmarksFragment.INTERACTION_REMOVE_BOARD_BOOKMARK: + removeBookmark(bookmarkedBoard); + Toast.makeText(BookmarkActivity.this, "Bookmark removed", Toast.LENGTH_SHORT).show(); + break; } + return true; } /** diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/bookmarks/TopicBookmarksFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/bookmarks/TopicBookmarksFragment.java index 7679ad2f..54659baa 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/bookmarks/TopicBookmarksFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/bookmarks/TopicBookmarksFragment.java @@ -20,13 +20,18 @@ import java.util.ArrayList; import gr.thmmy.mthmmy.R; import gr.thmmy.mthmmy.model.Bookmark; +/** + * A {@link Fragment} subclass. + * Use the {@link TopicBookmarksFragment#newInstance} factory method to + * create an instance of this fragment. + */ public class TopicBookmarksFragment extends Fragment { protected static final String ARG_SECTION_NUMBER = "SECTION_NUMBER"; - protected static final String ARG_TOPIC_BOOKMARKS = "BOARD_BOOKMARKS"; + protected static final String ARG_TOPIC_BOOKMARKS = "TOPIC_BOOKMARKS"; - public static final String INTERACTION_CLICK_TOPIC_BOOKMARK = "CLICK_BOARD_BOOKMARK"; + public static final String INTERACTION_CLICK_TOPIC_BOOKMARK = "CLICK_TOPIC_BOOKMARK"; public static final String INTERACTION_TOGGLE_TOPIC_NOTIFICATION = "TOGGLE_TOPIC_NOTIFICATION"; - public static final String INTERACTION_REMOVE_TOPIC_BOOKMARK = "REMOVE_BOARD_BOOKMARK"; + public static final String INTERACTION_REMOVE_TOPIC_BOOKMARK = "REMOVE_TOPIC_BOOKMARK"; ArrayList topicBookmarks = null; @@ -43,11 +48,11 @@ public class TopicBookmarksFragment extends Fragment { * * @return A new instance of fragment Forum. */ - public static TopicBookmarksFragment newInstance(int sectionNumber, String boardBookmarks) { + public static TopicBookmarksFragment newInstance(int sectionNumber, String topicBookmarks) { TopicBookmarksFragment fragment = new TopicBookmarksFragment(); Bundle args = new Bundle(); args.putInt(ARG_SECTION_NUMBER, sectionNumber); - args.putString(ARG_TOPIC_BOOKMARKS, boardBookmarks); + args.putString(ARG_TOPIC_BOOKMARKS, topicBookmarks); fragment.setArguments(args); return fragment; } @@ -56,23 +61,21 @@ public class TopicBookmarksFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { - String bundledBoardBookmarks = getArguments().getString(ARG_TOPIC_BOOKMARKS); - if (bundledBoardBookmarks != null) { - topicBookmarks = Bookmark.arrayFromString(bundledBoardBookmarks); + String bundledTopicBookmarks = getArguments().getString(ARG_TOPIC_BOOKMARKS); + if (bundledTopicBookmarks != null) { + topicBookmarks = Bookmark.arrayFromString(bundledTopicBookmarks); } } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) notificationsEnabledButtonImage = getResources().getDrawable(R.drawable.ic_notification_on, null); - } else { + else notificationsEnabledButtonImage = VectorDrawableCompat.create(getResources(), R.drawable.ic_notification_on, null); - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) notificationsDisabledButtonImage = getResources().getDrawable(R.drawable.ic_notification_off, null); - } else { + else notificationsDisabledButtonImage = VectorDrawableCompat.create(getResources(), R.drawable.ic_notification_off, null); - } } @Override @@ -80,21 +83,18 @@ public class TopicBookmarksFragment extends Fragment { Bundle savedInstanceState) { // Inflates the layout for this fragment final View rootView = layoutInflater.inflate(R.layout.fragment_bookmarks, container, false); - //bookmarks_board_container + //bookmarks_topic_container final LinearLayout bookmarksLinearView = rootView.findViewById(R.id.bookmarks_container); if(this.topicBookmarks != null && !this.topicBookmarks.isEmpty()) { for (final Bookmark bookmarkedTopic : topicBookmarks) { if (bookmarkedTopic != null && bookmarkedTopic.getTitle() != null) { final LinearLayout row = (LinearLayout) layoutInflater.inflate( - R.layout.fragment_bookmarks_topic_row, bookmarksLinearView, false); - row.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Activity activity = getActivity(); - if (activity instanceof BookmarkActivity) { - ((BookmarkActivity) activity).onTopicInteractionListener(INTERACTION_CLICK_TOPIC_BOOKMARK, bookmarkedTopic); - } + R.layout.fragment_bookmarks_row, bookmarksLinearView, false); + row.setOnClickListener(view -> { + Activity activity = getActivity(); + if (activity instanceof BookmarkActivity) { + ((BookmarkActivity) activity).onTopicInteractionListener(INTERACTION_CLICK_TOPIC_BOOKMARK, bookmarkedTopic); } }); ((TextView) row.findViewById(R.id.bookmark_title)).setText(bookmarkedTopic.getTitle()); @@ -104,32 +104,26 @@ public class TopicBookmarksFragment extends Fragment { notificationsEnabledButton.setImageDrawable(notificationsDisabledButtonImage); } - notificationsEnabledButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Activity activity = getActivity(); - if (activity instanceof BookmarkActivity) { - if (((BookmarkActivity) activity).onTopicInteractionListener(INTERACTION_TOGGLE_TOPIC_NOTIFICATION, bookmarkedTopic)) { - notificationsEnabledButton.setImageDrawable(notificationsEnabledButtonImage); - } else { - notificationsEnabledButton.setImageDrawable(notificationsDisabledButtonImage); - } + notificationsEnabledButton.setOnClickListener(view -> { + Activity activity = getActivity(); + if (activity instanceof BookmarkActivity) { + if (((BookmarkActivity) activity).onTopicInteractionListener(INTERACTION_TOGGLE_TOPIC_NOTIFICATION, bookmarkedTopic)) { + notificationsEnabledButton.setImageDrawable(notificationsEnabledButtonImage); + } else { + notificationsEnabledButton.setImageDrawable(notificationsDisabledButtonImage); } } }); - (row.findViewById(R.id.remove_bookmark)).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Activity activity = getActivity(); - if (activity instanceof BookmarkActivity) { - ((BookmarkActivity) activity).onTopicInteractionListener(INTERACTION_REMOVE_TOPIC_BOOKMARK, bookmarkedTopic); - topicBookmarks.remove(bookmarkedTopic); - } - row.setVisibility(View.GONE); + (row.findViewById(R.id.remove_bookmark)).setOnClickListener(view -> { + Activity activity = getActivity(); + if (activity instanceof BookmarkActivity) { + ((BookmarkActivity) activity).onTopicInteractionListener(INTERACTION_REMOVE_TOPIC_BOOKMARK, bookmarkedTopic); + topicBookmarks.remove(bookmarkedTopic); + } + row.setVisibility(View.GONE); - if (topicBookmarks.isEmpty()){ - bookmarksLinearView.addView(bookmarksListEmptyMessage()); - } + if (topicBookmarks.isEmpty()){ + bookmarksLinearView.addView(bookmarksListEmptyMessage()); } }); bookmarksLinearView.addView(row); diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/create_content/CreateContentActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/create_content/CreateContentActivity.java new file mode 100644 index 00000000..b770b7b5 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/create_content/CreateContentActivity.java @@ -0,0 +1,110 @@ +package gr.thmmy.mthmmy.activities.create_content; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.support.design.widget.TextInputLayout; +import android.text.InputType; +import android.text.TextUtils; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.widget.Toast; + +import gr.thmmy.mthmmy.R; +import gr.thmmy.mthmmy.activities.settings.SettingsActivity; +import gr.thmmy.mthmmy.base.BaseActivity; +import gr.thmmy.mthmmy.editorview.EditorView; +import gr.thmmy.mthmmy.editorview.EmojiKeyboard; +import gr.thmmy.mthmmy.session.SessionManager; +import me.zhanghai.android.materialprogressbar.MaterialProgressBar; +import timber.log.Timber; + +public class CreateContentActivity extends BaseActivity implements NewTopicTask.NewTopicTaskCallbacks { + + public final static String EXTRA_NEW_TOPIC_URL = "new-topic-extra"; + + private EditorView contentEditor; + private EmojiKeyboard emojiKeyboard; + private TextInputLayout subjectInput; + private MaterialProgressBar progressBar; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_create_content); + + //Initialize toolbar + toolbar = findViewById(R.id.toolbar); + toolbar.setTitle("Create topic"); + setSupportActionBar(toolbar); + if (getSupportActionBar() != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setDisplayShowHomeEnabled(true); + } + + progressBar = findViewById(R.id.progressBar); + + Intent callingIntent = getIntent(); + String newTopicUrl = callingIntent.getStringExtra(EXTRA_NEW_TOPIC_URL); + + emojiKeyboard = findViewById(R.id.emoji_keyboard); + + subjectInput = findViewById(R.id.subject_input); + subjectInput.getEditText().setRawInputType(InputType.TYPE_CLASS_TEXT); + subjectInput.getEditText().setImeOptions(EditorInfo.IME_ACTION_DONE); + + contentEditor = findViewById(R.id.main_content_editorview); + contentEditor.setEmojiKeyboard(emojiKeyboard); + emojiKeyboard.registerEmojiInputField(contentEditor); + contentEditor.setOnSubmitListener(v -> { + if (newTopicUrl != null) { + if (TextUtils.isEmpty(subjectInput.getEditText().getText())) { + subjectInput.setError("Required"); + return; + } + if (TextUtils.isEmpty(contentEditor.getText())) { + contentEditor.setError("Required"); + return; + } + boolean includeAppSignature = true; + SessionManager sessionManager = BaseActivity.getSessionManager(); + if (sessionManager.isLoggedIn()) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + includeAppSignature = prefs.getBoolean(SettingsActivity.POSTING_APP_SIGNATURE_ENABLE_KEY, true); + } + emojiKeyboard.setVisibility(View.GONE); + + new NewTopicTask(this, includeAppSignature).execute(newTopicUrl, subjectInput.getEditText().getText().toString(), + contentEditor.getText().toString()); + } + }); + } + @Override + public void onBackPressed() { + if (emojiKeyboard.getVisibility() == View.VISIBLE) { + emojiKeyboard.setVisibility(View.GONE); + } else { + super.onBackPressed(); + } + } + + @Override + public void onNewTopicTaskStarted() { + Timber.i("New topic creation started"); + progressBar.setVisibility(View.VISIBLE); + } + + @Override + public void onNewTopicTaskFinished(boolean success) { + progressBar.setVisibility(View.INVISIBLE); + if (success) { + Timber.i("New topic created successfully"); + finish(); + } else { + Timber.w("New topic creation failed"); + Toast.makeText(getBaseContext(), "Failed to create new topic!", Toast.LENGTH_LONG).show(); + finish(); + } + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/create_content/NewTopicTask.java b/app/src/main/java/gr/thmmy/mthmmy/activities/create_content/NewTopicTask.java new file mode 100644 index 00000000..985e0930 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/create_content/NewTopicTask.java @@ -0,0 +1,100 @@ +package gr.thmmy.mthmmy.activities.create_content; + +import android.os.AsyncTask; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; + +import java.io.IOException; + +import gr.thmmy.mthmmy.base.BaseApplication; +import okhttp3.MultipartBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import timber.log.Timber; + +import static gr.thmmy.mthmmy.activities.topic.Posting.replyStatus; + +public class NewTopicTask extends AsyncTask { + + private NewTopicTaskCallbacks listener; + private boolean includeAppSignature; + + public NewTopicTask(NewTopicTaskCallbacks listener, boolean includeAppSignature){ + this.listener = listener; + this.includeAppSignature = includeAppSignature; + } + + @Override + protected void onPreExecute() { + listener.onNewTopicTaskStarted(); + } + + @Override + protected Boolean doInBackground(String... strings) { + Request request = new Request.Builder() + .url(strings[0] + ";wap2") + .build(); + + OkHttpClient client = BaseApplication.getInstance().getClient(); + + Document document; + String seqnum, sc, topic, createTopicUrl; + try { + Response response = client.newCall(request).execute(); + document = Jsoup.parse(response.body().string()); + + seqnum = document.select("input[name=seqnum]").first().attr("value"); + sc = document.select("input[name=sc]").first().attr("value"); + topic = document.select("input[name=topic]").first().attr("value"); + createTopicUrl = document.select("form").first().attr("action"); + + final String appSignature = "\n[right][size=7pt][i]sent from [url=https://play.google.com/store/apps/" + + "details?id=gr.thmmy.mthmmy]mTHMMY[/url] [/i][/size][/right]"; + + RequestBody postBody = new MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("message", strings[2] + (includeAppSignature ? appSignature : "")) + .addFormDataPart("seqnum", seqnum) + .addFormDataPart("sc", sc) + .addFormDataPart("subject", strings[1]) + .addFormDataPart("topic", topic) + .build(); + + Request post = new Request.Builder() + .url(createTopicUrl) + .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36") + .post(postBody) + .build(); + + try { + client.newCall(post).execute(); + Response response2 = client.newCall(post).execute(); + switch (replyStatus(response2)) { + case SUCCESSFUL: + BaseApplication.getInstance().logFirebaseAnalyticsEvent("new_topic_creation", null); + return true; + default: + Timber.e("Malformed post. Request string: %s", post.toString()); + return false; + } + } catch (IOException e) { + return false; + } + } catch (IOException e) { + return false; + } + } + + @Override + protected void onPostExecute(Boolean success) { + listener.onNewTopicTaskFinished(success); + } + + public interface NewTopicTaskCallbacks { + void onNewTopicTaskStarted(); + void onNewTopicTaskFinished(boolean success); + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/downloads/DownloadsActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/downloads/DownloadsActivity.java index 93d92f1a..076cefe9 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/downloads/DownloadsActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/downloads/DownloadsActivity.java @@ -1,13 +1,14 @@ package gr.thmmy.mthmmy.activities.downloads; +import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; -import android.support.design.widget.FloatingActionButton; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; -import android.view.View; +import android.view.Menu; +import android.view.MenuItem; import android.widget.ProgressBar; import android.widget.Toast; @@ -19,6 +20,7 @@ import java.util.ArrayList; import java.util.Objects; import gr.thmmy.mthmmy.R; +import gr.thmmy.mthmmy.activities.upload.UploadActivity; import gr.thmmy.mthmmy.base.BaseActivity; import gr.thmmy.mthmmy.base.BaseApplication; import gr.thmmy.mthmmy.model.Download; @@ -31,6 +33,8 @@ import okhttp3.Request; import okhttp3.Response; import timber.log.Timber; +import static gr.thmmy.mthmmy.activities.upload.UploadActivity.BUNDLE_UPLOAD_CATEGORY; + public class DownloadsActivity extends BaseActivity implements DownloadsAdapter.OnLoadMoreListener { /** * The key to use when putting download's url String to {@link DownloadsActivity}'s Bundle. @@ -42,13 +46,14 @@ public class DownloadsActivity extends BaseActivity implements DownloadsAdapter. public static final String BUNDLE_DOWNLOADS_TITLE = "DOWNLOADS_TITLE"; private static final String downloadsIndexUrl = "https://www.thmmy.gr/smf/index.php?action=tpmod;dl;"; private String downloadsUrl; + private String downloadsNav; private String downloadsTitle; private final ArrayList parsedDownloads = new ArrayList<>(); private MaterialProgressBar progressBar; private RecyclerView recyclerView; private DownloadsAdapter downloadsAdapter; - private FloatingActionButton uploadFAB; + //private FloatingActionButton uploadFAB; private ParseDownloadPageTask parseDownloadPageTask; private int numberOfPages = -1; @@ -68,7 +73,7 @@ public class DownloadsActivity extends BaseActivity implements DownloadsAdapter. if (downloadsUrl != null && !Objects.equals(downloadsUrl, "")) { ThmmyPage.PageCategory target = ThmmyPage.resolvePageCategory(Uri.parse(downloadsUrl)); if (!target.is(ThmmyPage.PageCategory.DOWNLOADS)) { - Timber.e("Bundle came with a non downloads url!\nUrl:\n%s" , downloadsUrl); + Timber.e("Bundle came with a non downloads url!\nUrl:\n%s", downloadsUrl); Toast.makeText(this, "An error has occurred\nAborting.", Toast.LENGTH_SHORT).show(); finish(); } @@ -114,14 +119,38 @@ public class DownloadsActivity extends BaseActivity implements DownloadsAdapter. } }); - uploadFAB = findViewById(R.id.download_fab); - uploadFAB.setEnabled(false); - uploadFAB.hide(); +// uploadFAB = findViewById(R.id.upload_fab); +// uploadFAB.setEnabled(false); +// uploadFAB.hide(); parseDownloadPageTask = new ParseDownloadPageTask(); parseDownloadPageTask.execute(downloadsUrl); } +// @Override +// public boolean onCreateOptionsMenu(Menu menu) { +// // Inflates the menu; this adds items to the action bar if it is present. +// getMenuInflater().inflate(R.menu.downloads_menu, menu); +// super.onCreateOptionsMenu(menu); +// return true; +// } +// +// @Override +// public boolean onOptionsItemSelected(MenuItem item) { +// // Handle presses on the action bar items +// switch (item.getItemId()) { +// case R.id.menu_upload: +// Intent intent = new Intent(DownloadsActivity.this, UploadActivity.class); +// Bundle extras = new Bundle(); +// extras.putString(BUNDLE_UPLOAD_CATEGORY, downloadsNav); +// intent.putExtras(extras); +// startActivity(intent); +// return true; +// default: +// return super.onOptionsItemSelected(item); +// } +// } + @Override public void onLoadMore() { if (pagesLoaded < numberOfPages) { @@ -165,7 +194,7 @@ public class DownloadsActivity extends BaseActivity implements DownloadsAdapter. * data. {@link ParseTask#postExecution(ResultCode) postExecution} method calls {@link RecyclerView#swapAdapter} * to build graphics. *

- *

Calling TopicTask's {@link ParseTask#execute execute} method needs to have profile's url + *

Calling TopicTask's {@link ParseTask#execute execute} method needs to have download's page url * as String parameter!

*/ private class ParseDownloadPageTask extends ParseTask { @@ -175,18 +204,22 @@ public class DownloadsActivity extends BaseActivity implements DownloadsAdapter. @Override protected void onPreExecute() { if (!isLoadingMore) progressBar.setVisibility(ProgressBar.VISIBLE); - if (uploadFAB.getVisibility() != View.GONE) uploadFAB.setEnabled(false); + //if (uploadFAB.getVisibility() != View.GONE) uploadFAB.setEnabled(false); } @Override protected void parse(Document downloadPage) throws ParseException { - try{ + try { + Element downloadsNavElement = downloadPage.select("div.nav").first(); + downloadsNav = downloadsNavElement.text(); + if (downloadsTitle == null || Objects.equals(downloadsTitle, "")) - downloadsTitle = downloadPage.select("div.nav>b>a.nav").last().text(); + downloadsTitle = downloadsNavElement.select("b>a.nav").last().text(); //Removes loading item if (isLoadingMore) { - if (parsedDownloads.size() > 0) parsedDownloads.remove(parsedDownloads.size() - 1); + if (parsedDownloads.size() > 0) + parsedDownloads.remove(parsedDownloads.size() - 1); } if (ThmmyPage.resolvePageCategory(Uri.parse(url)).is(ThmmyPage.PageCategory.DOWNLOADS_CATEGORY)) @@ -231,15 +264,15 @@ public class DownloadsActivity extends BaseActivity implements DownloadsAdapter. } } else { download = new Download(type, - rows.select("b>a").first().attr("href"), - rows.select("b>a").first().text(), - rows.select("div.smalltext:not(:has(a))").text(), - rows.select("span:not(:has(a))").first().text(), - false, - rows.select("span:has(a)").first().text()); + rows.select("b>a").first().attr("href"), + rows.select("b>a").first().text(), + rows.select("div.smalltext:not(:has(a))").text(), + rows.select("span:not(:has(a))").first().text(), + false, + rows.select("span:has(a)").first().text()); parsedDownloads.add(download); } - }catch(Exception e){ + } catch (Exception e) { throw new ParseException("Parsing failed (DownloadsActivity)"); } } @@ -269,7 +302,7 @@ public class DownloadsActivity extends BaseActivity implements DownloadsAdapter. toolbar.setTitle(downloadsTitle); ++pagesLoaded; - if (uploadFAB.getVisibility() != View.GONE) uploadFAB.setEnabled(true); + //if (uploadFAB.getVisibility() != View.GONE) uploadFAB.setEnabled(true); progressBar.setVisibility(ProgressBar.INVISIBLE); downloadsAdapter.notifyDataSetChanged(); isLoadingMore = false; diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/downloads/DownloadsAdapter.java b/app/src/main/java/gr/thmmy/mthmmy/activities/downloads/DownloadsAdapter.java index 5395b447..34a583e0 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/downloads/DownloadsAdapter.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/downloads/DownloadsAdapter.java @@ -91,10 +91,10 @@ class DownloadsAdapter extends RecyclerView.Adapter { if (downloadExpandableVisibility.get(downloadViewHolder.getAdapterPosition())) { downloadViewHolder.informationExpandable.setVisibility(View.VISIBLE); - downloadViewHolder.informationExpandableBtn.setImageResource(R.drawable.ic_arrow_drop_up); + downloadViewHolder.informationExpandableBtn.setImageResource(R.drawable.ic_arrow_drop_up_accent_24dp); } else { downloadViewHolder.informationExpandable.setVisibility(View.GONE); - downloadViewHolder.informationExpandableBtn.setImageResource(R.drawable.ic_arrow_drop_down); + downloadViewHolder.informationExpandableBtn.setImageResource(R.drawable.ic_arrow_drop_down_accent_24dp); } downloadViewHolder.informationExpandableBtn.setOnClickListener(new View.OnClickListener() { @Override @@ -103,10 +103,10 @@ class DownloadsAdapter extends RecyclerView.Adapter { getAdapterPosition()); if (visible) { downloadViewHolder.informationExpandable.setVisibility(View.GONE); - downloadViewHolder.informationExpandableBtn.setImageResource(R.drawable.ic_arrow_drop_down); + downloadViewHolder.informationExpandableBtn.setImageResource(R.drawable.ic_arrow_drop_down_accent_24dp); } else { downloadViewHolder.informationExpandable.setVisibility(View.VISIBLE); - downloadViewHolder.informationExpandableBtn.setImageResource(R.drawable.ic_arrow_drop_up); + downloadViewHolder.informationExpandableBtn.setImageResource(R.drawable.ic_arrow_drop_up_accent_24dp); } downloadExpandableVisibility.set(downloadViewHolder.getAdapterPosition(), !visible); } diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java index 45ea0fc9..67f99897 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java @@ -1,6 +1,7 @@ package gr.thmmy.mthmmy.activities.main; import android.content.Intent; +import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.support.design.widget.TabLayout; @@ -8,6 +9,7 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; +import android.support.v7.preference.PreferenceManager; import android.widget.Toast; import java.util.ArrayList; @@ -35,6 +37,7 @@ import static gr.thmmy.mthmmy.activities.downloads.DownloadsActivity.BUNDLE_DOWN import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_THUMBNAIL_URL; import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_URL; import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_USERNAME; +import static gr.thmmy.mthmmy.activities.settings.SettingsActivity.DEFAULT_HOME_TAB; import static gr.thmmy.mthmmy.activities.topic.TopicActivity.BUNDLE_TOPIC_TITLE; import static gr.thmmy.mthmmy.activities.topic.TopicActivity.BUNDLE_TOPIC_URL; @@ -42,6 +45,8 @@ public class MainActivity extends BaseActivity implements RecentFragment.RecentF //-----------------------------------------CLASS VARIABLES------------------------------------------ private static final int TIME_INTERVAL = 2000; + private SharedPreferences sharedPrefs; + private static final String DRAWER_INTRO = "DRAWER_INTRO"; private long mBackPressed; private SectionsPagerAdapter sectionsPagerAdapter; private ViewPager viewPager; @@ -53,9 +58,12 @@ public class MainActivity extends BaseActivity implements RecentFragment.RecentF redirectToActivityFromIntent(intentFilter); setContentView(R.layout.activity_main); + PreferenceManager.setDefaultValues(this, R.xml.app_preferences_user, false); + if (sessionManager.isLoginScreenDefault()) { //Go to login Intent intent = new Intent(MainActivity.this, LoginActivity.class); + intent.putExtra("REDIRECT", true); startActivity(intent); finish(); overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out); @@ -71,7 +79,6 @@ public class MainActivity extends BaseActivity implements RecentFragment.RecentF if (sessionManager.isLoggedIn()) sectionsPagerAdapter.addFragment(UnreadFragment.newInstance(3), "UNREAD"); - //Set up the ViewPager with the sections adapter. viewPager = findViewById(R.id.container); viewPager.setAdapter(sectionsPagerAdapter); @@ -79,6 +86,12 @@ public class MainActivity extends BaseActivity implements RecentFragment.RecentF TabLayout tabLayout = findViewById(R.id.tabs); tabLayout.setupWithViewPager(viewPager); + sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); + int preferredTab = Integer.parseInt(sharedPrefs.getString(DEFAULT_HOME_TAB, "0")); + if (preferredTab != 3 || sessionManager.isLoggedIn()) { + tabLayout.getTabAt(preferredTab).select(); + } + setMainActivity(this); } @@ -92,6 +105,10 @@ public class MainActivity extends BaseActivity implements RecentFragment.RecentF @Override protected void onResume() { drawer.setSelection(HOME_ID); + if(!sharedPrefs.getBoolean(DRAWER_INTRO, false)){ + drawer.openDrawer(); + sharedPrefs.edit().putBoolean(DRAWER_INTRO, true).apply(); + } updateTabs(); super.onResume(); } diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/forum/ForumFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/forum/ForumFragment.java index 3b6366b4..a85eca23 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/forum/ForumFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/forum/ForumFragment.java @@ -10,6 +10,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.RelativeLayout; +import android.widget.Toast; import com.bignerdranch.expandablerecyclerview.ExpandableRecyclerAdapter; @@ -17,21 +18,26 @@ import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import gr.thmmy.mthmmy.R; import gr.thmmy.mthmmy.base.BaseActivity; +import gr.thmmy.mthmmy.base.BaseApplication; import gr.thmmy.mthmmy.base.BaseFragment; import gr.thmmy.mthmmy.model.Board; import gr.thmmy.mthmmy.model.Category; import gr.thmmy.mthmmy.session.SessionManager; import gr.thmmy.mthmmy.utils.CustomRecyclerView; +import gr.thmmy.mthmmy.utils.NetworkResultCodes; +import gr.thmmy.mthmmy.utils.parsing.NewParseTask; import gr.thmmy.mthmmy.utils.parsing.ParseException; -import gr.thmmy.mthmmy.utils.parsing.ParseTask; import me.zhanghai.android.materialprogressbar.MaterialProgressBar; import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; import okhttp3.Request; +import okhttp3.Response; import timber.log.Timber; /** @@ -83,7 +89,7 @@ public class ForumFragment extends BaseFragment { public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (categories.isEmpty()) { - forumTask = new ForumTask(); + forumTask = new ForumTask(this::onForumTaskStarted, this::onForumTaskFinished); forumTask.execute(); } @@ -106,7 +112,7 @@ public class ForumFragment extends BaseFragment { if (BaseActivity.getSessionManager().isLoggedIn()) { if (forumTask.getStatus() == AsyncTask.Status.RUNNING) forumTask.cancel(true); - forumTask = new ForumTask(); + forumTask = new ForumTask(ForumFragment.this::onForumTaskStarted, ForumFragment.this::onForumTaskFinished); forumTask.setUrl(categories.get(parentPosition).getCategoryURL()); forumTask.execute(); } @@ -117,7 +123,7 @@ public class ForumFragment extends BaseFragment { if (BaseActivity.getSessionManager().isLoggedIn()) { if (forumTask.getStatus() == AsyncTask.Status.RUNNING) forumTask.cancel(true); - forumTask = new ForumTask(); + forumTask = new ForumTask(ForumFragment.this::onForumTaskStarted, ForumFragment.this::onForumTaskFinished); forumTask.setUrl(categories.get(parentPosition).getCategoryURL()); forumTask.execute(); } @@ -135,16 +141,12 @@ public class ForumFragment extends BaseFragment { swipeRefreshLayout = rootView.findViewById(R.id.swiperefresh); swipeRefreshLayout.setProgressBackgroundColorSchemeResource(R.color.primary); swipeRefreshLayout.setColorSchemeResources(R.color.accent); - swipeRefreshLayout.setOnRefreshListener( - new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - if (forumTask != null && forumTask.getStatus() != AsyncTask.Status.RUNNING) { - forumTask = new ForumTask(); - forumTask.execute(SessionManager.indexUrl.toString()); - } + swipeRefreshLayout.setOnRefreshListener(() -> { + if (forumTask != null && forumTask.getStatus() != AsyncTask.Status.RUNNING) { + forumTask = new ForumTask(ForumFragment.this::onForumTaskStarted, ForumFragment.this::onForumTaskFinished); + //forumTask.execute(SessionManager.indexUrl.toString()); + forumTask.execute(); } - } ); @@ -163,33 +165,38 @@ public class ForumFragment extends BaseFragment { void onForumFragmentInteraction(Board board); } - //---------------------------------------ASYNC TASK----------------------------------- + public void onForumTaskStarted() { + progressBar.setVisibility(ProgressBar.VISIBLE); + } - private class ForumTask extends ParseTask { - private HttpUrl forumUrl = SessionManager.forumUrl; //may change upon collapse/expand + public void onForumTaskFinished(int resultCode, ArrayList fetchedCategories) { + if (resultCode == NetworkResultCodes.SUCCESSFUL) { + categories.clear(); + categories.addAll(fetchedCategories); + forumAdapter.notifyParentDataSetChanged(false); + } else if (resultCode == NetworkResultCodes.NETWORK_ERROR) { + Toast.makeText(BaseApplication.getInstance().getApplicationContext(), "Network error", Toast.LENGTH_SHORT).show(); + } - private final List fetchedCategories; + progressBar.setVisibility(ProgressBar.INVISIBLE); + swipeRefreshLayout.setRefreshing(false); + } - ForumTask() { - fetchedCategories = new ArrayList<>(); - } + //---------------------------------------ASYNC TASK----------------------------------- - protected void onPreExecute() { - progressBar.setVisibility(ProgressBar.VISIBLE); - } + private class ForumTask extends NewParseTask> { + private HttpUrl forumUrl = SessionManager.forumUrl; //may change upon collapse/expand - @Override - protected Request prepareRequest(String... params) { - return new Request.Builder() - .url(forumUrl) - .build(); + public ForumTask(OnTaskStartedListener onTaskStartedListener, + OnNetworkTaskFinishedListener> onParseTaskFinishedListener) { + super(onTaskStartedListener, onParseTaskFinishedListener); } - @Override - public void parse(Document document) throws ParseException { + protected ArrayList parse(Document document, Response response) throws ParseException { Elements categoryBlocks = document.select(".tborder:not([style])>table[cellpadding=5]"); if (categoryBlocks.size() != 0) { + ArrayList fetchedCategories = new ArrayList<>(); for (Element categoryBlock : categoryBlocks) { Element categoryElement = categoryBlock.select("td[colspan=2]>[name]").first(); String categoryUrl = categoryElement.attr("href"); @@ -207,24 +214,26 @@ public class ForumFragment extends BaseFragment { fetchedCategories.add(category); } - categories.clear(); - categories.addAll(fetchedCategories); - fetchedCategories.clear(); + return fetchedCategories; } else throw new ParseException("Parsing failed"); } @Override - protected void postExecution(ParseTask.ResultCode result) { - if (result == ResultCode.SUCCESS) - forumAdapter.notifyParentDataSetChanged(false); + protected Response sendRequest(OkHttpClient client, String... input) throws IOException { + Request request = new Request.Builder() + .url(forumUrl) + .build(); + return client.newCall(request).execute(); + } - progressBar.setVisibility(ProgressBar.INVISIBLE); - swipeRefreshLayout.setRefreshing(false); + @Override + protected int getResultCode(Response response, ArrayList data) { + return NetworkResultCodes.SUCCESSFUL; } - public void setUrl(String string) //TODO delete and simplify e.g. in prepareRequest possible? - { + //TODO delete and simplify e.g. in prepareRequest possible? + public void setUrl(String string) { forumUrl = HttpUrl.parse(string); } } diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java index aee35e37..65b0d315 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java @@ -10,6 +10,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.RelativeLayout; +import android.widget.Toast; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; @@ -20,13 +21,16 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import gr.thmmy.mthmmy.R; +import gr.thmmy.mthmmy.base.BaseApplication; import gr.thmmy.mthmmy.base.BaseFragment; import gr.thmmy.mthmmy.model.TopicSummary; import gr.thmmy.mthmmy.session.SessionManager; import gr.thmmy.mthmmy.utils.CustomRecyclerView; +import gr.thmmy.mthmmy.utils.NetworkResultCodes; +import gr.thmmy.mthmmy.utils.parsing.NewParseTask; import gr.thmmy.mthmmy.utils.parsing.ParseException; -import gr.thmmy.mthmmy.utils.parsing.ParseTask; import me.zhanghai.android.materialprogressbar.MaterialProgressBar; +import okhttp3.Response; import timber.log.Timber; @@ -79,7 +83,7 @@ public class RecentFragment extends BaseFragment { public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (topicSummaries.isEmpty()) { - recentTask = new RecentTask(); + recentTask = new RecentTask(this::onRecentTaskStarted, this::onRecentTaskFinished); recentTask.execute(SessionManager.indexUrl.toString()); } @@ -109,16 +113,11 @@ public class RecentFragment extends BaseFragment { swipeRefreshLayout = rootView.findViewById(R.id.swiperefresh); swipeRefreshLayout.setProgressBackgroundColorSchemeResource(R.color.primary); swipeRefreshLayout.setColorSchemeResources(R.color.accent); - swipeRefreshLayout.setOnRefreshListener( - new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - if (recentTask != null && recentTask.getStatus() != AsyncTask.Status.RUNNING) { - recentTask = new RecentTask(); - recentTask.execute(SessionManager.indexUrl.toString()); - } + swipeRefreshLayout.setOnRefreshListener(() -> { + if (recentTask != null && recentTask.getStatus() != AsyncTask.Status.RUNNING) { + recentTask = new RecentTask(this::onRecentTaskStarted, this::onRecentTaskFinished); + recentTask.execute(SessionManager.indexUrl.toString()); } - } ); } @@ -138,18 +137,34 @@ public class RecentFragment extends BaseFragment { void onRecentFragmentInteraction(TopicSummary topicSummary); } + private void onRecentTaskStarted() { + progressBar.setVisibility(ProgressBar.VISIBLE); + } + + private void onRecentTaskFinished(int resultCode, ArrayList fetchedRecent) { + if (resultCode == NetworkResultCodes.SUCCESSFUL) { + topicSummaries.clear(); + topicSummaries.addAll(fetchedRecent); + recentAdapter.notifyDataSetChanged(); + } else if (resultCode == NetworkResultCodes.NETWORK_ERROR) { + Toast.makeText(BaseApplication.getInstance().getApplicationContext(), "Network error", Toast.LENGTH_SHORT).show(); + } + + progressBar.setVisibility(ProgressBar.INVISIBLE); + swipeRefreshLayout.setRefreshing(false); + } + //---------------------------------------ASYNC TASK----------------------------------- - private class RecentTask extends ParseTask { - private List fetchedRecent; + private class RecentTask extends NewParseTask> { - @Override - protected void onPreExecute() { - progressBar.setVisibility(ProgressBar.VISIBLE); - fetchedRecent = new ArrayList<>(); + public RecentTask(OnTaskStartedListener onTaskStartedListener, + OnNetworkTaskFinishedListener> onParseTaskFinishedListener) { + super(onTaskStartedListener, onParseTaskFinishedListener); } @Override - public void parse(Document document) throws ParseException { + protected ArrayList parse(Document document, Response response) throws ParseException { + ArrayList fetchedRecent = new ArrayList<>(); Elements recent = document.select("#block8 :first-child div"); if (!recent.isEmpty()) { for (int i = 0; i < recent.size(); i += 3) { @@ -174,7 +189,7 @@ public class RecentFragment extends BaseFragment { dateTime.contains(" πμ") || dateTime.contains(" μμ")) { dateTime = dateTime.replaceAll(":[0-5][0-9] ", " "); } else { - dateTime=dateTime.substring(0,dateTime.lastIndexOf(":")); + dateTime = dateTime.substring(0, dateTime.lastIndexOf(":")); } if (!dateTime.contains(",")) { dateTime = dateTime.replaceAll(".+? ([0-9])", "$1"); @@ -184,22 +199,14 @@ public class RecentFragment extends BaseFragment { fetchedRecent.add(new TopicSummary(link, title, lastUser, dateTime)); } - return; + return fetchedRecent; } throw new ParseException("Parsing failed"); } @Override - protected void postExecution(ParseTask.ResultCode result) { - if (result == ResultCode.SUCCESS) - { - topicSummaries.clear(); - topicSummaries.addAll(fetchedRecent); - recentAdapter.notifyDataSetChanged(); - } - - progressBar.setVisibility(ProgressBar.INVISIBLE); - swipeRefreshLayout.setRefreshing(false); + protected int getResultCode(Response response, ArrayList data) { + return NetworkResultCodes.SUCCESSFUL; } } } diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/unread/UnreadAdapter.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/unread/UnreadAdapter.java index 4b7c235b..65100922 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/unread/UnreadAdapter.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/unread/UnreadAdapter.java @@ -1,6 +1,5 @@ package gr.thmmy.mthmmy.activities.main.unread; -import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -15,7 +14,6 @@ import gr.thmmy.mthmmy.base.BaseFragment; import gr.thmmy.mthmmy.model.TopicSummary; class UnreadAdapter extends RecyclerView.Adapter { - private final Context context; private final List unreadList; private final UnreadFragment.UnreadFragmentInteractionListener mListener; private final MarkReadInteractionListener markReadListener; @@ -24,10 +22,9 @@ class UnreadAdapter extends RecyclerView.Adapter { private final int VIEW_TYPE_NADA = 1; private final int VIEW_TYPE_MARK_READ = 2; - UnreadAdapter(Context context, @NonNull List topicSummaryList, + UnreadAdapter(@NonNull List topicSummaryList, BaseFragment.FragmentInteractionListener listener, MarkReadInteractionListener markReadInteractionListener) { - this.context = context; this.unreadList = topicSummaryList; mListener = (UnreadFragment.UnreadFragmentInteractionListener) listener; markReadListener = markReadInteractionListener; @@ -39,8 +36,9 @@ class UnreadAdapter extends RecyclerView.Adapter { return unreadList.get(position).getTopicUrl() == null ? VIEW_TYPE_NADA : VIEW_TYPE_ITEM; } + @NonNull @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { if (viewType == VIEW_TYPE_ITEM) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.fragment_unread_row, parent, false); @@ -58,7 +56,7 @@ class UnreadAdapter extends RecyclerView.Adapter { } @Override - public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { + public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position) { if (holder instanceof UnreadAdapter.EmptyViewHolder) { final UnreadAdapter.EmptyViewHolder emptyViewHolder = (UnreadAdapter.EmptyViewHolder) holder; emptyViewHolder.text.setText(unreadList.get(holder.getAdapterPosition()).getDateTimeModified()); diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/unread/UnreadFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/unread/UnreadFragment.java index 98be97e2..0747b4bf 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/unread/UnreadFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/unread/UnreadFragment.java @@ -2,6 +2,7 @@ package gr.thmmy.mthmmy.activities.main.unread; import android.os.AsyncTask; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; @@ -21,14 +22,17 @@ import java.util.ArrayList; import java.util.List; import gr.thmmy.mthmmy.R; +import gr.thmmy.mthmmy.base.BaseApplication; import gr.thmmy.mthmmy.base.BaseFragment; import gr.thmmy.mthmmy.model.TopicSummary; import gr.thmmy.mthmmy.session.SessionManager; import gr.thmmy.mthmmy.utils.CustomRecyclerView; +import gr.thmmy.mthmmy.utils.NetworkResultCodes; +import gr.thmmy.mthmmy.utils.parsing.NewParseTask; import gr.thmmy.mthmmy.utils.parsing.ParseException; -import gr.thmmy.mthmmy.utils.parsing.ParseTask; import me.zhanghai.android.materialprogressbar.MaterialProgressBar; import okhttp3.Request; +import okhttp3.Response; import timber.log.Timber; /** @@ -42,13 +46,14 @@ import timber.log.Timber; public class UnreadFragment extends BaseFragment { private static final String TAG = "UnreadFragment"; - // Fragment initialization parameters, e.g. ARG_SECTION_NUMBER private MaterialProgressBar progressBar; private SwipeRefreshLayout swipeRefreshLayout; private UnreadAdapter unreadAdapter; private List topicSummaries; + private int numberOfPages = 0; + private int loadedPages = 0; private UnreadTask unreadTask; private MarkReadTask markReadTask; @@ -82,7 +87,8 @@ public class UnreadFragment extends BaseFragment { public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (topicSummaries.isEmpty()) { - unreadTask = new UnreadTask(); + unreadTask = new UnreadTask(this::onUnreadTaskStarted, this::onUnreadTaskFinished); + assert SessionManager.unreadUrl != null; unreadTask.execute(SessionManager.unreadUrl.toString()); } markReadTask = new MarkReadTask(); @@ -91,7 +97,7 @@ public class UnreadFragment extends BaseFragment { @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment final View rootView = inflater.inflate(R.layout.fragment_unread, container, false); @@ -99,16 +105,13 @@ public class UnreadFragment extends BaseFragment { // Set the adapter if (rootView instanceof RelativeLayout) { progressBar = rootView.findViewById(R.id.progressBar); - unreadAdapter = new UnreadAdapter(getActivity(), topicSummaries, - fragmentInteractionListener, new UnreadAdapter.MarkReadInteractionListener() { - @Override - public void onMarkReadInteraction(String markReadLinkUrl) { - if (markReadTask != null && markReadTask.getStatus() != AsyncTask.Status.RUNNING) { - markReadTask = new MarkReadTask(); - markReadTask.execute(markReadLinkUrl); - } - } - }); + unreadAdapter = new UnreadAdapter(topicSummaries, + fragmentInteractionListener, markReadLinkUrl -> { + if (markReadTask != null && markReadTask.getStatus() != AsyncTask.Status.RUNNING) { + markReadTask = new MarkReadTask(); + markReadTask.execute(markReadLinkUrl); + } + }); CustomRecyclerView recyclerView = rootView.findViewById(R.id.list); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(recyclerView.getContext()); @@ -122,15 +125,15 @@ public class UnreadFragment extends BaseFragment { swipeRefreshLayout.setProgressBackgroundColorSchemeResource(R.color.primary); swipeRefreshLayout.setColorSchemeResources(R.color.accent); swipeRefreshLayout.setOnRefreshListener( - new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - if (unreadTask != null && unreadTask.getStatus() != AsyncTask.Status.RUNNING) { - unreadTask = new UnreadTask(); - unreadTask.execute(SessionManager.unreadUrl.toString()); - } + () -> { + if (unreadTask != null && unreadTask.getStatus() != AsyncTask.Status.RUNNING) { + topicSummaries.clear(); + numberOfPages = 0; + loadedPages = 0; + unreadTask = new UnreadTask(this::onUnreadTaskStarted, this::onUnreadTaskFinished); + assert SessionManager.unreadUrl != null; + unreadTask.execute(SessionManager.unreadUrl.toString()); } - } ); } @@ -152,16 +155,45 @@ public class UnreadFragment extends BaseFragment { } //---------------------------------------ASYNC TASK----------------------------------- - private class UnreadTask extends ParseTask { - protected void onPreExecute() { - progressBar.setVisibility(ProgressBar.VISIBLE); + + private void onUnreadTaskStarted() { + progressBar.setVisibility(ProgressBar.VISIBLE); + } + + private void onUnreadTaskFinished(int resultCode, Void data) { + if (resultCode == NetworkResultCodes.SUCCESSFUL) { + unreadAdapter.notifyDataSetChanged(); + + ++loadedPages; + if (loadedPages < numberOfPages) { + unreadTask = new UnreadTask(this::onUnreadTaskStarted, this::onUnreadTaskFinished); + assert SessionManager.unreadUrl != null; + unreadTask.execute(SessionManager.unreadUrl.toString() + ";start=" + loadedPages * 20); + } + else { + progressBar.setVisibility(ProgressBar.INVISIBLE); + swipeRefreshLayout.setRefreshing(false); + } + } + else{ + progressBar.setVisibility(ProgressBar.INVISIBLE); + swipeRefreshLayout.setRefreshing(false); + if (resultCode == NetworkResultCodes.NETWORK_ERROR) + Toast.makeText(BaseApplication.getInstance().getApplicationContext(), "Network error", Toast.LENGTH_SHORT).show(); + } + } + + private class UnreadTask extends NewParseTask { + + UnreadTask(OnTaskStartedListener onTaskStartedListener, OnNetworkTaskFinishedListener onParseTaskFinishedListener) { + super(onTaskStartedListener, onParseTaskFinishedListener); } @Override - public void parse(Document document) throws ParseException { + protected Void parse(Document document, Response response) throws ParseException { Elements unread = document.select("table.bordercolor[cellspacing=1] tr:not(.titlebg)"); if (!unread.isEmpty()) { - topicSummaries.clear(); + //topicSummaries.clear(); for (Element row : unread) { Elements information = row.select("td"); String link = information.last().select("a").first().attr("href"); @@ -178,7 +210,7 @@ public class UnreadFragment extends BaseFragment { dateTime.contains(" πμ") || dateTime.contains(" μμ")) { dateTime = dateTime.replaceAll(":[0-5][0-9] ", " "); } else { - dateTime=dateTime.substring(0,dateTime.lastIndexOf(":")); + dateTime = dateTime.substring(0, dateTime.lastIndexOf(":")); } if (!dateTime.contains(",")) { dateTime = dateTime.replaceAll(".+? ([0-9])", "$1"); @@ -186,9 +218,26 @@ public class UnreadFragment extends BaseFragment { topicSummaries.add(new TopicSummary(link, title, lastUser, dateTime)); } - Element markRead = document.select("table:not(.bordercolor):not([width])").select("a") - .first(); - if (markRead != null) + Element topBar = document.select("table:not(.bordercolor):not(#bodyarea):has(td.middletext)").first(); + + Element pagesElement = null, markRead = null; + if (topBar != null) { + pagesElement = topBar.select("td.middletext").first(); + + markRead = document.select("table:not(.bordercolor):not([width])").select("a") + .first(); + } + + if (numberOfPages == 0 && pagesElement != null) { + Elements pages = pagesElement.select("a"); + if (!pages.isEmpty()) { + numberOfPages = Integer.parseInt(pages.last().text()); + } else { + numberOfPages = 1; + } + } + + if (markRead != null && loadedPages == numberOfPages - 1) topicSummaries.add(new TopicSummary(markRead.attr("href"), markRead.text(), null, null)); } else { @@ -201,15 +250,12 @@ public class UnreadFragment extends BaseFragment { } topicSummaries.add(new TopicSummary(null, null, null, message)); } + return null; } @Override - protected void postExecution(ParseTask.ResultCode result) { - if (result == ResultCode.SUCCESS) - unreadAdapter.notifyDataSetChanged(); - - progressBar.setVisibility(ProgressBar.INVISIBLE); - swipeRefreshLayout.setRefreshing(false); + protected int getResultCode(Response response, Void data) { + return NetworkResultCodes.SUCCESSFUL; } } @@ -253,7 +299,8 @@ public class UnreadFragment extends BaseFragment { , "Fatal error!\n Task aborted...", Toast.LENGTH_LONG).show(); } else { if (unreadTask != null && unreadTask.getStatus() != AsyncTask.Status.RUNNING) { - unreadTask = new UnreadTask(); + unreadTask = new UnreadTask(UnreadFragment.this::onUnreadTaskStarted, UnreadFragment.this::onUnreadTaskFinished); + assert SessionManager.unreadUrl != null; unreadTask.execute(SessionManager.unreadUrl.toString()); } } diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/profile/ProfileActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/profile/ProfileActivity.java index a83fc610..19680329 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/profile/ProfileActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/profile/ProfileActivity.java @@ -5,6 +5,7 @@ import android.graphics.Color; import android.graphics.Typeface; import android.net.Uri; import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.TabLayout; @@ -13,6 +14,7 @@ import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.content.res.ResourcesCompat; import android.support.v4.view.ViewPager; +import android.support.v7.app.AppCompatDelegate; import android.text.Spannable; import android.text.SpannableString; import android.text.Spanned; @@ -92,6 +94,13 @@ public class ProfileActivity extends BaseActivity implements LatestPostsFragment private String username; private int tabSelect; + //Fix for vector drawables on android <21 + static { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); + } + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -124,9 +133,9 @@ public class ProfileActivity extends BaseActivity implements LatestPostsFragment .resize(THUMBNAIL_SIZE, THUMBNAIL_SIZE) .centerCrop() .error(ResourcesCompat.getDrawable(this.getResources() - , R.drawable.ic_default_user_thumbnail, null)) + , R.drawable.ic_default_user_thumbnail_white_24dp, null)) .placeholder(ResourcesCompat.getDrawable(this.getResources() - , R.drawable.ic_default_user_thumbnail, null)) + , R.drawable.ic_default_user_thumbnail_white_24dp, null)) .transform(new CircleTransform()) .into(thumbnailView); usernameView = findViewById(R.id.profile_activity_username); @@ -310,9 +319,9 @@ public class ProfileActivity extends BaseActivity implements LatestPostsFragment .resize(THUMBNAIL_SIZE, THUMBNAIL_SIZE) .centerCrop() .error(ResourcesCompat.getDrawable(getResources() - , R.drawable.ic_default_user_thumbnail, null)) + , R.drawable.ic_default_user_thumbnail_white_24dp, null)) .placeholder(ResourcesCompat.getDrawable(getResources() - , R.drawable.ic_default_user_thumbnail, null)) + , R.drawable.ic_default_user_thumbnail_white_24dp, null)) .transform(new CircleTransform()) .into(thumbnailView); if (personalText != null) { diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/profile/summary/SummaryFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/profile/summary/SummaryFragment.java index 8993fcf0..76380576 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/profile/summary/SummaryFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/profile/summary/SummaryFragment.java @@ -180,8 +180,6 @@ public class SummaryFragment extends Fragment { if (profileSummaryRow.contains("@") && (profileSummaryRow.contains("Email") || profileSummaryRow.contains("E-mail"))) { - Timber.d("mpika"); - Timber.d(profileSummaryRow); String email = profileSummaryRow.substring(profileSummaryRow.indexOf(": ") + 6); profileSummaryRow = profileSummaryRow.replace(email, "" + email + ""); diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/settings/SettingsActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/settings/SettingsActivity.java new file mode 100644 index 00000000..4383732b --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/settings/SettingsActivity.java @@ -0,0 +1,48 @@ +package gr.thmmy.mthmmy.activities.settings; + +import android.os.Bundle; +import android.support.v4.app.FragmentTransaction; + +import gr.thmmy.mthmmy.R; +import gr.thmmy.mthmmy.base.BaseActivity; + +public class SettingsActivity extends BaseActivity { + public static final String DEFAULT_HOME_TAB = "pref_app_main_default_tab_key"; + public static final String NOTIFICATION_LED_KEY = "pref_notification_led_enable_key"; + public static final String NOTIFICATION_VIBRATION_KEY = "pref_notification_vibration_enable_key"; + public static final String POSTING_APP_SIGNATURE_ENABLE_KEY = "pref_posting_app_signature_enable_key"; + public static final String UPLOADING_APP_SIGNATURE_ENABLE_KEY = "pref_uploading_app_signature_enable_key"; + + private SettingsFragment preferenceFragment; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_settings); + + //Initialize toolbar + toolbar = findViewById(R.id.toolbar); + toolbar.setTitle("Settings"); + setSupportActionBar(toolbar); + if (getSupportActionBar() != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setDisplayShowHomeEnabled(true); + } + + createDrawer(); + drawer.setSelection(SETTINGS_ID); + + preferenceFragment = SettingsFragment.newInstance(sessionManager.isLoggedIn()); + FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); + fragmentTransaction.add(R.id.pref_container, preferenceFragment); + fragmentTransaction.commit(); + } + + @Override + protected void onResume() { + drawer.setSelection(SETTINGS_ID); + super.onResume(); + if (preferenceFragment != null) + preferenceFragment.updateUserLoginState(sessionManager.isLoggedIn()); + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/settings/SettingsFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/settings/SettingsFragment.java new file mode 100644 index 00000000..df97ad07 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/settings/SettingsFragment.java @@ -0,0 +1,214 @@ +package gr.thmmy.mthmmy.activities.settings; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.media.RingtoneManager; +import android.net.Uri; +import android.os.Bundle; +import android.provider.Settings; +import android.support.annotation.NonNull; +import android.support.v7.preference.ListPreference; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceFragmentCompat; +import android.view.View; +import android.widget.Toast; + +import java.util.ArrayList; + +import gr.thmmy.mthmmy.R; +import gr.thmmy.mthmmy.base.BaseApplication; +import timber.log.Timber; + +import static gr.thmmy.mthmmy.activities.settings.SettingsActivity.DEFAULT_HOME_TAB; + +public class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener { + private enum PREFS_TYPE { + NOT_SET, USER, GUEST + } + + public static final String ARG_IS_LOGGED_IN = "selectedRingtoneKey"; + + //Preferences xml keys + private static final String SELECTED_NOTIFICATIONS_SOUND = "pref_notifications_select_sound_key"; + private static final String POSTING_CATEGORY = "pref_category_posting_key"; + private static final String UPLOADING_CATEGORY = "pref_category_uploading_key"; + + //SharedPreferences keys + private static final int REQUEST_CODE_ALERT_RINGTONE = 2; + public static final String SETTINGS_SHARED_PREFS = "settingsSharedPrefs"; + public static final String SELECTED_RINGTONE = "selectedRingtoneKey"; + private static final String SILENT_SELECTED = "STFU"; + + private SharedPreferences settingsFile; + + private PREFS_TYPE prefs_type = PREFS_TYPE.NOT_SET; + private boolean isLoggedIn = false; + private ArrayList defaultHomeTabEntries = new ArrayList<>(); + private ArrayList defaultHomeTabValues = new ArrayList<>(); + + public static SettingsFragment newInstance(boolean isLoggedIn) { + SettingsFragment fragment = new SettingsFragment(); + Bundle args = new Bundle(); + args.putBoolean(ARG_IS_LOGGED_IN, isLoggedIn); + fragment.setArguments(args); + return fragment; + } + + public SettingsFragment() { + defaultHomeTabEntries.add("Recent"); + defaultHomeTabEntries.add("Forum"); + + defaultHomeTabValues.add("0"); + defaultHomeTabValues.add("1"); + + if(isLoggedIn = BaseApplication.getInstance().getSessionManager().isLoggedIn()){ + defaultHomeTabEntries.add("Unread"); + defaultHomeTabValues.add("2"); + } + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Bundle args = getArguments(); + + if (args != null) + isLoggedIn = args.getBoolean(ARG_IS_LOGGED_IN, false); + } + + @Override + public void onResume() { + super.onResume(); + getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); + } + + @Override + public void onPause() { + super.onPause(); + getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); + } + + @Override + public void onCreatePreferences(Bundle bundle, String rootKey) { + isLoggedIn = BaseApplication.getInstance().getSessionManager().isLoggedIn(); //Ensures it stays updated + // Add the Preferences from the XML file if needed + if(isLoggedIn&&(prefs_type==PREFS_TYPE.GUEST||prefs_type==PREFS_TYPE.NOT_SET)){ + prefs_type = PREFS_TYPE.USER; + addPreferencesFromResource(R.xml.app_preferences_user); + } + else if(!isLoggedIn&&(prefs_type==PREFS_TYPE.USER||prefs_type==PREFS_TYPE.NOT_SET)){ + prefs_type = PREFS_TYPE.GUEST; + addPreferencesFromResource(R.xml.app_preferences_guest); + } + } + + @Override + public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + updatePreferenceVisibility(); + } + + @Override + public boolean onPreferenceTreeClick(Preference preference) { + if (preference.getKey().equals(SELECTED_NOTIFICATIONS_SOUND)) { + Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); + intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); + intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); + intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true); + intent.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI, Settings.System.DEFAULT_NOTIFICATION_URI); + + Activity activity = this.getActivity(); + settingsFile = activity != null + ? activity.getSharedPreferences(SETTINGS_SHARED_PREFS, Context.MODE_PRIVATE) + : null; + String existingValue = settingsFile != null + ? settingsFile.getString(SELECTED_RINGTONE, null) + : null; + if (existingValue != null) { + if (existingValue.equals(SILENT_SELECTED)) { + //Selects "Silent" + intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, (Uri) null); + } else { + intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, Uri.parse(existingValue)); + } + } else { + //No ringtone has been selected, set to the default + intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, Settings.System.DEFAULT_NOTIFICATION_URI); + } + + startActivityForResult(intent, REQUEST_CODE_ALERT_RINGTONE); + return true; + } else { + return super.onPreferenceTreeClick(preference); + } + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == REQUEST_CODE_ALERT_RINGTONE && data != null) { + Uri ringtone = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); + SharedPreferences.Editor editor = settingsFile.edit(); + if (ringtone != null) { + editor.putString(SELECTED_RINGTONE, ringtone.toString()).apply(); + } else { + //"Silent" was selected + editor.putString(SELECTED_RINGTONE, SILENT_SELECTED).apply(); + } + } else { + super.onActivityResult(requestCode, resultCode, data); + } + } + + public void updateUserLoginState(boolean isLoggedIn) { + this.isLoggedIn = isLoggedIn; + updatePreferenceVisibility(); + } + + private void updatePreferenceVisibility(){ + if(isLoggedIn&& prefs_type==PREFS_TYPE.GUEST) { + prefs_type = PREFS_TYPE.USER; + setPreferencesFromResource(R.xml.app_preferences_user, getPreferenceScreen().getKey()); + if(!defaultHomeTabEntries.contains("Unread")){ + defaultHomeTabEntries.add("Unread"); + defaultHomeTabValues.add("2"); + } + } + else if(!isLoggedIn&&prefs_type==PREFS_TYPE.USER){ + prefs_type = PREFS_TYPE.GUEST; + setPreferencesFromResource(R.xml.app_preferences_guest,getPreferenceScreen().getKey()); + if(defaultHomeTabEntries.contains("Unread")){ + defaultHomeTabEntries.remove("Unread"); + defaultHomeTabValues.remove("2"); + } + } + + CharSequence[] tmpCs = defaultHomeTabEntries.toArray(new CharSequence[defaultHomeTabEntries.size()]); + ((ListPreference) findPreference(DEFAULT_HOME_TAB)).setEntries(tmpCs); + + tmpCs = defaultHomeTabValues.toArray(new CharSequence[defaultHomeTabValues.size()]); + ((ListPreference) findPreference(DEFAULT_HOME_TAB)).setEntryValues(tmpCs); + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + boolean enabled; + if (key.equals(getString(R.string.pref_privacy_crashlytics_enable_key))) { + enabled = sharedPreferences.getBoolean(key, false); + if(enabled) + BaseApplication.getInstance().startFirebaseCrashlyticsCollection(); + else { + Timber.i("Crashlytics collection will be disabled after restarting."); + Toast.makeText(BaseApplication.getInstance().getApplicationContext(), "This change will take effect once you restart the app.", Toast.LENGTH_SHORT).show(); + } + } else if (key.equals(getString(R.string.pref_privacy_analytics_enable_key))) { + enabled = sharedPreferences.getBoolean(key, false); + BaseApplication.getInstance().setFirebaseAnalyticsCollection(enabled); + if(enabled) + Timber.i("Analytics collection enabled."); + else + Timber.i("Analytics collection disabled."); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/Posting.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/Posting.java index cc08f17d..88c2f8a3 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/Posting.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/Posting.java @@ -11,11 +11,11 @@ import timber.log.Timber; /** * This is a utility class containing a collection of static methods to help with topic replying. */ -class Posting { +public class Posting { /** * {@link REPLY_STATUS} enum defines the different possible outcomes of a topic reply request. */ - enum REPLY_STATUS { + public enum REPLY_STATUS { /** * The request was successful */ @@ -54,7 +54,7 @@ class Posting { * @return a {@link REPLY_STATUS} that describes the response status * @throws IOException method relies to {@link org.jsoup.Jsoup#parse(String)} */ - static REPLY_STATUS replyStatus(Response response) throws IOException { + public static REPLY_STATUS replyStatus(Response response) throws IOException { if (response.code() == 404) return REPLY_STATUS.NOT_FOUND; if (response.code() < 200 || response.code() >= 400) return REPLY_STATUS.OTHER_ERROR; String finalUrl = response.request().url().toString(); diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicActivity.java index cffbc290..4d03649d 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicActivity.java @@ -2,24 +2,26 @@ package gr.thmmy.mthmmy.activities.topic; import android.annotation.SuppressLint; import android.app.NotificationManager; +import android.arch.lifecycle.ViewModelProviders; import android.content.Context; import android.content.Intent; import android.graphics.Rect; import android.net.Uri; -import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.Snackbar; +import android.support.v4.content.res.ResourcesCompat; import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatDelegate; import android.support.v7.widget.RecyclerView; -import android.text.Html; +import android.text.Spannable; +import android.text.SpannableString; import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.text.method.LinkMovementMethod; -import android.text.style.ClickableSpan; -import android.text.style.URLSpan; -import android.util.SparseArray; +import android.text.style.ForegroundColorSpan; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; @@ -32,39 +34,29 @@ import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Selector; - -import java.io.IOException; import java.util.ArrayList; -import java.util.Objects; import gr.thmmy.mthmmy.R; -import gr.thmmy.mthmmy.activities.board.BoardActivity; -import gr.thmmy.mthmmy.activities.profile.ProfileActivity; +import gr.thmmy.mthmmy.activities.topic.tasks.EditTask; +import gr.thmmy.mthmmy.activities.topic.tasks.PrepareForEditTask; +import gr.thmmy.mthmmy.activities.topic.tasks.PrepareForReply; +import gr.thmmy.mthmmy.activities.topic.tasks.ReplyTask; +import gr.thmmy.mthmmy.activities.topic.tasks.TopicTask; import gr.thmmy.mthmmy.base.BaseActivity; +import gr.thmmy.mthmmy.base.BaseApplication; +import gr.thmmy.mthmmy.editorview.EmojiKeyboard; import gr.thmmy.mthmmy.model.Bookmark; import gr.thmmy.mthmmy.model.Post; import gr.thmmy.mthmmy.model.ThmmyPage; +import gr.thmmy.mthmmy.model.TopicItem; import gr.thmmy.mthmmy.utils.CustomLinearLayoutManager; -import gr.thmmy.mthmmy.utils.parsing.ParseException; +import gr.thmmy.mthmmy.utils.HTMLUtils; +import gr.thmmy.mthmmy.utils.NetworkResultCodes; import gr.thmmy.mthmmy.utils.parsing.ParseHelpers; +import gr.thmmy.mthmmy.viewmodel.TopicViewModel; import me.zhanghai.android.materialprogressbar.MaterialProgressBar; -import okhttp3.MultipartBody; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; import timber.log.Timber; -import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; -import static gr.thmmy.mthmmy.activities.board.BoardActivity.BUNDLE_BOARD_TITLE; -import static gr.thmmy.mthmmy.activities.board.BoardActivity.BUNDLE_BOARD_URL; -import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_THUMBNAIL_URL; -import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_URL; -import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_USERNAME; -import static gr.thmmy.mthmmy.activities.topic.Posting.replyStatus; import static gr.thmmy.mthmmy.services.NotificationService.NEW_POST_TAG; /** @@ -74,7 +66,7 @@ import static gr.thmmy.mthmmy.services.NotificationService.NEW_POST_TAG; * key {@link #BUNDLE_TOPIC_TITLE} for faster title rendering. */ @SuppressWarnings("unchecked") -public class TopicActivity extends BaseActivity { +public class TopicActivity extends BaseActivity implements TopicAdapter.OnPostFocusChangeListener { //Activity's variables /** * The key to use when putting topic's url String to {@link TopicActivity}'s Bundle. @@ -84,80 +76,18 @@ public class TopicActivity extends BaseActivity { * The key to use when putting topic's title String to {@link TopicActivity}'s Bundle. */ public static final String BUNDLE_TOPIC_TITLE = "TOPIC_TITLE"; - private static TopicTask topicTask; private MaterialProgressBar progressBar; private TextView toolbarTitle; - /** - * Holds this topic's base url. For example a topic with url similar to - * "https://www.thmmy.gr/smf/index.php?topic=1.15;topicseen" or - * "https://www.thmmy.gr/smf/index.php?topic=1.msg1#msg1" - * has the base url "https://www.thmmy.gr/smf/index.php?topic=1" - */ - private static String base_url = ""; - /** - * Holds this topic's title. At first this gets the value of the topic title that came with - * bundle and is rendered in the toolbar while parsing this topic. Later, after topic's parsing - * is done, it gets the value of {@link #parsedTitle} if bundle title and parsed title differ. - */ - private String topicTitle; - /** - * Holds this topic's title as parsed from the html source. If this (parsed) title is different - * than the one that came with activity's bundle then the parsed title is preferred over the - * bundle one and gets rendered in the toolbar. - */ - private String parsedTitle; - private String topicPageUrl; private RecyclerView recyclerView; - /** - * Holds the url of this page - */ - private String loadedPageUrl = ""; - /** - * Holds the topicId of this page - */ - private int loadedPageTopicId = -1; - /** - * Becomes true after user has posted in this topic and the page is being reloaded and false - * when topic's reloading is done - */ - private boolean reloadingPage = false; //Posts related private TopicAdapter topicAdapter; /** * Holds a list of this topic's posts */ - private ArrayList postsList; - /** - * Gets assigned to {@link #postFocus} when there is no post focus information in the url - */ - private static final int NO_POST_FOCUS = -1; - /** - * Holds the index of the post that has focus - */ - private int postFocus = NO_POST_FOCUS; - /** - * Holds the position in the {@link #postsList} of the post with focus - */ - private static int postFocusPosition = 0; + private ArrayList topicItems; //Reply related private FloatingActionButton replyFAB; - /** - * Holds this topic's reply url - */ - private String replyPageUrl = null; //Topic's pages related - /** - * Holds current page's index (starting from 1, not 0) - */ - private int thisPage = 1; - /** - * Holds this topic's number of pages - */ - private int numberOfPages = 1; - /** - * Holds a list of this topic's pages urls - */ - private final SparseArray pagesUrls = new SparseArray<>(); //Page select related /** * Used for handling bottom navigation bar's buttons long click user interactions @@ -179,11 +109,7 @@ public class TopicActivity extends BaseActivity { * long click is held in either first or last buttons */ private static final int LARGE_STEP = 10; - /** - * Holds the value (index) of the page to be requested when a user interaction with bottom - * navigation bar occurs - */ - private Integer pageRequestValue; + //Bottom navigation bar graphics related private LinearLayout bottomNavBar; private ImageButton firstPage; @@ -191,19 +117,28 @@ public class TopicActivity extends BaseActivity { private TextView pageIndicator; private ImageButton nextPage; private ImageButton lastPage; - //Topic's info related - private SpannableStringBuilder topicTreeAndMods = new SpannableStringBuilder("Loading..."), - topicViewers = new SpannableStringBuilder("Loading..."); - + private Snackbar snackbar; + private TopicViewModel viewModel; + private EmojiKeyboard emojiKeyboard; + + //Fix for vector drawables on android <21 + static { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); + } + } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_topic); + // get TopicViewModel instance + viewModel = ViewModelProviders.of(this).get(TopicViewModel.class); + subscribeUI(); Bundle extras = getIntent().getExtras(); - topicTitle = extras.getString(BUNDLE_TOPIC_TITLE); - topicPageUrl = extras.getString(BUNDLE_TOPIC_URL); + String topicTitle = extras.getString(BUNDLE_TOPIC_TITLE); + String topicPageUrl = extras.getString(BUNDLE_TOPIC_URL); ThmmyPage.PageCategory target = ThmmyPage.resolvePageCategory( Uri.parse(topicPageUrl)); if (!target.is(ThmmyPage.PageCategory.TOPIC)) { @@ -213,7 +148,6 @@ public class TopicActivity extends BaseActivity { } topicPageUrl = ThmmyPage.sanitizeTopicUrl(topicPageUrl); - thisPageBookmark = new Bookmark(topicTitle, ThmmyPage.getTopicId(topicPageUrl), true); //Initializes graphics @@ -233,40 +167,28 @@ public class TopicActivity extends BaseActivity { createDrawer(); progressBar = findViewById(R.id.progressBar); + emojiKeyboard = findViewById(R.id.emoji_keyboard); - postsList = new ArrayList<>(); + topicItems = new ArrayList<>(); recyclerView = findViewById(R.id.topic_recycler_view); recyclerView.setHasFixedSize(true); - recyclerView.setOnTouchListener( - new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - v.performClick(); - return topicTask != null && topicTask.getStatus() == AsyncTask.Status.RUNNING; - } - } - ); //LinearLayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); CustomLinearLayoutManager layoutManager = new CustomLinearLayoutManager( - getApplicationContext(), loadedPageUrl); + getApplicationContext(), topicPageUrl); + recyclerView.setLayoutManager(layoutManager); - topicAdapter = new TopicAdapter(this, postsList, base_url, topicTask); + topicAdapter = new TopicAdapter(this, emojiKeyboard, topicItems); recyclerView.setAdapter(topicAdapter); replyFAB = findViewById(R.id.topic_fab); - replyFAB.setEnabled(false); + replyFAB.hide(); bottomNavBar = findViewById(R.id.bottom_navigation_bar); if (!sessionManager.isLoggedIn()) replyFAB.hide(); else { - replyFAB.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (sessionManager.isLoggedIn()) { - PrepareForReply prepareForReply = new PrepareForReply(); - prepareForReply.execute(topicAdapter.getToQuoteList()); - } - } + replyFAB.setOnClickListener(view -> { + if (sessionManager.isLoggedIn()) + viewModel.prepareForReply(); }); } @@ -281,11 +203,11 @@ public class TopicActivity extends BaseActivity { initDecrementButton(previousPage, SMALL_STEP); initIncrementButton(nextPage, SMALL_STEP); initIncrementButton(lastPage, LARGE_STEP); + paginationEnabled(false); - //Gets posts - topicTask = new TopicTask(); - topicTask.execute(topicPageUrl); //Attempt data parsing + Timber.i("Starting initial topic load"); + viewModel.loadUrl(topicPageUrl); } @Override @@ -305,27 +227,34 @@ public class TopicActivity extends BaseActivity { topicMenuBookmarkClick(); return true; case R.id.menu_info: - AlertDialog.Builder builder = new AlertDialog.Builder(this); + AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyleAccent); LayoutInflater inflater = this.getLayoutInflater(); LinearLayout infoDialog = (LinearLayout) inflater.inflate(R.layout.dialog_topic_info , null); TextView treeAndMods = infoDialog.findViewById(R.id.topic_tree_and_mods); - treeAndMods.setText(topicTreeAndMods); + treeAndMods.setText(new SpannableStringBuilder("Loading...")); treeAndMods.setMovementMethod(LinkMovementMethod.getInstance()); TextView usersViewing = infoDialog.findViewById(R.id.users_viewing); - usersViewing.setText(topicViewers); + usersViewing.setText(new SpannableStringBuilder("Loading...")); usersViewing.setMovementMethod(LinkMovementMethod.getInstance()); - + viewModel.getTopicTreeAndMods().observe(this, topicTreeAndMods -> { + if (topicTreeAndMods == null) return; + treeAndMods.setText(HTMLUtils.getSpannableFromHtml(this, topicTreeAndMods)); + }); + viewModel.getTopicViewers().observe(this, topicViewers -> { + if (topicViewers == null) return; + usersViewing.setText(HTMLUtils.getSpannableFromHtml(this, topicViewers)); + }); builder.setView(infoDialog); AlertDialog dialog = builder.create(); dialog.show(); return true; case R.id.menu_share: - Intent sendIntent = new Intent(android.content.Intent.ACTION_SEND); + Intent sendIntent = new Intent(android.content.Intent.ACTION_SEND); sendIntent.setType("text/plain"); - sendIntent.putExtra(android.content.Intent.EXTRA_TEXT, topicPageUrl); + sendIntent.putExtra(android.content.Intent.EXTRA_TEXT, viewModel.getTopicUrl()); startActivity(Intent.createChooser(sendIntent, "Share via")); - return true; + return true; //invalidateOptionsMenu(); default: return super.onOptionsItemSelected(item); } @@ -336,16 +265,24 @@ public class TopicActivity extends BaseActivity { if (drawer.isDrawerOpen()) { drawer.closeDrawer(); return; - } - else if(postsList!=null && postsList.size()>0 && postsList.get(postsList.size()-1)==null) - { - postsList.remove(postsList.size() - 1); - topicAdapter.notifyItemRemoved(postsList.size()); + } else if (emojiKeyboard.getVisibility() == View.VISIBLE) { + emojiKeyboard.setVisibility(View.GONE); + return; + } else if (viewModel.isWritingReply()) { + topicItems.remove(topicItems.size() - 1); + topicAdapter.notifyItemRemoved(topicItems.size()); + topicAdapter.setBackButtonHidden(); + viewModel.setWritingReply(false); + replyFAB.show(); + bottomNavBar.setVisibility(View.VISIBLE); + return; + } else if (viewModel.isEditingPost()) { + ((Post) topicItems.get(viewModel.getPostBeingEditedPosition())).setPostType(Post.TYPE_POST); + topicAdapter.notifyItemChanged(viewModel.getPostBeingEditedPosition()); topicAdapter.setBackButtonHidden(); - replyFAB.setVisibility(View.INVISIBLE); - bottomNavBar.setVisibility(View.INVISIBLE); - paginationEnabled(true); - replyFAB.setEnabled(true); + viewModel.setEditingPost(false); + replyFAB.show(); + bottomNavBar.setVisibility(View.VISIBLE); return; } super.onBackPressed(); @@ -362,8 +299,12 @@ public class TopicActivity extends BaseActivity { protected void onDestroy() { super.onDestroy(); recyclerView.setAdapter(null); - if (topicTask != null && topicTask.getStatus() != AsyncTask.Status.RUNNING) - topicTask.cancel(true); + viewModel.stopLoading(); + } + + @Override + public void onPostFocusChange(int position) { + recyclerView.scrollToPosition(position); } //--------------------------------------BOTTOM NAV BAR METHODS---------------------------------- @@ -385,10 +326,10 @@ public class TopicActivity extends BaseActivity { public void run() { long REPEAT_DELAY = 250; if (autoIncrement) { - incrementPageRequestValue(step); + viewModel.incrementPageRequestValue(step, false); repeatUpdateHandler.postDelayed(new RepetitiveUpdater(step), REPEAT_DELAY); } else if (autoDecrement) { - decrementPageRequestValue(step); + viewModel.decrementPageRequestValue(step, false); repeatUpdateHandler.postDelayed(new RepetitiveUpdater(step), REPEAT_DELAY); } } @@ -426,26 +367,21 @@ public class TopicActivity extends BaseActivity { @SuppressLint("ClickableViewAccessibility") private void initIncrementButton(ImageButton increment, final int step) { // Increment once for a click - increment.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - if (!autoIncrement && step == LARGE_STEP) { - changePage(numberOfPages - 1); - } else if (!autoIncrement) { - incrementPageRequestValue(step); - changePage(pageRequestValue - 1); - } + increment.setOnClickListener(v -> { + if (!autoIncrement && step == LARGE_STEP) { + viewModel.setPageIndicatorIndex(viewModel.getPageCount(), true); + } else if (!autoIncrement) { + viewModel.incrementPageRequestValue(step, true); } }); // Auto increment for a long click increment.setOnLongClickListener( - new View.OnLongClickListener() { - public boolean onLongClick(View arg0) { - paginationDisable(arg0); - autoIncrement = true; - repeatUpdateHandler.postDelayed(new RepetitiveUpdater(step), INITIAL_DELAY); - return false; - } + arg0 -> { + paginationDisable(arg0); + autoIncrement = true; + repeatUpdateHandler.postDelayed(new RepetitiveUpdater(step), INITIAL_DELAY); + return false; } ); @@ -459,11 +395,11 @@ public class TopicActivity extends BaseActivity { } else if (rect != null && event.getAction() == MotionEvent.ACTION_UP && autoIncrement) { autoIncrement = false; paginationEnabled(true); - changePage(pageRequestValue - 1); + viewModel.loadPageIndicated(); } else if (rect != null && event.getAction() == MotionEvent.ACTION_MOVE) { if (!rect.contains(v.getLeft() + (int) event.getX(), v.getTop() + (int) event.getY())) { autoIncrement = false; - decrementPageRequestValue(pageRequestValue - thisPage); + viewModel.setPageIndicatorIndex(viewModel.getCurrentPageIndex(), false); paginationEnabled(true); } } @@ -475,26 +411,21 @@ public class TopicActivity extends BaseActivity { @SuppressLint("ClickableViewAccessibility") private void initDecrementButton(ImageButton decrement, final int step) { // Decrement once for a click - decrement.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - if (!autoDecrement && step == LARGE_STEP) { - changePage(0); - } else if (!autoDecrement) { - decrementPageRequestValue(step); - changePage(pageRequestValue - 1); - } + decrement.setOnClickListener(v -> { + if (!autoDecrement && step == LARGE_STEP) { + viewModel.setPageIndicatorIndex(1, true); + } else if (!autoDecrement) { + viewModel.decrementPageRequestValue(step, true); } }); // Auto decrement for a long click decrement.setOnLongClickListener( - new View.OnLongClickListener() { - public boolean onLongClick(View arg0) { - paginationDisable(arg0); - autoDecrement = true; - repeatUpdateHandler.postDelayed(new RepetitiveUpdater(step), INITIAL_DELAY); - return false; - } + arg0 -> { + paginationDisable(arg0); + autoDecrement = true; + repeatUpdateHandler.postDelayed(new RepetitiveUpdater(step), INITIAL_DELAY); + return false; } ); @@ -508,12 +439,12 @@ public class TopicActivity extends BaseActivity { } else if (event.getAction() == MotionEvent.ACTION_UP && autoDecrement) { autoDecrement = false; paginationEnabled(true); - changePage(pageRequestValue - 1); + viewModel.loadPageIndicated(); } else if (event.getAction() == MotionEvent.ACTION_MOVE) { if (rect != null && !rect.contains(v.getLeft() + (int) event.getX(), v.getTop() + (int) event.getY())) { autoIncrement = false; - incrementPageRequestValue(thisPage - pageRequestValue); + viewModel.setPageIndicatorIndex(viewModel.getCurrentPageIndex(), false); paginationEnabled(true); } } @@ -522,446 +453,306 @@ public class TopicActivity extends BaseActivity { }); } - private void incrementPageRequestValue(int step) { - if (pageRequestValue < numberOfPages - step) { - pageRequestValue = pageRequestValue + step; - } else - pageRequestValue = numberOfPages; - pageIndicator.setText(pageRequestValue + "/" + String.valueOf(numberOfPages)); - } - - private void decrementPageRequestValue(int step) { - if (pageRequestValue > step) - pageRequestValue = pageRequestValue - step; - else - pageRequestValue = 1; - pageIndicator.setText(pageRequestValue + "/" + String.valueOf(numberOfPages)); - } - - private void changePage(int pageRequested) { - if (pageRequested != thisPage - 1) { - if (topicTask != null && topicTask.getStatus() != AsyncTask.Status.RUNNING) - topicTask.cancel(true); - - topicTask = new TopicTask(); - topicTask.execute(pagesUrls.get(pageRequested)); //Attempt data parsing - - } - } -//------------------------------------BOTTOM NAV BAR METHODS END------------------------------------ - private enum ResultCode { - SUCCESS, NETWORK_ERROR, PARSING_ERROR, OTHER_ERROR, SAME_PAGE, UNAUTHORIZED - } - + //------------------------------------BOTTOM NAV BAR METHODS END------------------------------------ /** - * An {@link AsyncTask} that handles asynchronous fetching of this topic page and parsing of its - * data. - *

TopicTask's {@link AsyncTask#execute execute} method needs a topic's url as String - * parameter.

+ * Binds the UI to its data */ - class TopicTask extends AsyncTask { - ArrayList localPostsList; + private void subscribeUI() { + // Implement async task callbacks + viewModel.setTopicTaskObserver(new TopicTask.TopicTaskObserver() { + @Override + public void onTopicTaskStarted() { + progressBar.setVisibility(ProgressBar.VISIBLE); + if (snackbar != null) snackbar.dismiss(); + } - @Override - protected void onPreExecute() { - progressBar.setVisibility(ProgressBar.VISIBLE); - paginationEnabled(false); - if (replyFAB.getVisibility() != View.GONE) replyFAB.setEnabled(false); - } + @Override + public void onTopicTaskCancelled() { + progressBar.setVisibility(ProgressBar.GONE); + } + }); + viewModel.setDeleteTaskStartedListener(() -> progressBar.setVisibility(ProgressBar.VISIBLE)); + viewModel.setDeleteTaskFinishedListener((resultCode, data) -> { + progressBar.setVisibility(ProgressBar.GONE); + if (resultCode == NetworkResultCodes.SUCCESSFUL) { + Timber.i("Post deleted successfully"); + viewModel.reloadPage(); + } else { + Timber.w("Failed to delete post"); + Toast.makeText(getBaseContext(), "Delete failed!", Toast.LENGTH_SHORT).show(); + } + }); + viewModel.setReplyFinishListener(new ReplyTask.ReplyTaskCallbacks() { + @Override + public void onReplyTaskStarted() { + progressBar.setVisibility(ProgressBar.VISIBLE); + } - protected ResultCode doInBackground(String... strings) { - Document document = null; - String newPageUrl = strings[0]; - - //Finds the index of message focus if present - { - postFocus = NO_POST_FOCUS; - if (newPageUrl.contains("msg")) { - String tmp = newPageUrl.substring(newPageUrl.indexOf("msg") + 3); - if (tmp.contains(";")) - postFocus = Integer.parseInt(tmp.substring(0, tmp.indexOf(";"))); - else if (tmp.contains("#")) - postFocus = Integer.parseInt(tmp.substring(0, tmp.indexOf("#"))); + @Override + public void onReplyTaskFinished(Posting.REPLY_STATUS replyStatus) { + View view = getCurrentFocus(); + if (view != null) { + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } - } - //Checks if the page to be loaded is the one already shown - if (!reloadingPage && !Objects.equals(loadedPageUrl, "") && newPageUrl.contains(base_url)) { - if (newPageUrl.contains("topicseen#new") || newPageUrl.contains("#new")) - if (thisPage == numberOfPages) - return ResultCode.SAME_PAGE; - if (newPageUrl.contains("msg")) { - String tmpUrlSbstr = newPageUrl.substring(newPageUrl.indexOf("msg") + 3); - if (tmpUrlSbstr.contains("msg")) - tmpUrlSbstr = tmpUrlSbstr.substring(0, tmpUrlSbstr.indexOf("msg") - 1); - int testAgainst = Integer.parseInt(tmpUrlSbstr); - for (Post post : postsList) { - if (post.getPostIndex() == testAgainst) { - return ResultCode.SAME_PAGE; + + progressBar.setVisibility(ProgressBar.GONE); + + switch (replyStatus) { + case SUCCESSFUL: + BaseApplication.getInstance().logFirebaseAnalyticsEvent("post_creation", null); + Timber.i("Post reply successful"); + replyFAB.show(); + bottomNavBar.setVisibility(View.VISIBLE); + viewModel.setWritingReply(false); + if ((((Post) topicItems.get(topicItems.size() - 1)).getPostNumber() + 1) % 15 == 0) { + Timber.i("Reply was posted in new page. Switching to last page."); + viewModel.loadUrl(ParseHelpers.getBaseURL(viewModel.getTopicUrl()) + "." + 2147483647); + } else { + viewModel.reloadPage(); } - } - } else if ((Objects.equals(newPageUrl, base_url) && thisPage == 1) || - Integer.parseInt(newPageUrl.substring(base_url.length() + 1)) / 15 + 1 == thisPage) - return ResultCode.SAME_PAGE; - } else if (!Objects.equals(loadedPageUrl, "")) topicTitle = null; - if (reloadingPage) reloadingPage = !reloadingPage; - - loadedPageUrl = newPageUrl; - if (strings[0].substring(0, strings[0].lastIndexOf(".")).contains("topic=")) - base_url = strings[0].substring(0, strings[0].lastIndexOf(".")); //New topic's base url - replyPageUrl = null; - Request request = new Request.Builder() - .url(newPageUrl) - .build(); - try { - Response response = client.newCall(request).execute(); - document = Jsoup.parse(response.body().string()); - localPostsList = parse(document); - - loadedPageTopicId = Integer.parseInt(ThmmyPage.getTopicId(loadedPageUrl)); - - //Finds the position of the focused message if present - for (int i = 0; i < localPostsList.size(); ++i) { - if (localPostsList.get(i).getPostIndex() == postFocus) { - postFocusPosition = i; break; - } + case NEW_REPLY_WHILE_POSTING: + Timber.i("New reply while writing a reply"); + TopicAdapter.QuickReplyViewHolder replyHolder = (TopicAdapter.QuickReplyViewHolder) + recyclerView.findViewHolderForAdapterPosition(topicItems.size() - 1); + String subject = replyHolder.quickReplySubject.getText().toString(); + String message = replyHolder.replyEditor.getText().toString(); + Runnable addReply = () -> { + viewModel.setWritingReply(true); + topicItems.add(Post.newQuickReply()); + topicAdapter.notifyItemInserted(topicItems.size()); + recyclerView.scrollToPosition(topicItems.size() - 1); + replyFAB.hide(); + bottomNavBar.setVisibility(View.GONE); + TopicAdapter.QuickReplyViewHolder newReplyHolder = (TopicAdapter.QuickReplyViewHolder) + recyclerView.findViewHolderForAdapterPosition(topicItems.size() - 1); + newReplyHolder.quickReplySubject.setText(subject); + newReplyHolder.replyEditor.setText(message); + AlertDialog.Builder builder = new AlertDialog.Builder(TopicActivity.this, + R.style.AppCompatAlertDialogStyleAccent); + builder.setMessage("A new reply was posted before you completed your new post." + + " Please review it and send your reply again") + .setNeutralButton(getString(R.string.ok), (dialog, which) -> dialog.dismiss()) + .show(); + }; + viewModel.reloadPageThen(addReply); + break; + default: + Timber.w("Post reply unsuccessful"); + Toast.makeText(getBaseContext(), "Post failed!", Toast.LENGTH_SHORT).show(); + recyclerView.getChildAt(topicItems.size() - 1).setAlpha(1); + recyclerView.getChildAt(topicItems.size() - 1).setEnabled(true); } - return ResultCode.SUCCESS; - } catch (IOException e) { - Timber.i(e, "IO Exception"); - return ResultCode.NETWORK_ERROR; - } catch (ParseException e) { - if(isUnauthorized(document)) - return ResultCode.UNAUTHORIZED; - Timber.e(e, "Parsing Error"); - return ResultCode.PARSING_ERROR; - } catch (Exception e) { - Timber.e(e, "Exception"); - return ResultCode.OTHER_ERROR; } - } - - protected void onPostExecute(ResultCode parseResult) { - switch (parseResult) { - case SUCCESS: - if (topicTitle == null || Objects.equals(topicTitle, "") - || !Objects.equals(topicTitle, parsedTitle)) { - toolbarTitle.setText(parsedTitle); - topicTitle = parsedTitle; - thisPageBookmark = new Bookmark(parsedTitle, Integer.toString(loadedPageTopicId), true); - invalidateOptionsMenu(); - } - - if (!postsList.isEmpty()) { - recyclerView.getRecycledViewPool().clear(); //Avoid inconsistency detected bug - postsList.clear(); - topicAdapter.notifyItemRangeRemoved(0, postsList.size() - 1); - } - postsList.addAll(localPostsList); - topicAdapter.notifyItemRangeInserted(0, postsList.size()); - progressBar.setVisibility(ProgressBar.INVISIBLE); - - if (replyPageUrl == null) { - replyFAB.hide(); - topicAdapter.resetTopic(base_url, new TopicTask(), false); - } else topicAdapter.resetTopic(base_url, new TopicTask(), true); + }); + viewModel.setPrepareForEditCallbacks(new PrepareForEditTask.PrepareForEditCallbacks() { + @Override + public void onPrepareEditStarted() { + progressBar.setVisibility(ProgressBar.VISIBLE); + } - if (replyFAB.getVisibility() != View.GONE) replyFAB.setEnabled(true); + @Override + public void onPrepareEditCancelled() { + progressBar.setVisibility(ProgressBar.GONE); + } + }); + viewModel.setEditTaskCallbacks(new EditTask.EditTaskCallbacks() { + @Override + public void onEditTaskStarted() { + progressBar.setVisibility(ProgressBar.VISIBLE); + } - //Set current page - pageIndicator.setText(String.valueOf(thisPage) + "/" + String.valueOf(numberOfPages)); - pageRequestValue = thisPage; + @Override + public void onEditTaskFinished(boolean result, int position) { + View view = getCurrentFocus(); + if (view != null) { + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + } - if(thisPage==numberOfPages){ - NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - if(notificationManager!=null) - notificationManager.cancel(NEW_POST_TAG, loadedPageTopicId); - } + progressBar.setVisibility(ProgressBar.GONE); + + if (result) { + Timber.i("Post edit successful"); + ((Post) topicItems.get(position)).setPostType(Post.TYPE_POST); + topicAdapter.notifyItemChanged(position); + replyFAB.show(); + bottomNavBar.setVisibility(View.VISIBLE); + viewModel.setEditingPost(false); + viewModel.reloadPage(); + } else { + Timber.i("Post edit unsuccessful"); + Toast.makeText(getBaseContext(), "Edit failed!", Toast.LENGTH_SHORT).show(); + recyclerView.getChildAt(viewModel.getPostBeingEditedPosition()).setAlpha(1); + recyclerView.getChildAt(viewModel.getPostBeingEditedPosition()).setEnabled(true); + } + } + }); + viewModel.setPrepareForReplyCallbacks(new PrepareForReply.PrepareForReplyCallbacks() { + @Override + public void onPrepareForReplyStarted() { + progressBar.setVisibility(ProgressBar.VISIBLE); + } + @Override + public void onPrepareForReplyCancelled() { + progressBar.setVisibility(ProgressBar.GONE); + } + }); + viewModel.setVoteTaskStartedListener(() -> progressBar.setVisibility(ProgressBar.VISIBLE)); + viewModel.setVoteTaskFinishedListener((resultCode, data) -> { + progressBar.setVisibility(View.GONE); + if (resultCode == NetworkResultCodes.SUCCESSFUL) { + Timber.i("Vote sent"); + viewModel.resetPage(); + } + else { + Timber.w("Failed to send vote"); + Toast.makeText(this, "Failed to send vote", Toast.LENGTH_LONG).show(); + } + }); + viewModel.setRemoveVoteTaskStartedListener(() -> progressBar.setVisibility(ProgressBar.VISIBLE)); + viewModel.setRemoveVoteTaskFinishedListener((resultCode, data) -> { + progressBar.setVisibility(View.GONE); + if (resultCode == NetworkResultCodes.SUCCESSFUL) { + Timber.i("Vote removed"); + viewModel.resetPage(); + } + else { + Timber.w("Failed to remove vote"); + Toast.makeText(this, "Failed to remove vote", Toast.LENGTH_LONG).show(); + } + }); + // observe the chages in data + viewModel.getPageIndicatorIndex().observe(this, pageIndicatorIndex -> { + if (pageIndicatorIndex == null) return; + pageIndicator.setText(String.valueOf(pageIndicatorIndex) + "/" + + String.valueOf(viewModel.getPageCount())); + }); + viewModel.getTopicTitle().observe(this, newTopicTitle -> { + if (newTopicTitle == null) return; + if (!TextUtils.equals(toolbarTitle.getText(), newTopicTitle)) + toolbarTitle.setText(newTopicTitle); + }); + viewModel.getPageTopicId().observe(this, pageTopicId -> { + if (pageTopicId == null) return; + if (viewModel.getCurrentPageIndex() == viewModel.getPageCount()) { + NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + if (notificationManager != null) + notificationManager.cancel(NEW_POST_TAG, pageTopicId); + } + }); + viewModel.getReplyPageUrl().observe(this, replyPageUrl -> { + if (replyPageUrl == null) + replyFAB.hide(); + else + replyFAB.show(); + }); + viewModel.getTopicItems().observe(this, postList -> { + if (postList == null) progressBar.setVisibility(ProgressBar.VISIBLE); + recyclerView.getRecycledViewPool().clear(); //Avoid inconsistency detected bug + topicItems.clear(); + topicItems.addAll(postList); + topicAdapter.notifyDataSetChanged(); + }); + /*viewModel.getFocusedPostIndex().observe(this, focusedPostIndex -> { + if (focusedPostIndex == null) return; + recyclerView.scrollToPosition(focusedPostIndex); + });*/ + viewModel.getTopicTaskResultCode().observe(this, resultCode -> { + if (resultCode == null) return; + progressBar.setVisibility(ProgressBar.GONE); + switch (resultCode) { + case SUCCESS: + Timber.i("Successfully loaded topic with URL %s", viewModel.getTopicUrl()); paginationEnabled(true); break; case NETWORK_ERROR: - Toast.makeText(getBaseContext(), "Network Error", Toast.LENGTH_SHORT).show(); - break; - case SAME_PAGE: - stopLoading(); - Toast.makeText(getBaseContext(), "That's the same page", Toast.LENGTH_SHORT).show(); - //TODO change focus + Timber.w("Network error on loaded page"); + if (viewModel.getTopicItems().getValue() == null) { + // no page has been loaded yet. Give user the ability to refresh + recyclerView.setVisibility(View.GONE); + TextView errorTextview = findViewById(R.id.error_textview); + + Spannable errorText = new SpannableString(getString(R.string.network_error_retry_prompt)); + errorText.setSpan( + new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.accent, null)), + errorText.toString().indexOf("Tap to retry"), + errorText.length(), + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + + errorTextview.setText(errorText); + errorTextview.setVisibility(View.VISIBLE); + errorTextview.setOnClickListener(view -> { + viewModel.reloadPage(); + errorTextview.setVisibility(View.GONE); + recyclerView.setVisibility(View.VISIBLE); + }); + } else { + // a page has already been loaded + viewModel.setPageIndicatorIndex(viewModel.getCurrentPageIndex(), false); + snackbar = Snackbar.make(findViewById(R.id.main_content), + R.string.generic_network_error, Snackbar.LENGTH_INDEFINITE); + snackbar.setAction(R.string.retry, view -> viewModel.reloadPage()); + snackbar.show(); + } break; case UNAUTHORIZED: - stopLoading(); - Toast.makeText(getBaseContext(), "This topic is either missing or off limits to you", Toast.LENGTH_SHORT).show(); + Timber.w("Requested topic was unauthorized"); + recyclerView.setVisibility(View.GONE); + TextView errorTextview = findViewById(R.id.error_textview); + + Spannable errorText = new SpannableString(getString(R.string.unauthorized_topic_error)); + errorText.setSpan( + //TODO: maybe change the color to a red in order to indicate the error nature of the message + new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.accent, null)), + 0, + errorText.length(), + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + + errorTextview.setText(getString(R.string.unauthorized_topic_error)); + errorTextview.setVisibility(View.VISIBLE); break; default: //Parse failed - should never happen - Timber.d("Parse failed!"); //TODO report ParseException!!! + Timber.wtf("Parse failed!"); //TODO report ParseException!!! Toast.makeText(getBaseContext(), "Fatal Error", Toast.LENGTH_SHORT).show(); finish(); break; } - } - - private void stopLoading(){ - progressBar.setVisibility(ProgressBar.INVISIBLE); - if (replyPageUrl == null) { + }); + viewModel.getPrepareForReplyResult().observe(this, prepareForReplyResult -> { + progressBar.setVisibility(ProgressBar.GONE); + if (prepareForReplyResult != null && prepareForReplyResult.isSuccessful()) { + Timber.i("Prepare for reply successful"); + //prepare for a reply + viewModel.setWritingReply(true); + topicItems.add(Post.newQuickReply()); + topicAdapter.notifyItemInserted(topicItems.size()); + recyclerView.scrollToPosition(topicItems.size() - 1); replyFAB.hide(); - topicAdapter.resetTopic(base_url, new TopicTask(), false); - } else topicAdapter.resetTopic(base_url, new TopicTask(), true); - if (replyFAB.getVisibility() != View.GONE) replyFAB.setEnabled(true); - paginationEnabled(true); - } - - /** - * All the parsing a topic needs. - * - * @param topic {@link Document} object containing this topic's source code - * @see org.jsoup.Jsoup Jsoup - */ - private ArrayList parse(Document topic) throws ParseException{ - try { - ParseHelpers.Language language = ParseHelpers.Language.getLanguage(topic); - - //Finds topic's tree, mods and users viewing - { - topicTreeAndMods = getSpannableFromHtml(topic.select("div.nav").first().html()); - topicViewers = getSpannableFromHtml(TopicParser.parseUsersViewingThisTopic(topic, language)); - } - - //Finds reply page url - { - Element replyButton = topic.select("a:has(img[alt=Reply])").first(); - if (replyButton == null) - replyButton = topic.select("a:has(img[alt=Απάντηση])").first(); - if (replyButton != null) replyPageUrl = replyButton.attr("href"); - } - - //Finds topic title if missing - { - parsedTitle = topic.select("td[id=top_subject]").first().text(); - if (parsedTitle.contains("Topic:")) { - parsedTitle = parsedTitle.substring(parsedTitle.indexOf("Topic:") + 7 - , parsedTitle.indexOf("(Read") - 2); - } else { - parsedTitle = parsedTitle.substring(parsedTitle.indexOf("Θέμα:") + 6 - , parsedTitle.indexOf("(Αναγνώστηκε") - 2); - Timber.d("Parsed title: %s", parsedTitle); - } - } - - { //Finds current page's index - thisPage = TopicParser.parseCurrentPageIndex(topic, language); - } - { //Finds number of pages - numberOfPages = TopicParser.parseTopicNumberOfPages(topic, thisPage, language); - - for (int i = 0; i < numberOfPages; i++) { - //Generate each page's url from topic's base url +".15*numberOfPage" - pagesUrls.put(i, base_url + "." + String.valueOf(i * 15)); - } - } - - return TopicParser.parseTopic(topic, language); - } catch (Exception e) { - throw new ParseException("Parsing failed (TopicTask)"); - } - } - - private boolean isUnauthorized(Document document) { - return document != null && document.select("body:contains(The topic or board you" + - " are looking for appears to be either missing or off limits to you.)," + - "body:contains(Το θέμα ή πίνακας που ψάχνετε ή δεν υπάρχει ή δεν " + - "είναι προσβάσιμο από εσάς.)").size() > 0; - } - - private void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span) { - int start = strBuilder.getSpanStart(span); - int end = strBuilder.getSpanEnd(span); - int flags = strBuilder.getSpanFlags(span); - ClickableSpan clickable = new ClickableSpan() { - @Override - public void onClick(View view) { - ThmmyPage.PageCategory target = ThmmyPage.resolvePageCategory(Uri.parse(span.getURL())); - if (target.is(ThmmyPage.PageCategory.BOARD)) { - Intent intent = new Intent(getApplicationContext(), BoardActivity.class); - Bundle extras = new Bundle(); - extras.putString(BUNDLE_BOARD_URL, span.getURL()); - extras.putString(BUNDLE_BOARD_TITLE, ""); - intent.putExtras(extras); - intent.setFlags(FLAG_ACTIVITY_NEW_TASK); - getApplicationContext().startActivity(intent); - } else if (target.is(ThmmyPage.PageCategory.PROFILE)) { - Intent intent = new Intent(getApplicationContext(), ProfileActivity.class); - Bundle extras = new Bundle(); - extras.putString(BUNDLE_PROFILE_URL, span.getURL()); - extras.putString(BUNDLE_PROFILE_THUMBNAIL_URL, ""); - extras.putString(BUNDLE_PROFILE_USERNAME, ""); - intent.putExtras(extras); - intent.setFlags(FLAG_ACTIVITY_NEW_TASK); - getApplicationContext().startActivity(intent); - } else if (target.is(ThmmyPage.PageCategory.INDEX)) - finish(); - } - }; - strBuilder.setSpan(clickable, start, end, flags); - strBuilder.removeSpan(span); - } - - private SpannableStringBuilder getSpannableFromHtml(String html) { - CharSequence sequence; - if (Build.VERSION.SDK_INT >= 24) { - sequence = Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY); + bottomNavBar.setVisibility(View.GONE); } else { - //noinspection deprecation - sequence = Html.fromHtml(html); - } - SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence); - URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class); - for (URLSpan span : urls) { - makeLinkClickable(strBuilder, span); + Timber.i("Prepare for reply unsuccessful"); + Snackbar.make(findViewById(R.id.main_content), getString(R.string.generic_network_error), Snackbar.LENGTH_SHORT).show(); } - return strBuilder; - } - } - - class PrepareForReply extends AsyncTask, Void, Boolean> { - String numReplies, seqnum, sc, topic, buildedQuotes = ""; - - @Override - protected void onPreExecute() { - progressBar.setVisibility(ProgressBar.VISIBLE); - paginationEnabled(false); - replyFAB.setEnabled(false); - replyFAB.hide(); - bottomNavBar.setVisibility(View.GONE); - } - - @Override - protected Boolean doInBackground(ArrayList... quoteList) { - Document document; - Request request = new Request.Builder() - .url(replyPageUrl + ";wap2") - .build(); - - try { - Response response = client.newCall(request).execute(); - document = Jsoup.parse(response.body().string()); - - numReplies = replyPageUrl.substring(replyPageUrl.indexOf("num_replies=") + 12); - seqnum = document.select("input[name=seqnum]").first().attr("value"); - sc = document.select("input[name=sc]").first().attr("value"); - topic = document.select("input[name=topic]").first().attr("value"); - } catch (IOException | Selector.SelectorParseException e) { - Timber.e(e, "Prepare failed."); - return false; - } - - for (Integer quotePosition : quoteList[0]) { - request = new Request.Builder() - .url("https://www.thmmy.gr/smf/index.php?action=quotefast;quote=" + - postsList.get(quotePosition).getPostIndex() + - ";" + "sesc=" + sc + ";xml") - .build(); - - try { - Response response = client.newCall(request).execute(); - String body = response.body().string(); - buildedQuotes += body.substring(body.indexOf("") + 7, body.indexOf("")); - buildedQuotes += "\n\n"; - } catch (IOException | Selector.SelectorParseException e) { - Timber.e(e, "Quote building failed."); - return false; - } - } - return true; - } - - @Override - protected void onPostExecute(Boolean result) { - postsList.add(null); - topicAdapter.notifyItemInserted(postsList.size()); - topicAdapter.prepareForReply(new ReplyTask(), topicTitle, numReplies, seqnum, sc, - topic, buildedQuotes); - recyclerView.scrollToPosition(postsList.size() - 1); - progressBar.setVisibility(ProgressBar.GONE); - } - } - - class ReplyTask extends AsyncTask { - - @Override - protected void onPreExecute() { - progressBar.setVisibility(ProgressBar.VISIBLE); - paginationEnabled(false); - replyFAB.setEnabled(false); - } - - @Override - protected Boolean doInBackground(String... args) { - final String sentFrommTHMMY = "\n[right][size=7pt][i]sent from [url=https://play.google.com/store/apps/details?id=gr.thmmy.mthmmy]mTHMMY[/url] [/i][/size][/right]"; - RequestBody postBody = new MultipartBody.Builder() - .setType(MultipartBody.FORM) - .addFormDataPart("message", args[1] + sentFrommTHMMY) - .addFormDataPart("num_replies", args[2]) - .addFormDataPart("seqnum", args[3]) - .addFormDataPart("sc", args[4]) - .addFormDataPart("subject", args[0]) - .addFormDataPart("topic", args[5]) - .build(); - Request post = new Request.Builder() - .url("https://www.thmmy.gr/smf/index.php?action=post2") - .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36") - .post(postBody) - .build(); - - try { - client.newCall(post).execute(); - Response response = client.newCall(post).execute(); - switch (replyStatus(response)) { - case SUCCESSFUL: - return true; - case NEW_REPLY_WHILE_POSTING: - //TODO this... - return true; - default: - Timber.e("Malformed post. Request string: %s", post.toString()); - return true; - } - } catch (IOException e) { - Timber.e(e, "Post failed."); - return false; - } - } - - @Override - protected void onPostExecute(Boolean result) { - View view = getCurrentFocus(); - if (view != null) { - InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(view.getWindowToken(), 0); - } - - postsList.remove(postsList.size() - 1); - topicAdapter.notifyItemRemoved(postsList.size()); - + }); + viewModel.getPrepareForEditResult().observe(this, result -> { progressBar.setVisibility(ProgressBar.GONE); - replyFAB.setVisibility(View.VISIBLE); - bottomNavBar.setVisibility(View.VISIBLE); - - if (!result) - Toast.makeText(TopicActivity.this, "Post failed!", Toast.LENGTH_SHORT).show(); - paginationEnabled(true); - replyFAB.setEnabled(true); - - if (result) { - topicTask = new TopicTask(); - if ((postsList.get(postsList.size() - 1).getPostNumber() + 1) % 15 == 0) - topicTask.execute(base_url + "." + 2147483647); - else { - reloadingPage = true; - topicTask.execute(loadedPageUrl); - } + if (result != null && result.isSuccessful()) { + Timber.i("Prepare for edit successful"); + viewModel.setEditingPost(true); + ((Post) topicItems.get(result.getPosition())).setPostType(Post.TYPE_EDIT); + topicAdapter.notifyItemChanged(result.getPosition()); + recyclerView.scrollToPosition(result.getPosition()); + replyFAB.hide(); + bottomNavBar.setVisibility(View.GONE); + } else { + Timber.i("Prepare for edit unsuccessful"); + Snackbar.make(findViewById(R.id.main_content), getString(R.string.generic_network_error), Snackbar.LENGTH_SHORT).show(); } - } + }); } } \ No newline at end of file diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java index 54560b58..bfc26961 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java @@ -2,34 +2,51 @@ package gr.thmmy.mthmmy.activities.topic; import android.annotation.SuppressLint; import android.annotation.TargetApi; +import android.arch.lifecycle.ViewModelProviders; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.graphics.Typeface; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.content.res.ResourcesCompat; -import android.support.v7.widget.AppCompatImageButton; +import android.support.v7.app.AlertDialog; +import android.support.v7.content.res.AppCompatResources; +import android.support.v7.widget.AppCompatButton; import android.support.v7.widget.RecyclerView; -import android.text.Editable; +import android.text.Html; +import android.text.InputType; import android.text.TextUtils; -import android.text.TextWatcher; +import android.text.method.LinkMovementMethod; +import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.webkit.WebResourceRequest; import android.webkit.WebView; import android.webkit.WebViewClient; +import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.PopupWindow; +import android.widget.RadioButton; +import android.widget.RadioGroup; import android.widget.RelativeLayout; import android.widget.TextView; +import com.github.mikephil.charting.charts.HorizontalBarChart; +import com.github.mikephil.charting.components.XAxis; +import com.github.mikephil.charting.components.YAxis; +import com.github.mikephil.charting.data.BarData; +import com.github.mikephil.charting.data.BarDataSet; +import com.github.mikephil.charting.data.BarEntry; import com.squareup.picasso.Picasso; import java.util.ArrayList; @@ -40,10 +57,16 @@ import gr.thmmy.mthmmy.R; import gr.thmmy.mthmmy.activities.board.BoardActivity; import gr.thmmy.mthmmy.activities.profile.ProfileActivity; import gr.thmmy.mthmmy.base.BaseActivity; +import gr.thmmy.mthmmy.editorview.EditorView; +import gr.thmmy.mthmmy.editorview.IEmojiKeyboard; +import gr.thmmy.mthmmy.model.Poll; import gr.thmmy.mthmmy.model.Post; import gr.thmmy.mthmmy.model.ThmmyFile; import gr.thmmy.mthmmy.model.ThmmyPage; +import gr.thmmy.mthmmy.model.TopicItem; import gr.thmmy.mthmmy.utils.CircleTransform; +import gr.thmmy.mthmmy.utils.parsing.ParseHelpers; +import gr.thmmy.mthmmy.viewmodel.TopicViewModel; import timber.log.Timber; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; @@ -66,305 +89,377 @@ class TopicAdapter extends RecyclerView.Adapter { */ private static int THUMBNAIL_SIZE; private final Context context; - private String topicTitle; - private String baseUrl; - private final ArrayList toQuoteList = new ArrayList<>(); - private final List postsList; - /** - * Used to hold the state of visibility and other attributes for views that are animated or - * otherwise changed. Used in combination with {@link #isUserExtraInfoVisibile} and - * {@link #isQuoteButtonChecked}. - */ - private final ArrayList viewProperties = new ArrayList<>(); - /** - * Index of state indicator in the boolean array. If true user's extra info are expanded and - * visible. - */ - private static final int isUserExtraInfoVisibile = 0; - /** - * Index of state indicator in the boolean array. If true quote button for this post is checked. - */ - private static final int isQuoteButtonChecked = 1; - private TopicActivity.TopicTask topicTask; - private TopicActivity.ReplyTask replyTask; - private final int VIEW_TYPE_POST = 0; - private final int VIEW_TYPE_QUICK_REPLY = 1; - - private final String[] replyDataHolder = new String[2]; - private final int replySubject = 0, replyText = 1; - private String numReplies, seqnum, sc, topic, buildedQuotes; - private boolean canReply = false; + private final OnPostFocusChangeListener postFocusListener; + private final IEmojiKeyboard emojiKeyboard; + private final List topicItems; + private TopicViewModel viewModel; /** - * @param context the context of the {@link RecyclerView} - * @param postsList List of {@link Post} objects to use + * @param context the context of the {@link RecyclerView} + * @param topicItems List of {@link Post} objects to use */ - TopicAdapter(Context context, List postsList, String baseUrl, - TopicActivity.TopicTask topicTask) { + TopicAdapter(TopicActivity context, IEmojiKeyboard emojiKeyboard, List topicItems) { this.context = context; - this.postsList = postsList; - this.baseUrl = baseUrl; + this.topicItems = topicItems; + this.postFocusListener = context; + this.emojiKeyboard = emojiKeyboard; - THUMBNAIL_SIZE = (int) context.getResources().getDimension(R.dimen.thumbnail_size); - for (int i = 0; i < postsList.size(); ++i) { - //Initializes properties, array's values will be false by default - viewProperties.add(new boolean[3]); - } - this.topicTask = topicTask; - } + viewModel = ViewModelProviders.of(context).get(TopicViewModel.class); - ArrayList getToQuoteList(){ - return toQuoteList; - } - - void prepareForReply(TopicActivity.ReplyTask replyTask, String topicTitle, String numReplies, - String seqnum, String sc, String topic, String buildedQuotes) { - this.replyTask = replyTask; - this.topicTitle = topicTitle; - this.numReplies = numReplies; - this.seqnum = seqnum; - this.sc = sc; - this.topic = topic; - this.buildedQuotes = buildedQuotes; + THUMBNAIL_SIZE = (int) context.getResources().getDimension(R.dimen.thumbnail_size); } @Override public int getItemViewType(int position) { - return postsList.get(position) == null ? VIEW_TYPE_QUICK_REPLY : VIEW_TYPE_POST; + if (topicItems.get(position) instanceof Poll) return Poll.TYPE_POLL; + return ((Post) topicItems.get(position)).getPostType(); } + @NonNull @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - if (viewType == VIEW_TYPE_POST) { + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + if (viewType == Post.TYPE_POST) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.activity_topic_post_row, parent, false); return new PostViewHolder(itemView); - } else if (viewType == VIEW_TYPE_QUICK_REPLY) { + } else if (viewType == Post.TYPE_QUICK_REPLY) { View view = LayoutInflater.from(parent.getContext()). inflate(R.layout.activity_topic_quick_reply_row, parent, false); - view.findViewById(R.id.quick_reply_submit).setEnabled(true); - final EditText quickReplyText = view.findViewById(R.id.quick_reply_text); + final EditText quickReplyText = ((EditorView) view.findViewById(R.id.reply_editorview)).getEditText(); quickReplyText.setFocusableInTouchMode(true); - quickReplyText.setOnFocusChangeListener(new View.OnFocusChangeListener() { - @Override - public void onFocusChange(View v, boolean hasFocus) { - quickReplyText.post(new Runnable() { - @Override - public void run() { - InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); - imm.showSoftInput(quickReplyText, InputMethodManager.SHOW_IMPLICIT); - } - }); - } - }); + quickReplyText.setOnFocusChangeListener((v, hasFocus) -> quickReplyText.post(() -> { + InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(quickReplyText, InputMethodManager.SHOW_IMPLICIT); + })); quickReplyText.requestFocus(); - //Default post subject - replyDataHolder[replySubject] = "Re: " + topicTitle; - //Build quotes - if (!Objects.equals(buildedQuotes, "")) - replyDataHolder[replyText] = buildedQuotes; - return new QuickReplyViewHolder(view, new CustomEditTextListener(replySubject), - new CustomEditTextListener(replyText)); + return new QuickReplyViewHolder(view); + } else if (viewType == Post.TYPE_EDIT) { + View view = LayoutInflater.from(parent.getContext()). + inflate(R.layout.activity_topic_edit_row, parent, false); + + final EditText editPostEdittext = ((EditorView) view.findViewById(R.id.edit_editorview)).getEditText(); + editPostEdittext.setFocusableInTouchMode(true); + editPostEdittext.setOnFocusChangeListener((v, hasFocus) -> editPostEdittext.post(() -> { + InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(editPostEdittext, InputMethodManager.SHOW_IMPLICIT); + })); + editPostEdittext.requestFocus(); + + return new EditMessageViewHolder(view); + } else if (viewType == Poll.TYPE_POLL) { + View view = LayoutInflater.from(parent.getContext()). + inflate(R.layout.activity_topic_poll, parent, false); + return new PollViewHolder(view); + } else { + throw new IllegalArgumentException("Unknown view type"); } - return null; } @SuppressLint({"SetJavaScriptEnabled", "SetTextI18n"}) @Override - public void onBindViewHolder(final RecyclerView.ViewHolder currentHolder, + public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder currentHolder, final int position) { - if (currentHolder instanceof PostViewHolder) { - final Post currentPost = postsList.get(position); - final PostViewHolder holder = (PostViewHolder) currentHolder; - - //Post's WebView parameters - holder.post.setClickable(true); - holder.post.setWebViewClient(new LinkLauncher()); - - //Avoids errors about layout having 0 width/height - holder.thumbnail.setMinimumWidth(1); - holder.thumbnail.setMinimumHeight(1); - //Sets thumbnail size - holder.thumbnail.setMaxWidth(THUMBNAIL_SIZE); - holder.thumbnail.setMaxHeight(THUMBNAIL_SIZE); - - //noinspection ConstantConditions - Picasso.with(context) - .load(currentPost.getThumbnailURL()) - .resize(THUMBNAIL_SIZE, THUMBNAIL_SIZE) - .centerCrop() - .error(ResourcesCompat.getDrawable(context.getResources() - , R.drawable.ic_default_user_thumbnail, null)) - .placeholder(ResourcesCompat.getDrawable(context.getResources() - , R.drawable.ic_default_user_thumbnail, null)) - .transform(new CircleTransform()) - .into(holder.thumbnail); - - //Sets username,submit date, index number, subject, post's and attached files texts - holder.username.setText(currentPost.getAuthor()); - holder.postDate.setText(currentPost.getPostDate()); - if (currentPost.getPostNumber() != 0) - holder.postNum.setText(context.getString( - R.string.user_number_of_posts, currentPost.getPostNumber())); - else - holder.postNum.setText(""); - holder.subject.setText(currentPost.getSubject()); - holder.post.loadDataWithBaseURL("file:///android_asset/", currentPost.getContent(), "text/html", "UTF-8", null); - if ((currentPost.getAttachedFiles() != null && currentPost.getAttachedFiles().size() != 0) - || (currentPost.getLastEdit() != null)) { - holder.bodyFooterDivider.setVisibility(View.VISIBLE); - holder.postFooter.removeAllViews(); - - if (currentPost.getAttachedFiles() != null && currentPost.getAttachedFiles().size() != 0) { - int filesTextColor; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - filesTextColor = context.getResources().getColor(R.color.accent, null); - } else //noinspection deprecation - filesTextColor = context.getResources().getColor(R.color.accent); - - for (final ThmmyFile attachedFile : currentPost.getAttachedFiles()) { - final TextView attached = new TextView(context); - attached.setTextSize(10f); - attached.setClickable(true); - attached.setTypeface(Typeface.createFromAsset(context.getAssets() - , "fonts/fontawesome-webfont.ttf")); - attached.setText(faIconFromFilename(attachedFile.getFilename()) + " " - + attachedFile.getFilename() + attachedFile.getFileInfo()); - attached.setTextColor(filesTextColor); - attached.setPadding(0, 3, 0, 3); - - attached.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - ((BaseActivity) context).downloadFile(attachedFile); - } - }); - - holder.postFooter.addView(attached); + if (currentHolder.getItemViewType() == Poll.TYPE_POLL) { + Poll poll = (Poll) topicItems.get(position); + Poll.Entry[] entries = poll.getEntries(); + PollViewHolder holder = (PollViewHolder) currentHolder; + holder.question.setText(poll.getQuestion()); + holder.optionsLayout.removeAllViews(); + holder.errorTooManySelected.setVisibility(View.GONE); + if (poll.getAvailableVoteCount() > 1) { + for (Poll.Entry entry : entries) { + LinearLayout container = new LinearLayout(context); + container.setOrientation(LinearLayout.HORIZONTAL); + CheckBox checkBox = new CheckBox(context); + TextView label = new TextView(context); + label.setTextColor(context.getResources().getColor(R.color.primary_text)); + label.setMovementMethod(LinkMovementMethod.getInstance()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + label.setText(Html.fromHtml(entry.getEntryName(), Html.FROM_HTML_MODE_LEGACY)); + } else { + //noinspection deprecation + label.setText(Html.fromHtml(entry.getEntryName())); } + checkBox.setTextColor(context.getResources().getColor(R.color.primary_text)); + container.addView(checkBox); + container.addView(label); + holder.optionsLayout.addView(container); } - if (currentPost.getLastEdit() != null && currentPost.getLastEdit().length() > 0) { - int lastEditTextColor; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - lastEditTextColor = context.getResources().getColor(R.color.white, null); - } else //noinspection deprecation - lastEditTextColor = context.getResources().getColor(R.color.white); - - final TextView lastEdit = new TextView(context); - lastEdit.setTextSize(12f); - lastEdit.setText(currentPost.getLastEdit()); - lastEdit.setTextColor(lastEditTextColor); - lastEdit.setPadding(0, 3, 0, 3); - holder.postFooter.addView(lastEdit); + holder.voteChart.setVisibility(View.GONE); + holder.optionsLayout.setVisibility(View.VISIBLE); + } else if (poll.getAvailableVoteCount() == 1) { + RadioGroup radioGroup = new RadioGroup(context); + for (int i = 0; i < entries.length; i++) { + RadioButton radioButton = new RadioButton(context); + radioButton.setId(i); + radioButton.setMovementMethod(LinkMovementMethod.getInstance()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + radioButton.setText(Html.fromHtml(entries[i].getEntryName(), Html.FROM_HTML_MODE_LEGACY)); + } else { + //noinspection deprecation + radioButton.setText(Html.fromHtml(entries[i].getEntryName())); + } + radioButton.setTextColor(context.getResources().getColor(R.color.primary_text)); + radioGroup.addView(radioButton); } + holder.optionsLayout.addView(radioGroup); + holder.voteChart.setVisibility(View.GONE); + holder.optionsLayout.setVisibility(View.VISIBLE); } else { - holder.bodyFooterDivider.setVisibility(View.GONE); - holder.postFooter.removeAllViews(); - } - - String mSpecialRank, mRank, mGender, mNumberOfPosts, mPersonalText; - int mNumberOfStars, mUserColor; - - if (!currentPost.isDeleted()) { //Sets user's extra info - mSpecialRank = currentPost.getSpecialRank(); - mRank = currentPost.getRank(); - mGender = currentPost.getGender(); - mNumberOfPosts = currentPost.getNumberOfPosts(); - mPersonalText = currentPost.getPersonalText(); - mNumberOfStars = currentPost.getNumberOfStars(); - } else { - mSpecialRank = null; - mRank = null; - mGender = null; - mNumberOfPosts = null; - mPersonalText = null; - mNumberOfStars = 0; - } - mUserColor = currentPost.getUserColor(); - - if (!Objects.equals(mSpecialRank, "") && mSpecialRank != null) { - holder.specialRank.setText(mSpecialRank); - holder.specialRank.setVisibility(View.VISIBLE); - } else - holder.specialRank.setVisibility(View.GONE); - if (!Objects.equals(mRank, "") && mRank != null) { - holder.rank.setText(mRank); - holder.rank.setVisibility(View.VISIBLE); - } else - holder.rank.setVisibility(View.GONE); - if (!Objects.equals(mGender, "") && mGender != null) { - holder.gender.setText(mGender); - holder.gender.setVisibility(View.VISIBLE); - } else - holder.gender.setVisibility(View.GONE); - if (!Objects.equals(mNumberOfPosts, "") && mNumberOfPosts != null) { - holder.numberOfPosts.setText(mNumberOfPosts); - holder.numberOfPosts.setVisibility(View.VISIBLE); - } else - holder.numberOfPosts.setVisibility(View.GONE); - if (!Objects.equals(mPersonalText, "") && mPersonalText != null) { - holder.personalText.setText("\"" + mPersonalText + "\""); - holder.personalText.setVisibility(View.VISIBLE); - } else - holder.personalText.setVisibility(View.GONE); - if (mUserColor != USER_COLOR_YELLOW) { - holder.username.setTextColor(mUserColor); - } else { - holder.username.setTextColor(USER_COLOR_WHITE); + //Showing results + holder.optionsLayout.setVisibility(View.GONE); + List valuesToCompare = new ArrayList<>(); + for (int i = 0; i < entries.length; i++) { + valuesToCompare.add(new BarEntry(i, entries[i].getVotes())); + } + BarDataSet data = new BarDataSet(valuesToCompare, "Vote Results"); + data.setColor(context.getResources().getColor(R.color.accent)); + + YAxis yAxisLeft = holder.voteChart.getAxisLeft(); + yAxisLeft.setGranularity(1); + yAxisLeft.setTextColor(context.getResources().getColor(R.color.primary_text)); + yAxisLeft.setAxisMinimum(0); + YAxis yAxisRight = holder.voteChart.getAxisRight(); + yAxisRight.setEnabled(false); + + XAxis xAxis = holder.voteChart.getXAxis(); + xAxis.setValueFormatter((value, axis) -> Html.fromHtml(entries[(int) value].getEntryName()).toString()); + xAxis.setTextColor(context.getResources().getColor(R.color.primary_text)); + xAxis.setGranularity(1f); + xAxis.setLabelCount(entries.length); + xAxis.setDrawGridLines(false); + xAxis.setDrawAxisLine(false); + xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); + + BarData barData = new BarData(data); + barData.setValueTextColor(context.getResources().getColor(R.color.accent)); + holder.voteChart.setData(barData); + holder.voteChart.getLegend().setEnabled(false); + holder.voteChart.getDescription().setEnabled(false); + int chartHeightdp = 10 + 30 * entries.length; + DisplayMetrics metrics = context.getResources().getDisplayMetrics(); + holder.voteChart.setMinimumHeight((int) (chartHeightdp * (metrics.densityDpi / 160f))); + holder.voteChart.invalidate(); + holder.voteChart.setVisibility(View.VISIBLE); } - if (mNumberOfStars > 0) { - holder.stars.setTypeface(Typeface.createFromAsset(context.getAssets() - , "fonts/fontawesome-webfont.ttf")); - - String aStar = context.getResources().getString(R.string.fa_icon_star); - String usersStars = ""; - for (int i = 0; i < mNumberOfStars; ++i) { - usersStars += aStar; + if (poll.getRemoveVoteUrl() != null) { + holder.removeVotesButton.setOnClickListener(v -> viewModel.removeVote()); + holder.removeVotesButton.setVisibility(View.VISIBLE); + } else holder.removeVotesButton.setVisibility(View.GONE); + if (poll.getShowVoteResultsUrl() != null) { + holder.showPollResultsButton.setOnClickListener(v -> viewModel.loadUrl(poll.getShowVoteResultsUrl())); + holder.showPollResultsButton.setVisibility(View.VISIBLE); + } else holder.showPollResultsButton.setVisibility(View.GONE); + + if (poll.getShowOptionsUrl() != null) { + holder.hidePollResultsButton.setOnClickListener(v -> viewModel.loadUrl(poll.getShowOptionsUrl())); + holder.hidePollResultsButton.setVisibility(View.VISIBLE); + } else holder.hidePollResultsButton.setVisibility(View.GONE); + if (poll.getPollFormUrl() != null) { + holder.submitButton.setOnClickListener(v -> { + if (!viewModel.submitVote(holder.optionsLayout)) { + holder.errorTooManySelected.setText(context.getResources() + .getQuantityString(R.plurals.error_too_many_checked, poll.getAvailableVoteCount(), + poll.getAvailableVoteCount())); + holder.errorTooManySelected.setVisibility(View.VISIBLE); + } + }); + holder.submitButton.setVisibility(View.VISIBLE); + } else holder.submitButton.setVisibility(View.GONE); + } else { + Post currentPost = (Post) topicItems.get(position); + if (currentHolder instanceof PostViewHolder) { + final PostViewHolder holder = (PostViewHolder) currentHolder; + + //Post's WebView parameters + holder.post.setClickable(true); + holder.post.setWebViewClient(new LinkLauncher()); + + //Avoids errors about layout having 0 width/height + holder.thumbnail.setMinimumWidth(1); + holder.thumbnail.setMinimumHeight(1); + //Sets thumbnail size + holder.thumbnail.setMaxWidth(THUMBNAIL_SIZE); + holder.thumbnail.setMaxHeight(THUMBNAIL_SIZE); + + //noinspection ConstantConditions + Picasso.with(context) + .load(currentPost.getThumbnailURL()) + .resize(THUMBNAIL_SIZE, THUMBNAIL_SIZE) + .centerCrop() + .error(ResourcesCompat.getDrawable(context.getResources() + , R.drawable.ic_default_user_thumbnail_white_24dp, null)) + .placeholder(ResourcesCompat.getDrawable(context.getResources() + , R.drawable.ic_default_user_thumbnail_white_24dp, null)) + .transform(new CircleTransform()) + .into(holder.thumbnail); + + //Sets username,submit date, index number, subject, post's and attached files texts + holder.username.setText(currentPost.getAuthor()); + holder.postDate.setText(currentPost.getPostDate()); + if (currentPost.getPostNumber() != 0) + holder.postNum.setText(context.getString( + R.string.user_number_of_posts, currentPost.getPostNumber())); + else + holder.postNum.setText(""); + holder.subject.setText(currentPost.getSubject()); + holder.post.loadDataWithBaseURL("file:///android_asset/", currentPost.getContent(), "text/html", "UTF-8", null); + if ((currentPost.getAttachedFiles() != null && currentPost.getAttachedFiles().size() != 0) + || (currentPost.getLastEdit() != null)) { + holder.bodyFooterDivider.setVisibility(View.VISIBLE); + holder.postFooter.removeAllViews(); + + if (currentPost.getAttachedFiles() != null && currentPost.getAttachedFiles().size() != 0) { + int filesTextColor; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + filesTextColor = context.getResources().getColor(R.color.accent, null); + } else //noinspection deprecation + filesTextColor = context.getResources().getColor(R.color.accent); + + for (final ThmmyFile attachedFile : currentPost.getAttachedFiles()) { + final TextView attached = new TextView(context); + attached.setTextSize(10f); + attached.setClickable(true); + attached.setTypeface(Typeface.createFromAsset(context.getAssets() + , "fonts/fontawesome-webfont.ttf")); + attached.setText(faIconFromFilename(attachedFile.getFilename()) + " " + + attachedFile.getFilename() + attachedFile.getFileInfo()); + attached.setTextColor(filesTextColor); + attached.setPadding(0, 3, 0, 3); + + attached.setOnClickListener(view -> ((BaseActivity) context).downloadFile(attachedFile)); + + holder.postFooter.addView(attached); + } + } + if (currentPost.getLastEdit() != null && currentPost.getLastEdit().length() > 0) { + int lastEditTextColor; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + lastEditTextColor = context.getResources().getColor(R.color.white, null); + } else //noinspection deprecation + lastEditTextColor = context.getResources().getColor(R.color.white); + + final TextView lastEdit = new TextView(context); + lastEdit.setTextSize(12f); + lastEdit.setText(currentPost.getLastEdit()); + lastEdit.setTextColor(lastEditTextColor); + lastEdit.setPadding(0, 3, 0, 3); + holder.postFooter.addView(lastEdit); + } + } else { + holder.bodyFooterDivider.setVisibility(View.GONE); + holder.postFooter.removeAllViews(); } - holder.stars.setText(usersStars); - holder.stars.setTextColor(mUserColor); - holder.stars.setVisibility(View.VISIBLE); - } else - holder.stars.setVisibility(View.GONE); - //Special card for special member of the month! - if (mUserColor == TopicParser.USER_COLOR_PINK) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - holder.cardChildLinear.setBackground(context.getResources(). - getDrawable(R.drawable.member_of_the_month_card, null)); - } else //noinspection deprecation - holder.cardChildLinear.setBackground(context.getResources(). - getDrawable(R.drawable.member_of_the_month_card)); - } else holder.cardChildLinear.setBackground(null); - - //Avoid's view's visibility recycling - if (!currentPost.isDeleted() && viewProperties.get(position)[isUserExtraInfoVisibile]) { - holder.userExtraInfo.setVisibility(View.VISIBLE); - holder.userExtraInfo.setAlpha(1.0f); - - holder.username.setMaxLines(Integer.MAX_VALUE); - holder.username.setEllipsize(null); - - holder.subject.setTextColor(Color.parseColor("#FFFFFF")); - holder.subject.setMaxLines(Integer.MAX_VALUE); - holder.subject.setEllipsize(null); - } else { - holder.userExtraInfo.setVisibility(View.GONE); - holder.userExtraInfo.setAlpha(0.0f); - holder.username.setMaxLines(1); - holder.username.setEllipsize(TextUtils.TruncateAt.END); - - holder.subject.setTextColor(Color.parseColor("#757575")); - holder.subject.setMaxLines(1); - holder.subject.setEllipsize(TextUtils.TruncateAt.END); - } - if (!currentPost.isDeleted()) { - //Sets graphics behavior - holder.thumbnail.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { + String mSpecialRank, mRank, mGender, mNumberOfPosts, mPersonalText; + int mNumberOfStars, mUserColor; + + if (!currentPost.isDeleted()) { //Sets user's extra info + mSpecialRank = currentPost.getSpecialRank(); + mRank = currentPost.getRank(); + mGender = currentPost.getGender(); + mNumberOfPosts = currentPost.getNumberOfPosts(); + mPersonalText = currentPost.getPersonalText(); + mNumberOfStars = currentPost.getNumberOfStars(); + } else { + mSpecialRank = null; + mRank = null; + mGender = null; + mNumberOfPosts = null; + mPersonalText = null; + mNumberOfStars = 0; + } + mUserColor = currentPost.getUserColor(); + + if (!Objects.equals(mSpecialRank, "") && mSpecialRank != null) { + holder.specialRank.setText(mSpecialRank); + holder.specialRank.setVisibility(View.VISIBLE); + } else + holder.specialRank.setVisibility(View.GONE); + if (!Objects.equals(mRank, "") && mRank != null) { + holder.rank.setText(mRank); + holder.rank.setVisibility(View.VISIBLE); + } else + holder.rank.setVisibility(View.GONE); + if (!Objects.equals(mGender, "") && mGender != null) { + holder.gender.setText(mGender); + holder.gender.setVisibility(View.VISIBLE); + } else + holder.gender.setVisibility(View.GONE); + if (!Objects.equals(mNumberOfPosts, "") && mNumberOfPosts != null) { + holder.numberOfPosts.setText(mNumberOfPosts); + holder.numberOfPosts.setVisibility(View.VISIBLE); + } else + holder.numberOfPosts.setVisibility(View.GONE); + if (!Objects.equals(mPersonalText, "") && mPersonalText != null) { + holder.personalText.setText("\"" + mPersonalText + "\""); + holder.personalText.setVisibility(View.VISIBLE); + } else + holder.personalText.setVisibility(View.GONE); + if (mUserColor != USER_COLOR_YELLOW) { + holder.username.setTextColor(mUserColor); + } else { + holder.username.setTextColor(USER_COLOR_WHITE); + } + if (mNumberOfStars > 0) { + holder.stars.setTypeface(Typeface.createFromAsset(context.getAssets() + , "fonts/fontawesome-webfont.ttf")); + + String aStar = context.getResources().getString(R.string.fa_icon_star); + StringBuilder usersStars = new StringBuilder(); + for (int i = 0; i < mNumberOfStars; ++i) { + usersStars.append(aStar); + } + holder.stars.setText(usersStars.toString()); + holder.stars.setTextColor(mUserColor); + holder.stars.setVisibility(View.VISIBLE); + } else + holder.stars.setVisibility(View.GONE); + + if (currentPost.isUserMentionedInPost()) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + holder.cardChildLinear.setBackground(context.getResources(). + getDrawable(R.drawable.mention_card, null)); + } else //noinspection deprecation + holder.cardChildLinear.setBackground(context.getResources(). + getDrawable(R.drawable.mention_card)); + } else if (mUserColor == TopicParser.USER_COLOR_PINK) { + //Special card for special member of the month! + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + holder.cardChildLinear.setBackground(context.getResources(). + getDrawable(R.drawable.member_of_the_month_card, null)); + } else //noinspection deprecation + holder.cardChildLinear.setBackground(context.getResources(). + getDrawable(R.drawable.member_of_the_month_card)); + } else holder.cardChildLinear.setBackground(null); + + //Avoid's view's visibility recycling + if (!currentPost.isDeleted() && viewModel.isUserExtraInfoVisible(holder.getAdapterPosition())) { + holder.userExtraInfo.setVisibility(View.VISIBLE); + holder.userExtraInfo.setAlpha(1.0f); + + holder.username.setMaxLines(Integer.MAX_VALUE); + holder.username.setEllipsize(null); + + holder.subject.setTextColor(Color.parseColor("#FFFFFF")); + holder.subject.setMaxLines(Integer.MAX_VALUE); + holder.subject.setEllipsize(null); + } else { + holder.userExtraInfo.setVisibility(View.GONE); + holder.userExtraInfo.setAlpha(0.0f); + + holder.username.setMaxLines(1); + holder.username.setEllipsize(TextUtils.TruncateAt.END); + + holder.subject.setTextColor(Color.parseColor("#757575")); + holder.subject.setMaxLines(1); + holder.subject.setEllipsize(TextUtils.TruncateAt.END); + } + if (!currentPost.isDeleted()) { + //Sets graphics behavior + holder.thumbnail.setOnClickListener(view -> { //Clicking the thumbnail opens user's profile Intent intent = new Intent(context, ProfileActivity.class); Bundle extras = new Bundle(); @@ -377,133 +472,198 @@ class TopicAdapter extends RecyclerView.Adapter { intent.putExtras(extras); intent.setFlags(FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); - } - }); - holder.header.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { + }); + holder.header.setOnClickListener(v -> { //Clicking the header makes it expand/collapse - boolean[] tmp = viewProperties.get(holder.getAdapterPosition()); - tmp[isUserExtraInfoVisibile] = !tmp[isUserExtraInfoVisibile]; - viewProperties.set(holder.getAdapterPosition(), tmp); + viewModel.toggleUserInfo(holder.getAdapterPosition()); TopicAnimations.animateUserExtraInfoVisibility(holder.username, holder.subject, Color.parseColor("#FFFFFF"), Color.parseColor("#757575"), holder.userExtraInfo); - } - }); - //Clicking the expanded part of a header (the extra info) makes it collapse - holder.userExtraInfo.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - boolean[] tmp = viewProperties.get(holder.getAdapterPosition()); - tmp[isUserExtraInfoVisibile] = false; - viewProperties.set(holder.getAdapterPosition(), tmp); - + }); + //Clicking the expanded part of a header (the extra info) makes it collapse + holder.userExtraInfo.setOnClickListener(v -> { + viewModel.hideUserInfo(holder.getAdapterPosition()); TopicAnimations.animateUserExtraInfoVisibility(holder.username, holder.subject, Color.parseColor("#FFFFFF"), Color.parseColor("#757575"), (LinearLayout) v); + }); + } else { + holder.header.setOnClickListener(null); + holder.userExtraInfo.setOnClickListener(null); + } + + holder.overflowButton.setOnClickListener(view -> { + //Inflates the popup menu content + LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + if (layoutInflater == null) { + return; + } + View popUpContent = layoutInflater.inflate(R.layout.activity_topic_overflow_menu, null); + + //Creates the PopupWindow + final PopupWindow popUp = new PopupWindow(holder.overflowButton.getContext()); + popUp.setContentView(popUpContent); + popUp.setWidth(LinearLayout.LayoutParams.WRAP_CONTENT); + popUp.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT); + popUp.setFocusable(true); + + TextView shareButton = popUpContent.findViewById(R.id.post_share_button); + Drawable shareStartDrawable = AppCompatResources.getDrawable(context, R.drawable.ic_share_white_24dp); + shareButton.setCompoundDrawablesRelativeWithIntrinsicBounds(shareStartDrawable, null, null, null); + shareButton.setOnClickListener(v -> { + Intent sendIntent = new Intent(Intent.ACTION_SEND); + sendIntent.setType("text/plain"); + sendIntent.putExtra(Intent.EXTRA_TEXT, currentPost.getPostURL()); + context.startActivity(Intent.createChooser(sendIntent, "Share via")); + popUp.dismiss(); + }); + + final TextView editPostButton = popUpContent.findViewById(R.id.edit_post); + Drawable editStartDrawable = AppCompatResources.getDrawable(context, R.drawable.ic_edit_white_24dp); + editPostButton.setCompoundDrawablesRelativeWithIntrinsicBounds(editStartDrawable, null, null, null); + + if (viewModel.isEditingPost() || currentPost.getPostEditURL() == null || currentPost.getPostEditURL().equals("")) { + editPostButton.setVisibility(View.GONE); + } else { + editPostButton.setOnClickListener(v -> { + viewModel.prepareForEdit(position, currentPost.getPostEditURL()); + popUp.dismiss(); + }); + } + + TextView deletePostButton = popUpContent.findViewById(R.id.delete_post); + + if (currentPost.getPostDeleteURL() == null || currentPost.getPostDeleteURL().equals("")) { + deletePostButton.setVisibility(View.GONE); + } else { + Drawable deleteStartDrawable = AppCompatResources.getDrawable(context, R.drawable.ic_delete_white_24dp); + deletePostButton.setCompoundDrawablesRelativeWithIntrinsicBounds(deleteStartDrawable, null, null, null); + popUpContent.findViewById(R.id.delete_post).setOnClickListener(v -> { + new AlertDialog.Builder(holder.overflowButton.getContext()) + .setTitle("Delete post") + .setMessage("Do you really want to delete this post?") + .setIcon(android.R.drawable.ic_dialog_alert) + .setPositiveButton(android.R.string.yes, (dialog, whichButton) -> viewModel.deletePost(currentPost.getPostDeleteURL())) + .setNegativeButton(android.R.string.no, null).show(); + popUp.dismiss(); + }); } + + //Displays the popup + popUp.showAsDropDown(holder.overflowButton); }); - } else { - holder.header.setOnClickListener(null); - holder.userExtraInfo.setOnClickListener(null); - } - holder.sharePostButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Intent sendIntent = new Intent(android.content.Intent.ACTION_SEND); - sendIntent.setType("text/plain"); - sendIntent.putExtra(android.content.Intent.EXTRA_TEXT, currentPost.getPostURL()); - context.startActivity(Intent.createChooser(sendIntent, "Share via")); + //noinspection PointlessBooleanExpression,ConstantConditions + if (!BaseActivity.getSessionManager().isLoggedIn() || !viewModel.canReply()) { + holder.quoteToggle.setVisibility(View.GONE); + } else { + if (viewModel.getToQuoteList().contains(currentPost.getPostIndex())) + holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_checked_accent_24dp); + else + holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_unchecked_24dp); + //Sets graphics behavior + holder.quoteToggle.setOnClickListener(view -> { + viewModel.postIndexToggle(currentPost.getPostIndex()); + if (viewModel.getToQuoteList().contains(currentPost.getPostIndex())) + holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_checked_accent_24dp); + else + holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_unchecked_24dp); + }); } - }); + } else if (currentHolder instanceof QuickReplyViewHolder) { + final QuickReplyViewHolder holder = (QuickReplyViewHolder) currentHolder; + + //noinspection ConstantConditions + Picasso.with(context) + .load(getSessionManager().getAvatarLink()) + .resize(THUMBNAIL_SIZE, THUMBNAIL_SIZE) + .centerCrop() + .error(ResourcesCompat.getDrawable(context.getResources() + , R.drawable.ic_default_user_thumbnail_white_24dp, null)) + .placeholder(ResourcesCompat.getDrawable(context.getResources() + , R.drawable.ic_default_user_thumbnail_white_24dp, null)) + .transform(new CircleTransform()) + .into(holder.thumbnail); + holder.username.setText(getSessionManager().getUsername()); + holder.quickReplySubject.setText("Re: " + viewModel.getTopicTitle().getValue()); + holder.quickReplySubject.setRawInputType(InputType.TYPE_CLASS_TEXT); + holder.quickReplySubject.setImeOptions(EditorInfo.IME_ACTION_DONE); + + holder.replyEditor.setEmojiKeyboard(emojiKeyboard); + holder.replyEditor.requestEditTextFocus(); + emojiKeyboard.registerEmojiInputField(holder.replyEditor); + + holder.replyEditor.setText(viewModel.getBuildedQuotes()); + holder.replyEditor.setOnSubmitListener(view -> { + if (holder.quickReplySubject.getText().toString().isEmpty()) return; + if (holder.replyEditor.getText().toString().isEmpty()) { + holder.replyEditor.setError("Required"); + return; + } + InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + holder.itemView.setAlpha(0.5f); + holder.itemView.setEnabled(false); + emojiKeyboard.hide(); + + viewModel.postReply(context, holder.quickReplySubject.getText().toString(), + holder.replyEditor.getText().toString()); + }); + holder.replyEditor.setOnClickListener(view -> holder.replyEditor.setError(null)); - //noinspection PointlessBooleanExpression,ConstantConditions - if (!BaseActivity.getSessionManager().isLoggedIn() || !canReply) { - holder.quoteToggle.setVisibility(View.GONE); - } else { - if (viewProperties.get(position)[isQuoteButtonChecked]) - holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_checked); - else - holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_unchecked); - //Sets graphics behavior - holder.quoteToggle.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - boolean[] tmp = viewProperties.get(holder.getAdapterPosition()); - if (tmp[isQuoteButtonChecked]) { - if (toQuoteList.contains(postsList.indexOf(currentPost))) { - toQuoteList.remove(toQuoteList.indexOf(postsList.indexOf(currentPost))); - } else - Timber.i("An error occurred while trying to exclude post fromtoQuoteList, post wasn't there!"); - holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_unchecked); - } else { - toQuoteList.add(postsList.indexOf(currentPost)); - holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_checked); - } - tmp[isQuoteButtonChecked] = !tmp[isQuoteButtonChecked]; - viewProperties.set(holder.getAdapterPosition(), tmp); + if (backPressHidden) { + holder.replyEditor.requestFocus(); + backPressHidden = false; + } + } else if (currentHolder instanceof EditMessageViewHolder) { + final EditMessageViewHolder holder = (EditMessageViewHolder) currentHolder; + + //noinspection ConstantConditions + Picasso.with(context) + .load(getSessionManager().getAvatarLink()) + .resize(THUMBNAIL_SIZE, THUMBNAIL_SIZE) + .centerCrop() + .error(ResourcesCompat.getDrawable(context.getResources() + , R.drawable.ic_default_user_thumbnail_white_24dp, null)) + .placeholder(ResourcesCompat.getDrawable(context.getResources() + , R.drawable.ic_default_user_thumbnail_white_24dp, null)) + .transform(new CircleTransform()) + .into(holder.thumbnail); + holder.username.setText(getSessionManager().getUsername()); + holder.editSubject.setText(currentPost.getSubject()); + holder.editSubject.setRawInputType(InputType.TYPE_CLASS_TEXT); + holder.editSubject.setImeOptions(EditorInfo.IME_ACTION_DONE); + + holder.editEditor.setEmojiKeyboard(emojiKeyboard); + holder.editEditor.requestEditTextFocus(); + emojiKeyboard.registerEmojiInputField(holder.editEditor); + holder.editEditor.setText(viewModel.getPostBeingEditedText()); + holder.editEditor.setOnSubmitListener(view -> { + if (holder.editSubject.getText().toString().isEmpty()) return; + if (holder.editEditor.getText().toString().isEmpty()) { + holder.editEditor.setError("Required"); + return; } + InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + holder.itemView.setAlpha(0.5f); + holder.itemView.setEnabled(false); + emojiKeyboard.hide(); + + viewModel.editPost(position, holder.editSubject.getText().toString(), holder.editEditor.getText().toString()); }); - } - } else if (currentHolder instanceof QuickReplyViewHolder) { - final QuickReplyViewHolder holder = (QuickReplyViewHolder) currentHolder; - - //noinspection ConstantConditions - Picasso.with(context) - .load(getSessionManager().getAvatarLink()) - .resize(THUMBNAIL_SIZE, THUMBNAIL_SIZE) - .centerCrop() - .error(ResourcesCompat.getDrawable(context.getResources() - , R.drawable.ic_default_user_thumbnail, null)) - .placeholder(ResourcesCompat.getDrawable(context.getResources() - , R.drawable.ic_default_user_thumbnail, null)) - .transform(new CircleTransform()) - .into(holder.thumbnail); - holder.username.setText(getSessionManager().getUsername()); - holder.quickReplySubject.setText(replyDataHolder[replySubject]); - - if (replyDataHolder[replyText] != null && !Objects.equals(replyDataHolder[replyText], "")) - holder.quickReply.setText(replyDataHolder[replyText]); - - holder.submitButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (holder.quickReplySubject.getText().toString().isEmpty()) return; - if (holder.quickReply.getText().toString().isEmpty()) return; - holder.submitButton.setEnabled(false); - replyTask.execute(holder.quickReplySubject.getText().toString(), - holder.quickReply.getText().toString(), numReplies, seqnum, sc, topic); - - holder.quickReplySubject.getText().clear(); - holder.quickReplySubject.setText("Re: " + topicTitle); - holder.quickReply.getText().clear(); - holder.submitButton.setEnabled(true); + + if (backPressHidden) { + holder.editEditor.requestFocus(); + backPressHidden = false; } - }); - if(backPressHidden) - { - holder.quickReply.requestFocus(); - backPressHidden = false; } } } - void resetTopic(String baseUrl, TopicActivity.TopicTask topicTask, boolean canReply) { - this.baseUrl = baseUrl; - this.topicTask = topicTask; - this.canReply = canReply; - viewProperties.clear(); - for (int i = 0; i < postsList.size(); ++i) { - //Initializes properties, array's values will be false by default - viewProperties.add(new boolean[3]); - } - } - @Override public int getItemCount() { - return postsList.size(); + return topicItems.size(); } /** @@ -514,7 +674,7 @@ class TopicAdapter extends RecyclerView.Adapter { final TextView postDate, postNum, username, subject; final ImageView thumbnail; final public WebView post; - final ImageButton quoteToggle, sharePostButton; + final ImageButton quoteToggle, overflowButton; final RelativeLayout header; final LinearLayout userExtraInfo; final View bodyFooterDivider; @@ -535,7 +695,7 @@ class TopicAdapter extends RecyclerView.Adapter { post = view.findViewById(R.id.post); post.setBackgroundColor(Color.argb(1, 255, 255, 255)); quoteToggle = view.findViewById(R.id.toggle_quote_button); - sharePostButton = view.findViewById(R.id.post_share_button); + overflowButton = view.findViewById(R.id.post_overflow_menu); bodyFooterDivider = view.findViewById(R.id.body_footer_divider); postFooter = view.findViewById(R.id.post_footer); @@ -561,22 +721,55 @@ class TopicAdapter extends RecyclerView.Adapter { /** * Custom {@link RecyclerView.ViewHolder} implementation */ - private static class QuickReplyViewHolder extends RecyclerView.ViewHolder { + static class QuickReplyViewHolder extends RecyclerView.ViewHolder { final ImageView thumbnail; final TextView username; - final EditText quickReply, quickReplySubject; - final AppCompatImageButton submitButton; + final EditText quickReplySubject; + final EditorView replyEditor; - QuickReplyViewHolder(View quickReply, CustomEditTextListener replySubject - , CustomEditTextListener replyText) { + QuickReplyViewHolder(View quickReply) { super(quickReply); thumbnail = quickReply.findViewById(R.id.thumbnail); username = quickReply.findViewById(R.id.username); - this.quickReply = quickReply.findViewById(R.id.quick_reply_text); - this.quickReply.addTextChangedListener(replyText); quickReplySubject = quickReply.findViewById(R.id.quick_reply_subject); - quickReplySubject.addTextChangedListener(replySubject); - submitButton = quickReply.findViewById(R.id.quick_reply_submit); + replyEditor = quickReply.findViewById(R.id.reply_editorview); + } + } + + static class EditMessageViewHolder extends RecyclerView.ViewHolder { + final ImageView thumbnail; + final TextView username; + final EditText editSubject; + final EditorView editEditor; + + EditMessageViewHolder(View editView) { + super(editView); + + thumbnail = editView.findViewById(R.id.thumbnail); + username = editView.findViewById(R.id.username); + editSubject = editView.findViewById(R.id.edit_message_subject); + editEditor = editView.findViewById(R.id.edit_editorview); + } + } + + static class PollViewHolder extends RecyclerView.ViewHolder { + final TextView question, errorTooManySelected; + final LinearLayout optionsLayout; + final AppCompatButton submitButton; + final AppCompatButton removeVotesButton, showPollResultsButton, hidePollResultsButton; + final HorizontalBarChart voteChart; + + PollViewHolder(View itemView) { + super(itemView); + + question = itemView.findViewById(R.id.question_textview); + optionsLayout = itemView.findViewById(R.id.options_layout); + submitButton = itemView.findViewById(R.id.submit_button); + removeVotesButton = itemView.findViewById(R.id.remove_vote_button); + showPollResultsButton = itemView.findViewById(R.id.show_poll_results_button); + hidePollResultsButton = itemView.findViewById(R.id.show_poll_options_button); + errorTooManySelected = itemView.findViewById(R.id.error_too_many_checked); + voteChart = itemView.findViewById(R.id.vote_chart); } } @@ -605,26 +798,39 @@ class TopicAdapter extends RecyclerView.Adapter { final String uriString = uri.toString(); ThmmyPage.PageCategory target = ThmmyPage.resolvePageCategory(uri); + viewModel.stopLoading(); if (target.is(ThmmyPage.PageCategory.TOPIC)) { //This url points to a topic - //Checks if this is the current topic - if (Objects.equals(uriString.substring(0, uriString.lastIndexOf(".")), baseUrl)) { - //Gets uri's targeted message's index number - String msgIndexReq = uriString.substring(uriString.indexOf("msg") + 3); - if (msgIndexReq.contains("#")) - msgIndexReq = msgIndexReq.substring(0, msgIndexReq.indexOf("#")); - else - msgIndexReq = msgIndexReq.substring(0, msgIndexReq.indexOf(";")); - - //Checks if this post is in the current topic's page - for (Post post : postsList) { - if (post.getPostIndex() == Integer.parseInt(msgIndexReq)) { - // TODO Don't restart Activity, Just change post focus + //Checks if the page to be loaded is the one already shown + if (uriString.contains(ParseHelpers.getBaseURL(viewModel.getTopicUrl()))) { + if (uriString.contains("topicseen#new") || uriString.contains("#new")) { + if (viewModel.getCurrentPageIndex() == viewModel.getPageCount()) { + //same page + postFocusListener.onPostFocusChange(getItemCount() - 1); + Timber.e("new"); return true; } } - - topicTask.execute(uri.toString()); + if (uriString.contains("msg")) { + String tmpUrlSbstr = uriString.substring(uriString.indexOf("msg") + 3); + if (tmpUrlSbstr.contains("msg")) + tmpUrlSbstr = tmpUrlSbstr.substring(0, tmpUrlSbstr.indexOf("msg") - 1); + int testAgainst = Integer.parseInt(tmpUrlSbstr); + for (int i = 0; i < topicItems.size(); i++) { + if (topicItems.get(i) instanceof Post && ((Post) topicItems.get(i)).getPostIndex() == testAgainst) { + //same page + Timber.e(Integer.toString(i)); + postFocusListener.onPostFocusChange(i); + return true; + } + } + } else if ((Objects.equals(uriString, ParseHelpers.getBaseURL(viewModel.getTopicUrl())) && + viewModel.getCurrentPageIndex() == 1) || + Integer.parseInt(uriString.substring(ParseHelpers.getBaseURL(viewModel.getTopicUrl()).length() + 1)) / 15 + 1 == + viewModel.getCurrentPageIndex()) { + //same page + return true; + } } Intent intent = new Intent(context, TopicActivity.class); @@ -665,25 +871,9 @@ class TopicAdapter extends RecyclerView.Adapter { } - private class CustomEditTextListener implements TextWatcher { - private final int positionInDataHolder; - - CustomEditTextListener(int positionInDataHolder) { - this.positionInDataHolder = positionInDataHolder; - } - - @Override - public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { - } - - @Override - public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { - replyDataHolder[positionInDataHolder] = charSequence.toString(); - } - - @Override - public void afterTextChanged(Editable editable) { - } + //we need to set a callback to topic activity to scroll the recyclerview when post focus is requested + public interface OnPostFocusChangeListener { + void onPostFocusChange(int position); } /** diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicParser.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicParser.java index 97f134ae..5a411e12 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicParser.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicParser.java @@ -5,6 +5,7 @@ import android.graphics.Color; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; +import org.jsoup.nodes.Node; import org.jsoup.select.Elements; import java.net.MalformedURLException; @@ -13,9 +14,14 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import gr.thmmy.mthmmy.base.BaseActivity; +import gr.thmmy.mthmmy.model.Poll; import gr.thmmy.mthmmy.model.Post; import gr.thmmy.mthmmy.model.ThmmyFile; +import gr.thmmy.mthmmy.model.TopicItem; import gr.thmmy.mthmmy.utils.parsing.ParseHelpers; import timber.log.Timber; @@ -28,7 +34,11 @@ import timber.log.Timber; *
  • {@link #parseTopicNumberOfPages(Document, int, ParseHelpers.Language)}
  • *
  • {@link #parseTopic(Document, ParseHelpers.Language)}
  • */ -class TopicParser { +public class TopicParser { + private static Pattern mentionsPattern = Pattern. + compile("
    \\n\\s+?(Quote from|Παράθεση από): " + + BaseActivity.getSessionManager().getUsername()); + //User colors private static final int USER_COLOR_BLACK = Color.parseColor("#000000"); private static final int USER_COLOR_RED = Color.parseColor("#F44336"); @@ -48,7 +58,7 @@ class TopicParser { * @return String containing html with the usernames of users * @see org.jsoup.Jsoup Jsoup */ - static String parseUsersViewingThisTopic(Document topic, ParseHelpers.Language language) { + public static String parseUsersViewingThisTopic(Document topic, ParseHelpers.Language language) { if (language.is(ParseHelpers.Language.GREEK)) return topic.select("td:containsOwn(διαβάζουν αυτό το θέμα)").first().html(); return topic.select("td:containsOwn(are viewing this topic)").first().html(); @@ -64,7 +74,7 @@ class TopicParser { * @return int containing parsed topic's current page * @see org.jsoup.Jsoup Jsoup */ - static int parseCurrentPageIndex(Document topic, ParseHelpers.Language language) { + public static int parseCurrentPageIndex(Document topic, ParseHelpers.Language language) { int parsedPage = 1; if (language.is(ParseHelpers.Language.GREEK)) { @@ -102,7 +112,7 @@ class TopicParser { * @return int containing the number of pages * @see org.jsoup.Jsoup Jsoup */ - static int parseTopicNumberOfPages(Document topic, int currentPage, ParseHelpers.Language language) { + public static int parseTopicNumberOfPages(Document topic, int currentPage, ParseHelpers.Language language) { int returnPages = 1; if (language.is(ParseHelpers.Language.GREEK)) { @@ -140,10 +150,16 @@ class TopicParser { * @return {@link ArrayList} of {@link Post}s * @see org.jsoup.Jsoup Jsoup */ - static ArrayList parseTopic(Document topic, ParseHelpers.Language language) { + public static ArrayList parseTopic(Document topic, ParseHelpers.Language language) { //Method's variables final int NO_INDEX = -1; - ArrayList parsedPostsList = new ArrayList<>(); + + ArrayList parsedPostsList = new ArrayList<>(); + +// Poll poll = findPoll(topic); +// if (poll != null) +// parsedPostsList.add(poll); + Elements postRows; //Each row is a post @@ -156,9 +172,10 @@ class TopicParser { for (Element thisRow : postRows) { //Variables for Post constructor String p_userName, p_thumbnailURL, p_subject, p_post, p_postDate, p_profileURL, p_rank, - p_specialRank, p_gender, p_personalText, p_numberOfPosts, p_postLastEditDate, p_postURL; + p_specialRank, p_gender, p_personalText, p_numberOfPosts, p_postLastEditDate, + p_postURL, p_deletePostURL, p_editPostURL; int p_postNum, p_postIndex, p_numberOfStars, p_userColor; - boolean p_isDeleted = false; + boolean p_isDeleted = false, p_isUserMentionedInPost = false; ArrayList p_attachedFiles; //Initialize variables @@ -172,6 +189,8 @@ class TopicParser { p_userColor = USER_COLOR_YELLOW; p_attachedFiles = new ArrayList<>(); p_postLastEditDate = null; + p_deletePostURL = null; + p_editPostURL = null; //Language independent parsing //Finds thumbnail url @@ -185,7 +204,7 @@ class TopicParser { p_subject = thisRow.select("div[id^=subject_]").first().select("a").first().text(); //Finds post's link - p_postURL = thisRow.select("div[id^=subject_]").first().select("a").first() .attr("href"); + p_postURL = thisRow.select("div[id^=subject_]").first().select("a").first().attr("href"); //Finds post's text p_post = ParseHelpers.youtubeEmbeddedFix(thisRow.select("div").select(".post").first()); @@ -201,11 +220,11 @@ class TopicParser { if (postIndex != null) { String tmp = postIndex.attr("name"); p_postIndex = Integer.parseInt(tmp.substring(tmp.indexOf("msg") + 3)); - } else{ + } else { postIndex = thisRow.select("div[id^=subject]").first(); if (postIndex == null) p_postIndex = NO_INDEX; - else{ + else { String tmp = postIndex.attr("id"); p_postIndex = Integer.parseInt(tmp.substring(tmp.indexOf("subject") + 8)); } @@ -232,6 +251,16 @@ class TopicParser { p_profileURL = userName.attr("href"); } + //Finds post delete url + Element postDelete = thisRow.select("a:has(img[alt='Διαγραφή'])").first(); + if (postDelete != null) { + p_deletePostURL = postDelete.attr("href"); + } + + Element postEdit = thisRow.select("a:has(img[alt='Αλλαγή'])").first(); + if (postEdit != null) + p_editPostURL = postEdit.attr("href"); + //Finds post's submit date Element postDate = thisRow.select("div.smalltext:matches(στις:)").first(); p_postDate = postDate.text(); @@ -292,6 +321,18 @@ class TopicParser { p_profileURL = userName.attr("href"); } + //Finds post delete url + Element postDelete = thisRow.select("a:has(img[alt='Remove message'])").first(); + if (postDelete != null) { + p_deletePostURL = postDelete.attr("href"); + } + + //Finds post modify url + Element postEdit = thisRow.select("a:has(img[alt='Modify message'])").first(); + if (postEdit != null) { + p_editPostURL = postEdit.attr("href"); + } + //Finds post's submit date Element postDate = thisRow.select("div.smalltext:matches(on:)").first(); p_postDate = postDate.text(); @@ -412,21 +453,110 @@ class TopicParser { p_personalText = p_personalText.replace("\n", "").replace("\r", "").trim(); } } + + //Checks post for mentions of this user (if the user is logged in) + if (BaseActivity.getSessionManager().isLoggedIn() && + mentionsPattern.matcher(p_post).find()) { + p_isUserMentionedInPost = true; + } + //Add new post in postsList, extended information needed parsedPostsList.add(new Post(p_thumbnailURL, p_userName, p_subject, p_post, p_postIndex , p_postNum, p_postDate, p_profileURL, p_rank, p_specialRank, p_gender , p_numberOfPosts, p_personalText, p_numberOfStars, p_userColor - , p_attachedFiles, p_postLastEditDate, p_postURL)); + , p_attachedFiles, p_postLastEditDate, p_postURL, p_deletePostURL, p_editPostURL + , p_isUserMentionedInPost, Post.TYPE_POST)); } else { //Deleted user //Add new post in postsList, only standard information needed - parsedPostsList.add(new Post(p_thumbnailURL, p_userName, p_subject, p_post, p_postIndex - , p_postNum, p_postDate, p_userColor, p_attachedFiles, p_postLastEditDate, p_postURL)); + parsedPostsList.add(new Post(p_thumbnailURL, p_userName, p_subject, p_post + , p_postIndex, p_postNum, p_postDate, p_userColor, p_attachedFiles + , p_postLastEditDate, p_postURL, p_deletePostURL, p_editPostURL + , p_isUserMentionedInPost, Post.TYPE_POST)); } } return parsedPostsList; } + private static Poll findPoll(Document topic) { + Pattern integerPattern = Pattern.compile("[0-9]+"); + Element table = topic.select("table.tborder").first(); + try { + String question; + ArrayList entries = new ArrayList<>(); + int availableVoteCount = 0; + String pollFormUrl = null, sc = null, removeVoteUrl = null, showVoteResultsUrl = null, + showOptionsUrl = null; + + Element pollColumn = table.select("tr[class=windowbg]").first().child(1); + question = pollColumn.ownText().trim(); + Element form = pollColumn.select("form").first(); + + if (form != null) { + // poll in vote mode + pollFormUrl = form.attr("action"); + sc = form.select("input[name=sc]").first().attr("value"); + + List possibleEntriesRows = form.select("td:has(input[id^=options])").first().childNodes(); + for (Node possibleEntry : possibleEntriesRows) { + String possibleEntryHtml = possibleEntry.outerHtml(); + if (!possibleEntryHtml.equals(" ") && !possibleEntryHtml.equals("
    ") && !possibleEntryHtml.startsWith("tr"); + Elements links; + + if (formTableRows.size() == 3) { + String prompt = formTableRows.first().child(0).text().trim(); + Matcher integerMatcher = integerPattern.matcher(prompt); + if (integerMatcher.find()) { + availableVoteCount = Integer.parseInt(prompt.substring(integerMatcher.start(), integerMatcher.end())); + } + links = formTableRows.get(1).child(1).select("a"); + } else { + availableVoteCount = 1; + links = formTableRows.first().child(1).select("a"); + } + + if (links != null && links.size() > 0) { + showVoteResultsUrl = links.first().attr("href"); + } + } else { + // poll in results mode + Elements entryRows = pollColumn.select("table[cellspacing] tr"); + for (Element entryRow : entryRows) { + Elements entryColumns = entryRow.select("td"); + String optionName = entryColumns.first().html(); + String voteCountDescription = entryColumns.last().text(); + Matcher integerMatcher = integerPattern.matcher(voteCountDescription); + int voteCount = 0; + if (integerMatcher.find()) { + voteCount = Integer.parseInt(voteCountDescription.substring(integerMatcher.start(), + integerMatcher.end())); + } + + entries.add(0, new Poll.Entry(optionName, voteCount)); + } + + Elements links = pollColumn.child(0).child(0).child(0).child(1).select("a"); + if (links != null && links.size() > 0) { + if (links.first().text().equals("Remove Vote") || links.first().text().equals("Αφαίρεση ψήφου")) + removeVoteUrl = links.first().attr("href"); + else if (links.first().text().equals("Voting options") || links.first().text().equals("Επιλογές ψηφοφορίας")) + showOptionsUrl = links.first().attr("href"); + } + } + return new Poll(question, entries.toArray(new Poll.Entry[0]), availableVoteCount, + pollFormUrl, sc, removeVoteUrl, showVoteResultsUrl, showOptionsUrl); + } catch (Exception e) { + Timber.v(e, "Could not parse a poll"); + } + + return null; + } + /** * Returns the color of a user according to user's rank on forum. * diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/DeleteTask.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/DeleteTask.java new file mode 100644 index 00000000..b277d2bd --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/DeleteTask.java @@ -0,0 +1,39 @@ +package gr.thmmy.mthmmy.activities.topic.tasks; + +import org.jsoup.nodes.Document; + +import java.io.IOException; + +import gr.thmmy.mthmmy.utils.NetworkResultCodes; +import gr.thmmy.mthmmy.utils.NetworkTask; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +public class DeleteTask extends NetworkTask { + + public DeleteTask(OnTaskStartedListener onTaskStartedListener, OnNetworkTaskFinishedListener onParseTaskFinishedListener) { + super(onTaskStartedListener, onParseTaskFinishedListener); + } + + @Override + protected Response sendRequest(OkHttpClient client, String... input) throws IOException { + Request delete = new Request.Builder() + .url(input[0]) + .header("User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36") + .build(); + client.newCall(delete).execute(); + return client.newCall(delete).execute(); + } + + @Override + protected Void performTask(Document document, Response response) { + return null; + } + + @Override + protected int getResultCode(Response response, Void data) { + return NetworkResultCodes.SUCCESSFUL; + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/EditTask.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/EditTask.java new file mode 100644 index 00000000..3b5b46f0 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/EditTask.java @@ -0,0 +1,78 @@ +package gr.thmmy.mthmmy.activities.topic.tasks; + +import android.os.AsyncTask; + +import java.io.IOException; + +import gr.thmmy.mthmmy.base.BaseApplication; +import okhttp3.MultipartBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import timber.log.Timber; + +import static gr.thmmy.mthmmy.activities.topic.Posting.replyStatus; + +public class EditTask extends AsyncTask { + private EditTaskCallbacks listener; + private int position; + + public EditTask(EditTaskCallbacks listener, int position) { + this.listener = listener; + this.position = position; + } + + @Override + protected void onPreExecute() { + listener.onEditTaskStarted(); + } + + @Override + protected Boolean doInBackground(String... strings) { + RequestBody postBody = new MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("message", strings[1]) + .addFormDataPart("num_replies", strings[2]) + .addFormDataPart("seqnum", strings[3]) + .addFormDataPart("sc", strings[4]) + .addFormDataPart("subject", strings[5]) + .addFormDataPart("topic", strings[6]) + .build(); + Request post = new Request.Builder() + .url(strings[0]) + .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36") + .post(postBody) + .build(); + + try { + OkHttpClient client = BaseApplication.getInstance().getClient(); + client.newCall(post).execute(); + Response response = client.newCall(post).execute(); + switch (replyStatus(response)) { + case SUCCESSFUL: + BaseApplication.getInstance().logFirebaseAnalyticsEvent("post_editing", null); + return true; + case NEW_REPLY_WHILE_POSTING: + //TODO this... + return true; + default: + Timber.e("Malformed post. Request string: %s", post.toString()); + return true; + } + } catch (IOException e) { + Timber.e(e, "Edit failed."); + return false; + } + } + + @Override + protected void onPostExecute(Boolean result) { + listener.onEditTaskFinished(result, position); + } + + public interface EditTaskCallbacks { + void onEditTaskStarted(); + void onEditTaskFinished(boolean result, int position); + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/PrepareForEditResult.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/PrepareForEditResult.java new file mode 100644 index 00000000..a8176072 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/PrepareForEditResult.java @@ -0,0 +1,51 @@ +package gr.thmmy.mthmmy.activities.topic.tasks; + +public class PrepareForEditResult { + private final String postText, commitEditUrl, numReplies, seqnum, sc, topic; + private int position; + private boolean successful; + + public PrepareForEditResult(String postText, String commitEditUrl, String numReplies, String seqnum, + String sc, String topic, int position, boolean successful) { + this.postText = postText; + this.commitEditUrl = commitEditUrl; + this.numReplies = numReplies; + this.seqnum = seqnum; + this.sc = sc; + this.topic = topic; + this.position = position; + this.successful = successful; + } + + public String getPostText() { + return postText; + } + + public String getCommitEditUrl() { + return commitEditUrl; + } + + public String getNumReplies() { + return numReplies; + } + + public String getSeqnum() { + return seqnum; + } + + public String getSc() { + return sc; + } + + public String getTopic() { + return topic; + } + + public int getPosition() { + return position; + } + + public boolean isSuccessful() { + return successful; + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/PrepareForEditTask.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/PrepareForEditTask.java new file mode 100644 index 00000000..5864e635 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/PrepareForEditTask.java @@ -0,0 +1,79 @@ +package gr.thmmy.mthmmy.activities.topic.tasks; + +import android.os.AsyncTask; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Selector; + +import java.io.IOException; + +import gr.thmmy.mthmmy.base.BaseApplication; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import timber.log.Timber; + +public class PrepareForEditTask extends AsyncTask { + private int position; + private String replyPageUrl; + private PrepareForEditCallbacks listener; + private OnPrepareEditFinished finishListener; + + public PrepareForEditTask(PrepareForEditCallbacks listener, OnPrepareEditFinished finishListener, int position, String replyPageUrl) { + this.listener = listener; + this.finishListener = finishListener; + this.position = position; + this.replyPageUrl = replyPageUrl; + } + + @Override + protected void onPreExecute() { + listener.onPrepareEditStarted(); + } + + @Override + protected PrepareForEditResult doInBackground(String... strings) { + Document document; + String url = strings[0]; + Request request = new Request.Builder() + .url(url + ";wap2") + .build(); + + try { + String postText, commitEditURL, numReplies, seqnum, sc, topic; + OkHttpClient client = BaseApplication.getInstance().getClient(); + Response response = client.newCall(request).execute(); + document = Jsoup.parse(response.body().string()); + + Element message = document.select("textarea").first(); + postText = message.text(); + + commitEditURL = document.select("form").first().attr("action"); + numReplies = replyPageUrl.substring(replyPageUrl.indexOf("num_replies=") + 12); + seqnum = document.select("input[name=seqnum]").first().attr("value"); + sc = document.select("input[name=sc]").first().attr("value"); + topic = document.select("input[name=topic]").first().attr("value"); + + return new PrepareForEditResult(postText, commitEditURL, numReplies, seqnum, sc, topic, position, true); + } catch (IOException | Selector.SelectorParseException e) { + Timber.e(e, "Prepare failed."); + return new PrepareForEditResult(null, null, null, null, null, null, position, false); + } + } + + @Override + protected void onPostExecute(PrepareForEditResult result) { + finishListener.onPrepareEditFinished(result, position); + } + + public interface PrepareForEditCallbacks { + void onPrepareEditStarted(); + void onPrepareEditCancelled(); + } + + public interface OnPrepareEditFinished { + void onPrepareEditFinished(PrepareForEditResult result, int position); + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/PrepareForReply.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/PrepareForReply.java new file mode 100644 index 00000000..2e0d7148 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/PrepareForReply.java @@ -0,0 +1,88 @@ +package gr.thmmy.mthmmy.activities.topic.tasks; + +import android.os.AsyncTask; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.select.Selector; + +import java.io.IOException; + +import gr.thmmy.mthmmy.base.BaseApplication; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import timber.log.Timber; + +public class PrepareForReply extends AsyncTask { + private PrepareForReplyCallbacks listener; + private OnPrepareForReplyFinished finishListener; + private String replyPageUrl; + + public PrepareForReply(PrepareForReplyCallbacks listener, OnPrepareForReplyFinished finishListener, + String replyPageUrl) { + this.listener = listener; + this.finishListener = finishListener; + this.replyPageUrl = replyPageUrl; + } + + @Override + protected void onPreExecute() { + listener.onPrepareForReplyStarted(); + } + + @Override + protected PrepareForReplyResult doInBackground(Integer... postIndices) { + Document document; + Request request = new Request.Builder() + .url(replyPageUrl + ";wap2") + .build(); + + OkHttpClient client = BaseApplication.getInstance().getClient(); + String numReplies, seqnum, sc, topic; + try { + Response response = client.newCall(request).execute(); + document = Jsoup.parse(response.body().string()); + + numReplies = replyPageUrl.substring(replyPageUrl.indexOf("num_replies=") + 12); + seqnum = document.select("input[name=seqnum]").first().attr("value"); + sc = document.select("input[name=sc]").first().attr("value"); + topic = document.select("input[name=topic]").first().attr("value"); + } catch (IOException | Selector.SelectorParseException e) { + Timber.e(e, "Prepare failed."); + return new PrepareForReplyResult(false, null, null, null, null, null); + } + + StringBuilder buildedQuotes = new StringBuilder(""); + for (Integer postIndex : postIndices) { + request = new Request.Builder() + .url("https://www.thmmy.gr/smf/index.php?action=quotefast;quote=" + + postIndex + ";" + "sesc=" + sc + ";xml") + .build(); + try { + Response response = client.newCall(request).execute(); + String body = response.body().string(); + buildedQuotes.append(body.substring(body.indexOf("") + 7, body.indexOf(""))); + buildedQuotes.append("\n\n"); + } catch (IOException | Selector.SelectorParseException e) { + Timber.e(e, "Quote building failed."); + return new PrepareForReplyResult(false, null, null, null, null, null); + } + } + return new PrepareForReplyResult(true, numReplies, seqnum, sc, topic, buildedQuotes.toString()); + } + + @Override + protected void onPostExecute(PrepareForReplyResult result) { + finishListener.onPrepareForReplyFinished(result); + } + + public interface PrepareForReplyCallbacks { + void onPrepareForReplyStarted(); + void onPrepareForReplyCancelled(); + } + + public interface OnPrepareForReplyFinished { + void onPrepareForReplyFinished(PrepareForReplyResult result); + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/PrepareForReplyResult.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/PrepareForReplyResult.java new file mode 100644 index 00000000..3e44f423 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/PrepareForReplyResult.java @@ -0,0 +1,40 @@ +package gr.thmmy.mthmmy.activities.topic.tasks; + +public class PrepareForReplyResult { + private final String numReplies, seqnum, sc, topic, buildedQuotes; + private boolean successful; + + + public PrepareForReplyResult(boolean successful, String numReplies, String seqnum, String sc, String topic, String buildedQuotes) { + this.successful = successful; + this.numReplies = numReplies; + this.seqnum = seqnum; + this.sc = sc; + this.topic = topic; + this.buildedQuotes = buildedQuotes; + } + + public String getNumReplies() { + return numReplies; + } + + public String getSeqnum() { + return seqnum; + } + + public String getSc() { + return sc; + } + + public String getTopic() { + return topic; + } + + public String getBuildedQuotes() { + return buildedQuotes; + } + + public boolean isSuccessful() { + return successful; + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/RemoveVoteTask.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/RemoveVoteTask.java new file mode 100644 index 00000000..f94ae027 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/RemoveVoteTask.java @@ -0,0 +1,20 @@ +package gr.thmmy.mthmmy.activities.topic.tasks; + +import org.jsoup.nodes.Document; + +import gr.thmmy.mthmmy.utils.NetworkResultCodes; +import gr.thmmy.mthmmy.utils.NetworkTask; +import okhttp3.Response; + +public class RemoveVoteTask extends NetworkTask { + + @Override + protected Void performTask(Document document, Response response) { + return null; + } + + @Override + protected int getResultCode(Response response, Void data) { + return NetworkResultCodes.SUCCESSFUL; + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/ReplyTask.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/ReplyTask.java new file mode 100644 index 00000000..13ad66d9 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/ReplyTask.java @@ -0,0 +1,72 @@ +package gr.thmmy.mthmmy.activities.topic.tasks; + +import android.os.AsyncTask; + +import java.io.IOException; + +import gr.thmmy.mthmmy.activities.topic.Posting; +import gr.thmmy.mthmmy.base.BaseApplication; +import okhttp3.MultipartBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import timber.log.Timber; + +import static gr.thmmy.mthmmy.activities.topic.Posting.replyStatus; + +public class ReplyTask extends AsyncTask { + private ReplyTaskCallbacks listener; + private boolean includeAppSignature; + + public ReplyTask(ReplyTaskCallbacks listener, boolean includeAppSignature) { + this.listener = listener; + this.includeAppSignature = includeAppSignature; + } + + @Override + protected void onPreExecute() { + listener.onReplyTaskStarted(); + } + + @Override + protected Posting.REPLY_STATUS doInBackground(String... args) { + final String sentFrommTHMMY = includeAppSignature + ? "\n[right][size=7pt][i]sent from [url=https://play.google.com/store/apps/details?id=gr.thmmy.mthmmy]mTHMMY[/url] [/i][/size][/right]" + : ""; + RequestBody postBody = new MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("message", args[1] + sentFrommTHMMY) + .addFormDataPart("num_replies", args[2]) + .addFormDataPart("seqnum", args[3]) + .addFormDataPart("sc", args[4]) + .addFormDataPart("subject", args[0]) + .addFormDataPart("topic", args[5]) + .build(); + Request post = new Request.Builder() + .url("https://www.thmmy.gr/smf/index.php?action=post2") + .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36") + .post(postBody) + .build(); + + try { + OkHttpClient client = BaseApplication.getInstance().getClient(); + client.newCall(post).execute(); + Response response = client.newCall(post).execute(); + return replyStatus(response); + } catch (IOException e) { + Timber.e(e, "Post failed."); + return Posting.REPLY_STATUS.OTHER_ERROR; + } + } + + @Override + protected void onPostExecute(Posting.REPLY_STATUS result) { + listener.onReplyTaskFinished(result); + } + + public interface ReplyTaskCallbacks { + void onReplyTaskStarted(); + void onReplyTaskFinished(Posting.REPLY_STATUS result); + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/SubmitVoteTask.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/SubmitVoteTask.java new file mode 100644 index 00000000..ec3773f7 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/SubmitVoteTask.java @@ -0,0 +1,48 @@ +package gr.thmmy.mthmmy.activities.topic.tasks; + +import org.jsoup.nodes.Document; + +import java.io.IOException; + +import gr.thmmy.mthmmy.utils.NetworkResultCodes; +import gr.thmmy.mthmmy.utils.NetworkTask; +import okhttp3.MultipartBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +public class SubmitVoteTask extends NetworkTask { + + private int[] votes; + + public SubmitVoteTask(int... votes) { + this.votes = votes; + } + + @Override + protected Response sendRequest(OkHttpClient client, String... input) throws IOException { + MultipartBody.Builder postBodyBuilder = new MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("sc", input[1]); + for (int vote : votes) { + postBodyBuilder.addFormDataPart("options[]", Integer.toString(vote)); + } + + Request voteRequest = new Request.Builder() + .url(input[0]) + .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36") + .post(postBodyBuilder.build()) + .build(); + return client.newCall(voteRequest).execute(); + } + + @Override + protected Void performTask(Document document, Response response) { + return null; + } + + @Override + protected int getResultCode(Response response, Void data) { + return NetworkResultCodes.SUCCESSFUL; + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/TopicTask.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/TopicTask.java new file mode 100644 index 00000000..fa4f9d2d --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/TopicTask.java @@ -0,0 +1,149 @@ +package gr.thmmy.mthmmy.activities.topic.tasks; + +import android.os.AsyncTask; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; + +import java.io.IOException; +import java.util.ArrayList; + +import gr.thmmy.mthmmy.activities.topic.TopicParser; +import gr.thmmy.mthmmy.base.BaseApplication; +import gr.thmmy.mthmmy.model.Post; +import gr.thmmy.mthmmy.model.ThmmyPage; +import gr.thmmy.mthmmy.model.TopicItem; +import gr.thmmy.mthmmy.utils.parsing.ParseHelpers; +import okhttp3.Request; +import okhttp3.Response; +import timber.log.Timber; + +/** + * An {@link AsyncTask} that handles asynchronous fetching of this topic page and parsing of its + * data. + *

    TopicTask's {@link AsyncTask#execute execute} method needs a topic's url as String + * parameter.

    + */ +public class TopicTask extends AsyncTask { + private TopicTaskObserver topicTaskObserver; + private OnTopicTaskCompleted finishListener; + + public TopicTask(TopicTaskObserver topicTaskObserver, OnTopicTaskCompleted finishListener) { + this.topicTaskObserver = topicTaskObserver; + this.finishListener = finishListener; + } + + @Override + protected void onPreExecute() { + topicTaskObserver.onTopicTaskStarted(); + } + + @Override + protected TopicTaskResult doInBackground(String... strings) { + Document topic = null; + String newPageUrl = strings[0]; + + //Finds the index of message focus if present + int postFocus = 0; + { + if (newPageUrl.contains("msg")) { + String tmp = newPageUrl.substring(newPageUrl.indexOf("msg") + 3); + if (tmp.contains(";")) + postFocus = Integer.parseInt(tmp.substring(0, tmp.indexOf(";"))); + else if (tmp.contains("#")) + postFocus = Integer.parseInt(tmp.substring(0, tmp.indexOf("#"))); + } + } + + Request request = new Request.Builder() + .url(newPageUrl) + .build(); + try { + Response response = BaseApplication.getInstance().getClient().newCall(request).execute(); + topic = Jsoup.parse(response.body().string()); + + ParseHelpers.Language language = ParseHelpers.Language.getLanguage(topic); + + //Finds topic's tree, mods and users viewing + String topicTreeAndMods = topic.select("div.nav").first().html(); + String topicViewers = TopicParser.parseUsersViewingThisTopic(topic, language); + + //Finds reply page url + String replyPageUrl = null; + Element replyButton = topic.select("a:has(img[alt=Reply])").first(); + if (replyButton == null) + replyButton = topic.select("a:has(img[alt=Απάντηση])").first(); + if (replyButton != null) replyPageUrl = replyButton.attr("href"); + + //Finds topic title if missing + String topicTitle = topic.select("td[id=top_subject]").first().text(); + if (topicTitle.contains("Topic:")) { + topicTitle = topicTitle.substring(topicTitle.indexOf("Topic:") + 7 + , topicTitle.indexOf("(Read") - 2); + } else { + topicTitle = topicTitle.substring(topicTitle.indexOf("Θέμα:") + 6 + , topicTitle.indexOf("(Αναγνώστηκε") - 2); + Timber.d("Parsed title: %s", topicTitle); + } + + //Finds current page's index + int currentPageIndex = TopicParser.parseCurrentPageIndex(topic, language); + + //Finds number of pages + int pageCount = TopicParser.parseTopicNumberOfPages(topic, currentPageIndex, language); + + ArrayList newPostsList = TopicParser.parseTopic(topic, language); + + int loadedPageTopicId = Integer.parseInt(ThmmyPage.getTopicId(newPageUrl)); + + //Finds the position of the focused message if present + int focusedPostIndex = 0; + for (int i = 0; i < newPostsList.size(); ++i) { + if (newPostsList.get(i) instanceof Post && ((Post) newPostsList.get(i)).getPostIndex() == postFocus) { + focusedPostIndex = i; + break; + } + } + return new TopicTaskResult(ResultCode.SUCCESS, topicTitle, replyPageUrl, newPostsList, loadedPageTopicId, + currentPageIndex, pageCount, focusedPostIndex, topicTreeAndMods, topicViewers); + } catch (IOException e) { + return new TopicTaskResult(ResultCode.NETWORK_ERROR, null, null, null, + 0, 0, 0, 0, null, null); + } catch (Exception e) { + if (isUnauthorized(topic)) { + return new TopicTaskResult(ResultCode.UNAUTHORIZED, null, null, null, + 0, 0, 0, 0, null, null); + } else { + Timber.e(e, "Topic parse failed"); + return new TopicTaskResult(ResultCode.PARSING_ERROR, null, null, null, + 0, 0, 0, 0, null, null); + } + } + } + + private boolean isUnauthorized(Document document) { + return document != null && document.select("body:contains(The topic or board you" + + " are looking for appears to be either missing or off limits to you.)," + + "body:contains(Το θέμα ή πίνακας που ψάχνετε ή δεν υπάρχει ή δεν " + + "είναι προσβάσιμο από εσάς.)").size() > 0; + } + + @Override + protected void onPostExecute(TopicTaskResult topicTaskResult) { + finishListener.onTopicTaskCompleted(topicTaskResult); + } + + public enum ResultCode { + SUCCESS, NETWORK_ERROR, PARSING_ERROR, UNAUTHORIZED + } + + public interface TopicTaskObserver { + void onTopicTaskStarted(); + void onTopicTaskCancelled(); + } + + public interface OnTopicTaskCompleted { + void onTopicTaskCompleted(TopicTaskResult result); + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/TopicTaskResult.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/TopicTaskResult.java new file mode 100644 index 00000000..9381ada8 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/TopicTaskResult.java @@ -0,0 +1,95 @@ +package gr.thmmy.mthmmy.activities.topic.tasks; + +import java.util.ArrayList; + +import gr.thmmy.mthmmy.model.TopicItem; + +public class TopicTaskResult { + private final TopicTask.ResultCode resultCode; + /** + * Holds this topic's title. At first this gets the value of the topic title that came with + * bundle and is rendered in the toolbar while parsing this topic. Later, if a different topic + * title is parsed from the html source, it gets updated. + */ + private final String topicTitle; + /** + * This topic's reply url + */ + private final String replyPageUrl; + private final ArrayList newPostsList; + /** + * The topicId of the loaded page + */ + private final int loadedPageTopicId; + /** + * Holds current page's index (starting from 1, not 0) + */ + private final int currentPageIndex; + /** + * Holds the requested topic's number of pages + */ + private final int pageCount; + /** + * The index of the post that has focus + */ + private final int focusedPostIndex; + //Topic's info related + private final String topicTreeAndMods; + private final String topicViewers; + + public TopicTaskResult(TopicTask.ResultCode resultCode, String topicTitle, + String replyPageUrl, ArrayList newPostsList, int loadedPageTopicId, + int currentPageIndex, int pageCount, int focusedPostIndex, String topicTreeAndMods, + String topicViewers) { + this.resultCode = resultCode; + this.topicTitle = topicTitle; + this.replyPageUrl = replyPageUrl; + this.newPostsList = newPostsList; + this.loadedPageTopicId = loadedPageTopicId; + this.currentPageIndex = currentPageIndex; + this.pageCount = pageCount; + this.focusedPostIndex = focusedPostIndex; + this.topicTreeAndMods = topicTreeAndMods; + this.topicViewers = topicViewers; + } + + public TopicTask.ResultCode getResultCode() { + return resultCode; + } + + public String getTopicTitle() { + return topicTitle; + } + + public String getReplyPageUrl() { + return replyPageUrl; + } + + public ArrayList getNewPostsList() { + return newPostsList; + } + + public int getLoadedPageTopicId() { + return loadedPageTopicId; + } + + public int getCurrentPageIndex() { + return currentPageIndex; + } + + public int getPageCount() { + return pageCount; + } + + public int getFocusedPostIndex() { + return focusedPostIndex; + } + + public String getTopicTreeAndMods() { + return topicTreeAndMods; + } + + public String getTopicViewers() { + return topicViewers; + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadActivity.java new file mode 100644 index 00000000..ce93b6b1 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadActivity.java @@ -0,0 +1,605 @@ +package gr.thmmy.mthmmy.activities.upload; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.ResolveInfo; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Bundle; +import android.provider.MediaStore; +import android.support.design.widget.FloatingActionButton; +import android.support.v7.content.res.AppCompatResources; +import android.support.v7.preference.PreferenceManager; +import android.support.v7.widget.AppCompatButton; +import android.support.v7.widget.AppCompatTextView; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.Toast; + +import net.gotev.uploadservice.MultipartUploadRequest; +import net.gotev.uploadservice.ServerResponse; +import net.gotev.uploadservice.UploadInfo; +import net.gotev.uploadservice.UploadNotificationConfig; +import net.gotev.uploadservice.UploadStatusDelegate; + +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.io.File; +import java.io.FileOutputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +import gr.thmmy.mthmmy.R; +import gr.thmmy.mthmmy.base.BaseActivity; +import gr.thmmy.mthmmy.base.BaseApplication; +import gr.thmmy.mthmmy.model.UploadCategory; +import gr.thmmy.mthmmy.utils.AppCompatSpinnerWithoutDefault; +import gr.thmmy.mthmmy.utils.parsing.ParseException; +import gr.thmmy.mthmmy.utils.parsing.ParseTask; +import me.zhanghai.android.materialprogressbar.MaterialProgressBar; +import timber.log.Timber; + +import static gr.thmmy.mthmmy.activities.settings.SettingsActivity.UPLOADING_APP_SIGNATURE_ENABLE_KEY; +import static gr.thmmy.mthmmy.activities.upload.UploadFieldsBuilderActivity.BUNDLE_UPLOAD_FIELD_BUILDER_COURSE; +import static gr.thmmy.mthmmy.activities.upload.UploadFieldsBuilderActivity.BUNDLE_UPLOAD_FIELD_BUILDER_SEMESTER; +import static gr.thmmy.mthmmy.activities.upload.UploadFieldsBuilderActivity.RESULT_DESCRIPTION; +import static gr.thmmy.mthmmy.activities.upload.UploadFieldsBuilderActivity.RESULT_FILENAME; +import static gr.thmmy.mthmmy.activities.upload.UploadFieldsBuilderActivity.RESULT_TITLE; + +public class UploadActivity extends BaseActivity { + /** + * The key to use when putting upload's category String to {@link UploadActivity}'s Bundle. + */ + public static final String BUNDLE_UPLOAD_CATEGORY = "UPLOAD_CATEGORY"; + private static final String uploadIndexUrl = "https://www.thmmy.gr/smf/index.php?action=tpmod;dl=upload"; + private static final String uploadedFromThmmyPromptHtml = "
    uploaded from mTHMMY"; + /** + * Request codes used in activities for result (AFR) calls + */ + private static final int AFR_REQUEST_CODE_CHOOSE_FILE = 8; + private static final int AFR_REQUEST_CODE_CAMERA = 4; + private static final int AFR_REQUEST_CODE_FIELDS_BUILDER = 74; + + private ArrayList uploadRootCategories = new ArrayList<>(); + private ParseUploadPageTask parseUploadPageTask; + private ArrayList bundleCategory; + private String categorySelected = "-1"; + private String uploaderProfileIndex = "1"; + private String uploadFilename; + private Uri fileUri; + private String fileIcon; + + //UI elements + private MaterialProgressBar progressBar; + private LinearLayout categoriesSpinners; + private AppCompatSpinnerWithoutDefault rootCategorySpinner; + private EditText uploadTitle; + private EditText uploadDescription; + private AppCompatButton titleDescriptionBuilderButton; + private AppCompatTextView filenameHolder; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_upload); + + Bundle extras = getIntent().getExtras(); + if (extras != null) { + String tmpUploadCategoryNav = extras.getString(BUNDLE_UPLOAD_CATEGORY); + //something like "THMMY.gr > Downloads > Βασικός Κύκλος > 3ο εξάμηνο > Ηλεκτρικά Κυκλώματα ΙΙ" + if (tmpUploadCategoryNav != null && !tmpUploadCategoryNav.equals("")) { + String[] tmpSplitUploadCategoryNav = tmpUploadCategoryNav.split(">"); + + for (int i = 0; i < tmpSplitUploadCategoryNav.length; ++i) { + tmpSplitUploadCategoryNav[i] = tmpSplitUploadCategoryNav[i].trim(); + } + + if (tmpSplitUploadCategoryNav.length > 2) { + bundleCategory = new ArrayList<>(Arrays.asList(tmpSplitUploadCategoryNav).subList(2, tmpSplitUploadCategoryNav.length)); + } + } + } + + //Initialize toolbar + toolbar = findViewById(R.id.toolbar); + toolbar.setTitle("Upload"); + setSupportActionBar(toolbar); + if (getSupportActionBar() != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setDisplayShowHomeEnabled(true); + } + + createDrawer(); + drawer.setSelection(UPLOAD_ID); + + progressBar = findViewById(R.id.progressBar); + + findViewById(R.id.upload_outer_scrollview).setVerticalScrollBarEnabled(false); + categoriesSpinners = findViewById(R.id.upload_spinners); + rootCategorySpinner = findViewById(R.id.upload_spinner_category_root); + rootCategorySpinner.setOnItemSelectedListener(new CustomOnItemSelectedListener(uploadRootCategories)); + + titleDescriptionBuilderButton = findViewById(R.id.upload_title_description_builder); + titleDescriptionBuilderButton.setOnClickListener(view -> { + if (categorySelected.equals("-1")) { + Toast.makeText(view.getContext(), "Please choose a category first", Toast.LENGTH_SHORT).show(); + return; + } + + int numberOfSpinners = categoriesSpinners.getChildCount(); + + if (numberOfSpinners < 3) { + Toast.makeText(view.getContext(), "Please choose a course category", Toast.LENGTH_SHORT).show(); + return; + } + + String maybeSemester = "", maybeCourse = ""; + + if (numberOfSpinners == 5) { + if (((AppCompatSpinnerWithoutDefault) categoriesSpinners.getChildAt(numberOfSpinners - 1)). + getSelectedItemPosition() == -1) { + maybeSemester = (String) ((AppCompatSpinnerWithoutDefault) + categoriesSpinners.getChildAt(numberOfSpinners - 4)).getSelectedItem(); + maybeCourse = (String) ((AppCompatSpinnerWithoutDefault) + categoriesSpinners.getChildAt(numberOfSpinners - 2)).getSelectedItem(); + } else { + Toast.makeText(view.getContext(), "Please choose a course category", Toast.LENGTH_SHORT).show(); + } + } else if (numberOfSpinners == 4) { + maybeSemester = (String) ((AppCompatSpinnerWithoutDefault) + categoriesSpinners.getChildAt(numberOfSpinners - 3)).getSelectedItem(); + maybeCourse = (String) ((AppCompatSpinnerWithoutDefault) + categoriesSpinners.getChildAt(numberOfSpinners - 1)).getSelectedItem(); + } else { + maybeSemester = (String) ((AppCompatSpinnerWithoutDefault) + categoriesSpinners.getChildAt(numberOfSpinners - 2)).getSelectedItem(); + maybeCourse = (String) ((AppCompatSpinnerWithoutDefault) + categoriesSpinners.getChildAt(numberOfSpinners - 1)).getSelectedItem(); + } + + if (!maybeSemester.contains("εξάμηνο") && !maybeSemester.contains("Εξάμηνο")) { + Toast.makeText(view.getContext(), "Please choose a course category", Toast.LENGTH_SHORT).show(); + return; + } + if (maybeCourse == null) { + Toast.makeText(view.getContext(), "Please choose a course", Toast.LENGTH_SHORT).show(); + return; + } + + //Fixes course and semester + String course = maybeCourse.replaceAll("-", "").replace("(ΝΠΣ)", "").trim(); + String semester = maybeSemester.replaceAll("-", "").trim().substring(0, 1); + + Intent intent = new Intent(UploadActivity.this, UploadFieldsBuilderActivity.class); + Bundle builderExtras = new Bundle(); + builderExtras.putString(BUNDLE_UPLOAD_FIELD_BUILDER_COURSE, course); + builderExtras.putString(BUNDLE_UPLOAD_FIELD_BUILDER_SEMESTER, semester); + intent.putExtras(builderExtras); + startActivityForResult(intent, AFR_REQUEST_CODE_FIELDS_BUILDER); + }); + titleDescriptionBuilderButton.setEnabled(false); + + uploadTitle = findViewById(R.id.upload_title); + uploadDescription = findViewById(R.id.upload_description); + + filenameHolder = findViewById(R.id.upload_filename); + Drawable filenameDrawable = AppCompatResources.getDrawable(this, R.drawable.ic_attach_file_white_24dp); + filenameHolder.setCompoundDrawablesRelativeWithIntrinsicBounds(filenameDrawable, null, null, null); + + AppCompatButton selectFileButton = findViewById(R.id.upload_select_file_button); + Drawable selectStartDrawable = AppCompatResources.getDrawable(this, R.drawable.ic_insert_drive_file_white_24dp); + selectFileButton.setCompoundDrawablesRelativeWithIntrinsicBounds(selectStartDrawable, null, null, null); + selectFileButton.setOnClickListener(v -> { + String[] mimeTypes = {"image/jpeg", "text/html", "image/png", "image/jpg", "image/gif", + "application/pdf", "application/rar", "application/x-tar", "application/zip", + "application/msword", "image/vnd.djvu", "application/gz", "application/tar.gz"}; + + Intent intent = new Intent(Intent.ACTION_GET_CONTENT) + //.setType("*/*") + .setType("image/jpeg") + .putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes); + + startActivityForResult(intent, AFR_REQUEST_CODE_CHOOSE_FILE); + }); + + AppCompatButton takePhotoButton = findViewById(R.id.upload_take_photo_button); + Drawable takePhotoDrawable = AppCompatResources.getDrawable(this, R.drawable.ic_photo_camera_white_24dp); + takePhotoButton.setCompoundDrawablesRelativeWithIntrinsicBounds(takePhotoDrawable, null, null, null); + takePhotoButton.setOnClickListener(v -> { + Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + takePhotoIntent.putExtra("return-data", true); + takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(UploadsHelper.getCacheFile(this))); + + Intent targetedIntent = new Intent(takePhotoIntent); + List resInfo = this.getPackageManager().queryIntentActivities(takePhotoIntent, 0); + for (ResolveInfo resolveInfo : resInfo) { + String packageName = resolveInfo.activityInfo.packageName; + targetedIntent.setPackage(packageName); + } + startActivityForResult(takePhotoIntent, AFR_REQUEST_CODE_CAMERA); + }); + + FloatingActionButton uploadFAB = findViewById(R.id.upload_fab); + uploadFAB.setOnClickListener(view -> { + progressBar.setVisibility(View.VISIBLE); + + String uploadTitleText = uploadTitle.getText().toString(); + String uploadDescriptionText = uploadDescription.getText().toString(); + + if (uploadTitleText.equals("")) { + uploadTitle.setError("Required"); + } + if (fileUri == null) { + Toast.makeText(view.getContext(), "Please choose a file to upload or take a photo", Toast.LENGTH_LONG).show(); + } + if (categorySelected.equals("-1")) { + Toast.makeText(view.getContext(), "Please choose category first", Toast.LENGTH_SHORT).show(); + } + + if (categorySelected.equals("-1") || uploadTitleText.equals("") || fileUri == null) { + progressBar.setVisibility(View.GONE); + return; + } + + SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(view.getContext()); + if (sharedPrefs.getBoolean(UPLOADING_APP_SIGNATURE_ENABLE_KEY, true)) { + uploadDescriptionText += uploadedFromThmmyPromptHtml; + } + + String tempFilePath = null; + if (uploadFilename != null) { + //File should be uploaded with a certain name. Temporarily copies the file and renames it + tempFilePath = UploadsHelper.createTempFile(this, fileUri, uploadFilename); + if (tempFilePath == null) { + //Something went wrong, abort + Toast.makeText(this, "Could not create temporary file for renaming", Toast.LENGTH_SHORT).show(); + progressBar.setVisibility(View.GONE); + return; + } + } + + try { + new MultipartUploadRequest(view.getContext(), uploadIndexUrl) + .setUtf8Charset() + .addParameter("tp-dluploadtitle", uploadTitleText) + .addParameter("tp-dluploadcat", categorySelected) + .addParameter("tp-dluploadtext", uploadDescriptionText) + .addFileToUpload(tempFilePath == null + ? fileUri.toString() + : tempFilePath + , "tp-dluploadfile") + .addParameter("tp_dluploadicon", fileIcon) + .addParameter("tp-uploaduser", uploaderProfileIndex) + .setNotificationConfig(new UploadNotificationConfig()) + .setMaxRetries(2) + .setDelegate(new UploadStatusDelegate() { + @Override + public void onProgress(Context context, UploadInfo uploadInfo) { + } + + @Override + public void onError(Context context, UploadInfo uploadInfo, ServerResponse serverResponse, + Exception exception) { + Toast.makeText(context, "Upload failed", Toast.LENGTH_SHORT).show(); + UploadsHelper.deleteTempFiles(); + progressBar.setVisibility(View.GONE); + } + + @Override + public void onCompleted(Context context, UploadInfo uploadInfo, ServerResponse serverResponse) { + Toast.makeText(context, "Upload completed successfully", Toast.LENGTH_SHORT).show(); + UploadsHelper.deleteTempFiles(); + BaseApplication.getInstance().logFirebaseAnalyticsEvent("file_upload", null); + + uploadTitle.setText(null); + uploadDescription.setText(null); + fileUri = null; + filenameHolder.setText(null); + filenameHolder.setVisibility(View.GONE); + progressBar.setVisibility(View.GONE); + } + + @Override + public void onCancelled(Context context, UploadInfo uploadInfo) { + Toast.makeText(context, "Upload canceled", Toast.LENGTH_SHORT).show(); + + UploadsHelper.deleteTempFiles(); + progressBar.setVisibility(View.GONE); + } + }) + .startUpload(); + } catch (Exception exception) { + Timber.e(exception, "AndroidUploadService: %s", exception.getMessage()); + progressBar.setVisibility(View.GONE); + } + }); + + if (uploadRootCategories.isEmpty()) { + //Parses the uploads page + parseUploadPageTask = new ParseUploadPageTask(); + parseUploadPageTask.execute(uploadIndexUrl); + } else { + //Renders the already parsed data + updateUIElements(); + titleDescriptionBuilderButton.setEnabled(true); + } + } + + @Override + public void onBackPressed() { + if (drawer.isDrawerOpen()) { + drawer.closeDrawer(); + return; + } + super.onBackPressed(); + } + + @Override + protected void onResume() { + drawer.setSelection(UPLOAD_ID); + super.onResume(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (parseUploadPageTask != null && parseUploadPageTask.getStatus() != AsyncTask.Status.RUNNING) + parseUploadPageTask.cancel(true); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == AFR_REQUEST_CODE_CHOOSE_FILE) { + if (resultCode == Activity.RESULT_CANCELED || data == null) { + return; + } + + fileUri = data.getData(); + if (fileUri != null) { + String filename = UploadsHelper.filenameFromUri(this, fileUri); + filenameHolder.setText(filename); + filenameHolder.setVisibility(View.VISIBLE); + + filename = filename.toLowerCase(); + if (filename.endsWith(".jpg")) { + fileIcon = "jpg_image.gif"; + } else if (filename.endsWith(".gif")) { + fileIcon = "gif_image.gif"; + } else if (filename.endsWith(".png")) { + fileIcon = "png_image.gif"; + } else if (filename.endsWith(".html") || filename.endsWith(".htm")) { + fileIcon = "html_file.gif"; + } else if (filename.endsWith(".pdf") || filename.endsWith(".doc") || + filename.endsWith("djvu")) { + fileIcon = "text_file.gif"; + } else if (filename.endsWith(".zip") || filename.endsWith(".rar") || + filename.endsWith(".tar") || filename.endsWith(".tar.gz") || + filename.endsWith(".gz")) { + fileIcon = "archive.gif"; + } else { + fileIcon = "blank.gif"; + } + } + } else if (requestCode == AFR_REQUEST_CODE_CAMERA) { + if (resultCode == Activity.RESULT_CANCELED) { + return; + } + + Bitmap bitmap; + File cacheImageFile = UploadsHelper.getCacheFile(this); + + Uri cacheFileUri = Uri.fromFile(cacheImageFile); + fileIcon = "jpg_image.gif"; + + bitmap = UploadsHelper.getImageResized(this, cacheFileUri); + int rotation = UploadsHelper.getRotation(this, cacheFileUri); + bitmap = UploadsHelper.rotate(bitmap, rotation); + + try { + FileOutputStream out = new FileOutputStream(cacheImageFile); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); + out.flush(); + out.close(); + } catch (Exception e) { + e.printStackTrace(); + } + + String newFilename = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.FRANCE). + format(new Date()); + fileUri = Uri.parse(UploadsHelper.createTempFile(this, cacheFileUri, newFilename)); + + newFilename += ".jpg"; + filenameHolder.setText(newFilename); + filenameHolder.setVisibility(View.VISIBLE); + + UploadsHelper.deleteCacheFiles(this); + } else if (requestCode == AFR_REQUEST_CODE_FIELDS_BUILDER) { + if (resultCode == Activity.RESULT_CANCELED) { + return; + } + + uploadFilename = data.getStringExtra(RESULT_FILENAME); + uploadTitle.setText(data.getStringExtra(RESULT_TITLE)); + uploadDescription.setText(data.getStringExtra(RESULT_DESCRIPTION)); + } else { + super.onActivityResult(requestCode, resultCode, data); + } + } + + private class CustomOnItemSelectedListener implements AdapterView.OnItemSelectedListener { + private ArrayList parentCategories, childCategories; + + // Suppresses default constructor + @SuppressWarnings("unused") + private CustomOnItemSelectedListener() { + } + + CustomOnItemSelectedListener(ArrayList parentCategories) { + this.parentCategories = parentCategories; + } + + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + //Removes old, unneeded sub-category spinner(s) + int viewIndex = categoriesSpinners.indexOfChild((AppCompatSpinnerWithoutDefault) view.getParent()); + + if (viewIndex + 1 != categoriesSpinners.getChildCount()) { //Makes sure this is not the last child + categoriesSpinners.removeViews(viewIndex + 1, categoriesSpinners.getChildCount() - viewIndex - 1); + } + + categorySelected = parentCategories.get(position).getValue(); + + //Adds new sub-category spinner + if (parentCategories.get(position).hasSubCategories()) { + childCategories = parentCategories.get(position).getSubCategories(); + + String[] tmpSpinnerArray = new String[childCategories.size()]; + for (int i = 0; i < tmpSpinnerArray.length; ++i) { + tmpSpinnerArray[i] = childCategories.get(i).getCategoryTitle(); + } + + ArrayAdapter spinnerArrayAdapter = new ArrayAdapter<>(getApplicationContext(), + R.layout.spinner_item, tmpSpinnerArray); + spinnerArrayAdapter.setDropDownViewResource(R.layout.spinner_dropdown_item); + + AppCompatSpinnerWithoutDefault subSpinner = new AppCompatSpinnerWithoutDefault(categoriesSpinners.getContext()); + subSpinner.setPromptId(R.string.upload_spinners_hint); + subSpinner.setPopupBackgroundResource(R.color.primary); + subSpinner.setAdapter(spinnerArrayAdapter); + subSpinner.setOnItemSelectedListener(new CustomOnItemSelectedListener(childCategories)); + categoriesSpinners.addView(subSpinner); + + //Sets bundle selection + if (bundleCategory != null && !bundleCategory.isEmpty()) { + int bundleSelectionIndex = -1, currentIndex = 0; + + for (UploadCategory category : childCategories) { + if (bundleCategory.get(0).contains(category.getCategoryTitle() + .replace("-", "").trim())) { + bundleSelectionIndex = currentIndex; + break; + } + ++currentIndex; + } + + if (bundleSelectionIndex != -1) { + subSpinner.setSelection(bundleSelectionIndex, true); + bundleCategory.remove(0); + } + } + } + } + + @Override + public void onNothingSelected(AdapterView parent) { + } + } + + /** + * An {@link ParseTask} that handles asynchronous fetching of the upload page and parsing the + * upload categories. + */ + private class ParseUploadPageTask extends ParseTask { + @Override + protected void onPreExecute() { + progressBar.setVisibility(ProgressBar.VISIBLE); + } + + @Override + protected void parse(Document uploadPage) throws ParseException { + Elements categoriesElements; + Element uploaderProfileIndexElement; + + try { + categoriesElements = uploadPage.select("select[name='tp-dluploadcat']>option"); + uploaderProfileIndexElement = uploadPage.select("input[name=\"tp-uploaduser\"]").first(); + } catch (Exception e) { + throw new ParseException("Parsing failed (UploadActivity)"); + } + + uploaderProfileIndex = uploaderProfileIndexElement.attr("value"); + + for (Element category : categoriesElements) { + String categoryValue = category.attr("value"); + String categoryText = category.text(); + + if (categoryText.startsWith("- ")) { + //This is a level one subcategory + uploadRootCategories.get(uploadRootCategories.size() - 1).addSubCategory(categoryValue, categoryText); + } else if (categoryText.startsWith("-- ")) { + //This is a level two subcategory + UploadCategory rootLevelCategory = uploadRootCategories.get(uploadRootCategories.size() - 1); + UploadCategory firstLevelCategory = rootLevelCategory.getSubCategories().get(rootLevelCategory.getSubCategories().size() - 1); + firstLevelCategory.addSubCategory(categoryValue, categoryText); + } else if (categoryText.startsWith("--- ")) { + //This is a level three subcategory + UploadCategory rootLevelCategory = uploadRootCategories.get(uploadRootCategories.size() - 1); + UploadCategory firstLevelCategory = rootLevelCategory.getSubCategories().get(rootLevelCategory.getSubCategories().size() - 1); + UploadCategory secondLevelCategory = firstLevelCategory.getSubCategories().get(firstLevelCategory.getSubCategories().size() - 1); + secondLevelCategory.addSubCategory(categoryValue, categoryText); + } else if (categoryText.startsWith("---- ")) { + //This is a level four subcategory + UploadCategory rootLevelCategory = uploadRootCategories.get(uploadRootCategories.size() - 1); + UploadCategory firstLevelCategory = rootLevelCategory.getSubCategories().get(rootLevelCategory.getSubCategories().size() - 1); + UploadCategory secondLevelCategory = firstLevelCategory.getSubCategories().get(firstLevelCategory.getSubCategories().size() - 1); + UploadCategory thirdLevelCategory = secondLevelCategory.getSubCategories().get(secondLevelCategory.getSubCategories().size() - 1); + thirdLevelCategory.addSubCategory(categoryValue, categoryText); + } else { + //This is a root category + uploadRootCategories.add(new UploadCategory(categoryValue, categoryText)); + } + } + } + + @Override + protected void postExecution(ResultCode result) { + updateUIElements(); + titleDescriptionBuilderButton.setEnabled(true); + progressBar.setVisibility(ProgressBar.GONE); + } + } + + private void updateUIElements() { + String[] tmpSpinnerArray = new String[uploadRootCategories.size()]; + for (int i = 0; i < uploadRootCategories.size(); ++i) { + tmpSpinnerArray[i] = uploadRootCategories.get(i).getCategoryTitle(); + } + + ArrayAdapter spinnerArrayAdapter = new ArrayAdapter<>(BaseApplication.getInstance().getApplicationContext(), + R.layout.spinner_item, tmpSpinnerArray); + spinnerArrayAdapter.setDropDownViewResource(R.layout.spinner_dropdown_item); + rootCategorySpinner.setAdapter(spinnerArrayAdapter); + + //Sets bundle selection + if (bundleCategory != null) { + int bundleSelectionIndex = -1, currentIndex = 0; + + for (UploadCategory category : uploadRootCategories) { + if (bundleCategory.get(0).contains(category.getCategoryTitle())) { + bundleSelectionIndex = currentIndex; + break; + } + ++currentIndex; + } + + if (bundleSelectionIndex != -1) { + rootCategorySpinner.setSelection(bundleSelectionIndex, true); + bundleCategory.remove(0); + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadFieldsBuilderActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadFieldsBuilderActivity.java new file mode 100644 index 00000000..c5ab4829 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadFieldsBuilderActivity.java @@ -0,0 +1,516 @@ +package gr.thmmy.mthmmy.activities.upload; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.View; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.RadioGroup; +import android.widget.Toast; + +import java.util.Calendar; + +import gr.thmmy.mthmmy.R; +import timber.log.Timber; + +public class UploadFieldsBuilderActivity extends AppCompatActivity { + static final String BUNDLE_UPLOAD_FIELD_BUILDER_COURSE = "UPLOAD_FIELD_BUILDER_COURSE"; + static final String BUNDLE_UPLOAD_FIELD_BUILDER_SEMESTER = "UPLOAD_FIELD_BUILDER_SEMESTER"; + + static final String RESULT_FILENAME = "RESULT_FILENAME"; + static final String RESULT_TITLE = "RESULT_TITLE"; + static final String RESULT_DESCRIPTION = "RESULT_DESCRIPTION"; + + private String course, semester; + + private LinearLayout semesterChooserLinear; + private RadioGroup typeRadio, semesterRadio; + private EditText year; + + private TextWatcher customYearWatcher = new TextWatcher() { + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + String working = s.toString(); + boolean isValid; + + if (working.length() == 4) { + int currentYear = Calendar.getInstance().get(Calendar.YEAR); + int inputYear = Integer.parseInt(working); + + isValid = inputYear <= currentYear && inputYear > 2000; + } else { + isValid = false; + } + + if (!isValid) { + year.setError("Please enter a valid year"); + } else { + year.setError(null); + } + + } + + @Override + public void afterTextChanged(Editable s) { + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_upload_fields_builder); + + Bundle extras = getIntent().getExtras(); + if (extras != null) { + course = extras.getString(BUNDLE_UPLOAD_FIELD_BUILDER_COURSE); + semester = extras.getString(BUNDLE_UPLOAD_FIELD_BUILDER_SEMESTER); + if (course == null || course.equals("") || semester == null || semester.equals("")) { + Toast.makeText(this, "Something went wrong!", Toast.LENGTH_SHORT).show(); + Timber.e("Bundle came empty in %s", UploadFieldsBuilderActivity.class.getSimpleName()); + + Intent returnIntent = new Intent(); + setResult(Activity.RESULT_CANCELED, returnIntent); + finish(); + } + } + + //Initialize toolbar + Toolbar toolbar = findViewById(R.id.toolbar); + toolbar.setTitle(R.string.upload_fields_builder_toolbar_title); + setSupportActionBar(toolbar); + if (getSupportActionBar() != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setDisplayShowHomeEnabled(true); + } + + semesterChooserLinear = findViewById(R.id.upload_fields_builder_choose_semester); + semesterRadio = findViewById(R.id.upload_fields_builder_semester_radio_group); + semesterRadio.check(Integer.parseInt(semester) % 2 == 0 + ? R.id.upload_fields_builder_radio_button_jun + : R.id.upload_fields_builder_radio_button_feb); + + year = findViewById(R.id.upload_fields_builder_year); + year.addTextChangedListener(customYearWatcher); + + typeRadio = findViewById(R.id.upload_fields_builder_type_radio_group); + typeRadio.setOnCheckedChangeListener((group, checkedId) -> { + if (checkedId == R.id.upload_fields_builder_radio_button_notes) { + semesterChooserLinear.setVisibility(View.GONE); + } else { + semesterChooserLinear.setVisibility(View.VISIBLE); + } + }); + + findViewById(R.id.upload_fields_builder_submit).setOnClickListener(view -> { + int typeId = typeRadio.getCheckedRadioButtonId(), + semesterId = semesterRadio.getCheckedRadioButtonId(); + if (typeId == -1) { + Toast.makeText(view.getContext(), "Please choose a type for the upload", Toast.LENGTH_SHORT).show(); + return; + } else if (semesterChooserLinear.getVisibility() == View.VISIBLE && semesterId == -1) { + Toast.makeText(view.getContext(), "Please choose a semester for the upload", Toast.LENGTH_SHORT).show(); + return; + } else if (year.getText().toString().isEmpty()) { + Toast.makeText(view.getContext(), "Please choose a year for the upload", Toast.LENGTH_SHORT).show(); + return; + } + + Intent returnIntent = new Intent(); + returnIntent.putExtra(RESULT_FILENAME, buildFilename()); + returnIntent.putExtra(RESULT_TITLE, buildTitle()); + returnIntent.putExtra(RESULT_DESCRIPTION, buildDescription()); + setResult(Activity.RESULT_OK, returnIntent); + finish(); + }); + } + + @Nullable + private String buildFilename() { + switch (typeRadio.getCheckedRadioButtonId()) { + case R.id.upload_fields_builder_radio_button_exams: + return getGreeklishCourseName() + "_" + getGreeklishPeriod() + "_" + year.getText().toString(); + case R.id.upload_fields_builder_radio_button_exam_solutions: + return getGreeklishCourseName() + "_" + getGreeklishPeriod() + "_" + year.getText().toString() + "_Lyseis"; + case R.id.upload_fields_builder_radio_button_notes: + return getGreeklishCourseName() + "_" + year.getText().toString() + "_Shmeiwseis"; + default: + return null; + } + } + + @Nullable + private String buildTitle() { + switch (typeRadio.getCheckedRadioButtonId()) { + case R.id.upload_fields_builder_radio_button_exams: + return getMinifiedCourseName() + " - " + "Θέματα εξετάσεων " + getPeriod() + " " + year.getText().toString(); + case R.id.upload_fields_builder_radio_button_exam_solutions: + return getMinifiedCourseName() + " - " + "Λύσεις θεμάτων " + getPeriod() + " " + year.getText().toString(); + case R.id.upload_fields_builder_radio_button_notes: + return getMinifiedCourseName() + " - " + "Σημειώσεις παραδόσεων " + year.getText().toString(); + default: + return null; + } + } + + private String buildDescription() { + switch (typeRadio.getCheckedRadioButtonId()) { + case R.id.upload_fields_builder_radio_button_exams: + return "Θέματα εξετάσεων " + getPeriod() + " " + year.getText().toString() + " του μαθήματος \"" + course + "\""; + case R.id.upload_fields_builder_radio_button_exam_solutions: + return "Λύσεις των θεμάτων των εξετάσεων " + getPeriod() + " " + year.getText().toString() + " του μαθήματος \"" + course + "\""; + case R.id.upload_fields_builder_radio_button_notes: + return "Σημειώσεις των παραδόσεων του μαθήματος \"" + course + "\" από το " + year.getText().toString(); + default: + return null; + } + } + + private String getGreeklishPeriod() { + switch (semesterRadio.getCheckedRadioButtonId()) { + case R.id.upload_fields_builder_radio_button_feb: + return "FEB"; + case R.id.upload_fields_builder_radio_button_jun: + return "IOY"; + case R.id.upload_fields_builder_radio_button_sept: + return "SEP"; + default: + return null; + } + } + + private String getPeriod() { + switch (semesterRadio.getCheckedRadioButtonId()) { + case R.id.upload_fields_builder_radio_button_feb: + return "Φεβρουαρίου"; + case R.id.upload_fields_builder_radio_button_jun: + return "Ιουνίου"; + case R.id.upload_fields_builder_radio_button_sept: + return "Σεπτεμβρίου"; + default: + return null; + } + } + + @Nullable + private String getGreeklishCourseName() { + return getGreeklishOrMinifiedCourseName(true); + } + + @Nullable + private String getMinifiedCourseName() { + return getGreeklishOrMinifiedCourseName(false); + } + + + @Nullable + private String getGreeklishOrMinifiedCourseName(boolean greeklish) { + if (course.contains("Ψηφιακή Επεξεργασία Σήματος")) { + return greeklish ? "PSES" : "ΨΕΣ"; + } else if (course.contains("Ψηφιακή Επεξεργασία Εικόνας")) { + return greeklish ? "psee" : "ΨΕΕ"; + } else if (course.contains("Ψηφιακές Τηλεπικοινωνίες ΙΙ")) { + return greeklish ? "pshf_thlep_II" : "Ψηφιακές Τηλεπ. 2"; + } else if (course.contains("Ψηφιακές Τηλεπικοινωνίες Ι")) { + return greeklish ? "pshf_thlep_I" : "Ψηφιακές Τηλεπ. 1"; + } else if (course.contains("Ψηφιακά Φίλτρα")) { + return greeklish ? "filtra" : "Φίλτρα"; + } else if (course.contains("Ψηφιακά Συστήματα ΙΙΙ")) { + return greeklish ? "pshfiaka_III" : "Ψηφιακά 3"; + } else if (course.contains("Ψηφιακά Συστήματα ΙΙ")) { + return greeklish ? "pshfiaka_II" : "Ψηφιακά 2"; + } else if (course.contains("Ψηφιακά Συστήματα Ι")) { + return greeklish ? "pshfiaka_I" : "Ψηφιακά 1"; + } else if (course.contains("Φωτονική Τεχνολογία")) { + return greeklish ? "fwtonikh" : "Φωτονική"; + } else if (course.contains("Φυσική Ι")) { + return greeklish ? "fysikh_I" : "Φυσική 1"; + } else if (course.contains("Υψηλές Τάσεις ΙΙΙ")) { + return greeklish ? "ypshles_III" : "Υψηλές 3"; + } else if (course.contains("Υψηλές Τάσεις ΙΙ")) { + return greeklish ? "ypshles_II" : "Υψηλές 2"; + } else if (course.contains("Υψηλές Τάσεις Ι")) { + return greeklish ? "ypshles_I" : "Υψηλές 1"; + } else if (course.contains("Υψηλές Τάσεις 4")) { + return greeklish ? "ypshles_IV" : "Υψηλές 4"; + } else if (course.contains("Υπολογιστικός Ηλεκτρομαγνητισμός")) { + return greeklish ? "ypologistikos_HM" : "Υπολογιστικός Η/Μ"; + } else if (course.contains("Υπολογιστικές Μέθοδοι στα Ενεργειακά Συστήματα")) { + return greeklish ? "ymes" : "ΥΜΕΣ"; + } else if (course.contains("Τηλεπικοινωνιακή Ηλεκτρονική")) { + return greeklish ? "tilep_ilektr" : "Τηλεπ. Ηλεκτρ."; + } else if (course.contains("Τηλεοπτικά Συστήματα")) { + return greeklish ? "tileoptika" : "Τηλεοπτικά"; + } else if (course.contains("Τεχνολογία Λογισμικού")) { + return greeklish ? "SE" : "Τεχνολογία Λογισμικού"; + } else if (course.contains("Τεχνολογία Ηλεκτροτεχνικών Υλικών")) { + return greeklish ? "Hlektrotexnika_Ylika" : "Ηλεκτροτεχνικά Υλικά"; + } else if (course.contains("Τεχνολογία Ήχου και Εικόνας")) { + return greeklish ? "texn_hxoy_eikonas" : "Τεχνολογία Ήχου και Εικόνας"; + } else if (course.contains("Τεχνική Μηχανική")) { + return greeklish ? "texn_mhxan" : "Τεχν. Μηχαν."; + } else if (course.contains("Τεχνικές μη Καταστρεπτικών Δοκιμών")) { + return greeklish ? "non_destructive_tests" : "Μη Καταστρεπτικές Δοκιμές"; + } else if (course.contains("Τεχνικές Σχεδίασης με Η/Υ")) { + return greeklish ? "sxedio" : "Σχέδιο"; + } else if (course.contains("Τεχνικές Κωδικοποίησης")) { + return greeklish ? "texn_kwdikopoihshs" : "Τεχνικές Κωδικοποίησης"; + } else if (course.contains("Τεχνικές Βελτιστοποίησης")) { + return greeklish ? "veltistopoihsh" : "Βελτιστοποίηση"; + } else if (course.contains("Σύνθεση Τηλεπικοινωνιακών Διατάξεων")) { + return greeklish ? "synth_thlep_diataksewn" : "Σύνθεση Τηλεπ. Διατάξεων"; + } else if (course.contains("Σύνθεση Ενεργών και Παθητικών Κυκλωμάτων")) { + return greeklish ? "synthesh" : "Σύνθεση"; + } else if (course.contains("Σχεδίαση Συστημάτων VLSI")) { + return greeklish ? "VLSI" : "VLSI"; + } else if (course.contains("Συστήματα Υπολογιστών (Υπολογιστικά Συστήματα)")) { + return greeklish ? "sys_ypologistwn" : "Συσ. Υπολογιστών"; + } else if (course.contains("Συστήματα Πολυμέσων και Εικονική Πραγματικότητα")) { + return greeklish ? "polymesa" : "Πολυμέσα"; + } else if (course.contains("Συστήματα Μικροϋπολογιστών")) { + return greeklish ? "mikro_I" : "Μίκρο 1"; + } else if (course.contains("Συστήματα Ηλεκτροκίνησης")) { + return greeklish ? "hlektrokinhsh" : "Ηλεκτροκίνηση"; + } else if (course.contains("Συστήματα Ηλεκτρικής Ενέργειας ΙΙΙ")) { + return greeklish ? "SHE_III" : "ΣΗΕ 3"; + } else if (course.contains("Συστήματα Ηλεκτρικής Ενέργειας ΙΙ")) { + return greeklish ? "SHE_II" : "ΣΗΕ 2"; + } else if (course.contains("Συστήματα Ηλεκτρικής Ενέργειας Ι")) { + return greeklish ? "SHE_I" : "ΣΗΕ 1"; + } else if (course.contains("Συστήματα Αυτομάτου Ελέγχου ΙΙI")) { + return greeklish ? "SAE_III" : "ΣΑΕ 3"; + } else if (course.contains("Συστήματα Αυτομάτου Ελέγχου ΙΙ")) { + return greeklish ? "SAE_II" : "ΣΑΕ 2"; + } else if (course.contains("Συστήματα Αυτομάτου Ελέγχου Ι")) { + return greeklish ? "SAE_1" : "ΣΑΕ 1"; + } else if (course.contains("Στοχαστικό Σήμα")) { + return greeklish ? "stox_shma" : "Στοχ. Σήμα"; + } else if (course.contains("Σταθμοί Παραγωγής Ηλεκτρικής Ενέργειας")) { + return greeklish ? "SPHE" : "ΣΠΗΕ"; + } else if (course.contains("Σερβοκινητήρια Συστήματα")) { + return greeklish ? "servo" : "Σέρβο"; + } else if (course.contains("Σήματα και Συστήματα")) { + return greeklish ? "analog_shma" : "Σύματα & Συστήματα"; + } else if (course.contains("Ρομποτική")) { + return greeklish ? "rompotikh" : "Ρομποτική"; + } else if (course.contains("Προσομοίωση και Μοντελοποίηση Συστημάτων")) { + return greeklish ? "montelopoihsh" : "Μοντελοποίηση"; + } else if (course.contains("Προηγμένες Τεχνικές Επεξεργασίας Σήματος")) { + return greeklish ? "ptes" : "ΠΤΕΣ"; + } else if (course.contains("Προγραμματιστικές Τεχνικές")) { + return greeklish ? "cpp" : "Προγραμματ. Τεχν."; + } else if (course.contains("Προγραμματιζόμενα Κυκλώματα ASIC")) { + return greeklish ? "asic" : "ASIC"; + } else if (course.contains("Παράλληλα και Κατανεμημένα Συστήματα")) { + return greeklish ? "parallhla" : "Παράλληλα"; + } else if (course.contains("Οργάνωση και Διοίκηση Εργοστασίων")) { + return greeklish ? "organ_dioik_ergostasiwn" : "Οργάνωση και Διοίκηση Εργοστασίων"; + } else if (course.contains("Οργάνωση Υπολογιστών")) { + return greeklish ? "org_ypol" : "Οργάνωση Υπολ."; + } else if (course.contains("Οπτική ΙΙ")) { + return greeklish ? "optikh_II" : "Οπτική 2"; + } else if (course.contains("Οπτική Ι")) { + return greeklish ? "optikh_I" : "Οπτική 1"; + } else if (course.contains("Οπτικές Επικοινωνίες")) { + return greeklish ? "optikes_thlep" : "Οπτικές Τηλεπ."; + } else if (course.contains("Μικροκύματα II")) { + return greeklish ? "mikrokymata_II" : "Μικροκύματα 2"; + } else if (course.contains("Μικροκύματα I")) { + return greeklish ? "mikrokymata_I" : "Μικροκύματα 1"; + } else if (course.contains("Μικροκυματική Τηλεπισκόπηση")) { + return greeklish ? "thlepiskophsh" : "Τηλεπισκόπηση"; + } else if (course.contains("Μικροεπεξεργαστές και Περιφερειακά")) { + return greeklish ? "mikro_II" : "Μίκρο 2"; + } else if (course.contains("Μετάδοση Θερμότητας")) { + return greeklish ? "metadosi_therm" : "Μετάδοση Θερμ."; + } else if (course.contains("Λογισμός ΙΙ")) { + return greeklish ? "logismos_II" : "Λογισμός 2"; + } else if (course.contains("Λογισμός Ι")) { + return greeklish ? "logismos_I" : "Λογισμός 1"; + } else if (course.contains("Λογική Σχεδίαση")) { + return greeklish ? "logiki_sxediash" : "Λογική Σχεδίαση"; + } else if (course.contains("Λειτουργικά Συστήματα")) { + return greeklish ? "OS" : "Λειτουργικά"; + } else if (course.contains("Κινητές και Δορυφορικές Επικοινωνίες")) { + return greeklish ? "kinhtes_doryforikes_epik" : "Κινητές & Δορυφορικές Επικοινωνίες"; + } else if (course.contains("Κβαντική Φυσική")) { + return greeklish ? "kvantikh" : "Κβαντική"; + } else if (course.contains("Θεωρία και Τεχνολογία Πυρηνικών Αντιδραστήρων")) { + return greeklish ? "texn_antidrasthrwn" : "Τεχνολογία Αντιδραστήρων"; + } else if (course.contains("Θεωρία Υπολογισμών και Αλγορίθμων")) { + return greeklish ? "thya" : "ΘΥΑ"; + } else if (course.contains("Θεωρία Σκέδασης")) { + return greeklish ? "skedash" : "Σκέδαση"; + } else if (course.contains("Θεωρία Σημάτων και Γραμμικών Συστημάτων")) { + return greeklish ? "analog_shma" : "Σύματα & Συστήματα"; + } else if (course.contains("Θεωρία Πληροφοριών")) { + return greeklish ? "theoria_plir" : "Θεωρία Πληρ."; + } else if (course.contains("Θεωρία Πιθανοτήτων και Στατιστική")) { + return greeklish ? "pithanothtes" : "Πιθανότητες"; + } else if (course.contains("Ημιαγωγά Υλικά: Θεωρία-Διατάξεις")) { + return greeklish ? "Hmiagwga_Ylika" : "Ημιαγωγά Υλικά"; + } else if (course.contains("Ηλεκτρονική ΙΙΙ")) { + return greeklish ? "hlektronikh_III" : "Ηλεκτρονική 3"; + } else if (course.contains("Ηλεκτρονική ΙΙ")) { + return greeklish ? "hlektronikh_2" : "Ηλεκτρονική 2"; + } else if (course.contains("Ηλεκτρονική Ι")) { + return greeklish ? "hlektronikh_1" : "Ηλεκτρονική 1"; + } else if (course.contains("Ηλεκτρονικές Διατάξεις και Μετρήσεις")) { + return greeklish ? "hlektron_diatakseis_metrhseis" : "Ηλεκτρονικές Διατάξεις και Μετρήσεις"; + } else if (course.contains("Ηλεκτρονικά Ισχύος ΙΙ")) { + return greeklish ? "isxyos_II" : "Ισχύος 2"; + } else if (course.contains("Ηλεκτρονικά Ισχύος Ι")) { + return greeklish ? "isxyos_I" : "Ισχύος 1"; + } else if (course.contains("Ηλεκτρομαγνητικό Πεδίο ΙΙ")) { + return greeklish ? "pedio_II" : "Πεδίο 2"; + } else if (course.contains("Ηλεκτρομαγνητικό Πεδίο Ι")) { + return greeklish ? "pedio_I" : "Πεδίο 1"; + } else if (course.contains("Ηλεκτρομαγνητική Συμβατότητα")) { + return greeklish ? "HM_symvatothta" : "H/M Συμβατότητα"; + } else if (course.contains("Ηλεκτρολογικά Υλικά")) { + return greeklish ? "ylika" : "Ηλεκτρ. Υλικά"; + } else if (course.contains("Ηλεκτρική Οικονομία")) { + return greeklish ? "hlektr_oikonomia" : "Ηλεκτρική Οικονομία"; + } else if (course.contains("Ηλεκτρικές Μηχανές Γ'")) { + return greeklish ? "mhxanes_C" : "Μηχανές Γ"; + } else if (course.contains("Ηλεκτρικές Μηχανές Β'")) { + return greeklish ? "mhxanes_B" : "Μηχανές Β"; + } else if (course.contains("Ηλεκτρικές Μηχανές Α'")) { + return greeklish ? "mhxanes_A" : "Μηχανές Α"; + } else if (course.contains("Ηλεκτρικές Μετρήσεις ΙΙ")) { + return greeklish ? "metrhseis_II" : "Μετρήσεις 2"; + } else if (course.contains("Ηλεκτρικές Μετρήσεις Ι")) { + return greeklish ? "metrhseis_1" : "Μετρήσεις 1"; + } else if (course.contains("Ηλεκτρικά Κυκλώματα ΙΙΙ")) { + return greeklish ? "kyklwmata_I" : "Κυκλώματα 3"; + } else if (course.contains("Ηλεκτρικά Κυκλώματα ΙΙ")) { + return greeklish ? "kyklwmata_II" : "Κυκλώματα 2"; + } else if (course.contains("Ηλεκτρικά Κυκλώματα Ι")) { + return greeklish ? "kyklwmata_I" : "Κυκλώματα 1"; + } else if (course.contains("Ηλεκτρακουστική ΙΙ")) { + return greeklish ? "hlektroakoystikh_II" : "Ηλεκτροακουστική 2"; + } else if (course.contains("Ηλεκτρακουστική Ι")) { + return greeklish ? "hlektroakoystikh_I" : "Ηλεκτροακουστική 1"; + } else if (course.contains("Εφαρμοσμένη Θερμοδυναμική")) { + return greeklish ? "thermodynamikh" : "Θερμοδυναμική"; + } else if (course.contains("Εφαρμοσμένα Μαθηματικά ΙΙ")) { + return greeklish ? "efarmosmena_math_II" : "Εφαρμοσμένα 2"; + } else if (course.contains("Εφαρμοσμένα Μαθηματικά Ι")) { + return greeklish ? "efarmosmena_math_I" : "Εφαρμοσμένα 1"; + } else if (course.contains("Εφαρμογές Τηλεπικοινωνιακών Διατάξεων")) { + return greeklish ? "efarm_thlep_diataksewn" : "Εφαρμογές Τηλεπ. Διατάξεων"; + } else if (course.contains("Ευφυή Συστήματα Ρομπότ")) { + return greeklish ? "eufuh" : "Ευφυή"; + } else if (course.contains("Ευρυζωνικά Δίκτυα")) { + return greeklish ? "eyryzwnika" : "Ευρυζωνικά"; + } else if (course.contains("Επιχειρησιακή Έρευνα")) { + return greeklish ? "epixeirisiaki" : "Επιχειρησιακή Έρευνα"; + } else if (course.contains("Ενσωματωμένα Συστήματα Πραγματικού Χρόνου")) { + return greeklish ? "enswmatwmena" : "Ενσωματωμένα"; + } else if (course.contains("Εισαγωγή στις εφαρμογές Πυρηνικής Τεχνολογίας")) { + return greeklish ? "Intro_Purhnikh_Texn" : "Εισ. Πυρηνικη Τεχν."; + } else if (course.contains("Εισαγωγή στην Πολιτική Οικονομία")) { + return greeklish ? "polit_oik" : "Πολιτική Οικονομία"; + } else if (course.contains("Εισαγωγή στην Ενεργειακή Τεχνολογία ΙΙ")) { + return greeklish ? "EET_2" : "ΕΕΤ2"; + } else if (course.contains("Εισαγωγή στην Ενεργειακή Τεχνολογία Ι")) { + return greeklish ? "EET_I" : "ΕΕΤ 1"; + } else if (course.contains("Ειδικές Κεραίες, Σύνθεση Κεραιών")) { + return greeklish ? "eidikes_keraies" : "Ειδικές Κεραίες, Σύνθεση Κεραιών"; + } else if (course.contains("Ειδικές Αρχιτεκτονικές Υπολογιστών")) { + return greeklish ? "eidikes_arx_ypolog" : "Ειδικές Αρχιτεκτονικές Υπολογιστών"; + } else if (course.contains("Ειδικά Κεφάλαια Συστημάτων Ηλεκτρικής Ενέργειας")) { + return greeklish ? "ekshe" : "ΕΚΣΗΕ"; + } else if (course.contains("Ειδικά Κεφάλαια Ηλεκτρομαγνητικού Πεδίου Ι")) { + return greeklish ? "eidika_kef_HM_pedioy_I" : "Ειδικά Κεφάλαια Ηλεκτρομαγνητικού Πεδίου Ι"; + } else if (course.contains("Ειδικά Κεφάλαια Διαφορικών Εξισώσεων")) { + return greeklish ? "eidika_kef_diaf_eksis" : "Ειδικά Κεφάλαια Διαφορικών Εξισώσεων"; + } else if (course.contains("Δομημένος Προγραμματισμός")) { + return greeklish ? "C" : "Δομ. Προγραμμ."; + } else if (course.contains("Δομές Δεδομένων")) { + return greeklish ? "dom_dedomenwn" : "Δομ. Δεδομ."; + } else if (course.contains("Διαχείριση Συστημάτων Ηλεκτρικής Ενέργειας")) { + return greeklish ? "dshe" : "ΔΣΗΕ"; + } else if (course.contains("Διαφορικές Εξισώσεις")) { + return greeklish ? "diaforikes" : "Διαφορικές"; + } else if (course.contains("Διανεμημένη Παραγωγή")) { + return greeklish ? "dian_paragwgh" : "Διανεμημένη Παραγωγή"; + } else if (course.contains("Διακριτά μαθηματικά")) { + return greeklish ? "diakrita" : "Διακριτά Μαθηματικά"; + } else if (course.contains("Διακριτά Μαθηματικά")) { + return greeklish ? "diakrita" : "Διακριτά Μαθηματικά"; + } else if (course.contains("Διάδοση Ηλεκτρομαγνητικού Κύματος Ι (πρώην Πεδίο ΙΙΙ)")) { + return greeklish ? "diadosi_1" : "Διάδοση 1"; + } else if (course.contains("Διάδοση Η/Μ Κύματος ΙΙ")) { + return greeklish ? "diadosi_II" : "Διάδοση 2"; + } else if (course.contains("Δίκτυα Υπολογιστών ΙΙ")) { + return greeklish ? "diktya_II" : "Δίκτυα 2"; + } else if (course.contains("Δίκτυα Υπολογιστών Ι")) { + return greeklish ? "diktya_I" : "Δίκτυα 1"; + } else if (course.contains("Δίκτυα Τηλεπικοινωνιών")) { + return greeklish ? "diktya_thlep" : "Δίκτυα Τηλέπ."; + } else if (course.contains("Γραφική με Υπολογιστές")) { + return greeklish ? "grafikh" : "Γραφική"; + } else if (course.contains("Γραμμική Άλγεβρα")) { + return greeklish ? "grammikh_algebra" : "Γραμμ. Άλγεβρ."; + } else if (course.contains("Γεωηλεκτρομαγνητισμός")) { + return greeklish ? "geohlektromagnitismos" : "Γεωηλεκτρομαγνητισμός"; + } else if (course.contains("Βιοϊατρική Τεχνολογία")) { + return greeklish ? "vioiatriki" : "Βιοιατρική"; + } else if (course.contains("Βιομηχανική Πληροφορική")) { + return greeklish ? "viomix_plir" : "Βιομηχανική Πληρ"; + } else if (course.contains("Βιομηχανικά Ηλεκτρονικά")) { + return greeklish ? "bhomix_hlektronika" : "Βιομηχανικά Ηλεκτρονικά"; + } else if (course.contains("Βάσεις Δεδομένων")) { + return greeklish ? "vaseis" : "Βάσεις"; + } else if (course.contains("Ασύρματος Τηλεπικοινωνία ΙΙ")) { + return greeklish ? "asyrmatos_II" : "Ασύρματος 2"; + } else if (course.contains("Ασύρματος Τηλεπικοινωνία Ι")) { + return greeklish ? "asyrmatos_I" : "Ασύρματος 1"; + } else if (course.contains("Ασφάλεια Πληροφοριακών Συστημάτων")) { + return greeklish ? "asfaleia" : "Ασφάλεια"; + } else if (course.contains("Ασαφή Συστήματα")) { + return greeklish ? "asafh" : "Ασαφή"; + } else if (course.contains("Αρχιτεκτονική Υπολογιστών")) { + return greeklish ? "arx_ypologistwn" : "Αρχ. Υπολογιστών"; + } else if (course.contains("Αρχές Παράλληλης Επεξεργασίας")) { + return greeklish ? "arxes_parall_epeksergasias" : "Αρχές Παράλληλης Επεξεργασίας"; + } else if (course.contains("Αρχές Οικονομίας")) { + return greeklish ? "arx_oikonomias" : "Αρχές Οικονομίας"; + } else if (course.contains("Αριθμητική Ανάλυση")) { + return greeklish ? "arith_anal" : "Αριθμ. Ανάλυση"; + } else if (course.contains("Αξιοπιστία Συστημάτων")) { + return greeklish ? "aksiopistia_systhmatwn" : "Αξιοπιστία Συστημάτων"; + } else if (course.contains("Αντικειμενοστραφής Προγραμματισμός")) { + return greeklish ? "OOP" : "Αντικειμενοστραφής"; + } else if (course.contains("Αναλογικές Τηλεπικοινωνίες (πρώην Τηλεπικοινωνιακά Συστήματα Ι)")) { + return greeklish ? "anal_thlep" : "Αναλογικές Τηλεπ."; + } else if (course.contains("Αναγνώριση Προτύπων")) { + return greeklish ? "protipa" : "Αναγνώριση Προτύπων"; + } else if (course.contains("Ανάλυση και Σχεδίαση Αλγορίθμων")) { + return greeklish ? "algorithms" : "Αλγόριθμοι"; + } else if (course.contains("Ανάλυση Χρονοσειρών")) { + return greeklish ? "xronoseires" : "Χρονοσειρές"; + } else if (course.contains("Ανάλυση Συστημάτων Ηλεκτρικής Ενέργειας")) { + return greeklish ? "ASHE" : "ΑΣΗΕ"; + } else if (course.contains("Ανάλυση Ηλεκτρικών Κυκλωμάτων με Υπολογιστή")) { + return greeklish ? "analysh_hlektr_kykl" : "Ανάλυση Ηλεκτρικ. Κυκλ. με Υπολογιστή"; + } else if (course.contains("Ακουστική ΙΙ")) { + return greeklish ? "akoystikh_II" : "Ακουστική 2"; + } else if (course.contains("Ακουστική Ι")) { + return greeklish ? "akoystikh_I" : "Ακουστική 1"; + } else { + return null; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadsHelper.java b/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadsHelper.java new file mode 100644 index 00000000..9529d402 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadsHelper.java @@ -0,0 +1,199 @@ +package gr.thmmy.mthmmy.activities.upload; + +import android.content.Context; +import android.content.res.AssetFileDescriptor; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Matrix; +import android.media.ExifInterface; +import android.net.Uri; +import android.os.Environment; +import android.provider.OpenableColumns; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.widget.Toast; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import timber.log.Timber; + +class UploadsHelper { + private static final int DEFAULT_MIN_WIDTH_QUALITY = 400; + private static final String CACHE_IMAGE_NAME = "tempUploadFile.jpg"; + + @NonNull + static String filenameFromUri(Context context, Uri uri) { + String filename = null; + if (uri.getScheme().equals("content")) { + try (Cursor cursor = context.getContentResolver().query(uri, null, null, null, null)) { + if (cursor != null && cursor.moveToFirst()) { + filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); + } + } + } + if (filename == null) { + filename = uri.getPath(); + int cut = filename.lastIndexOf('/'); + if (cut != -1) { + filename = filename.substring(cut + 1); + } + } + + return filename; + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + @Nullable + static String createTempFile(Context context, Uri fileUri, String newFilename) { + String oldFilename = filenameFromUri(context, fileUri); + String fileExtension = oldFilename.substring(oldFilename.indexOf(".")); + String destinationFilename = Environment.getExternalStorageDirectory().getPath() + + File.separatorChar + "~tmp_mThmmy_uploads" + File.separatorChar + newFilename + fileExtension; + + File tempDirectory = new File(android.os.Environment.getExternalStorageDirectory().getPath() + + File.separatorChar + "~tmp_mThmmy_uploads"); + + if (!tempDirectory.exists()) { + if (!tempDirectory.mkdirs()) { + Timber.w("Temporary directory build returned false in %s", UploadActivity.class.getSimpleName()); + Toast.makeText(context, "Couldn't create temporary directory", Toast.LENGTH_SHORT).show(); + return null; + } + } + + InputStream inputStream; + BufferedInputStream bufferedInputStream = null; + BufferedOutputStream bufferedOutputStream = null; + + try { + inputStream = context.getContentResolver().openInputStream(fileUri); + if (inputStream == null) { + Timber.w("Input stream was null, %s", UploadActivity.class.getSimpleName()); + return null; + } + + bufferedInputStream = new BufferedInputStream(inputStream); + bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(destinationFilename, false)); + byte[] buf = new byte[1024]; + bufferedInputStream.read(buf); + do { + bufferedOutputStream.write(buf); + } while (bufferedInputStream.read(buf) != -1); + } catch (IOException exception) { + exception.printStackTrace(); + } finally { + try { + if (bufferedInputStream != null) bufferedInputStream.close(); + if (bufferedOutputStream != null) bufferedOutputStream.close(); + } catch (IOException exception) { + exception.printStackTrace(); + } + } + + return destinationFilename; + } + + static File getCacheFile(Context context) { + File imageFile = new File(context.getExternalCacheDir(), CACHE_IMAGE_NAME); + //noinspection ResultOfMethodCallIgnored + imageFile.getParentFile().mkdirs(); + return imageFile; + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + static void deleteTempFiles() { + File tempFilesDirectory = new File(Environment.getExternalStorageDirectory().getPath() + + File.separatorChar + "~tmp_mThmmy_uploads"); + + if (tempFilesDirectory.isDirectory()) { + String[] tempFilesArray = tempFilesDirectory.list(); + for (String tempFile : tempFilesArray) { + new File(tempFilesDirectory, tempFile).delete(); + } + tempFilesDirectory.delete(); + } + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + static void deleteCacheFiles(Context context) { + File cacheFilesDirectory = context.getExternalCacheDir(); + assert cacheFilesDirectory != null; + String[] tempFilesArray = cacheFilesDirectory.list(); + for (String tempFile : tempFilesArray) { + new File(cacheFilesDirectory, tempFile).delete(); + } + } + + /** + * Resize to avoid using too much memory loading big images (e.g.: 2560*1920) + **/ + static Bitmap getImageResized(Context context, Uri selectedImage) { + Bitmap bm; + int[] sampleSizes = new int[]{5, 3, 2, 1}; + int i = 0; + do { + bm = decodeBitmap(context, selectedImage, sampleSizes[i]); + i++; + } while (bm.getWidth() < DEFAULT_MIN_WIDTH_QUALITY && i < sampleSizes.length); + return bm; + } + + private static Bitmap decodeBitmap(Context context, Uri theUri, int sampleSize) { + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inSampleSize = sampleSize; + + AssetFileDescriptor fileDescriptor = null; + try { + fileDescriptor = context.getContentResolver().openAssetFileDescriptor(theUri, "r"); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + + assert fileDescriptor != null; + return BitmapFactory.decodeFileDescriptor( + fileDescriptor.getFileDescriptor(), null, options); + } + + static int getRotation(Context context, Uri imageUri) { + int rotation = 0; + try { + + context.getContentResolver().notifyChange(imageUri, null); + ExifInterface exif = new ExifInterface(imageUri.getPath()); + int orientation = exif.getAttributeInt( + ExifInterface.TAG_ORIENTATION, + ExifInterface.ORIENTATION_NORMAL); + + switch (orientation) { + case ExifInterface.ORIENTATION_ROTATE_270: + rotation = 270; + break; + case ExifInterface.ORIENTATION_ROTATE_180: + rotation = 180; + break; + case ExifInterface.ORIENTATION_ROTATE_90: + rotation = 90; + break; + } + } catch (Exception e) { + e.printStackTrace(); + } + return rotation; + } + + static Bitmap rotate(Bitmap bm, int rotation) { + if (rotation != 0) { + Matrix matrix = new Matrix(); + matrix.postRotate(rotation); + return Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true); + } + return bm; + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/base/BaseActivity.java b/app/src/main/java/gr/thmmy/mthmmy/base/BaseActivity.java index 9150065d..61b6e3ae 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/base/BaseActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/base/BaseActivity.java @@ -2,11 +2,11 @@ package gr.thmmy.mthmmy.base; import android.Manifest; import android.app.ProgressDialog; +import android.arch.lifecycle.ViewModelProviders; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; -import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; @@ -15,7 +15,9 @@ import android.support.annotation.NonNull; import android.support.design.widget.BottomSheetDialog; import android.support.v4.content.ContextCompat; import android.support.v4.content.FileProvider; +import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; +import android.support.v7.preference.PreferenceManager; import android.support.v7.widget.Toolbar; import android.view.MenuItem; import android.view.View; @@ -34,25 +36,31 @@ import com.mikepenz.materialdrawer.Drawer; import com.mikepenz.materialdrawer.DrawerBuilder; import com.mikepenz.materialdrawer.model.PrimaryDrawerItem; import com.mikepenz.materialdrawer.model.ProfileDrawerItem; -import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; -import com.mikepenz.materialdrawer.model.interfaces.IProfile; +import java.io.BufferedReader; import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; import java.util.ArrayList; import gr.thmmy.mthmmy.R; import gr.thmmy.mthmmy.activities.AboutActivity; -import gr.thmmy.mthmmy.activities.bookmarks.BookmarkActivity; import gr.thmmy.mthmmy.activities.LoginActivity; +import gr.thmmy.mthmmy.activities.bookmarks.BookmarkActivity; import gr.thmmy.mthmmy.activities.downloads.DownloadsActivity; import gr.thmmy.mthmmy.activities.main.MainActivity; import gr.thmmy.mthmmy.activities.profile.ProfileActivity; +import gr.thmmy.mthmmy.activities.settings.SettingsActivity; import gr.thmmy.mthmmy.model.Bookmark; import gr.thmmy.mthmmy.model.ThmmyFile; import gr.thmmy.mthmmy.services.DownloadHelper; import gr.thmmy.mthmmy.session.SessionManager; import gr.thmmy.mthmmy.utils.FileUtils; +import gr.thmmy.mthmmy.viewmodel.BaseViewModel; import okhttp3.OkHttpClient; +import ru.noties.markwon.LinkResolverDef; +import ru.noties.markwon.Markwon; +import ru.noties.markwon.SpannableConfiguration; import timber.log.Timber; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; @@ -61,7 +69,9 @@ import static gr.thmmy.mthmmy.activities.downloads.DownloadsActivity.BUNDLE_DOWN import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_THUMBNAIL_URL; import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_URL; import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_USERNAME; +import static gr.thmmy.mthmmy.activities.settings.SettingsActivity.DEFAULT_HOME_TAB; import static gr.thmmy.mthmmy.services.DownloadHelper.SAVE_DIR; +import static gr.thmmy.mthmmy.session.SessionManager.SUCCESS; import static gr.thmmy.mthmmy.utils.FileUtils.getMimeType; public abstract class BaseActivity extends AppCompatActivity { @@ -72,26 +82,29 @@ public abstract class BaseActivity extends AppCompatActivity { protected static SessionManager sessionManager; //Bookmarks - private static final String BOOKMARKS_SHARED_PREFS = "bookmarksSharedPrefs"; - private static final String BOOKMARKED_TOPICS_KEY = "bookmarkedTopicsKey"; + public static final String BOOKMARKS_SHARED_PREFS = "bookmarksSharedPrefs"; + public static final String BOOKMARKED_TOPICS_KEY = "bookmarkedTopicsKey"; private static final String BOOKMARKED_BOARDS_KEY = "bookmarkedBoardsKey"; protected Bookmark thisPageBookmark; private MenuItem thisPageBookmarkMenuButton; + private SharedPreferences sharedPreferences; private SharedPreferences bookmarksFile; private ArrayList topicsBookmarked; private ArrayList boardsBookmarked; - private static Drawable bookmarked; - private static Drawable notBookmarked; //Common UI elements protected Toolbar toolbar; protected Drawer drawer; private MainActivity mainActivity; + private boolean isMainActivity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + + isMainActivity = this instanceof MainActivity; + if (client == null) client = BaseApplication.getInstance().getClient(); //must check every time - e.g. @@ -99,29 +112,23 @@ public abstract class BaseActivity extends AppCompatActivity { if (sessionManager == null) sessionManager = BaseApplication.getInstance().getSessionManager(); - if (bookmarked == null) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - bookmarked = getResources().getDrawable(R.drawable.ic_bookmark_true, null); - } else //noinspection deprecation - bookmarked = getResources().getDrawable(R.drawable.ic_bookmark_true); - } - if (notBookmarked == null) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - notBookmarked = getResources().getDrawable(R.drawable.ic_bookmark_false, null); - } else //noinspection deprecation - notBookmarked = getResources().getDrawable(R.drawable.ic_bookmark_false); - } if (topicsBookmarked == null || boardsBookmarked == null) { bookmarksFile = getSharedPreferences(BOOKMARKS_SHARED_PREFS, Context.MODE_PRIVATE); loadSavedBookmarks(); } + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + + BaseViewModel baseViewModel = ViewModelProviders.of(this).get(BaseViewModel.class); + baseViewModel.getCurrentPageBookmark().observe(this, thisPageBookmark -> setTopicBookmark(thisPageBookmarkMenuButton)); } @Override protected void onResume() { super.onResume(); updateDrawer(); + if(!sharedPreferences.getBoolean(getString(R.string.user_consent_shared_preference_key),false)) + showUserConsentDialog(); } @Override @@ -144,13 +151,15 @@ public abstract class BaseActivity extends AppCompatActivity { //------------------------------------------DRAWER STUFF---------------------------------------- protected static final int HOME_ID = 0; protected static final int DOWNLOADS_ID = 1; - protected static final int BOOKMARKS_ID = 2; - protected static final int LOG_ID = 3; - protected static final int ABOUT_ID = 4; + protected static final int UPLOAD_ID = 2; + protected static final int BOOKMARKS_ID = 3; + protected static final int LOG_ID = 4; + protected static final int ABOUT_ID = 5; + protected static final int SETTINGS_ID = 6; private AccountHeader accountHeader; private ProfileDrawerItem profileDrawerItem; - private PrimaryDrawerItem downloadsItem, loginLogoutItem; + private PrimaryDrawerItem downloadsItem, uploadItem, loginLogoutItem; private IconicsDrawable loginIcon, logoutIcon; /** @@ -161,10 +170,9 @@ public abstract class BaseActivity extends AppCompatActivity { final int selectedPrimaryColor = ContextCompat.getColor(this, R.color.primary_dark); final int selectedSecondaryColor = ContextCompat.getColor(this, R.color.accent); - PrimaryDrawerItem homeItem, bookmarksItem, aboutItem; - IconicsDrawable homeIcon, homeIconSelected, downloadsIcon, downloadsIconSelected, - bookmarksIcon, bookmarksIconSelected, aboutIcon, - aboutIconSelected; + PrimaryDrawerItem homeItem, bookmarksItem, settingsItem, aboutItem; + IconicsDrawable homeIcon, homeIconSelected, downloadsIcon, downloadsIconSelected, uploadIcon, uploadIconSelected, settingsIcon, + settingsIconSelected, bookmarksIcon, bookmarksIconSelected, aboutIcon, aboutIconSelected; //Drawer Icons homeIcon = new IconicsDrawable(this) @@ -191,6 +199,22 @@ public abstract class BaseActivity extends AppCompatActivity { .icon(GoogleMaterial.Icon.gmd_file_download) .color(selectedSecondaryColor); + uploadIcon = new IconicsDrawable(this) + .icon(GoogleMaterial.Icon.gmd_file_upload) + .color(primaryColor); + + uploadIconSelected = new IconicsDrawable(this) + .icon(GoogleMaterial.Icon.gmd_file_upload) + .color(selectedSecondaryColor); + + settingsIcon = new IconicsDrawable(this) + .icon(GoogleMaterial.Icon.gmd_settings) + .color(primaryColor); + + settingsIconSelected = new IconicsDrawable(this) + .icon(GoogleMaterial.Icon.gmd_settings) + .color(selectedSecondaryColor); + loginIcon = new IconicsDrawable(this) .icon(FontAwesome.Icon.faw_sign_in) .color(primaryColor); @@ -217,6 +241,22 @@ public abstract class BaseActivity extends AppCompatActivity { .withIcon(homeIcon) .withSelectedIcon(homeIconSelected); + downloadsItem = new PrimaryDrawerItem() // Don't put it in the if below + .withTextColor(primaryColor) + .withSelectedColor(selectedPrimaryColor) + .withSelectedTextColor(selectedSecondaryColor) + .withIdentifier(DOWNLOADS_ID) + .withName(R.string.downloads) + .withIcon(downloadsIcon) + .withSelectedIcon(downloadsIconSelected); +// uploadItem = new PrimaryDrawerItem() +// .withTextColor(primaryColor) +// .withSelectedColor(selectedPrimaryColor) +// .withSelectedTextColor(selectedSecondaryColor) +// .withIdentifier(UPLOAD_ID) +// .withName(R.string.upload) +// .withIcon(uploadIcon) +// .withSelectedIcon(uploadIconSelected); if (sessionManager.isLoggedIn()) //When logged in { @@ -227,14 +267,6 @@ public abstract class BaseActivity extends AppCompatActivity { .withName(R.string.logout) .withIcon(logoutIcon) .withSelectable(false); - downloadsItem = new PrimaryDrawerItem() - .withTextColor(primaryColor) - .withSelectedColor(selectedPrimaryColor) - .withSelectedTextColor(selectedSecondaryColor) - .withIdentifier(DOWNLOADS_ID) - .withName(R.string.downloads) - .withIcon(downloadsIcon) - .withSelectedIcon(downloadsIconSelected); } else loginLogoutItem = new PrimaryDrawerItem() .withTextColor(primaryColor) @@ -243,6 +275,15 @@ public abstract class BaseActivity extends AppCompatActivity { .withIcon(loginIcon) .withSelectable(false); + settingsItem = new PrimaryDrawerItem() + .withTextColor(primaryColor) + .withSelectedColor(selectedPrimaryColor) + .withSelectedTextColor(selectedSecondaryColor) + .withIdentifier(SETTINGS_ID) + .withName(R.string.settings) + .withIcon(settingsIcon) + .withSelectedIcon(settingsIconSelected); + bookmarksItem = new PrimaryDrawerItem() .withTextColor(primaryColor) .withSelectedColor(selectedPrimaryColor) @@ -271,26 +312,24 @@ public abstract class BaseActivity extends AppCompatActivity { .withSelectionListEnabledForSingleProfile(false) .withHeaderBackground(R.color.primary) .addProfiles(profileDrawerItem) - .withOnAccountHeaderListener(new AccountHeader.OnAccountHeaderListener() { - @Override - public boolean onProfileChanged(View view, IProfile profile, boolean currentProfile) { - if (sessionManager.isLoggedIn()) { - Intent intent = new Intent(BaseActivity.this, ProfileActivity.class); - Bundle extras = new Bundle(); - extras.putString(BUNDLE_PROFILE_URL, "https://www.thmmy.gr/smf/index.php?action=profile"); - if (!sessionManager.hasAvatar()) - extras.putString(BUNDLE_PROFILE_THUMBNAIL_URL, ""); - else - extras.putString(BUNDLE_PROFILE_THUMBNAIL_URL, sessionManager.getAvatarLink()); - extras.putString(BUNDLE_PROFILE_USERNAME, sessionManager.getUsername()); - intent.putExtras(extras); - intent.setFlags(FLAG_ACTIVITY_NEW_TASK); - startActivity(intent); - return false; - } - return true; + .withOnAccountHeaderListener((view, profile, currentProfile) -> { + if (sessionManager.isLoggedIn()) { + Intent intent = new Intent(BaseActivity.this, ProfileActivity.class); + Bundle extras = new Bundle(); + extras.putString(BUNDLE_PROFILE_URL, "https://www.thmmy.gr/smf/index.php?action=profile"); + if (!sessionManager.hasAvatar()) + extras.putString(BUNDLE_PROFILE_THUMBNAIL_URL, ""); + else + extras.putString(BUNDLE_PROFILE_THUMBNAIL_URL, sessionManager.getAvatarLink()); + extras.putString(BUNDLE_PROFILE_USERNAME, sessionManager.getUsername()); + intent.putExtras(extras); + intent.setFlags(FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + return false; + } else + startLoginActivity(); + return true; - } }) .build(); @@ -301,66 +340,68 @@ public abstract class BaseActivity extends AppCompatActivity { .withDrawerWidthDp((int) BaseApplication.getInstance().getDpWidth() / 2) .withSliderBackgroundColor(ContextCompat.getColor(this, R.color.primary_light)) .withAccountHeader(accountHeader) - .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() { - @Override - public boolean onItemClick(View view, int position, IDrawerItem drawerItem) { - if (drawerItem.equals(HOME_ID)) { - if (!(BaseActivity.this instanceof MainActivity)) { - Intent i = new Intent(BaseActivity.this, MainActivity.class); - startActivity(i); - } - } else if (drawerItem.equals(DOWNLOADS_ID)) { - if (!(BaseActivity.this instanceof DownloadsActivity)) { - Intent i = new Intent(BaseActivity.this, DownloadsActivity.class); - Bundle extras = new Bundle(); - extras.putString(BUNDLE_DOWNLOADS_URL, ""); - extras.putString(BUNDLE_DOWNLOADS_TITLE, null); - i.putExtras(extras); - startActivity(i); - } - } else if (drawerItem.equals(BOOKMARKS_ID)) { - if (!(BaseActivity.this instanceof BookmarkActivity)) { - Intent i = new Intent(BaseActivity.this, BookmarkActivity.class); - startActivity(i); - } - } else if (drawerItem.equals(LOG_ID)) { - if (!sessionManager.isLoggedIn()) //When logged out or if user is guest - { - Intent intent = new Intent(BaseActivity.this, LoginActivity.class); - startActivity(intent); - finish(); - overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out); - } else - new LogoutTask().execute(); - } else if (drawerItem.equals(ABOUT_ID)) { - if (!(BaseActivity.this instanceof AboutActivity)) { - Intent i = new Intent(BaseActivity.this, AboutActivity.class); - startActivity(i); - } - + .withOnDrawerItemClickListener((view, position, drawerItem) -> { + if (drawerItem.equals(HOME_ID)) { + if (!isMainActivity) { + Intent intent = new Intent(BaseActivity.this, MainActivity.class); + startActivity(intent); + } + } else if (drawerItem.equals(DOWNLOADS_ID)) { + if (!(BaseActivity.this instanceof DownloadsActivity)) { + Intent intent = new Intent(BaseActivity.this, DownloadsActivity.class); + Bundle extras = new Bundle(); + extras.putString(BUNDLE_DOWNLOADS_URL, ""); + extras.putString(BUNDLE_DOWNLOADS_TITLE, null); + intent.putExtras(extras); + startActivity(intent); + } +// } else if (drawerItem.equals(UPLOAD_ID)) { +// if (!(BaseActivity.this instanceof UploadActivity)) { +// Intent intent = new Intent(BaseActivity.this, UploadActivity.class); +// startActivity(intent); +// } + } else if (drawerItem.equals(BOOKMARKS_ID)) { + if (!(BaseActivity.this instanceof BookmarkActivity)) { + Intent intent = new Intent(BaseActivity.this, BookmarkActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + startActivity(intent); + } + } else if (drawerItem.equals(LOG_ID)) { + if (!sessionManager.isLoggedIn()) //When logged out or if user is guest + startLoginActivity(); + else + new LogoutTask().execute(); + } else if (drawerItem.equals(ABOUT_ID)) { + if (!(BaseActivity.this instanceof AboutActivity)) { + Intent intent = new Intent(BaseActivity.this, AboutActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + startActivity(intent); + } + } else if (drawerItem.equals(SETTINGS_ID)) { + if (!(BaseActivity.this instanceof SettingsActivity)) { + Intent intent = new Intent(BaseActivity.this, SettingsActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + startActivity(intent); } - - drawer.closeDrawer(); - return true; } + + drawer.closeDrawer(); + return true; }); if (sessionManager.isLoggedIn()) - drawerBuilder.addDrawerItems(homeItem, bookmarksItem, downloadsItem, loginLogoutItem, aboutItem); + drawerBuilder.addDrawerItems(homeItem, bookmarksItem, downloadsItem, settingsItem, loginLogoutItem, aboutItem); else - drawerBuilder.addDrawerItems(homeItem, bookmarksItem, loginLogoutItem, aboutItem); + drawerBuilder.addDrawerItems(homeItem, bookmarksItem, settingsItem, loginLogoutItem, aboutItem); drawer = drawerBuilder.build(); - if (!(BaseActivity.this instanceof MainActivity)) + if (!isMainActivity) drawer.getActionBarDrawerToggle().setDrawerIndicatorEnabled(false); - drawer.setOnDrawerNavigationListener(new Drawer.OnDrawerNavigationListener() { - @Override - public boolean onNavigationClickListener(View clickedView) { - onBackPressed(); - return true; - } + drawer.setOnDrawerNavigationListener(clickedView -> { + onBackPressed(); + return true; }); } @@ -369,13 +410,20 @@ public abstract class BaseActivity extends AppCompatActivity { if (!sessionManager.isLoggedIn()) //When logged out or if user is guest { drawer.removeItem(DOWNLOADS_ID); +// drawer.removeItem(UPLOAD_ID); loginLogoutItem.withName(R.string.login).withIcon(loginIcon); //Swap logout with login profileDrawerItem.withName(sessionManager.getUsername()); setDefaultAvatar(); } else { + if (!drawer.getDrawerItems().contains(downloadsItem)) { + drawer.addItemAtPosition(downloadsItem, 3); + } +// if (!drawer.getDrawerItems().contains(uploadItem)) { +// drawer.addItemAtPosition(uploadItem, 4); +// } loginLogoutItem.withName(R.string.logout).withIcon(logoutIcon); //Swap login with logout profileDrawerItem.withName(sessionManager.getUsername()); - if(sessionManager.hasAvatar()) + if (sessionManager.hasAvatar()) profileDrawerItem.withIcon(sessionManager.getAvatarLink()); else setDefaultAvatar(); @@ -417,14 +465,22 @@ public abstract class BaseActivity extends AppCompatActivity { } protected void onPostExecute(Integer result) { + if (result == SUCCESS) { + SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + if (sharedPrefs.getString(DEFAULT_HOME_TAB, "0").equals("2")) { + SharedPreferences.Editor editor = sharedPrefs.edit(); + editor.putString(DEFAULT_HOME_TAB, "0").apply(); + } + } + updateDrawer(); if (mainActivity != null) mainActivity.updateTabs(); progressDialog.dismiss(); //if (BaseActivity.this instanceof TopicActivity){ - Intent intent = new Intent(BaseActivity.this, MainActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(intent); + Intent intent = new Intent(BaseActivity.this, MainActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); //} } } @@ -443,9 +499,9 @@ public abstract class BaseActivity extends AppCompatActivity { protected void setTopicBookmark(MenuItem thisPageBookmarkMenuButton) { this.thisPageBookmarkMenuButton = thisPageBookmarkMenuButton; if (thisPageBookmark.matchExists(topicsBookmarked)) { - thisPageBookmarkMenuButton.setIcon(bookmarked); + thisPageBookmarkMenuButton.setIcon(R.drawable.ic_bookmark_true_accent_24dp); } else { - thisPageBookmarkMenuButton.setIcon(notBookmarked); + thisPageBookmarkMenuButton.setIcon(R.drawable.ic_bookmark_false_accent_24dp); } } @@ -455,19 +511,19 @@ public abstract class BaseActivity extends AppCompatActivity { } loadSavedBookmarks(); if (thisPageBookmark.matchExists(topicsBookmarked)) { - thisPageBookmarkMenuButton.setIcon(bookmarked); + thisPageBookmarkMenuButton.setIcon(R.drawable.ic_bookmark_true_accent_24dp); } else { - thisPageBookmarkMenuButton.setIcon(notBookmarked); + thisPageBookmarkMenuButton.setIcon(R.drawable.ic_bookmark_false_accent_24dp); } } protected void topicMenuBookmarkClick() { if (thisPageBookmark.matchExists(topicsBookmarked)) { - thisPageBookmarkMenuButton.setIcon(notBookmarked); + thisPageBookmarkMenuButton.setIcon(R.drawable.ic_bookmark_false_accent_24dp); toggleTopicToBookmarks(thisPageBookmark); Toast.makeText(getBaseContext(), "Bookmark removed", Toast.LENGTH_SHORT).show(); } else { - thisPageBookmarkMenuButton.setIcon(bookmarked); + thisPageBookmarkMenuButton.setIcon(R.drawable.ic_bookmark_true_accent_24dp); toggleTopicToBookmarks(thisPageBookmark); Toast.makeText(getBaseContext(), "Bookmark added", Toast.LENGTH_SHORT).show(); } @@ -475,22 +531,19 @@ public abstract class BaseActivity extends AppCompatActivity { protected void setBoardBookmark(final ImageButton thisPageBookmarkImageButton) { if (thisPageBookmark.matchExists(boardsBookmarked)) { - thisPageBookmarkImageButton.setImageDrawable(bookmarked); + thisPageBookmarkImageButton.setImageResource(R.drawable.ic_bookmark_true_accent_24dp); } else { - thisPageBookmarkImageButton.setImageDrawable(notBookmarked); + thisPageBookmarkImageButton.setImageResource(R.drawable.ic_bookmark_false_accent_24dp); } - thisPageBookmarkImageButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (thisPageBookmark.matchExists(boardsBookmarked)) { - thisPageBookmarkImageButton.setImageDrawable(notBookmarked); - Toast.makeText(getBaseContext(), "Bookmark removed", Toast.LENGTH_SHORT).show(); - } else { - thisPageBookmarkImageButton.setImageDrawable(bookmarked); - Toast.makeText(getBaseContext(), "Bookmark added", Toast.LENGTH_SHORT).show(); - } - toggleBoardToBookmarks(thisPageBookmark); + thisPageBookmarkImageButton.setOnClickListener(view -> { + if (thisPageBookmark.matchExists(boardsBookmarked)) { + thisPageBookmarkImageButton.setImageResource(R.drawable.ic_bookmark_false_accent_24dp); + Toast.makeText(getBaseContext(), "Bookmark removed", Toast.LENGTH_SHORT).show(); + } else { + thisPageBookmarkImageButton.setImageResource(R.drawable.ic_bookmark_true_accent_24dp); + Toast.makeText(getBaseContext(), "Bookmark added", Toast.LENGTH_SHORT).show(); } + toggleBoardToBookmarks(thisPageBookmark); }); } @@ -499,9 +552,9 @@ public abstract class BaseActivity extends AppCompatActivity { return; loadSavedBookmarks(); if (thisPageBookmark.matchExists(boardsBookmarked)) { - thisPageBookmarkImageButton.setImageDrawable(bookmarked); + thisPageBookmarkImageButton.setImageResource(R.drawable.ic_bookmark_true_accent_24dp); } else { - thisPageBookmarkImageButton.setImageDrawable(notBookmarked); + thisPageBookmarkImageButton.setImageResource(R.drawable.ic_bookmark_false_accent_24dp); } } @@ -509,9 +562,8 @@ public abstract class BaseActivity extends AppCompatActivity { String tmpString = bookmarksFile.getString(BOOKMARKED_TOPICS_KEY, null); if (tmpString != null) topicsBookmarked = Bookmark.arrayFromString(tmpString); - else { + else topicsBookmarked = new ArrayList<>(); - } tmpString = bookmarksFile.getString(BOOKMARKED_BOARDS_KEY, null); if (tmpString != null) @@ -525,7 +577,11 @@ public abstract class BaseActivity extends AppCompatActivity { if (boardsBookmarked == null) return; if (bookmark.matchExists(boardsBookmarked)) { boardsBookmarked.remove(bookmark.findIndex(boardsBookmarked)); - } else boardsBookmarked.add(new Bookmark(bookmark.getTitle(), bookmark.getId(), false)); + FirebaseMessaging.getInstance().unsubscribeFromTopic("b" + bookmark.getId()); + } else { + boardsBookmarked.add(new Bookmark(bookmark.getTitle(), bookmark.getId(), true)); + FirebaseMessaging.getInstance().subscribeToTopic("b" + bookmark.getId()); + } updateBoardBookmarks(); } @@ -560,19 +616,29 @@ public abstract class BaseActivity extends AppCompatActivity { else if (bookmark.matchExists(topicsBookmarked)) toggleTopicToBookmarks(bookmark); } - protected boolean toggleNotification(Bookmark bookmark){ - if (bookmark.matchExists(topicsBookmarked)){ + protected boolean toggleNotification(Bookmark bookmark) { + if (bookmark.matchExists(topicsBookmarked)) { topicsBookmarked.get(bookmark.findIndex(topicsBookmarked)).toggleNotificationsEnabled(); updateTopicBookmarks(); - if (topicsBookmarked.get(bookmark.findIndex(topicsBookmarked)).isNotificationsEnabled()){ + if (topicsBookmarked.get(bookmark.findIndex(topicsBookmarked)).isNotificationsEnabled()) FirebaseMessaging.getInstance().subscribeToTopic(bookmark.getId()); - } else { + else FirebaseMessaging.getInstance().unsubscribeFromTopic(bookmark.getId()); - } return topicsBookmarked.get(bookmark.findIndex(topicsBookmarked)).isNotificationsEnabled(); - } + } else if (bookmark.matchExists(boardsBookmarked)) { + boardsBookmarked.get(bookmark.findIndex(boardsBookmarked)).toggleNotificationsEnabled(); + updateBoardBookmarks(); + + if (boardsBookmarked.get(bookmark.findIndex(boardsBookmarked)).isNotificationsEnabled()) + FirebaseMessaging.getInstance().subscribeToTopic("b" + bookmark.getId()); + else + FirebaseMessaging.getInstance().unsubscribeFromTopic("b" + bookmark.getId()); + + return boardsBookmarked.get(bookmark.findIndex(boardsBookmarked)).isNotificationsEnabled(); + } else + Timber.w("No bookmark match exists!"); return false; } //-------------------------------------------BOOKMARKS END------------------------------------------ @@ -593,7 +659,7 @@ public abstract class BaseActivity extends AppCompatActivity { return true; } - //Display popup gor user to grant permission + //Display popup for user to grant permission private void requestPerms() { //Runtime permissions request for devices with API >= 23 if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) { String[] PERMISSIONS_STORAGE = { @@ -634,9 +700,9 @@ public abstract class BaseActivity extends AppCompatActivity { prepareDownload(tempThmmyFile); } - private void prepareDownload(ThmmyFile thmmyFile){ + private void prepareDownload(ThmmyFile thmmyFile) { String fileName = thmmyFile.getFilename(); - if(FileUtils.fileNameExists(fileName)) + if (FileUtils.fileNameExists(fileName)) openDownloadPrompt(thmmyFile); else DownloadHelper.enqueueDownload(thmmyFile); @@ -647,46 +713,113 @@ public abstract class BaseActivity extends AppCompatActivity { final BottomSheetDialog dialog = new BottomSheetDialog(this); dialog.setContentView(view); TextView downloadPromptTextView = view.findViewById(R.id.downloadPromptTextView); - downloadPromptTextView.setText(getString(R.string.downloadPromptText,thmmyFile.getFilename())); + downloadPromptTextView.setText(getString(R.string.downloadPromptText, thmmyFile.getFilename())); Button cancelButton = view.findViewById(R.id.cancel); Button openButton = view.findViewById(R.id.open); Button downloadButton = view.findViewById(R.id.download); - cancelButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - dialog.dismiss(); + cancelButton.setOnClickListener(v -> dialog.dismiss()); + openButton.setOnClickListener(v -> { + dialog.dismiss(); + try { + String fileName = thmmyFile.getFilename(); + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION); + Uri fileUri = FileProvider.getUriForFile(getApplicationContext(), getPackageName() + ".provider", new File(SAVE_DIR, fileName)); + intent.setDataAndType(fileUri, getMimeType(fileName)); + BaseActivity.this.startActivity(intent); + } catch (Exception e) { + Timber.e(e, "Couldn't open downloaded file..."); + Toast.makeText(getBaseContext(), "Couldn't open file...", Toast.LENGTH_SHORT).show(); } - }); - openButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - dialog.dismiss(); - try{ - String fileName = thmmyFile.getFilename(); - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_GRANT_READ_URI_PERMISSION); - Uri fileUri = FileProvider.getUriForFile(getApplicationContext(), getPackageName() + ".provider", new File(SAVE_DIR, fileName)); - intent.setDataAndType(fileUri, getMimeType(fileName)); - BaseActivity.this.startActivity(intent); - }catch (Exception e){ - Timber.e(e,"Couldn't open downloaded file..."); - Toast.makeText(getBaseContext(), "Couldn't open file...", Toast.LENGTH_SHORT).show(); - } - } }); - downloadButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - dialog.dismiss(); - DownloadHelper.enqueueDownload(thmmyFile); - } + downloadButton.setOnClickListener(v -> { + dialog.dismiss(); + DownloadHelper.enqueueDownload(thmmyFile); }); dialog.show(); } + //----------------------------PRIVACY POLICY------------------ + private void showUserConsentDialog(){ + AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle); + builder.setTitle("User Agreement"); + builder.setMessage(R.string.user_agreement_dialog_text); + builder.setPositiveButton("Yes, I want to help", (dialogInterface, i) -> { + addUserConsent(); + FirebaseMessaging.getInstance().setAutoInitEnabled(true); + BaseApplication.getInstance().startFirebaseCrashlyticsCollection(); + BaseApplication.getInstance().setFirebaseAnalyticsCollection(true); + setUserDataShareEnabled(true); + }); + builder.setNegativeButton("Nope, leave me alone", (dialogInterface, i) -> { + addUserConsent(); + FirebaseMessaging.getInstance().setAutoInitEnabled(true); + setUserDataShareEnabled(false); + }); + builder.setNeutralButton("Privacy Policy", (dialog, which) -> {/*Will be overridden below*/}); + builder.setCancelable(false); + AlertDialog alertDialog = builder.create(); + alertDialog.setOnShowListener(dialogInterface -> { + Button button = alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL); + button.setOnClickListener(view -> showPrivacyPolicyDialog()); + }); // Overridden like this so it won't be dismissed when user touches this button + alertDialog.show(); + } + + protected void showPrivacyPolicyDialog() { + TextView privacyPolicyTextView = new TextView(this); + privacyPolicyTextView.setPadding(30,20,30,20); + privacyPolicyTextView.setTextColor(ContextCompat.getColor(this, R.color.primary_text)); + SpannableConfiguration configuration = SpannableConfiguration.builder(this).linkResolver(new LinkResolverDef()).build(); + StringBuilder stringBuilder = new StringBuilder(); + BufferedReader reader = null; + try { + reader = new BufferedReader(new InputStreamReader(getAssets().open("PRIVACY.md"))); + String line; + + while ((line = reader.readLine()) != null) { + stringBuilder.append(line); + stringBuilder.append("\n"); + } + Markwon.setMarkdown(privacyPolicyTextView, configuration, stringBuilder.toString()); + AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle); + builder.setView(privacyPolicyTextView); + builder.setPositiveButton("Close", (dialogInterface, i) -> dialogInterface.dismiss()); + builder.show(); + } catch (IOException e) { + Timber.e(e, "Error reading Privacy Policy from assets."); + } catch (Exception e) { + Timber.e(e, "Error in Privacy Policy dialog."); + } finally { + try { + if(reader!=null) + reader.close(); + } catch (IOException e) { + Timber.e(e, "Error in Privacy Policy dialog (closing reader)."); + } + } + } + + private void addUserConsent(){ + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putBoolean(getString(R.string.user_consent_shared_preference_key), true).apply(); + } + + private void setUserDataShareEnabled(boolean enabled){ + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putBoolean(getString(R.string.pref_privacy_crashlytics_enable_key), enabled).apply(); + editor.putBoolean(getString(R.string.pref_privacy_analytics_enable_key), enabled).apply(); + } + //----------------------------------MISC---------------------- protected void setMainActivity(MainActivity mainActivity) { this.mainActivity = mainActivity; } + + private void startLoginActivity(){ + Intent intent = new Intent(BaseActivity.this, LoginActivity.class); + startActivity(intent); + overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out); + } } diff --git a/app/src/main/java/gr/thmmy/mthmmy/base/BaseApplication.java b/app/src/main/java/gr/thmmy/mthmmy/base/BaseApplication.java index 35318579..e1a33b30 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/base/BaseApplication.java +++ b/app/src/main/java/gr/thmmy/mthmmy/base/BaseApplication.java @@ -5,13 +5,18 @@ import android.content.Context; import android.content.SharedPreferences; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.os.Bundle; +import android.preference.PreferenceManager; import android.support.v4.content.ContextCompat; import android.util.DisplayMetrics; import android.widget.ImageView; +import com.crashlytics.android.Crashlytics; +import com.crashlytics.android.core.CrashlyticsCore; import com.franmontiel.persistentcookiejar.PersistentCookieJar; import com.franmontiel.persistentcookiejar.cache.SetCookieCache; import com.franmontiel.persistentcookiejar.persistence.SharedPrefsCookiePersistor; +import com.google.firebase.analytics.FirebaseAnalytics; import com.jakewharton.picasso.OkHttp3Downloader; import com.mikepenz.fontawesome_typeface_library.FontAwesome; import com.mikepenz.iconics.IconicsDrawable; @@ -19,7 +24,9 @@ import com.mikepenz.materialdrawer.util.AbstractDrawerImageLoader; import com.mikepenz.materialdrawer.util.DrawerImageLoader; import com.squareup.picasso.Picasso; -import java.io.IOException; +import net.gotev.uploadservice.UploadService; +import net.gotev.uploadservice.okhttp.OkHttpStack; + import java.util.Objects; import java.util.concurrent.TimeUnit; @@ -27,25 +34,27 @@ import gr.thmmy.mthmmy.BuildConfig; import gr.thmmy.mthmmy.R; import gr.thmmy.mthmmy.session.SessionManager; import gr.thmmy.mthmmy.utils.CrashReportingTree; +import io.fabric.sdk.android.Fabric; import okhttp3.HttpUrl; -import okhttp3.Interceptor; import okhttp3.OkHttpClient; import okhttp3.Request; -import okhttp3.Response; import timber.log.Timber; public class BaseApplication extends Application { private static BaseApplication baseApplication; //BaseApplication singleton - // Client & SessionManager + //Firebase Analytics + private FirebaseAnalytics firebaseAnalytics; + + //Client & SessionManager private OkHttpClient client; private SessionManager sessionManager; - //Shared Preferences - private final String SHARED_PREFS_NAME = "ThmmySharedPrefs"; + //TODO: maybe use PreferenceManager.getDefaultSharedPreferences here as well? + private static final String SHARED_PREFS = "ThmmySharedPrefs"; //Display Metrics - private static float dpHeight, dpWidth; + private static float dpWidth; public static BaseApplication getInstance() { return baseApplication; @@ -56,32 +65,43 @@ public class BaseApplication extends Application { super.onCreate(); baseApplication = this; //init singleton - if (BuildConfig.DEBUG) { + // Initialize Timber + if (BuildConfig.DEBUG) Timber.plant(new Timber.DebugTree()); - } else { - Timber.plant(new CrashReportingTree()); - } - SharedPreferences sharedPrefs = getSharedPreferences(SHARED_PREFS_NAME, MODE_PRIVATE); + //Shared Preferences + SharedPreferences sharedPrefs = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE); + SharedPreferences settingsSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); + + if (settingsSharedPrefs.getBoolean(getString(R.string.pref_privacy_crashlytics_enable_key), false)) + startFirebaseCrashlyticsCollection(); + else + Timber.i("Starting app with Crashlytics disabled."); + + firebaseAnalytics = FirebaseAnalytics.getInstance(this); + boolean enableAnalytics = settingsSharedPrefs.getBoolean(getString(R.string.pref_privacy_analytics_enable_key), false); + firebaseAnalytics.setAnalyticsCollectionEnabled(enableAnalytics); + if(enableAnalytics) + Timber.i("Starting app with Analytics enabled."); + else + Timber.i("Starting app with Analytics disabled."); + SharedPrefsCookiePersistor sharedPrefsCookiePersistor = new SharedPrefsCookiePersistor(getApplicationContext()); PersistentCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), sharedPrefsCookiePersistor); client = new OkHttpClient.Builder() .cookieJar(cookieJar) - .addInterceptor(new Interceptor() { - @Override - public Response intercept(Chain chain) throws IOException { - Request request = chain.request(); - HttpUrl oldUrl = chain.request().url(); - if (Objects.equals(chain.request().url().host(), "www.thmmy.gr")) { - if (!oldUrl.toString().contains("theme=4")) { - //Probably works but needs more testing: - HttpUrl newUrl = oldUrl.newBuilder().addQueryParameter("theme", "4").build(); - request = request.newBuilder().url(newUrl).build(); - } + .addInterceptor(chain -> { + Request request = chain.request(); + HttpUrl oldUrl = chain.request().url(); + if (Objects.equals(chain.request().url().host(), "www.thmmy.gr")) { + if (!oldUrl.toString().contains("theme=4")) { + //Probably works but needs more testing: + HttpUrl newUrl = oldUrl.newBuilder().addQueryParameter("theme", "4").build(); + request = request.newBuilder().url(newUrl).build(); } - return chain.proceed(request); - } + return chain.proceed(request); + }) .connectTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) @@ -94,6 +114,10 @@ public class BaseApplication extends Application { Picasso.setSingletonInstance(picasso); //All following Picasso (with Picasso.with(Context context) requests will use this Picasso object + //Sets up upload service + UploadService.NAMESPACE = BuildConfig.APPLICATION_ID; + UploadService.HTTP_STACK = new OkHttpStack(client); + //Initialize and create the image loader logic DrawerImageLoader.init(new AbstractDrawerImageLoader() { @Override @@ -119,10 +143,14 @@ public class BaseApplication extends Application { }); DisplayMetrics displayMetrics = getApplicationContext().getResources().getDisplayMetrics(); - dpHeight = displayMetrics.heightPixels / displayMetrics.density; dpWidth = displayMetrics.widthPixels / displayMetrics.density; } + //Getters + public Context getContext() { + return getApplicationContext(); + } + public OkHttpClient getClient() { return client; } @@ -131,11 +159,35 @@ public class BaseApplication extends Application { return sessionManager; } - public float getDpHeight() { - return dpHeight; - } - public float getDpWidth() { return dpWidth; } + + + //--------------------Firebase-------------------- + + public void logFirebaseAnalyticsEvent(String event, Bundle params) { + firebaseAnalytics.logEvent(event, params); + } + + public void setFirebaseAnalyticsCollection(boolean enabled) { + firebaseAnalytics.setAnalyticsCollectionEnabled(enabled); + if(!enabled) + firebaseAnalytics.resetAnalyticsData(); + } + + // Set up Crashlytics, disabled for debug builds + public void startFirebaseCrashlyticsCollection() { + if(!Fabric.isInitialized()){ + Crashlytics crashlyticsKit = new Crashlytics.Builder() + .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()) + .build(); + // Initialize Fabric with the debug-disabled Crashlytics. + Fabric.with(this, crashlyticsKit); + Timber.plant(new CrashReportingTree()); + Timber.i("Crashlytics enabled."); + } + else + Timber.i("Crashlytics were already initialized for this app session."); + } } diff --git a/app/src/main/java/gr/thmmy/mthmmy/editorview/EditorView.java b/app/src/main/java/gr/thmmy/mthmmy/editorview/EditorView.java new file mode 100644 index 00000000..fb82337a --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/editorview/EditorView.java @@ -0,0 +1,345 @@ +package gr.thmmy.mthmmy.editorview; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.support.annotation.Nullable; +import android.support.design.widget.TextInputEditText; +import android.support.design.widget.TextInputLayout; +import android.support.v7.widget.AppCompatImageButton; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.text.Editable; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputConnection; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.PopupWindow; +import android.widget.ScrollView; +import android.widget.TextView; + +import java.util.Objects; + +import gr.thmmy.mthmmy.R; + +public class EditorView extends LinearLayout implements EmojiInputField { + + private SparseArray colors = new SparseArray<>(); + + private TextInputLayout edittextWrapper; + private TextInputEditText editText; + private AppCompatImageButton emojiButton; + private AppCompatImageButton submitButton; + private IEmojiKeyboard emojiKeyboard; + + public EditorView(Context context) { + super(context); + init(context, null); + } + + public EditorView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs); + } + + public EditorView(Context context, AttributeSet attrs, int defStyleAttrs) { + super(context, attrs, defStyleAttrs); + init(context, attrs); + } + + @SuppressLint("SetTextI18n") + private void init(Context context, AttributeSet attrs) { + LayoutInflater.from(context).inflate(R.layout.editor_view, this, true); + setOrientation(VERTICAL); + + edittextWrapper = findViewById(R.id.editor_edittext_wrapper); + editText = findViewById(R.id.editor_edittext); + editText.setOnFocusChangeListener((view, focused) -> { + if (focused) emojiKeyboard.onEmojiInputFieldFocused(EditorView.this); + }); + edittextWrapper.setOnFocusChangeListener((view, focused) -> { + if (focused) emojiKeyboard.onEmojiInputFieldFocused(EditorView.this); + }); + editText.setOnClickListener(view -> { + if (!emojiKeyboard.isVisible()) { + InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE); + imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); + } else { + InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(getWindowToken(), 0); + requestEditTextFocus(); + } + }); + + TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.EditorView, 0, 0); + try { + editText.setHint(a.getString(R.styleable.EditorView_hint)); + } finally { + a.recycle(); + } + + // without this, the editor gets default window background + Drawable background = getBackground(); + for (int i = 0; i < getChildCount(); i++) { + getChildAt(i).setBackground(background); + } + + emojiButton = findViewById(R.id.emoji_keyboard_button); + + colors.append(R.id.black, "black"); + colors.append(R.id.red, "red"); + colors.append(R.id.yellow, "yellow"); + colors.append(R.id.pink, "pink"); + colors.append(R.id.green, "green"); + colors.append(R.id.orange, "orange"); + colors.append(R.id.purple, "purple"); + colors.append(R.id.blue, "blue"); + colors.append(R.id.beige, "beige"); + colors.append(R.id.brown, "brown"); + colors.append(R.id.teal, "teal"); + colors.append(R.id.navy, "navy"); + colors.append(R.id.maroon, "maroon"); + colors.append(R.id.lime_green, "limegreen"); + + RecyclerView formatButtonsRecyclerview = findViewById(R.id.buttons_recyclerview); + DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); + float itemWidth = getResources().getDimension(R.dimen.editor_format_button_size) + + getResources().getDimension(R.dimen.editor_format_button_margin_between); + int columns = (int) Math.floor(displayMetrics.widthPixels / itemWidth); + formatButtonsRecyclerview.setLayoutManager(new GridLayoutManager(context, columns)); + formatButtonsRecyclerview.setAdapter(new FormatButtonsAdapter((view, drawableId) -> { + switch (drawableId) { + case R.drawable.ic_format_bold: { + boolean hadTextSelection = editText.hasSelection(); + getText().insert(editText.getSelectionStart(), "[b]"); + getText().insert(editText.getSelectionEnd(), "[/b]"); + editText.setSelection(hadTextSelection ? editText.getSelectionEnd() : editText.getSelectionStart() - 4); + break; + } + case R.drawable.ic_format_italic: { + boolean hadTextSelection = editText.hasSelection(); + getText().insert(editText.getSelectionStart(), "[i]"); + getText().insert(editText.getSelectionEnd(), "[/i]"); + editText.setSelection(hadTextSelection ? editText.getSelectionEnd() : editText.getSelectionStart() - 4); + break; + } + case R.drawable.ic_format_underlined: { + boolean hadTextSelection = editText.hasSelection(); + getText().insert(editText.getSelectionStart(), "[u]"); + getText().insert(editText.getSelectionEnd(), "[/u]"); + editText.setSelection(hadTextSelection ? editText.getSelectionEnd() : editText.getSelectionStart() - 4); + break; + } + case R.drawable.ic_strikethrough_s: { + boolean hadTextSelection = editText.hasSelection(); + getText().insert(editText.getSelectionStart(), "[s]"); + getText().insert(editText.getSelectionEnd(), "[/s]"); + editText.setSelection(hadTextSelection ? editText.getSelectionEnd() : editText.getSelectionStart() - 4); + break; + } + case R.drawable.ic_format_color_text: { + PopupWindow popupWindow = new PopupWindow(view.getContext()); + popupWindow.setHeight(LayoutParams.WRAP_CONTENT); + popupWindow.setWidth(LayoutParams.WRAP_CONTENT); + popupWindow.setFocusable(true); + ScrollView colorPickerScrollview = (ScrollView) LayoutInflater.from(context).inflate(R.layout.editor_view_color_picker, null); + LinearLayout colorPicker = (LinearLayout) colorPickerScrollview.getChildAt(0); + popupWindow.setContentView(colorPickerScrollview); + for (int i = 0; i < colorPicker.getChildCount(); i++) { + TextView child = (TextView) colorPicker.getChildAt(i); + child.setOnClickListener(v -> { + boolean hadTextSelection = editText.hasSelection(); + getText().insert(editText.getSelectionStart(), "[color=" + colors.get(v.getId()) + "]"); + getText().insert(editText.getSelectionEnd(), "[/color]"); + editText.setSelection(hadTextSelection ? editText.getSelectionEnd() : editText.getSelectionStart() - 8); + popupWindow.dismiss(); + }); + } + popupWindow.showAsDropDown(view); + break; + } + case R.drawable.ic_format_size: { + boolean hadTextSelection = editText.hasSelection(); + getText().insert(editText.getSelectionStart(), "[size=10pt]"); + getText().insert(editText.getSelectionEnd(), "[/size]"); + editText.setSelection(hadTextSelection ? editText.getSelectionEnd() : editText.getSelectionStart() - 7); + break; + } + case R.drawable.ic_text_format: { + boolean hadTextSelection = editText.hasSelection(); + getText().insert(editText.getSelectionStart(), "[font=Verdana]"); + getText().insert(editText.getSelectionEnd(), "[/font]"); + editText.setSelection(hadTextSelection ? editText.getSelectionEnd() : editText.getSelectionStart() - 7); + break; + } + case R.drawable.ic_format_list_bulleted: { + boolean hadTextSelection = editText.hasSelection(); + getText().insert(editText.getSelectionStart(), "[list]\n[li]"); + getText().insert(editText.getSelectionEnd(), "[/li]\n[li][/li]\n[/list]"); + editText.setSelection(hadTextSelection ? editText.getSelectionEnd() - 13 : editText.getSelectionStart() - 23); + break; + } + case R.drawable.ic_format_align_left: { + boolean hadTextSelection = editText.hasSelection(); + getText().insert(editText.getSelectionStart(), "[left]"); + getText().insert(editText.getSelectionEnd(), "[/left]"); + editText.setSelection(hadTextSelection ? editText.getSelectionEnd() : editText.getSelectionStart() - 7); + break; + } + case R.drawable.ic_format_align_center: { + boolean hadTextSelection = editText.hasSelection(); + getText().insert(editText.getSelectionStart(), "[center]"); + getText().insert(editText.getSelectionEnd(), "[/center]"); + editText.setSelection(hadTextSelection ? editText.getSelectionEnd() : editText.getSelectionStart() - 9); + break; + } + case R.drawable.ic_format_align_right: { + boolean hadTextSelection = editText.hasSelection(); + getText().insert(editText.getSelectionStart(), "[right]"); + getText().insert(editText.getSelectionEnd(), "[/right]"); + editText.setSelection(hadTextSelection ? editText.getSelectionEnd() : editText.getSelectionStart() - 8); + break; + } + case R.drawable.ic_insert_link: { + LinearLayout dialogBody = (LinearLayout) LayoutInflater.from(context) + .inflate(R.layout.dialog_create_link, null); + TextInputLayout linkUrl = dialogBody.findViewById(R.id.link_url_input); + linkUrl.setOnClickListener(view1 -> linkUrl.setError(null)); + TextInputLayout linkText = dialogBody.findViewById(R.id.link_text_input); + linkText.setOnClickListener(view2 -> linkText.setError(null)); + boolean hadTextSelection = editText.hasSelection(); + int start = editText.getSelectionStart(), end = editText.getSelectionEnd(); + if (editText.hasSelection()) { + linkText.getEditText().setText( + editText.getText().toString().substring(editText.getSelectionStart(), editText.getSelectionEnd())); + } + AlertDialog linkDialog = new AlertDialog.Builder(context, R.style.AppTheme_Dark_Dialog) + .setTitle(R.string.dialog_create_link_title) + .setView(dialogBody) + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss()) + .create(); + linkDialog.setOnShowListener(dialogInterface -> { + Button button = linkDialog.getButton(AlertDialog.BUTTON_POSITIVE); + button.setOnClickListener(view12 -> { + if (TextUtils.isEmpty(Objects.requireNonNull(linkUrl.getEditText()).getText().toString())) { + linkUrl.setError(context.getString(R.string.input_field_required)); + return; + } + + if (hadTextSelection) editText.getText().delete(start, end); + if (!TextUtils.isEmpty(linkText.getEditText().getText())) { + getText().insert(editText.getSelectionStart(), "[url=" + + linkUrl.getEditText().getText().toString() + "]" + + linkText.getEditText().getText().toString() + "[/url]"); + } + else + getText().insert(editText.getSelectionStart(), "[url]" + + linkUrl.getEditText().getText().toString() + "[/url]"); + linkDialog.dismiss(); + }); + }); + linkDialog.show(); + break; + } + case R.drawable.ic_format_quote: { + boolean hadTextSelection = editText.hasSelection(); + getText().insert(editText.getSelectionStart(), "[quote]"); + getText().insert(editText.getSelectionEnd(), "[/quote]"); + editText.setSelection(hadTextSelection ? editText.getSelectionEnd() : editText.getSelectionStart() - 8); + break; + } + case R.drawable.ic_code: { + boolean hadTextSelection = editText.hasSelection(); + getText().insert(editText.getSelectionStart(), "[code]"); + getText().insert(editText.getSelectionEnd(), "[/code]"); + editText.setSelection(hadTextSelection ? editText.getSelectionEnd() : editText.getSelectionStart() - 7); + break; + } + case R.drawable.ic_functions: { + boolean hadTextSelection = editText.hasSelection(); + getText().insert(editText.getSelectionStart(), "[tex]"); + getText().insert(editText.getSelectionEnd(), "[/tex]"); + editText.setSelection(hadTextSelection ? editText.getSelectionEnd() : editText.getSelectionStart() - 6); + break; + } + default: throw new IllegalArgumentException("Unknown format button click"); + } + })); + + emojiButton.setOnClickListener(view -> { + InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE); + //cache selection. For some reason it gets reset sometimes + int selectionStart = editText.getSelectionStart(); + int selectionEnd = editText.getSelectionStart(); + if (emojiKeyboard.onEmojiButtonToggle()) { + //prevent system keyboard from appearing when clicking the edittext + editText.setTextIsSelectable(true); + imm.hideSoftInputFromWindow(getWindowToken(), 0); + } + else { + editText.requestFocus(); + imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); + } + editText.setSelection(selectionStart, selectionEnd); + }); + + submitButton = findViewById(R.id.submit_button); + } + + public void setEmojiKeyboard(IEmojiKeyboard emojiKeyboard) { + this.emojiKeyboard = emojiKeyboard; + } + + public TextInputEditText getEditText() { + return editText; + } + + public Editable getText() { + return editText.getText(); + } + + public void setText(Editable text) { + editText.setText(text); + } + + public void setText(CharSequence text) { + editText.setText(text); + } + + public void setError(@Nullable CharSequence text) { + edittextWrapper.setError(text); + } + + public void setOnSubmitListener(OnClickListener onSubmitListener) { + submitButton.setOnClickListener(onSubmitListener); + } + + public boolean requestEditTextFocus() { + emojiKeyboard.onEmojiInputFieldFocused(EditorView.this); + return editText.requestFocus(); + } + + @Override + public void onKeyboardVisibilityChange(boolean visible) { + if (visible) { + emojiButton.setImageResource(R.drawable.ic_keyboard_24dp); + } else { + emojiButton.setImageResource(R.drawable.ic_tag_faces_24dp); + } + } + + @Override + public InputConnection getInputConnection() { + return editText.onCreateInputConnection(new EditorInfo()); + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/editorview/EmojiInputField.java b/app/src/main/java/gr/thmmy/mthmmy/editorview/EmojiInputField.java new file mode 100644 index 00000000..0cdccd60 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/editorview/EmojiInputField.java @@ -0,0 +1,8 @@ +package gr.thmmy.mthmmy.editorview; + +import android.view.inputmethod.InputConnection; + +public interface EmojiInputField { + void onKeyboardVisibilityChange(boolean visible); + InputConnection getInputConnection(); +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/editorview/EmojiKeyboard.java b/app/src/main/java/gr/thmmy/mthmmy/editorview/EmojiKeyboard.java new file mode 100644 index 00000000..856498ec --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/editorview/EmojiKeyboard.java @@ -0,0 +1,276 @@ +package gr.thmmy.mthmmy.editorview; + +import android.content.Context; +import android.os.Handler; +import android.support.v7.widget.AppCompatImageButton; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.inputmethod.InputConnection; +import android.widget.LinearLayout; + +import java.util.HashSet; + +import gr.thmmy.mthmmy.R; + +public class EmojiKeyboard extends LinearLayout implements IEmojiKeyboard { + + // TODO: Sort emojis in a way that makes sense + private final Emoji[] emojis = {new Emoji(R.drawable.emoji_smiley, ":)"), + new Emoji(R.drawable.emoji_wink, ";)"), + new Emoji(R.drawable.emoji_cheesy, ":D"), + new Emoji(R.drawable.emoji_grin, ";D"), + // removed repeated angry emoji + new Emoji(R.drawable.emoji_angry, ">:("), + new Emoji(R.drawable.emoji_sad, ":("), + new Emoji(R.drawable.emoji_shocked, ":o"), + new Emoji(R.drawable.emoji_cool, "8))"), + new Emoji(R.drawable.emoji_huh, ":???:"), + new Emoji(R.drawable.emoji_rolleyes, "::)"), + new Emoji(R.drawable.emoji_tongue, ":P"), + new Emoji(R.drawable.emoji_embarrassed, ":-["), + new Emoji(R.drawable.emoji_lipsrsealed, ":-X"), + new Emoji(R.drawable.emoji_undecided, ":-\\\\"), + new Emoji(R.drawable.emoji_kiss, ":-*"), + new Emoji(R.drawable.emoji_cry, ":'("), + new Emoji(R.drawable.emoji_heart, "<3"), + // removed repeated lock emoji + new Emoji(R.drawable.emoji_locked, "^lock^"), + new Emoji(R.drawable.emoji_roll_over, "^rollover^"), + new Emoji(R.drawable.emoji_redface, "^redface^"), + new Emoji(R.drawable.emoji_confused, "^confused^"), + new Emoji(R.drawable.emoji_innocent, "^innocent^"), + new Emoji(R.drawable.emoji_sleep, "^sleep^"), + new Emoji(R.drawable.emoji_lips_sealed, "^sealed^"), + new Emoji(R.drawable.emoji_cool2, "^cool^"), + new Emoji(R.drawable.emoji_monster, "^monster^"), + new Emoji(R.drawable.emoji_crazy, "^crazy^"), + new Emoji(R.drawable.emoji_mad, "^mad^"), + new Emoji(R.drawable.emoji_wav, "^wav^"), + new Emoji(R.drawable.emoji_binkybaby, "^binkybaby^"), + new Emoji(R.drawable.emoji_police, "^police^"), + new Emoji(R.drawable.emoji_dontknow, "^dontknow^"), + //removed repeated angry hot emoji + new Emoji(R.drawable.emoji_angry_hot, "^angryhot^"), + new Emoji(R.drawable.emoji_foyska, "^fouska^"), + new Emoji(R.drawable.emoji_e10_7_3e, "^sfinaki^"), + new Emoji(R.drawable.emoji_bang_head, "^banghead^"), + new Emoji(R.drawable.emoji_crybaby, "^crybaby^"), + new Emoji(R.drawable.emoji_hello, "^hello^"), + new Emoji(R.drawable.emoji_jerk, "^jerk^"), + new Emoji(R.drawable.emoji_nono, "^nono^"), + new Emoji(R.drawable.emoji_notworthy, "^notworthy^"), + new Emoji(R.drawable.emoji_off_topic, "^off-topic^"), + new Emoji(R.drawable.emoji_puke, "^puke^"), + new Emoji(R.drawable.emoji_shout, "^shout^"), + new Emoji(R.drawable.emoji_slurp, "^slurp^"), + new Emoji(R.drawable.emoji_superconfused, "^superconfused^"), + new Emoji(R.drawable.emoji_superinnocent, "^superinnocent^"), + new Emoji(R.drawable.emoji_cell_phone, "^cellPhone^"), + new Emoji(R.drawable.emoji_idiot, "^idiot^"), + new Emoji(R.drawable.emoji_knuppel, "^knuppel^"), + new Emoji(R.drawable.emoji_tickedoff, "^tickedOff^"), + new Emoji(R.drawable.emoji_peace, "^peace^"), + new Emoji(R.drawable.emoji_suspicious, "^suspicious^"), + new Emoji(R.drawable.emoji_caffine, "^caffine^"), + new Emoji(R.drawable.emoji_argue, "^argue^"), + new Emoji(R.drawable.emoji_banned2, "^banned2^"), + new Emoji(R.drawable.emoji_banned, "^banned^"), + new Emoji(R.drawable.emoji_bath, "^bath^"), + new Emoji(R.drawable.emoji_beg, "^beg^"), + new Emoji(R.drawable.emoji_bluescreen, "^bluescreen^"), + new Emoji(R.drawable.emoji_boil, "^boil^"), + new Emoji(R.drawable.emoji_bye, "^bye^"), + new Emoji(R.drawable.emoji_callmerip, "^callmerip^"), + new Emoji(R.drawable.emoji_carnaval, "^carnaval^"), + new Emoji(R.drawable.emoji_clap, "^clap^"), + new Emoji(R.drawable.emoji_coffeepot, "^coffepot^"), + new Emoji(R.drawable.emoji_crap, "^crap^"), + new Emoji(R.drawable.emoji_curses, "^curses^"), + new Emoji(R.drawable.emoji_funny, "^funny^"), + new Emoji(R.drawable.emoji_guitar1, "^guitar^"), + new Emoji(R.drawable.emoji_icon_kissy, "^kissy^"), + new Emoji(R.drawable.emoji_band, "^band^"), + new Emoji(R.drawable.emoji_ivres, "^ivres^"), + new Emoji(R.drawable.emoji_kaloe, "^kaloe^"), + new Emoji(R.drawable.emoji_kremala, "^kremala^"), + new Emoji(R.drawable.emoji_moon, "^moon^"), + new Emoji(R.drawable.emoji_mopping, "^mopping^"), + new Emoji(R.drawable.emoji_mountza, "^mountza^"), + new Emoji(R.drawable.emoji_pcsleep, "^pcsleep^"), + new Emoji(R.drawable.emoji_pinokio, "^pinokio^"), + new Emoji(R.drawable.emoji_poke, "^poke^"), + new Emoji(R.drawable.emoji_seestars, "^seestars^"), + new Emoji(R.drawable.emoji_sfyri, "^sfyri^"), + new Emoji(R.drawable.emoji_spam2, "^spam^"), + new Emoji(R.drawable.emoji_esuper, "^super^"), + new Emoji(R.drawable.emoji_tafos, "^tafos^"), + new Emoji(R.drawable.emoji_tomatomourh, "^tomato^"), + new Emoji(R.drawable.emoji_ytold, "^ytold^"), + new Emoji(R.drawable.emoji_beer2, "^beer^"), + new Emoji(R.drawable.emoji_yu, "^yue^"), + new Emoji(R.drawable.emoji_a_eatpaper, "^eatpaper^"), + new Emoji(R.drawable.emoji_fritz, "^fritz^"), + new Emoji(R.drawable.emoji_wade, "^wade^"), + new Emoji(R.drawable.emoji_lypi, "^lypi^"), + new Emoji(R.drawable.emoji_megashok1wq, "^aytoxeir^"), + new Emoji(R.drawable.emoji_victory, "^victory^"), + new Emoji(R.drawable.emoji_filarakia, "^filarakia^"), + new Emoji(R.drawable.emoji_bonjour_97213, "^hat^"), + new Emoji(R.drawable.emoji_curtseyqi9, "^miss^"), + new Emoji(R.drawable.emoji_rofl, "^rolfmao^"), + new Emoji(R.drawable.emoji_question, "^que^"), + new Emoji(R.drawable.emoji_shifty, "^shifty^"), + new Emoji(R.drawable.emoji_shy, "^shy^"), + new Emoji(R.drawable.emoji_music, "^music_listen^"), + new Emoji(R.drawable.emoji_shamed_bag, "^bagface^"), + new Emoji(R.drawable.emoji_rotfl, "^rotate^"), + new Emoji(R.drawable.emoji_love, "^love^"), + new Emoji(R.drawable.emoji_speech, "^speech^"), + new Emoji(R.drawable.emoji_facepalm, "^facepalm^"), + new Emoji(R.drawable.emoji_shocked2, "^shocked^"), + new Emoji(R.drawable.emoji_extremely_shocked, "^ex_shocked^"), + new Emoji(R.drawable.emoji_smurf, "^smurf^") + }; + + private InputConnection inputConnection; + private HashSet emojiInputFields = new HashSet<>(); + private Context context; + + public EmojiKeyboard(Context context) { + this(context, null, 0); + } + + public EmojiKeyboard(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public EmojiKeyboard(Context context, AttributeSet attrs, int defStyleAttrs) { + super(context, attrs, defStyleAttrs); + init(context, attrs); + } + + public void init(Context context, AttributeSet attrs) { + this.context = context; + LayoutInflater.from(context).inflate(R.layout.emoji_keyboard, this, true); + setOrientation(VERTICAL); + setBackgroundColor(getResources().getColor(R.color.primary)); + + RecyclerView emojiRecyclerview = findViewById(R.id.emoji_recyclerview); + emojiRecyclerview.setHasFixedSize(true); + GridLayoutManager emojiLayoutManager = new GridLayoutManager(context, 6); + emojiLayoutManager.setSpanSizeLookup(new EmojiColumnSpanLookup()); + emojiRecyclerview.setLayoutManager(emojiLayoutManager); + + EmojiKeyboardAdapter emojiKeyboardAdapter = new EmojiKeyboardAdapter(emojis); + emojiKeyboardAdapter.setOnEmojiClickListener((view, position) -> { + if (inputConnection == null) return; + String bbcode = emojis[position].getBbcode(); + inputConnection.commitText(" " + bbcode, 1); + }); + emojiRecyclerview.setAdapter(emojiKeyboardAdapter); + AppCompatImageButton backspaceButton = findViewById(R.id.backspace_button); + // backspace behavior + final Handler handler = new Handler(); + Runnable longPressed = new Runnable() { + @Override + public void run() { + inputConnection.deleteSurroundingText(1, 0); + handler.postDelayed(this, 50); + } + }; + backspaceButton.setOnTouchListener((v, event) -> { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + CharSequence selectedText = inputConnection.getSelectedText(0); + if (TextUtils.isEmpty(selectedText)) + inputConnection.deleteSurroundingText(1, 0); + else + inputConnection.commitText("", 1); + handler.postDelayed(longPressed, 400); + break; + case MotionEvent.ACTION_UP: + handler.removeCallbacks(longPressed); + break; + } + return true; + }); + } + + @Override + public void hide() { + setVisibility(GONE); + } + + @Override + public void registerEmojiInputField(EmojiInputField emojiInputField) { + emojiInputFields.add(emojiInputField); + } + + public void setInputConnection(InputConnection inputConnection) { + this.inputConnection = inputConnection; + } + + @Override + public boolean onEmojiButtonToggle() { + if (getVisibility() == VISIBLE) setVisibility(GONE); + else setVisibility(VISIBLE); + return getVisibility() == VISIBLE; + } + + @Override + public void onEmojiInputFieldFocused(EmojiInputField emojiInputField) { + setInputConnection(emojiInputField.getInputConnection()); + } + + @Override + public void setVisibility(int visibility) { + //notify input fields + for (EmojiInputField emojiInputField : emojiInputFields) + emojiInputField.onKeyboardVisibilityChange(visibility == VISIBLE); + super.setVisibility(visibility); + } + + @Override + public boolean isVisible() { + return getVisibility() == VISIBLE; + } + + class Emoji { + final int src; + final String bbcode; + + public Emoji(int src, String bbcode) { + this.src = src; + this.bbcode = bbcode; + } + + public int getSrc() { + return src; + } + + public String getBbcode() { + return bbcode; + } + } + + class EmojiColumnSpanLookup extends GridLayoutManager.SpanSizeLookup { + + @Override + public int getSpanSize(int position) { + switch (emojis[position].getSrc()) { + case R.drawable.emoji_wav: + return 4; + case R.drawable.emoji_band: + return 3; + case R.drawable.emoji_pcsleep: + return 2; + default: + return 1; + } + } + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/editorview/EmojiKeyboardAdapter.java b/app/src/main/java/gr/thmmy/mthmmy/editorview/EmojiKeyboardAdapter.java new file mode 100644 index 00000000..40fe4db5 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/editorview/EmojiKeyboardAdapter.java @@ -0,0 +1,64 @@ +package gr.thmmy.mthmmy.editorview; + +import android.graphics.drawable.AnimationDrawable; +import android.support.annotation.NonNull; +import android.support.v7.widget.AppCompatImageButton; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import gr.thmmy.mthmmy.R; + +public class EmojiKeyboardAdapter extends RecyclerView.Adapter { + private EmojiKeyboard.Emoji[] emojiIds; + private OnEmojiClickListener listener; + + public EmojiKeyboardAdapter(EmojiKeyboard.Emoji[] emojiIds) { + this.emojiIds = emojiIds; + } + + public void setOnEmojiClickListener(OnEmojiClickListener listener) { + this.listener = listener; + } + + @NonNull + @Override + public EmojiViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + AppCompatImageButton emojiButton = (AppCompatImageButton) LayoutInflater.from(parent.getContext()) + .inflate(R.layout.emoji_keyboard_grid_cell, parent, false); + return new EmojiViewHolder(emojiButton); + } + + @Override + public void onBindViewHolder(@NonNull EmojiViewHolder holder, int position) { + holder.emojiButton.setOnClickListener(view -> listener.onEmojiClick(view, position)); + } + + @Override + public void onViewAttachedToWindow(@NonNull EmojiViewHolder holder) { + holder.emojiButton.setImageResource(emojiIds[holder.getAdapterPosition()].getSrc()); + if (holder.emojiButton.getDrawable() instanceof AnimationDrawable) { + AnimationDrawable emojiAnimation = (AnimationDrawable) holder.emojiButton.getDrawable(); + emojiAnimation.start(); + } + } + + @Override + public int getItemCount() { + return emojiIds.length; + } + + static class EmojiViewHolder extends RecyclerView.ViewHolder { + AppCompatImageButton emojiButton; + + EmojiViewHolder(AppCompatImageButton emojiButton) { + super(emojiButton); + this.emojiButton = emojiButton; + } + } + + interface OnEmojiClickListener { + void onEmojiClick(View view, int position); + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/editorview/FormatButtonsAdapter.java b/app/src/main/java/gr/thmmy/mthmmy/editorview/FormatButtonsAdapter.java new file mode 100644 index 00000000..469cf2f6 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/editorview/FormatButtonsAdapter.java @@ -0,0 +1,56 @@ +package gr.thmmy.mthmmy.editorview; + +import android.support.annotation.NonNull; +import android.support.v7.widget.AppCompatImageButton; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import gr.thmmy.mthmmy.R; + +public class FormatButtonsAdapter extends RecyclerView.Adapter { + private OnFormatButtonClickListener listener; + + public static final int[] FORMAT_BUTTON_IDS = {R.drawable.ic_format_bold, R.drawable.ic_format_italic, + R.drawable.ic_format_underlined, R.drawable.ic_strikethrough_s, R.drawable.ic_format_color_text, + R.drawable.ic_format_size, R.drawable.ic_text_format, R.drawable.ic_format_list_bulleted, + R.drawable.ic_format_align_left, R.drawable.ic_format_align_center, R.drawable.ic_format_align_right, + R.drawable.ic_insert_link, R.drawable.ic_format_quote, R.drawable.ic_code, R.drawable.ic_functions}; + + public FormatButtonsAdapter(OnFormatButtonClickListener listener) { + this.listener = listener; + } + + @NonNull + @Override + public FormatButtonViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + AppCompatImageButton formatButton = (AppCompatImageButton) LayoutInflater.from(parent.getContext()) + .inflate(R.layout.format_button_grid_cell, parent, false); + return new FormatButtonViewHolder(formatButton); + } + + @Override + public void onBindViewHolder(@NonNull FormatButtonViewHolder holder, int position) { + holder.formatButton.setImageResource(FORMAT_BUTTON_IDS[position]); + holder.formatButton.setOnClickListener(v -> + listener.onFormatButtonClick(v, FORMAT_BUTTON_IDS[holder.getAdapterPosition()])); + } + + @Override + public int getItemCount() { + return FORMAT_BUTTON_IDS.length; + } + + static class FormatButtonViewHolder extends RecyclerView.ViewHolder { + AppCompatImageButton formatButton; + FormatButtonViewHolder(AppCompatImageButton formatButton) { + super(formatButton); + this.formatButton = formatButton; + } + } + + public interface OnFormatButtonClickListener { + void onFormatButtonClick(View view, int drawableId); + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/editorview/IEmojiKeyboard.java b/app/src/main/java/gr/thmmy/mthmmy/editorview/IEmojiKeyboard.java new file mode 100644 index 00000000..3ec906f2 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/editorview/IEmojiKeyboard.java @@ -0,0 +1,32 @@ +package gr.thmmy.mthmmy.editorview; + +public interface IEmojiKeyboard { + /** + * Hide keyboard + */ + void hide(); + + /** + * Check if keyboard is visible + * @return true, if {@link EmojiKeyboard#getVisibility()} returns View.VISIBLE, otherwise false + */ + boolean isVisible(); + + /** + * Callback to the keyboard when {@link EditorView#emojiButton} is clicked + * @return whether the keyboard became visible or not + */ + boolean onEmojiButtonToggle(); + + /** + * Callback to create input connection with {@link EmojiInputField} + * @param emojiInputField the connected input field + */ + void onEmojiInputFieldFocused(EmojiInputField emojiInputField); + + /** + * Persist a set of all input fields to update all of them when visibility changes + * @param emojiInputField the input field to be added + */ + void registerEmojiInputField(EmojiInputField emojiInputField); +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/model/Bookmark.java b/app/src/main/java/gr/thmmy/mthmmy/model/Bookmark.java index 9e2aae95..1f383462 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/model/Bookmark.java +++ b/app/src/main/java/gr/thmmy/mthmmy/model/Bookmark.java @@ -45,6 +45,18 @@ public class Bookmark implements java.io.Serializable { return false; } + public static boolean matchExistsById(ArrayList array, int id) { + if (array != null && !array.isEmpty()) { + for (Bookmark bookmark : array) { + if (bookmark != null) { + if (Objects.equals(Integer.parseInt(bookmark.getId()), id)) + return true; + } + } + } + return false; + } + public int findIndex(ArrayList array) { if (array != null && !array.isEmpty()) { for (int i = 0; i < array.size(); ++i) { diff --git a/app/src/main/java/gr/thmmy/mthmmy/model/Poll.java b/app/src/main/java/gr/thmmy/mthmmy/model/Poll.java new file mode 100644 index 00000000..e0d544f6 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/model/Poll.java @@ -0,0 +1,108 @@ +package gr.thmmy.mthmmy.model; + +import java.text.DecimalFormat; + +public class Poll extends TopicItem { + public static final int TYPE_POLL = 3; + + private final String question; + private Entry[] entries; + private int availableVoteCount; + private String pollFormUrl, sc, removeVoteUrl, showVoteResultsUrl, showOptionsUrl; + + public Poll(String question, Entry[] entries, int availableVoteCount, String pollFormUrl, String sc, + String removeVoteUrl, String showVoteResultsUrl, String showOptionsUrl) { + this.question = question; + this.entries = entries; + this.availableVoteCount = availableVoteCount; + this.pollFormUrl = pollFormUrl; + this.sc = sc; + this.removeVoteUrl = removeVoteUrl; + this.showVoteResultsUrl = showVoteResultsUrl; + this.showOptionsUrl = showOptionsUrl; + } + + private int totalVotes() { + int sum = 0; + for (Entry entry : entries) { + sum += entry.votes; + } + return sum; + } + + public String getVotePercentage(int index) { + DecimalFormat format = new DecimalFormat(".#"); + double percentage = 100 * ((double) entries[index].votes / (double) totalVotes()); + return format.format(percentage); + } + + public String getQuestion() { + return question; + } + + public Entry[] getEntries() { + return entries; + } + + public int getAvailableVoteCount() { + return availableVoteCount; + } + + public String getPollFormUrl() { + return pollFormUrl; + } + + public String getSc() { + return sc; + } + + public String getRemoveVoteUrl() { + return removeVoteUrl; + } + + public String getShowVoteResultsUrl() { + return showVoteResultsUrl; + } + + public String getShowOptionsUrl() { + return showOptionsUrl; + } + + public static class Entry { + private final String entryName; + private int votes; + + public Entry(String entryName, int votes) { + this.entryName = entryName; + this.votes = votes; + } + + /** + * Constructor for entry with unknown number of votes + * + * @param entryName + * The name of the entry + */ + public Entry(String entryName) { + this.entryName = entryName; + votes = -1; + } + + public String getEntryName() { + return entryName; + } + + public int getVotes() { + return votes; + } + + public void setVotes(int votes) { + this.votes = votes; + } + + @Override + public String toString() { + return "Vote label:" + entryName + ", num votes:" + votes; + } + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/model/Post.java b/app/src/main/java/gr/thmmy/mthmmy/model/Post.java index 76a335fd..1113ffbc 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/model/Post.java +++ b/app/src/main/java/gr/thmmy/mthmmy/model/Post.java @@ -15,7 +15,11 @@ import java.util.Objects; * gender, number of posts, personal text and number of start to be described in addition to * previous fields.

    */ -public class Post { +public class Post extends TopicItem { + public static final int TYPE_POST = 0; + public static final int TYPE_QUICK_REPLY = 1; + public static final int TYPE_EDIT = 2; + //Standard info (exists in every post) private final String thumbnailUrl; private final String author; @@ -29,6 +33,9 @@ public class Post { private final ArrayList attachedFiles; private final String lastEdit; private final String postURL; + private final String postDeleteURL; + private final String postEditURL; + private int postType; //Extra info private final String profileURL; @@ -38,6 +45,7 @@ public class Post { private final String numberOfPosts; private final String personalText; private final int numberOfStars; + private final boolean isUserMentionedInPost; // Suppresses default constructor @SuppressWarnings("unused") @@ -61,6 +69,10 @@ public class Post { attachedFiles = null; lastEdit = null; postURL = null; + postDeleteURL = null; + postEditURL = null; + isUserMentionedInPost = false; + postType = -1; } /** @@ -85,13 +97,15 @@ public class Post { * @param userColor author's user color * @param attachedFiles post's attached files * @param lastEdit post's last edit date - * @param postURL post's URL + * @param postURL post's URL */ public Post(@Nullable String thumbnailUrl, String author, String subject, String content , int postIndex, int postNumber, String postDate, String profileURl, @Nullable String rank , @Nullable String special_rank, @Nullable String gender, @Nullable String numberOfPosts , @Nullable String personalText, int numberOfStars, int userColor - , @Nullable ArrayList attachedFiles, @Nullable String lastEdit, String postURL) { + , @Nullable ArrayList attachedFiles, @Nullable String lastEdit, String postURL + , @Nullable String postDeleteURL, @Nullable String postEditURL, boolean isUserMentionedInPost + , int postType) { if (Objects.equals(thumbnailUrl, "")) this.thumbnailUrl = null; else this.thumbnailUrl = thumbnailUrl; this.author = author; @@ -112,6 +126,10 @@ public class Post { this.personalText = personalText; this.numberOfStars = numberOfStars; this.postURL = postURL; + this.postDeleteURL = postDeleteURL; + this.postEditURL = postEditURL; + this.isUserMentionedInPost = isUserMentionedInPost; + this.postType = postType; } /** @@ -129,11 +147,13 @@ public class Post { * @param userColor author's user color * @param attachedFiles post's attached files * @param lastEdit post's last edit date - * @param postURL post's URL + * @param postURL post's URL */ public Post(@Nullable String thumbnailUrl, String author, String subject, String content , int postIndex, int postNumber, String postDate, int userColor - , @Nullable ArrayList attachedFiles, @Nullable String lastEdit, String postURL) { + , @Nullable ArrayList attachedFiles, @Nullable String lastEdit, String postURL + , @Nullable String postDeleteURL, @Nullable String postEditURL, boolean isUserMentionedInPost + , int postType) { if (Objects.equals(thumbnailUrl, "")) this.thumbnailUrl = null; else this.thumbnailUrl = thumbnailUrl; this.author = author; @@ -154,6 +174,15 @@ public class Post { personalText = ""; numberOfStars = 0; this.postURL = postURL; + this.postDeleteURL = postDeleteURL; + this.postEditURL = postEditURL; + this.isUserMentionedInPost = isUserMentionedInPost; + this.postType = postType; + } + + public static Post newQuickReply() { + return new Post(null, null, null, null, 0, 0, null, + 0, null, null, null, null, null, false, TYPE_QUICK_REPLY); } //Getters @@ -342,4 +371,36 @@ public class Post { public String getPostURL() { return postURL; } + + /** + * Gets this post's delete url. + * + * @return post's delete url + */ + @Nullable + public String getPostDeleteURL() { + return postDeleteURL; + } + + /** + * Gets this post's modify url. + * + * @return post's edit url + */ + @Nullable + public String getPostEditURL() { + return postEditURL; + } + + public int getPostType() { + return postType; + } + + public boolean isUserMentionedInPost() { + return isUserMentionedInPost; + } + + public void setPostType(int postType) { + this.postType = postType; + } } diff --git a/app/src/main/java/gr/thmmy/mthmmy/model/PostNotification.java b/app/src/main/java/gr/thmmy/mthmmy/model/PostNotification.java index 42985352..838dc2d3 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/model/PostNotification.java +++ b/app/src/main/java/gr/thmmy/mthmmy/model/PostNotification.java @@ -8,10 +8,12 @@ package gr.thmmy.mthmmy.model; *

    . */ public class PostNotification { - final int postId; - final int topicId; - final String topicTitle; - final String poster; + private final int postId; + private final int topicId; + private final String topicTitle; + private final String poster; + private final int boardId; + private final String boardTitle; // Suppresses default constructor @SuppressWarnings("unused") @@ -20,6 +22,8 @@ public class PostNotification { this.topicId = -1; this.topicTitle = null; this.poster = null; + this.boardId = -1; + this.boardTitle = null; } /** @@ -30,12 +34,17 @@ public class PostNotification { * @param topicId this post's topicId * @param topicTitle this post's topicTitle * @param poster username of this post's author + * @param boardId one of this post's boardIds (-1 if it is a topic notification) + * @param boardTitle one of this post's boardTitles (null if it is a topic notification) */ - public PostNotification(int postId, int topicId, String topicTitle, String poster) { + public PostNotification(int postId, int topicId, String topicTitle, String poster, int boardId, String boardTitle) { this.postId = postId; this.topicId = topicId; this.topicTitle = topicTitle; this.poster = poster; + this.boardId = boardId; + this.boardTitle = boardTitle; + } /** @@ -73,6 +82,24 @@ public class PostNotification { public String getPoster() { return poster; } + + /** + * Gets this post's boardId. + * + * @return this post's boardId + */ + public int getBoardId() { + return boardId; + } + + /** + * Gets this post's boardTitle. + * + * @return this post's boardTitle + */ + public String getBoardTitle() { + return boardTitle; + } } diff --git a/app/src/main/java/gr/thmmy/mthmmy/model/ThmmyPage.java b/app/src/main/java/gr/thmmy/mthmmy/model/ThmmyPage.java index bc451fd1..c500c50a 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/model/ThmmyPage.java +++ b/app/src/main/java/gr/thmmy/mthmmy/model/ThmmyPage.java @@ -3,6 +3,8 @@ package gr.thmmy.mthmmy.model; import android.net.Uri; import java.util.Objects; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import timber.log.Timber; @@ -180,10 +182,10 @@ public class ThmmyPage { public static String getTopicId(String topicUrl) { if (resolvePageCategory(Uri.parse(topicUrl)) == PageCategory.TOPIC) { - String returnString = topicUrl.substring(topicUrl.indexOf("topic=") + 6); - if (returnString.contains(".")) - returnString = returnString.substring(0, returnString.indexOf(".")); - return returnString; + Matcher topicIdMatcher = Pattern.compile("topic=[0-9]+").matcher(topicUrl); + if (topicIdMatcher.find()) { + return topicUrl.substring(topicIdMatcher.start() + 6, topicIdMatcher.end()); + } else return null; } return null; } diff --git a/app/src/main/java/gr/thmmy/mthmmy/model/Topic.java b/app/src/main/java/gr/thmmy/mthmmy/model/Topic.java index 27f22c31..207e2c2e 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/model/Topic.java +++ b/app/src/main/java/gr/thmmy/mthmmy/model/Topic.java @@ -5,11 +5,11 @@ package gr.thmmy.mthmmy.model; * Class has one constructor and getter methods for all variables. *

    A topic is described by its url, subject, username of creator, its date and time of this * topic's last post, url of this topic's last post, its view and reply stats, whether it's locked or - * not and whether it's sticky or not.. + * not, whether it's sticky or not and whether it contains an unread post or not.. */ public class Topic extends TopicSummary { private final String lastPostUrl, stats; - private final boolean locked, sticky; + private final boolean locked, sticky, unread; // Suppresses default constructor @SuppressWarnings("unused") @@ -19,6 +19,7 @@ public class Topic extends TopicSummary { this.stats = null; this.locked = false; this.sticky = false; + this.unread = false; } /** @@ -33,14 +34,16 @@ public class Topic extends TopicSummary { * @param stats this topic's view and reply stats * @param locked whether this topic is locked or not * @param sticky whether this topic is sticky or not + * @param unread whether this topic contains an unread post or not */ public Topic(String topicUrl, String subject, String starter, String lastPost, String lastPostUrl, - String stats, boolean locked, boolean sticky) { + String stats, boolean locked, boolean sticky, boolean unread) { super(topicUrl, subject, starter, lastPost); this.lastPostUrl = lastPostUrl; this.stats = stats; this.locked = locked; this.sticky = sticky; + this.unread = unread; } /** @@ -114,4 +117,13 @@ public class Topic extends TopicSummary { public boolean isSticky() { return sticky; } + + /** + * Gets this topic's unread status. True if it contains an unread post, false otherwise. + * + * @return this topic's unread status + */ + public boolean isUnread() { + return unread; + } } diff --git a/app/src/main/java/gr/thmmy/mthmmy/model/TopicItem.java b/app/src/main/java/gr/thmmy/mthmmy/model/TopicItem.java new file mode 100644 index 00000000..17a8c6ef --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/model/TopicItem.java @@ -0,0 +1,5 @@ +package gr.thmmy.mthmmy.model; + +public abstract class TopicItem { + +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/model/UploadCategory.java b/app/src/main/java/gr/thmmy/mthmmy/model/UploadCategory.java new file mode 100644 index 00000000..311446d3 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/model/UploadCategory.java @@ -0,0 +1,37 @@ +package gr.thmmy.mthmmy.model; + +import java.util.ArrayList; + +public class UploadCategory { + private String value, categoryTitle; + private ArrayList subCategories = new ArrayList<>(); + + private UploadCategory() { + //Disables default constructor + } + + public UploadCategory(String value, String categoryTitle) { + this.value = value; + this.categoryTitle = categoryTitle; + } + + public String getValue() { + return value; + } + + public String getCategoryTitle() { + return categoryTitle; + } + + public void addSubCategory(String value, String categoryTitle) { + subCategories.add(new UploadCategory(value, categoryTitle)); + } + + public ArrayList getSubCategories() { + return subCategories; + } + + public boolean hasSubCategories() { + return !subCategories.isEmpty(); + } +} \ No newline at end of file diff --git a/app/src/main/java/gr/thmmy/mthmmy/services/DownloadHelper.java b/app/src/main/java/gr/thmmy/mthmmy/services/DownloadHelper.java index 1e1a5c31..65b5a426 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/services/DownloadHelper.java +++ b/app/src/main/java/gr/thmmy/mthmmy/services/DownloadHelper.java @@ -41,6 +41,7 @@ public class DownloadHelper { request.setDestinationInExternalPublicDir(SAVE_DIR.getName(), fileName); request.allowScanningByMediaScanner(); + BaseApplication.getInstance().logFirebaseAnalyticsEvent("file_download", null); downloadManager.enqueue(request); } catch (Exception e) { Toast.makeText(applicationContext, "Download failed...", Toast.LENGTH_SHORT).show(); diff --git a/app/src/main/java/gr/thmmy/mthmmy/services/NotificationService.java b/app/src/main/java/gr/thmmy/mthmmy/services/NotificationService.java index 2ebe4a37..39e34062 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/services/NotificationService.java +++ b/app/src/main/java/gr/thmmy/mthmmy/services/NotificationService.java @@ -6,11 +6,15 @@ import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Color; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.service.notification.StatusBarNotification; import android.support.annotation.RequiresApi; import android.support.v4.app.NotificationCompat; +import android.support.v7.preference.PreferenceManager; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; @@ -21,15 +25,24 @@ import org.json.JSONObject; import gr.thmmy.mthmmy.R; import gr.thmmy.mthmmy.activities.topic.TopicActivity; import gr.thmmy.mthmmy.base.BaseApplication; +import gr.thmmy.mthmmy.model.Bookmark; import gr.thmmy.mthmmy.model.PostNotification; import timber.log.Timber; import static android.support.v4.app.NotificationCompat.PRIORITY_MAX; +import static gr.thmmy.mthmmy.activities.settings.SettingsActivity.NOTIFICATION_LED_KEY; +import static gr.thmmy.mthmmy.activities.settings.SettingsActivity.NOTIFICATION_VIBRATION_KEY; +import static gr.thmmy.mthmmy.activities.settings.SettingsFragment.SELECTED_RINGTONE; +import static gr.thmmy.mthmmy.activities.settings.SettingsFragment.SETTINGS_SHARED_PREFS; import static gr.thmmy.mthmmy.activities.topic.TopicActivity.BUNDLE_TOPIC_TITLE; import static gr.thmmy.mthmmy.activities.topic.TopicActivity.BUNDLE_TOPIC_URL; +import static gr.thmmy.mthmmy.base.BaseActivity.BOOKMARKED_TOPICS_KEY; +import static gr.thmmy.mthmmy.base.BaseActivity.BOOKMARKS_SHARED_PREFS; +import static gr.thmmy.mthmmy.model.Bookmark.matchExistsById; public class NotificationService extends FirebaseMessagingService { private static final int buildVersion = Build.VERSION.SDK_INT; + private static final int disabledNotifiationsLedColor = Color.argb(0, 0, 0, 0); @Override public void onMessageReceived(RemoteMessage remoteMessage) { @@ -40,16 +53,35 @@ public class NotificationService extends FirebaseMessagingService { try { int userId = BaseApplication.getInstance().getSessionManager().getUserId(); //Don't notify me if the sender is me! - if(Integer.parseInt(json.getString("posterId"))!= userId) - { + if (Integer.parseInt(json.getString("posterId")) != userId) { + int boardId = -1; + String boardTitle = null; int topicId = Integer.parseInt(json.getString("topicId")); + if(remoteMessage.getFrom().contains("b")){ + Timber.i("FCM BOARD type message detected."); + + SharedPreferences bookmarksFile = getSharedPreferences(BOOKMARKS_SHARED_PREFS, Context.MODE_PRIVATE); + String tmpString = bookmarksFile.getString(BOOKMARKED_TOPICS_KEY, null); + if (tmpString != null){ + if(matchExistsById(Bookmark.arrayFromString(tmpString), topicId)){ + Timber.i("Board notification suppressed (already subscribed to topic)."); + return; + } + } + + boardId = Integer.parseInt(json.getString("boardId")); + boardTitle = json.getString("boardTitle"); + } + else + Timber.i("FCM TOPIC type message detected."); + int postId = Integer.parseInt(json.getString("postId")); String topicTitle = json.getString("topicTitle"); String poster = json.getString("poster"); - sendNotification(new PostNotification(postId, topicId, topicTitle, poster)); - } - else - Timber.v("Notification suppressed (own userID)."); + + sendNotification(new PostNotification(postId, topicId, topicTitle, poster, boardId, boardTitle)); + } else + Timber.i("Notification suppressed (own userID)."); } catch (JSONException e) { Timber.e(e, "JSON Exception"); } @@ -70,6 +102,39 @@ public class NotificationService extends FirebaseMessagingService { */ private void sendNotification(PostNotification postNotification) { Timber.i("Creating a notification..."); + + boolean isTopicNotification = postNotification.getBoardId() == -1; + + //Reads notifications preferences + SharedPreferences settingsFile = getSharedPreferences(SETTINGS_SHARED_PREFS, Context.MODE_PRIVATE); + String notificationsSound = settingsFile.getString(SELECTED_RINGTONE, null); + Uri notificationSoundUri = notificationsSound != null ? Uri.parse(notificationsSound) : null; + SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); + + boolean notificationsLedEnabled = sharedPrefs.getBoolean(NOTIFICATION_LED_KEY, true); + boolean notificationsVibrateEnabled = sharedPrefs.getBoolean(NOTIFICATION_VIBRATION_KEY, true); + int notificationDefaultValues = -1; + + if (notificationsLedEnabled) { + notificationDefaultValues = Notification.DEFAULT_LIGHTS; + } + if (notificationsVibrateEnabled) { + if (notificationDefaultValues != -1) { + notificationDefaultValues |= Notification.DEFAULT_VIBRATE; + } else { + notificationDefaultValues = Notification.DEFAULT_VIBRATE; + } + + } + if (notificationSoundUri == null) { + if (notificationDefaultValues != -1) { + notificationDefaultValues = Notification.DEFAULT_SOUND; + } else { + notificationDefaultValues |= Notification.DEFAULT_SOUND; + } + } + + //Builds notification String topicUrl = "https://www.thmmy.gr/smf/index.php?topic=" + postNotification.getTopicId() + "." + postNotification.getPostId(); Intent intent = new Intent(this, TopicActivity.class); Bundle extras = new Bundle(); @@ -80,16 +145,30 @@ public class NotificationService extends FirebaseMessagingService { PendingIntent pendingIntent = PendingIntent.getActivity(this, requestCode++, intent, PendingIntent.FLAG_ONE_SHOT); - final int topicId = postNotification.getTopicId(); - String contentText = "New post by " + postNotification.getPoster(); + int notificationId; + String contentText; + if(isTopicNotification){ + notificationId = postNotification.getTopicId(); + contentText = "New post by " + postNotification.getPoster(); + } + else{ + // Using Cantor pairing function (plus the minus sign) for id uniqueness + int k1 = postNotification.getTopicId(); + int k2 = postNotification.getBoardId(); + notificationId = -(((k1+k2)*(k1+k2+1))/2+k2); + contentText = "New post in \"" + postNotification.getTopicTitle() + "\""; + } + int newPostsCount = 1; - if (buildVersion >= Build.VERSION_CODES.M){ - Notification existingNotification = getActiveNotification(topicId); - if(existingNotification!=null) - { + if (buildVersion >= Build.VERSION_CODES.M) { + Notification existingNotification = getActiveNotification(notificationId); + if (existingNotification != null) { newPostsCount = existingNotification.extras.getInt(NEW_POSTS_COUNT) + 1; - contentText = newPostsCount + " new posts"; + if(isTopicNotification) + contentText = newPostsCount + " new posts"; + else + contentText = newPostsCount + " new posts in " + postNotification.getTopicTitle(); } } @@ -99,25 +178,42 @@ public class NotificationService extends FirebaseMessagingService { NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.ic_notification) - .setContentTitle(postNotification.getTopicTitle()) .setContentText(contentText) .setAutoCancel(true) .setContentIntent(pendingIntent) - .setDefaults(Notification.DEFAULT_ALL) .setGroup(GROUP_KEY) .addExtras(notificationExtras); + if(isTopicNotification) + notificationBuilder.setContentTitle(postNotification.getTopicTitle()); + + else + notificationBuilder.setContentTitle(postNotification.getBoardTitle()); + + //Applies user's notifications preferences + if (notificationDefaultValues != -1) { + notificationBuilder.setDefaults(notificationDefaultValues); + } + if (notificationSoundUri != null) { + notificationBuilder.setSound(notificationSoundUri); + } + if (!notificationsVibrateEnabled) { + notificationBuilder.setVibrate(new long[]{0L}); + } + if (!notificationsLedEnabled) { + notificationBuilder.setLights(disabledNotifiationsLedColor, 0, 1000); + } + if (buildVersion < Build.VERSION_CODES.O) notificationBuilder.setPriority(PRIORITY_MAX); boolean createSummaryNotification = false; - if(buildVersion >= Build.VERSION_CODES.M) - createSummaryNotification = otherNotificationsExist(topicId); + if (buildVersion >= Build.VERSION_CODES.M) + createSummaryNotification = otherNotificationsExist(notificationId); NotificationCompat.Builder summaryNotificationBuilder = null; - if(createSummaryNotification) - { + if (createSummaryNotification) { summaryNotificationBuilder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.ic_notification) @@ -129,28 +225,26 @@ public class NotificationService extends FirebaseMessagingService { .setDefaults(Notification.DEFAULT_ALL); } - - - NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // Since Android Oreo notification channel is needed. - if (buildVersion >= Build.VERSION_CODES.O) - notificationManager.createNotificationChannel(new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH)); + if (buildVersion >= Build.VERSION_CODES.O){ + if (notificationManager.getNotificationChannel(CHANNEL_ID) == null) + notificationManager.createNotificationChannel(new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH)); + } - notificationManager.notify(NEW_POST_TAG, topicId, notificationBuilder.build()); + notificationManager.notify(NEW_POST_TAG, notificationId, notificationBuilder.build()); - if(createSummaryNotification) - notificationManager.notify(SUMMARY_TAG,0, summaryNotificationBuilder.build()); + if (createSummaryNotification) + notificationManager.notify(SUMMARY_TAG, 0, summaryNotificationBuilder.build()); } @RequiresApi(api = Build.VERSION_CODES.M) private Notification getActiveNotification(int notificationId) { NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - if(notificationManager!=null) - { + if (notificationManager != null) { StatusBarNotification[] barNotifications = notificationManager.getActiveNotifications(); - for(StatusBarNotification notification: barNotifications) { + for (StatusBarNotification notification : barNotifications) { if (notification.getId() == notificationId) return notification.getNotification(); } @@ -160,13 +254,13 @@ public class NotificationService extends FirebaseMessagingService { } @RequiresApi(api = Build.VERSION_CODES.M) - private boolean otherNotificationsExist(int notificationId){ + private boolean otherNotificationsExist(int notificationId) { NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - if(notificationManager!=null) { + if (notificationManager != null) { StatusBarNotification[] barNotifications = notificationManager.getActiveNotifications(); for (StatusBarNotification notification : barNotifications) { String tag = notification.getTag(); - if (tag!=null && tag.equals(NEW_POST_TAG) && notification.getId() != notificationId) + if (tag != null && tag.equals(NEW_POST_TAG) && notification.getId() != notificationId) return true; } } @@ -180,4 +274,13 @@ public class NotificationService extends FirebaseMessagingService { } + /** + * Called if InstanceID token is updated. Note that this is called when the InstanceID token + * is initially generated so this is where you would retrieve the token. + */ + @Override + public void onNewToken(String s) { + super.onNewToken(s); + Timber.i("InstanceID token updated (onNewToken)"); + } } diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/AppCompatSpinnerWithoutDefault.java b/app/src/main/java/gr/thmmy/mthmmy/utils/AppCompatSpinnerWithoutDefault.java new file mode 100644 index 00000000..74bed048 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/utils/AppCompatSpinnerWithoutDefault.java @@ -0,0 +1,109 @@ +package gr.thmmy.mthmmy.utils; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.support.v7.widget.AppCompatSpinner; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.SpinnerAdapter; +import android.widget.TextView; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class AppCompatSpinnerWithoutDefault extends AppCompatSpinner { + public AppCompatSpinnerWithoutDefault(Context context) { + super(context); + } + + public AppCompatSpinnerWithoutDefault(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public AppCompatSpinnerWithoutDefault(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + @SuppressLint("PrivateApi") + public void setAdapter(SpinnerAdapter orig) { + final SpinnerAdapter adapter = newProxy(orig); + + super.setAdapter(adapter); + + try { + final Method m = AdapterView.class.getDeclaredMethod( + "setNextSelectedPositionInt", int.class); + m.setAccessible(true); + m.invoke(this, -1); + + final Method n = AdapterView.class.getDeclaredMethod( + "setSelectedPositionInt", int.class); + n.setAccessible(true); + n.invoke(this, -1); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + protected SpinnerAdapter newProxy(SpinnerAdapter obj) { + return (SpinnerAdapter) java.lang.reflect.Proxy.newProxyInstance( + obj.getClass().getClassLoader(), + new Class[]{SpinnerAdapter.class}, + new SpinnerAdapterProxy(obj)); + } + + + /** + * Intercepts getView() to display the prompt if position < 0 + */ + protected class SpinnerAdapterProxy implements InvocationHandler { + + SpinnerAdapter obj; + Method getView; + + + SpinnerAdapterProxy(SpinnerAdapter obj) { + this.obj = obj; + try { + this.getView = SpinnerAdapter.class.getMethod( + "getView", int.class, View.class, ViewGroup.class); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { + try { + return m.equals(getView) && + (Integer) (args[0]) < 0 ? + getView((Integer) args[0], (View) args[1], (ViewGroup) args[2]) : + m.invoke(obj, args); + } catch (InvocationTargetException e) { + throw e.getTargetException(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + View getView(int position, View convertView, ViewGroup parent) { + if (position < 0) { + LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + if (inflater != null) { + final TextView v = + (TextView) inflater.inflate(android.R.layout.simple_spinner_item, parent, false); + v.setText(getPrompt()); + return v; + } + return null; + } + return obj.getView(position, convertView, parent); + } + } + +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/CrashReporter.java b/app/src/main/java/gr/thmmy/mthmmy/utils/CrashReporter.java new file mode 100644 index 00000000..81b06769 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/utils/CrashReporter.java @@ -0,0 +1,42 @@ +package gr.thmmy.mthmmy.utils; + +import com.crashlytics.android.Crashlytics; + +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import gr.thmmy.mthmmy.utils.parsing.ParseHelpers; + +public class CrashReporter { + private static final int STRING_BATCH_LENGTH = 250; + + private CrashReporter() {} + + public static void reportDocument(Document document, String key) { + String documentString = document.toString(); + + ParseHelpers.Language language = ParseHelpers.Language.getLanguage(document); + Elements postRows; + if (language.is(ParseHelpers.Language.GREEK)) + postRows = document.select("form[id=quickModForm]>table>tbody>tr:matches(στις)"); + else + postRows = document.select("form[id=quickModForm]>table>tbody>tr:matches(on)"); + for (Element thisRow : postRows) { + String subject = thisRow.select("div[id^=subject_]").first().select("a").first().text(); + documentString = documentString.replace(subject, "subject"); + String post = thisRow.select("div").select(".post").first().text(); + documentString = documentString.replace(post, "post"); + } + + int batchCount = documentString.length() / STRING_BATCH_LENGTH; + for (int i = 0; i < batchCount; i++) { + String batch; + if (i != batchCount - 1) + batch = documentString.substring(i * STRING_BATCH_LENGTH, (i + 1) * STRING_BATCH_LENGTH); + else + batch = documentString.substring(i * STRING_BATCH_LENGTH); + Crashlytics.setString(key + "_" + i + 1, batch); + } + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/ExternalAsyncTask.java b/app/src/main/java/gr/thmmy/mthmmy/utils/ExternalAsyncTask.java new file mode 100644 index 00000000..d20d29dc --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/utils/ExternalAsyncTask.java @@ -0,0 +1,80 @@ +package gr.thmmy.mthmmy.utils; + +import android.os.AsyncTask; + +public abstract class ExternalAsyncTask extends AsyncTask { + + protected OnTaskStartedListener onTaskStartedListener; + protected OnTaskCancelledListener onTaskCancelledListener; + protected OnTaskFinishedListener onTaskFinishedListener; + + @Override + protected void onPreExecute() { + if (onTaskStartedListener != null) + onTaskStartedListener.onTaskStarted(); + else + super.onPreExecute(); + } + + @Override + protected void onCancelled() { + if (onTaskCancelledListener != null) + onTaskCancelledListener.onTaskCanceled(); + else + super.onCancelled(); + } + + @Override + protected void onCancelled(V v) { + if (onTaskCancelledListener != null) + onTaskCancelledListener.onTaskCanceled(); + else + super.onCancelled(); + } + + @Override + protected void onPostExecute(V v) { + if (onTaskFinishedListener != null) + onTaskFinishedListener.onTaskFinished(v); + else + super.onPostExecute(v); + } + + public ExternalAsyncTask(OnTaskStartedListener onTaskStartedListener, OnTaskCancelledListener onTaskCancelledListener, + OnTaskFinishedListener onTaskFinishedListener) { + this.onTaskStartedListener = onTaskStartedListener; + this.onTaskCancelledListener = onTaskCancelledListener; + this.onTaskFinishedListener = onTaskFinishedListener; + } + + public ExternalAsyncTask(OnTaskStartedListener onTaskStartedListener, OnTaskFinishedListener onTaskFinishedListener) { + this.onTaskStartedListener = onTaskStartedListener; + this.onTaskFinishedListener = onTaskFinishedListener; + } + + public ExternalAsyncTask() { } + + public void setOnTaskStartedListener(OnTaskStartedListener onTaskStartedListener) { + this.onTaskStartedListener = onTaskStartedListener; + } + + public void setOnTaskCancelledListener(OnTaskCancelledListener onTaskCancelledListener) { + this.onTaskCancelledListener = onTaskCancelledListener; + } + + public void setOnTaskFinishedListener(OnTaskFinishedListener onTaskFinishedListener) { + this.onTaskFinishedListener = onTaskFinishedListener; + } + + public interface OnTaskStartedListener { + void onTaskStarted(); + } + + public interface OnTaskCancelledListener { + void onTaskCanceled(); + } + + public interface OnTaskFinishedListener { + void onTaskFinished(V result); + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/HTMLUtils.java b/app/src/main/java/gr/thmmy/mthmmy/utils/HTMLUtils.java new file mode 100644 index 00000000..2713a2a8 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/utils/HTMLUtils.java @@ -0,0 +1,76 @@ +package gr.thmmy.mthmmy.utils; + +import android.app.Activity; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.text.Html; +import android.text.SpannableStringBuilder; +import android.text.style.ClickableSpan; +import android.text.style.URLSpan; +import android.view.View; + +import gr.thmmy.mthmmy.activities.board.BoardActivity; +import gr.thmmy.mthmmy.activities.profile.ProfileActivity; +import gr.thmmy.mthmmy.model.ThmmyPage; + +import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; +import static gr.thmmy.mthmmy.activities.board.BoardActivity.BUNDLE_BOARD_TITLE; +import static gr.thmmy.mthmmy.activities.board.BoardActivity.BUNDLE_BOARD_URL; +import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_THUMBNAIL_URL; +import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_URL; +import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_USERNAME; + +public class HTMLUtils { + private HTMLUtils() {} + + public static SpannableStringBuilder getSpannableFromHtml(Activity activity, String html) { + CharSequence sequence; + if (Build.VERSION.SDK_INT >= 24) { + sequence = Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY); + } else { + //noinspection deprecation + sequence = Html.fromHtml(html); + } + SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence); + URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class); + for (URLSpan span : urls) { + makeLinkClickable(activity, strBuilder, span); + } + return strBuilder; + } + + private static void makeLinkClickable(Activity activity, SpannableStringBuilder strBuilder, final URLSpan span) { + int start = strBuilder.getSpanStart(span); + int end = strBuilder.getSpanEnd(span); + int flags = strBuilder.getSpanFlags(span); + ClickableSpan clickable = new ClickableSpan() { + @Override + public void onClick(View view) { + ThmmyPage.PageCategory target = ThmmyPage.resolvePageCategory(Uri.parse(span.getURL())); + if (target.is(ThmmyPage.PageCategory.BOARD)) { + Intent intent = new Intent(activity.getApplicationContext(), BoardActivity.class); + Bundle extras = new Bundle(); + extras.putString(BUNDLE_BOARD_URL, span.getURL()); + extras.putString(BUNDLE_BOARD_TITLE, ""); + intent.putExtras(extras); + intent.setFlags(FLAG_ACTIVITY_NEW_TASK); + activity.getApplicationContext().startActivity(intent); + } else if (target.is(ThmmyPage.PageCategory.PROFILE)) { + Intent intent = new Intent(activity.getApplicationContext(), ProfileActivity.class); + Bundle extras = new Bundle(); + extras.putString(BUNDLE_PROFILE_URL, span.getURL()); + extras.putString(BUNDLE_PROFILE_THUMBNAIL_URL, ""); + extras.putString(BUNDLE_PROFILE_USERNAME, ""); + intent.putExtras(extras); + intent.setFlags(FLAG_ACTIVITY_NEW_TASK); + activity.getApplicationContext().startActivity(intent); + } else if (target.is(ThmmyPage.PageCategory.INDEX)) + activity.finish(); + } + }; + strBuilder.setSpan(clickable, start, end, flags); + strBuilder.removeSpan(span); + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/LaunchType.java b/app/src/main/java/gr/thmmy/mthmmy/utils/LaunchType.java new file mode 100644 index 00000000..29411b55 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/utils/LaunchType.java @@ -0,0 +1,40 @@ +package gr.thmmy.mthmmy.utils; + +import android.content.SharedPreferences; +import android.preference.PreferenceManager; + +import gr.thmmy.mthmmy.BuildConfig; +import gr.thmmy.mthmmy.base.BaseApplication; + +public class LaunchType { + public enum LAUNCH_TYPE { + FIRST_LAUNCH_EVER, FIRST_LAUNCH_AFTER_UPDATE, NORMAL_LAUNCH, INDETERMINATE + } + + private static final String PREF_VERSION_CODE_KEY = "VERSION_CODE"; + + public static LAUNCH_TYPE getLaunchType() { + final int notThere = -1; + //Gets current version code + int currentVersionCode = BuildConfig.VERSION_CODE; + //Gets saved version code + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(BaseApplication.getInstance().getContext()); + int savedVersionCode = prefs.getInt(PREF_VERSION_CODE_KEY, notThere); + //Checks for first run or upgrade + if (currentVersionCode == savedVersionCode) { + //This is just a normal run + return LAUNCH_TYPE.NORMAL_LAUNCH; + } else if (savedVersionCode == notThere) { + //Updates the shared preferences with the current version code + prefs.edit().putInt(PREF_VERSION_CODE_KEY, currentVersionCode).apply(); + return LAUNCH_TYPE.FIRST_LAUNCH_EVER; + } else if (currentVersionCode > savedVersionCode) { + //Updates the shared preferences with the current version code + prefs.edit().putInt(PREF_VERSION_CODE_KEY, currentVersionCode).apply(); + return LAUNCH_TYPE.FIRST_LAUNCH_AFTER_UPDATE; + } + //Probably shared preferences were manually changed by the user + return LAUNCH_TYPE.INDETERMINATE; + } +} + diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/NetworkResultCodes.java b/app/src/main/java/gr/thmmy/mthmmy/utils/NetworkResultCodes.java new file mode 100644 index 00000000..90cd8771 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/utils/NetworkResultCodes.java @@ -0,0 +1,32 @@ +package gr.thmmy.mthmmy.utils; + +public class NetworkResultCodes { + /** + * The request was successful + */ + public static final int SUCCESSFUL = 0; + /** + * Error 404, page was not found + */ + public static final int NOT_FOUND = 1; + /** + * User session ended while posting the reply + */ + public static final int SESSION_ENDED = 2; + /** + * Exception occured while parsing + */ + public static final int PARSE_ERROR = 3; + /** + * Other undefined of unidentified error + */ + public static final int OTHER_ERROR = 4; + /** + * Failed to connect to thmmy.gr + */ + public static final int NETWORK_ERROR = 5; + /** + * Error while excecuting NetworkTask's performTask() + */ + public static final int PERFORM_TASK_ERROR = 6; +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/NetworkTask.java b/app/src/main/java/gr/thmmy/mthmmy/utils/NetworkTask.java new file mode 100644 index 00000000..cb613f26 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/utils/NetworkTask.java @@ -0,0 +1,91 @@ +package gr.thmmy.mthmmy.utils; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; + +import java.io.IOException; + +import gr.thmmy.mthmmy.base.BaseApplication; +import gr.thmmy.mthmmy.utils.parsing.ParseException; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import timber.log.Timber; + +public abstract class NetworkTask extends ExternalAsyncTask> { + + protected OnNetworkTaskFinishedListener onNetworkTaskFinishedListener; + + public NetworkTask(OnTaskStartedListener onTaskStartedListener, OnTaskCancelledListener onTaskCancelledListener, + OnNetworkTaskFinishedListener onNetworkTaskFinishedListener) { + super(onTaskStartedListener, onTaskCancelledListener, null); + this.onNetworkTaskFinishedListener = onNetworkTaskFinishedListener; + } + + public NetworkTask(OnTaskStartedListener onTaskStartedListener, OnNetworkTaskFinishedListener onNetworkTaskFinishedListener) { + super(onTaskStartedListener, null); + this.onNetworkTaskFinishedListener = onNetworkTaskFinishedListener; + } + + public NetworkTask() {} + + @Override + protected final Parcel doInBackground(String... input) { + Response response; + try { + response = sendRequest(BaseApplication.getInstance().getClient(), input); + } catch (IOException e) { + Timber.e(e, "Error connecting to thmmy.gr"); + return new Parcel<>(NetworkResultCodes.NETWORK_ERROR, null); + } + String responseBodyString; + try { + responseBodyString = response.body().string(); + } catch (NullPointerException npe) { + Timber.wtf(npe, "Invalid response. Detatails: https://square.github.io/okhttp/3.x/okhttp/okhttp3/Response.html#body--"); + return new Parcel<>(NetworkResultCodes.NETWORK_ERROR, null); + } catch (IOException e) { + Timber.e(e, "Error getting response body string"); + return new Parcel<>(NetworkResultCodes.NETWORK_ERROR, null); + } + try { + T data = performTask(Jsoup.parse(responseBodyString), response); + int resultCode = getResultCode(response, data); + return new Parcel<>(resultCode, data); + } catch (ParseException pe) { + Timber.e(pe); + return new Parcel<>(NetworkResultCodes.PARSE_ERROR, null); + } catch (Exception e) { + Timber.e(e); + return new Parcel<>(NetworkResultCodes.PERFORM_TASK_ERROR, null); + } + } + + @Override + protected void onPostExecute(Parcel tParcel) { + if (onNetworkTaskFinishedListener != null) + onNetworkTaskFinishedListener.onNetworkTaskFinished(tParcel.getResultCode(), tParcel.getData()); + else + super.onPostExecute(tParcel); + } + + protected Response sendRequest(OkHttpClient client, String... input) throws IOException { + String url = input[0]; + Request request = new Request.Builder() + .url(url) + .build(); + return client.newCall(request).execute(); + } + + protected abstract T performTask(Document document, Response response); + + protected abstract int getResultCode(Response response, T data); + + public void setOnNetworkTaskFinishedListener(OnNetworkTaskFinishedListener onNetworkTaskFinishedListener) { + this.onNetworkTaskFinishedListener = onNetworkTaskFinishedListener; + } + + public interface OnNetworkTaskFinishedListener { + void onNetworkTaskFinished(int resultCode, T data); + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/Parcel.java b/app/src/main/java/gr/thmmy/mthmmy/utils/Parcel.java new file mode 100644 index 00000000..83e65285 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/utils/Parcel.java @@ -0,0 +1,20 @@ +package gr.thmmy.mthmmy.utils; + +public class Parcel { + + private int resultCode; + private T data; + + public Parcel(int resultCode, T data) { + this.resultCode = resultCode; + this.data = data; + } + + public int getResultCode() { + return resultCode; + } + + public T getData() { + return data; + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/ScrollAwareFABBehavior.java b/app/src/main/java/gr/thmmy/mthmmy/utils/ScrollAwareFABBehavior.java index d82e349b..9f843c20 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/utils/ScrollAwareFABBehavior.java +++ b/app/src/main/java/gr/thmmy/mthmmy/utils/ScrollAwareFABBehavior.java @@ -4,13 +4,14 @@ import android.content.Context; import android.support.annotation.NonNull; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.Snackbar; import android.support.v4.view.ViewCompat; import android.util.AttributeSet; import android.view.View; /** * Extends FloatingActionButton's behavior so the button will hide when scrolling down and show - * otherwise. + * otherwise. It also lifts the {@link FloatingActionButton} when a {@link Snackbar} is shown. */ @SuppressWarnings("unused") public class ScrollAwareFABBehavior extends CoordinatorLayout.Behavior { @@ -48,4 +49,16 @@ public class ScrollAwareFABBehavior extends CoordinatorLayout.BehaviorWhen a nested ScrollView is scrolled down, the view will disappear. - * When the ScrollView is scrolled back up, the view will reappear.

    + * When the ScrollView is scrolled back up, the view will reappear. It also pushes the + * {@link android.widget.LinearLayout} up when a {@link Snackbar} is shown + *

    */ @SuppressWarnings("unused") public class ScrollAwareLinearBehavior extends CoordinatorLayout.Behavior { @@ -111,4 +114,16 @@ public class ScrollAwareLinearBehavior extends CoordinatorLayout.Behavior animator.start(); } + + @Override + public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { + return dependency instanceof Snackbar.SnackbarLayout; + } + + @Override + public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { + float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight()); + child.setTranslationY(translationY); + return true; + } } \ No newline at end of file diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/parsing/NewParseTask.java b/app/src/main/java/gr/thmmy/mthmmy/utils/parsing/NewParseTask.java new file mode 100644 index 00000000..def14c2f --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/utils/parsing/NewParseTask.java @@ -0,0 +1,31 @@ +package gr.thmmy.mthmmy.utils.parsing; + +import org.jsoup.nodes.Document; + +import gr.thmmy.mthmmy.utils.NetworkTask; +import okhttp3.Response; + +public abstract class NewParseTask extends NetworkTask { + + public NewParseTask(OnTaskStartedListener onTaskStartedListener, OnTaskCancelledListener onTaskCancelledListener, + OnNetworkTaskFinishedListener onParseTaskFinishedListener) { + super(onTaskStartedListener, onTaskCancelledListener, onParseTaskFinishedListener); + } + + public NewParseTask(OnTaskStartedListener onTaskStartedListener, OnNetworkTaskFinishedListener onParseTaskFinishedListener) { + super(onTaskStartedListener, onParseTaskFinishedListener); + } + + public NewParseTask() {} + + @Override + protected final T performTask(Document document, Response response) { + try { + return parse(document, response); + } catch (Exception e) { + throw new ParseException("Parse failed.", e); + } + } + + protected abstract T parse (Document document, Response response) throws ParseException; +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/parsing/ParseException.java b/app/src/main/java/gr/thmmy/mthmmy/utils/parsing/ParseException.java index fea7be6b..942e789b 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/utils/parsing/ParseException.java +++ b/app/src/main/java/gr/thmmy/mthmmy/utils/parsing/ParseException.java @@ -3,11 +3,15 @@ package gr.thmmy.mthmmy.utils.parsing; /** * ParseException is to be used for errors while parsing. */ -public class ParseException extends Exception { +public class ParseException extends RuntimeException { public ParseException() {} public ParseException(String message) { super(message); } + + public ParseException(String message, Throwable cause) { + super(message, cause); + } } diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/parsing/ParseHelpers.java b/app/src/main/java/gr/thmmy/mthmmy/utils/parsing/ParseHelpers.java index 307efab0..2208ff04 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/utils/parsing/ParseHelpers.java +++ b/app/src/main/java/gr/thmmy/mthmmy/utils/parsing/ParseHelpers.java @@ -5,6 +5,8 @@ import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * This class consists exclusively of static classes (enums) and methods (excluding methods of inner @@ -166,4 +168,21 @@ public class ParseHelpers { } return fixed; } + + /** + * Method that extracts the base URL from a topic's page URL. For example a topic with url similar to + * "https://www.thmmy.gr/smf/index.php?topic=1.15;topicseen" or + * "https://www.thmmy.gr/smf/index.php?topic=1.msg1#msg1" + * has the base url "https://www.thmmy.gr/smf/index.php?topic=1" + * + * @param topicURL a topic's page URL + * @return the base URL of the given topic + */ + public static String getBaseURL(String topicURL) { + String forumUrl = "https://www.thmmy.gr/smf/index.php?"; + Matcher baseUrlMatcher = Pattern.compile("topic=[0-9]+").matcher(topicURL); + if (baseUrlMatcher.find()) + return forumUrl + topicURL.substring(baseUrlMatcher.start(), baseUrlMatcher.end()); + else return ""; + } } diff --git a/app/src/main/java/gr/thmmy/mthmmy/viewmodel/BaseViewModel.java b/app/src/main/java/gr/thmmy/mthmmy/viewmodel/BaseViewModel.java new file mode 100644 index 00000000..53ed84ef --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/viewmodel/BaseViewModel.java @@ -0,0 +1,18 @@ +package gr.thmmy.mthmmy.viewmodel; + +import android.arch.lifecycle.LiveData; +import android.arch.lifecycle.MutableLiveData; +import android.arch.lifecycle.ViewModel; + +import gr.thmmy.mthmmy.model.Bookmark; + +public class BaseViewModel extends ViewModel { + protected MutableLiveData currentPageBookmark; + + public LiveData getCurrentPageBookmark() { + if (currentPageBookmark == null) { + currentPageBookmark = new MutableLiveData<>(); + } + return currentPageBookmark; + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/viewmodel/TopicViewModel.java b/app/src/main/java/gr/thmmy/mthmmy/viewmodel/TopicViewModel.java new file mode 100644 index 00000000..530cdc9d --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/viewmodel/TopicViewModel.java @@ -0,0 +1,484 @@ +package gr.thmmy.mthmmy.viewmodel; + +import android.arch.lifecycle.MutableLiveData; +import android.content.Context; +import android.content.SharedPreferences; +import android.os.AsyncTask; +import android.preference.PreferenceManager; +import android.widget.CheckBox; +import android.widget.LinearLayout; +import android.widget.RadioGroup; + +import java.util.ArrayList; + +import gr.thmmy.mthmmy.activities.settings.SettingsActivity; +import gr.thmmy.mthmmy.activities.topic.tasks.DeleteTask; +import gr.thmmy.mthmmy.activities.topic.tasks.EditTask; +import gr.thmmy.mthmmy.activities.topic.tasks.PrepareForEditResult; +import gr.thmmy.mthmmy.activities.topic.tasks.PrepareForEditTask; +import gr.thmmy.mthmmy.activities.topic.tasks.PrepareForReply; +import gr.thmmy.mthmmy.activities.topic.tasks.PrepareForReplyResult; +import gr.thmmy.mthmmy.activities.topic.tasks.RemoveVoteTask; +import gr.thmmy.mthmmy.activities.topic.tasks.ReplyTask; +import gr.thmmy.mthmmy.activities.topic.tasks.SubmitVoteTask; +import gr.thmmy.mthmmy.activities.topic.tasks.TopicTask; +import gr.thmmy.mthmmy.activities.topic.tasks.TopicTaskResult; +import gr.thmmy.mthmmy.base.BaseActivity; +import gr.thmmy.mthmmy.model.Poll; +import gr.thmmy.mthmmy.model.Post; +import gr.thmmy.mthmmy.model.TopicItem; +import gr.thmmy.mthmmy.session.SessionManager; +import gr.thmmy.mthmmy.utils.ExternalAsyncTask; +import gr.thmmy.mthmmy.utils.NetworkTask; +import gr.thmmy.mthmmy.utils.parsing.ParseHelpers; +import timber.log.Timber; + +public class TopicViewModel extends BaseViewModel implements TopicTask.OnTopicTaskCompleted, + PrepareForReply.OnPrepareForReplyFinished, PrepareForEditTask.OnPrepareEditFinished { + /** + * topic state + */ + private boolean editingPost = false; + private boolean writingReply = false; + /** + * A list of {@link Post#getPostIndex()} for building quotes for replying + */ + private ArrayList toQuoteList = new ArrayList<>(); + /** + * caches the expand/collapse state of the user extra info in the current page for the recyclerview + */ + private ArrayList isUserExtraInfoVisibile = new ArrayList<>(); + /** + * holds the adapter position of the post being edited + */ + private int postBeingEditedPosition; + + private TopicTask currentTopicTask; + private PrepareForEditTask currentPrepareForEditTask; + private PrepareForReply currentPrepareForReplyTask; + + //callbacks for topic activity + private TopicTask.TopicTaskObserver topicTaskObserver; + private ExternalAsyncTask.OnTaskStartedListener deleteTaskStartedListener; + private NetworkTask.OnNetworkTaskFinishedListener deleteTaskFinishedListener; + private ReplyTask.ReplyTaskCallbacks replyFinishListener; + private PrepareForEditTask.PrepareForEditCallbacks prepareForEditCallbacks; + private EditTask.EditTaskCallbacks editTaskCallbacks; + private PrepareForReply.PrepareForReplyCallbacks prepareForReplyCallbacks; + private ExternalAsyncTask.OnTaskStartedListener voteTaskStartedListener; + private NetworkTask.OnNetworkTaskFinishedListener voteTaskFinishedListener; + private ExternalAsyncTask.OnTaskStartedListener removeVoteTaskStartedListener; + private NetworkTask.OnNetworkTaskFinishedListener removeVoteTaskFinishedListener; + + /** + * Holds the value (index) of the page to be requested when a user interaction with bottom + * navigation bar occurs, aka the value that the page indicator shows + */ + private MutableLiveData pageIndicatorIndex = new MutableLiveData<>(); + + private MutableLiveData replyPageUrl = new MutableLiveData<>(); + private MutableLiveData pageTopicId = new MutableLiveData<>(); + private MutableLiveData topicTitle = new MutableLiveData<>(); + private MutableLiveData> topicItems = new MutableLiveData<>(); + private MutableLiveData focusedPostIndex = new MutableLiveData<>(); + private MutableLiveData topicTaskResultCode = new MutableLiveData<>(); + private MutableLiveData topicTreeAndMods = new MutableLiveData<>(); + private MutableLiveData topicViewers = new MutableLiveData<>(); + private String topicUrl; + private int currentPageIndex; + private int pageCount; + + private MutableLiveData prepareForReplyResult = new MutableLiveData<>(); + private MutableLiveData prepareForEditResult = new MutableLiveData<>(); + + public void loadUrl(String pageUrl) { + stopLoading(); + topicUrl = pageUrl; + currentTopicTask = new TopicTask(topicTaskObserver, this); + currentTopicTask.execute(pageUrl); + } + + public void reloadPage() { + if (topicUrl == null) throw new NullPointerException("No topic task has been requested yet!"); + Timber.i("Reloading page"); + loadUrl(topicUrl); + } + + public void reloadPageThen(Runnable runnable) { + if (topicUrl == null) throw new NullPointerException("No topic task has been requested yet!"); + Timber.i("Reloading page"); + stopLoading(); + currentTopicTask = new TopicTask(topicTaskObserver, result -> { + TopicViewModel.this.onTopicTaskCompleted(result); + runnable.run(); + }); + currentTopicTask.execute(topicUrl); + } + + /** + * In contrasto to {@link TopicViewModel#reloadPage()} this method gets rid of any arguements + * in the url before refreshing + */ + public void resetPage() { + if (topicUrl == null) throw new NullPointerException("No topic task has been requested yet!"); + Timber.i("Reseting page"); + loadUrl(ParseHelpers.getBaseURL(topicUrl) + "." + String.valueOf(currentPageIndex * 15)); + } + + public void loadPageIndicated() { + if (pageIndicatorIndex.getValue() == null) + throw new NullPointerException("No page has been loaded yet!"); + int pageRequested = pageIndicatorIndex.getValue() - 1; + if (pageRequested != currentPageIndex - 1) { + Timber.i("Changing to page " + pageRequested + 1); + loadUrl(ParseHelpers.getBaseURL(topicUrl) + "." + String.valueOf(pageRequested * 15)); + pageIndicatorIndex.setValue(pageRequested + 1); + } else { + stopLoading(); + } + } + + public boolean submitVote(LinearLayout optionsLayout) { + if (topicItems.getValue() == null) throw new NullPointerException("Topic task has not finished yet!"); + ArrayList votes = new ArrayList<>(); + if (optionsLayout.getChildAt(0) instanceof RadioGroup) { + RadioGroup optionsRadioGroup = (RadioGroup) optionsLayout.getChildAt(0); + votes.add(optionsRadioGroup.getCheckedRadioButtonId()); + } else if (optionsLayout.getChildAt(0) instanceof LinearLayout) { + for (int i = 0; i < optionsLayout.getChildCount(); i++) { + LinearLayout container = (LinearLayout) optionsLayout.getChildAt(i); + if (((CheckBox) container.getChildAt(0)).isChecked()) + votes.add(i); + } + } + int[] votesArray = new int[votes.size()]; + for (int i = 0; i < votes.size(); i++) votesArray[i] = votes.get(i); + Poll poll = (Poll) topicItems.getValue().get(0); + if (poll.getAvailableVoteCount() < votesArray.length) return false; + SubmitVoteTask submitVoteTask = new SubmitVoteTask(votesArray); + submitVoteTask.setOnTaskStartedListener(voteTaskStartedListener); + submitVoteTask.setOnNetworkTaskFinishedListener(voteTaskFinishedListener); + submitVoteTask.execute(poll.getPollFormUrl(), poll.getSc()); + return true; + } + + public void removeVote() { + if (topicItems.getValue() == null) throw new NullPointerException("Topic task has not finished yet!"); + RemoveVoteTask removeVoteTask = new RemoveVoteTask(); + removeVoteTask.setOnTaskStartedListener(removeVoteTaskStartedListener); + removeVoteTask.setOnNetworkTaskFinishedListener(removeVoteTaskFinishedListener); + removeVoteTask.execute(((Poll) topicItems.getValue().get(0)).getRemoveVoteUrl()); + } + + public void prepareForReply() { + if (replyPageUrl.getValue() == null) + throw new NullPointerException("Topic task has not finished yet!"); + stopLoading(); + setPageIndicatorIndex(pageCount, true); + Timber.i("Preparing for reply"); + currentPrepareForReplyTask = new PrepareForReply(prepareForReplyCallbacks, this, + replyPageUrl.getValue()); + currentPrepareForReplyTask.execute(toQuoteList.toArray(new Integer[0])); + } + + public void postReply(Context context, String subject, String reply) { + if (prepareForReplyResult.getValue() == null) { + throw new NullPointerException("Reply preparation was not found!"); + } + PrepareForReplyResult replyForm = prepareForReplyResult.getValue(); + boolean includeAppSignature = true; + SessionManager sessionManager = BaseActivity.getSessionManager(); + if (sessionManager.isLoggedIn()) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + includeAppSignature = prefs.getBoolean(SettingsActivity.POSTING_APP_SIGNATURE_ENABLE_KEY, true); + } + toQuoteList.clear(); + Timber.i("Posting reply"); + new ReplyTask(replyFinishListener, includeAppSignature).execute(subject, reply, + replyForm.getNumReplies(), replyForm.getSeqnum(), replyForm.getSc(), replyForm.getTopic()); + } + + public void deletePost(String postDeleteUrl) { + Timber.i("Deleting post"); + new DeleteTask(deleteTaskStartedListener, deleteTaskFinishedListener).execute(postDeleteUrl); + } + + public void prepareForEdit(int position, String postEditURL) { + if (replyPageUrl.getValue() == null) + throw new NullPointerException("Topic task has not finished yet!"); + stopLoading(); + Timber.i("Preparing for edit"); + currentPrepareForEditTask = new PrepareForEditTask(prepareForEditCallbacks, this, position, + replyPageUrl.getValue()); + currentPrepareForEditTask.execute(postEditURL); + } + + public void editPost(int position, String subject, String message) { + if (prepareForEditResult.getValue() == null) + throw new NullPointerException("Edit preparation was not found!"); + PrepareForEditResult editResult = prepareForEditResult.getValue(); + Timber.i("Editing post"); + new EditTask(editTaskCallbacks, position).execute(editResult.getCommitEditUrl(), message, + editResult.getNumReplies(), editResult.getSeqnum(), editResult.getSc(), subject, editResult.getTopic()); + } + + /** + * cancel tasks that change the ui + * topic, prepare for edit, prepare for reply tasks need to cancel all other ui changing tasks + * before starting + */ + public void stopLoading() { + if (currentTopicTask != null && currentTopicTask.getStatus() == AsyncTask.Status.RUNNING) { + Timber.i("Canceling topic task"); + currentTopicTask.cancel(true); + pageIndicatorIndex.setValue(currentPageIndex); + topicTaskObserver.onTopicTaskCancelled(); + } + if (currentPrepareForEditTask != null && currentPrepareForEditTask.getStatus() == AsyncTask.Status.RUNNING) { + Timber.i("Canceling prepare for edit task"); + currentPrepareForEditTask.cancel(true); + prepareForEditCallbacks.onPrepareEditCancelled(); + } + if (currentPrepareForReplyTask != null && currentPrepareForReplyTask.getStatus() == AsyncTask.Status.RUNNING) { + Timber.i("Canceling prepare for reply task"); + currentPrepareForReplyTask.cancel(true); + prepareForReplyCallbacks.onPrepareForReplyCancelled(); + } + // no need to cancel reply, edit and delete task, user should not have to wait for the ui + // after he is done posting, editing or deleting + } + + // callbacks for viewmodel + @Override + public void onTopicTaskCompleted(TopicTaskResult result) { + if (result.getResultCode() == TopicTask.ResultCode.SUCCESS) { + currentPageIndex = result.getCurrentPageIndex(); + pageCount = result.getPageCount(); + topicTreeAndMods.setValue(result.getTopicTreeAndMods()); + topicViewers.setValue(result.getTopicViewers()); + pageTopicId.setValue(result.getLoadedPageTopicId()); + replyPageUrl.setValue(result.getReplyPageUrl()); + topicTitle.setValue(result.getTopicTitle()); + pageIndicatorIndex.setValue(result.getCurrentPageIndex()); + topicItems.setValue(result.getNewPostsList()); + focusedPostIndex.setValue(result.getFocusedPostIndex()); + isUserExtraInfoVisibile.clear(); + for (int i = 0; i < result.getNewPostsList().size(); i++) { + isUserExtraInfoVisibile.add(false); + } + } + topicTaskResultCode.setValue(result.getResultCode()); + } + + @Override + public void onPrepareForReplyFinished(PrepareForReplyResult result) { + prepareForReplyResult.setValue(result); + } + + @Override + public void onPrepareEditFinished(PrepareForEditResult result, int position) { + postBeingEditedPosition = position; + prepareForEditResult.setValue(result); + } + + public void incrementPageRequestValue(int step, boolean changePage) { + if (pageIndicatorIndex.getValue() == null) + throw new NullPointerException("No page has been loaded yet!"); + int oldIndicatorIndex = pageIndicatorIndex.getValue(); + if (oldIndicatorIndex <= pageCount - step) { + pageIndicatorIndex.setValue(pageIndicatorIndex.getValue() + step); + } else + pageIndicatorIndex.setValue(pageCount); + if (changePage && oldIndicatorIndex != pageIndicatorIndex.getValue()) loadPageIndicated(); + } + + public void decrementPageRequestValue(int step, boolean changePage) { + if (pageIndicatorIndex.getValue() == null) + throw new NullPointerException("No page has been loaded yet!"); + int oldIndicatorIndex = pageIndicatorIndex.getValue(); + if (oldIndicatorIndex > step) { + pageIndicatorIndex.setValue(pageIndicatorIndex.getValue() - step); + } else + pageIndicatorIndex.setValue(1); + if (changePage && oldIndicatorIndex != pageIndicatorIndex.getValue()) loadPageIndicated(); + } + + public void setPageIndicatorIndex(int pageIndicatorIndex, boolean changePage) { + if (this.pageIndicatorIndex.getValue() == null) + throw new NullPointerException("No page has been loaded yet!"); + int oldIndicatorIndex = this.pageIndicatorIndex.getValue(); + this.pageIndicatorIndex.setValue(pageIndicatorIndex); + if (changePage && oldIndicatorIndex != this.pageIndicatorIndex.getValue()) loadPageIndicated(); + } + + // <-------------Just getters, setters and helper methods below here----------------> + + + public void setRemoveVoteTaskStartedListener(ExternalAsyncTask.OnTaskStartedListener removeVoteTaskStartedListener) { + this.removeVoteTaskStartedListener = removeVoteTaskStartedListener; + } + + public void setRemoveVoteTaskFinishedListener(NetworkTask.OnNetworkTaskFinishedListener removeVoteTaskFinishedListener) { + this.removeVoteTaskFinishedListener = removeVoteTaskFinishedListener; + } + + public void setVoteTaskStartedListener(ExternalAsyncTask.OnTaskStartedListener voteTaskStartedListener) { + this.voteTaskStartedListener = voteTaskStartedListener; + } + + public void setVoteTaskFinishedListener(NetworkTask.OnNetworkTaskFinishedListener voteTaskFinishedListener) { + this.voteTaskFinishedListener = voteTaskFinishedListener; + } + + public MutableLiveData getTopicViewers() { + return topicViewers; + } + + public MutableLiveData getTopicTreeAndMods() { + return topicTreeAndMods; + } + + public MutableLiveData getTopicTaskResultCode() { + return topicTaskResultCode; + } + + public MutableLiveData getFocusedPostIndex() { + return focusedPostIndex; + } + + public MutableLiveData> getTopicItems() { + return topicItems; + } + + public MutableLiveData getReplyPageUrl() { + return replyPageUrl; + } + + public MutableLiveData getPageTopicId() { + return pageTopicId; + } + + public MutableLiveData getTopicTitle() { + return topicTitle; + } + + public String getTopicUrl() { + return topicUrl; + } + + public MutableLiveData getPageIndicatorIndex() { + return pageIndicatorIndex; + } + + public boolean isUserExtraInfoVisible(int position) { + return isUserExtraInfoVisibile.get(position); + } + + public void hideUserInfo(int position) { + isUserExtraInfoVisibile.set(position, false); + } + + public void toggleUserInfo(int position) { + isUserExtraInfoVisibile.set(position, !isUserExtraInfoVisibile.get(position)); + } + + public ArrayList getToQuoteList() { + return toQuoteList; + } + + public void postIndexToggle(Integer postIndex) { + if (toQuoteList.contains(postIndex)) + toQuoteList.remove(postIndex); + else + toQuoteList.add(postIndex); + } + + public void setTopicTaskObserver(TopicTask.TopicTaskObserver topicTaskObserver) { + this.topicTaskObserver = topicTaskObserver; + } + + + public void setDeleteTaskStartedListener(ExternalAsyncTask.OnTaskStartedListener deleteTaskStartedListener) { + this.deleteTaskStartedListener = deleteTaskStartedListener; + } + + public void setDeleteTaskFinishedListener(NetworkTask.OnNetworkTaskFinishedListener deleteTaskFinishedListener) { + this.deleteTaskFinishedListener = deleteTaskFinishedListener; + } + + public void setReplyFinishListener(ReplyTask.ReplyTaskCallbacks replyFinishListener) { + this.replyFinishListener = replyFinishListener; + } + + public void setPrepareForEditCallbacks(PrepareForEditTask.PrepareForEditCallbacks prepareForEditCallbacks) { + this.prepareForEditCallbacks = prepareForEditCallbacks; + } + + public void setEditTaskCallbacks(EditTask.EditTaskCallbacks editTaskCallbacks) { + this.editTaskCallbacks = editTaskCallbacks; + } + + public void setPrepareForReplyCallbacks(PrepareForReply.PrepareForReplyCallbacks prepareForReplyCallbacks) { + this.prepareForReplyCallbacks = prepareForReplyCallbacks; + } + + public MutableLiveData getPrepareForReplyResult() { + return prepareForReplyResult; + } + + public MutableLiveData getPrepareForEditResult() { + return prepareForEditResult; + } + + public void setEditingPost(boolean editingPost) { + this.editingPost = editingPost; + } + + public boolean isEditingPost() { + return editingPost; + } + + public int getPostBeingEditedPosition() { + return postBeingEditedPosition; + } + + public boolean canReply() { + return replyPageUrl.getValue() != null; + } + + public boolean isWritingReply() { + return writingReply; + } + + public void setWritingReply(boolean writingReply) { + this.writingReply = writingReply; + } + + public int getCurrentPageIndex() { + if (currentPageIndex == 0) throw new NullPointerException("No page has been loaded yet!"); + return currentPageIndex; + } + + public int getPageCount() { + if (pageCount == 0) throw new NullPointerException("No page has been loaded yet!"); + return pageCount; + } + + public String getPostBeingEditedText() { + if (prepareForEditResult.getValue() == null) + throw new NullPointerException("Edit preparation was not found!"); + return prepareForEditResult.getValue().getPostText(); + } + + public String getBuildedQuotes() { + if (prepareForReplyResult.getValue() == null) + throw new NullPointerException("Reply preparation was not found"); + return prepareForReplyResult.getValue().getBuildedQuotes(); + } + + public int postCount() { + if (topicItems.getValue() == null) + throw new NullPointerException("No page has been loaded yet!"); + return topicItems.getValue().size(); + } +} diff --git a/app/src/main/res/drawable-hdpi/ic_arrow_drop_down.png b/app/src/main/res/drawable-hdpi/ic_arrow_drop_down.png deleted file mode 100644 index 8c2624cc..00000000 Binary files a/app/src/main/res/drawable-hdpi/ic_arrow_drop_down.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_arrow_drop_up.png b/app/src/main/res/drawable-hdpi/ic_arrow_drop_up.png deleted file mode 100644 index f70260ad..00000000 Binary files a/app/src/main/res/drawable-hdpi/ic_arrow_drop_up.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_bookmark_false.png b/app/src/main/res/drawable-hdpi/ic_bookmark_false.png deleted file mode 100644 index afb6271f..00000000 Binary files a/app/src/main/res/drawable-hdpi/ic_bookmark_false.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_bookmark_true.png b/app/src/main/res/drawable-hdpi/ic_bookmark_true.png deleted file mode 100644 index ce6dd7a9..00000000 Binary files a/app/src/main/res/drawable-hdpi/ic_bookmark_true.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_delete.png b/app/src/main/res/drawable-hdpi/ic_delete.png deleted file mode 100644 index 83e1bb27..00000000 Binary files a/app/src/main/res/drawable-hdpi/ic_delete.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_format_quote_checked.png b/app/src/main/res/drawable-hdpi/ic_format_quote_checked.png deleted file mode 100644 index bd7be535..00000000 Binary files a/app/src/main/res/drawable-hdpi/ic_format_quote_checked.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_format_quote_unchecked.png b/app/src/main/res/drawable-hdpi/ic_format_quote_unchecked.png deleted file mode 100644 index 3e0e1c63..00000000 Binary files a/app/src/main/res/drawable-hdpi/ic_format_quote_unchecked.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_info.png b/app/src/main/res/drawable-hdpi/ic_info.png deleted file mode 100644 index 0932c17c..00000000 Binary files a/app/src/main/res/drawable-hdpi/ic_info.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_send.png b/app/src/main/res/drawable-hdpi/ic_send.png deleted file mode 100644 index a8fd035d..00000000 Binary files a/app/src/main/res/drawable-hdpi/ic_send.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_share.png b/app/src/main/res/drawable-hdpi/ic_share.png deleted file mode 100644 index c832502c..00000000 Binary files a/app/src/main/res/drawable-hdpi/ic_share.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_arrow_drop_down.png b/app/src/main/res/drawable-mdpi/ic_arrow_drop_down.png deleted file mode 100644 index a617f943..00000000 Binary files a/app/src/main/res/drawable-mdpi/ic_arrow_drop_down.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_arrow_drop_up.png b/app/src/main/res/drawable-mdpi/ic_arrow_drop_up.png deleted file mode 100644 index 73f9bb68..00000000 Binary files a/app/src/main/res/drawable-mdpi/ic_arrow_drop_up.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_bookmark_false.png b/app/src/main/res/drawable-mdpi/ic_bookmark_false.png deleted file mode 100644 index 79157474..00000000 Binary files a/app/src/main/res/drawable-mdpi/ic_bookmark_false.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_bookmark_true.png b/app/src/main/res/drawable-mdpi/ic_bookmark_true.png deleted file mode 100644 index 06eba446..00000000 Binary files a/app/src/main/res/drawable-mdpi/ic_bookmark_true.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_delete.png b/app/src/main/res/drawable-mdpi/ic_delete.png deleted file mode 100644 index 5ac9ef30..00000000 Binary files a/app/src/main/res/drawable-mdpi/ic_delete.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_format_quote_checked.png b/app/src/main/res/drawable-mdpi/ic_format_quote_checked.png deleted file mode 100644 index 9b28f144..00000000 Binary files a/app/src/main/res/drawable-mdpi/ic_format_quote_checked.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_format_quote_unchecked.png b/app/src/main/res/drawable-mdpi/ic_format_quote_unchecked.png deleted file mode 100644 index 0b2b07fa..00000000 Binary files a/app/src/main/res/drawable-mdpi/ic_format_quote_unchecked.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_info.png b/app/src/main/res/drawable-mdpi/ic_info.png deleted file mode 100644 index 03cf044b..00000000 Binary files a/app/src/main/res/drawable-mdpi/ic_info.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_send.png b/app/src/main/res/drawable-mdpi/ic_send.png deleted file mode 100644 index c914ae97..00000000 Binary files a/app/src/main/res/drawable-mdpi/ic_send.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_share.png b/app/src/main/res/drawable-mdpi/ic_share.png deleted file mode 100644 index 31ebd45a..00000000 Binary files a/app/src/main/res/drawable-mdpi/ic_share.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_arrow_drop_down.png b/app/src/main/res/drawable-xhdpi/ic_arrow_drop_down.png deleted file mode 100644 index 79f45456..00000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_arrow_drop_down.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_arrow_drop_up.png b/app/src/main/res/drawable-xhdpi/ic_arrow_drop_up.png deleted file mode 100644 index b3823901..00000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_arrow_drop_up.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_bookmark_false.png b/app/src/main/res/drawable-xhdpi/ic_bookmark_false.png deleted file mode 100644 index cded6d60..00000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_bookmark_false.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_bookmark_true.png b/app/src/main/res/drawable-xhdpi/ic_bookmark_true.png deleted file mode 100644 index 368c9ead..00000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_bookmark_true.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_delete.png b/app/src/main/res/drawable-xhdpi/ic_delete.png deleted file mode 100644 index 36f26ac7..00000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_delete.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_format_quote_checked.png b/app/src/main/res/drawable-xhdpi/ic_format_quote_checked.png deleted file mode 100644 index e56dbcea..00000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_format_quote_checked.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_format_quote_unchecked.png b/app/src/main/res/drawable-xhdpi/ic_format_quote_unchecked.png deleted file mode 100644 index 18a5f529..00000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_format_quote_unchecked.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_info.png b/app/src/main/res/drawable-xhdpi/ic_info.png deleted file mode 100644 index 33ec308a..00000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_info.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_send.png b/app/src/main/res/drawable-xhdpi/ic_send.png deleted file mode 100644 index c104e00d..00000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_send.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_share.png b/app/src/main/res/drawable-xhdpi/ic_share.png deleted file mode 100644 index 4560123d..00000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_share.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_arrow_drop_down.png b/app/src/main/res/drawable-xxhdpi/ic_arrow_drop_down.png deleted file mode 100644 index a62e15ba..00000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_arrow_drop_down.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_arrow_drop_up.png b/app/src/main/res/drawable-xxhdpi/ic_arrow_drop_up.png deleted file mode 100644 index 935d805e..00000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_arrow_drop_up.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_bookmark_false.png b/app/src/main/res/drawable-xxhdpi/ic_bookmark_false.png deleted file mode 100644 index a837b04d..00000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_bookmark_false.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_bookmark_true.png b/app/src/main/res/drawable-xxhdpi/ic_bookmark_true.png deleted file mode 100644 index 0253be02..00000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_bookmark_true.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_delete.png b/app/src/main/res/drawable-xxhdpi/ic_delete.png deleted file mode 100644 index 4d806633..00000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_delete.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_format_quote_checked.png b/app/src/main/res/drawable-xxhdpi/ic_format_quote_checked.png deleted file mode 100644 index f23788f7..00000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_format_quote_checked.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_format_quote_unchecked.png b/app/src/main/res/drawable-xxhdpi/ic_format_quote_unchecked.png deleted file mode 100644 index 3d17a5d9..00000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_format_quote_unchecked.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_info.png b/app/src/main/res/drawable-xxhdpi/ic_info.png deleted file mode 100644 index f8e64ad7..00000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_info.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_send.png b/app/src/main/res/drawable-xxhdpi/ic_send.png deleted file mode 100644 index 0bb93fd0..00000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_send.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_share.png b/app/src/main/res/drawable-xxhdpi/ic_share.png deleted file mode 100644 index df3f943f..00000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_share.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_arrow_drop_down.png b/app/src/main/res/drawable-xxxhdpi/ic_arrow_drop_down.png deleted file mode 100644 index fb2d3adc..00000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_arrow_drop_down.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_arrow_drop_up.png b/app/src/main/res/drawable-xxxhdpi/ic_arrow_drop_up.png deleted file mode 100644 index 18fd806f..00000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_arrow_drop_up.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_bookmark_false.png b/app/src/main/res/drawable-xxxhdpi/ic_bookmark_false.png deleted file mode 100644 index d65bb47d..00000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_bookmark_false.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_bookmark_true.png b/app/src/main/res/drawable-xxxhdpi/ic_bookmark_true.png deleted file mode 100644 index 59c96d06..00000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_bookmark_true.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_delete.png b/app/src/main/res/drawable-xxxhdpi/ic_delete.png deleted file mode 100644 index 3ececbea..00000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_delete.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_format_quote_checked.png b/app/src/main/res/drawable-xxxhdpi/ic_format_quote_checked.png deleted file mode 100644 index 1a6cc0ab..00000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_format_quote_checked.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_format_quote_unchecked.png b/app/src/main/res/drawable-xxxhdpi/ic_format_quote_unchecked.png deleted file mode 100644 index 8cb08365..00000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_format_quote_unchecked.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_info.png b/app/src/main/res/drawable-xxxhdpi/ic_info.png deleted file mode 100644 index cb42f367..00000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_info.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_send.png b/app/src/main/res/drawable-xxxhdpi/ic_send.png deleted file mode 100644 index ca6a867c..00000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_send.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_share.png b/app/src/main/res/drawable-xxxhdpi/ic_share.png deleted file mode 100644 index 43c930eb..00000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_share.png and /dev/null differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper.xml b/app/src/main/res/drawable/emoji_a_eatpaper.xml new file mode 100644 index 00000000..ceab283a --- /dev/null +++ b/app/src/main/res/drawable/emoji_a_eatpaper.xml @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f0.png b/app/src/main/res/drawable/emoji_a_eatpaper_f0.png new file mode 100644 index 00000000..3876828f Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f0.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f1.png b/app/src/main/res/drawable/emoji_a_eatpaper_f1.png new file mode 100644 index 00000000..31ac3af7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f1.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f10.png b/app/src/main/res/drawable/emoji_a_eatpaper_f10.png new file mode 100644 index 00000000..40db766c Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f10.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f11.png b/app/src/main/res/drawable/emoji_a_eatpaper_f11.png new file mode 100644 index 00000000..057bc415 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f11.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f12.png b/app/src/main/res/drawable/emoji_a_eatpaper_f12.png new file mode 100644 index 00000000..7dcb8335 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f12.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f13.png b/app/src/main/res/drawable/emoji_a_eatpaper_f13.png new file mode 100644 index 00000000..057bc415 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f13.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f14.png b/app/src/main/res/drawable/emoji_a_eatpaper_f14.png new file mode 100644 index 00000000..7dcb8335 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f14.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f15.png b/app/src/main/res/drawable/emoji_a_eatpaper_f15.png new file mode 100644 index 00000000..057bc415 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f15.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f16.png b/app/src/main/res/drawable/emoji_a_eatpaper_f16.png new file mode 100644 index 00000000..7dcb8335 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f16.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f17.png b/app/src/main/res/drawable/emoji_a_eatpaper_f17.png new file mode 100644 index 00000000..bb23d780 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f17.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f18.png b/app/src/main/res/drawable/emoji_a_eatpaper_f18.png new file mode 100644 index 00000000..7dcb8335 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f18.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f19.png b/app/src/main/res/drawable/emoji_a_eatpaper_f19.png new file mode 100644 index 00000000..bb23d780 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f19.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f2.png b/app/src/main/res/drawable/emoji_a_eatpaper_f2.png new file mode 100644 index 00000000..5b5ed6af Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f2.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f20.png b/app/src/main/res/drawable/emoji_a_eatpaper_f20.png new file mode 100644 index 00000000..7dcb8335 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f20.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f21.png b/app/src/main/res/drawable/emoji_a_eatpaper_f21.png new file mode 100644 index 00000000..bb23d780 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f21.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f22.png b/app/src/main/res/drawable/emoji_a_eatpaper_f22.png new file mode 100644 index 00000000..8345256f Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f22.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f23.png b/app/src/main/res/drawable/emoji_a_eatpaper_f23.png new file mode 100644 index 00000000..020a556c Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f23.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f24.png b/app/src/main/res/drawable/emoji_a_eatpaper_f24.png new file mode 100644 index 00000000..9c0ed179 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f24.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f25.png b/app/src/main/res/drawable/emoji_a_eatpaper_f25.png new file mode 100644 index 00000000..891c30a5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f25.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f26.png b/app/src/main/res/drawable/emoji_a_eatpaper_f26.png new file mode 100644 index 00000000..79005786 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f26.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f27.png b/app/src/main/res/drawable/emoji_a_eatpaper_f27.png new file mode 100644 index 00000000..34e8e23a Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f27.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f28.png b/app/src/main/res/drawable/emoji_a_eatpaper_f28.png new file mode 100644 index 00000000..79005786 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f28.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f29.png b/app/src/main/res/drawable/emoji_a_eatpaper_f29.png new file mode 100644 index 00000000..79005786 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f29.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f3.png b/app/src/main/res/drawable/emoji_a_eatpaper_f3.png new file mode 100644 index 00000000..31ac3af7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f3.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f30.png b/app/src/main/res/drawable/emoji_a_eatpaper_f30.png new file mode 100644 index 00000000..a377c8de Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f30.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f31.png b/app/src/main/res/drawable/emoji_a_eatpaper_f31.png new file mode 100644 index 00000000..79005786 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f31.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f32.png b/app/src/main/res/drawable/emoji_a_eatpaper_f32.png new file mode 100644 index 00000000..a377c8de Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f32.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f33.png b/app/src/main/res/drawable/emoji_a_eatpaper_f33.png new file mode 100644 index 00000000..79005786 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f33.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f34.png b/app/src/main/res/drawable/emoji_a_eatpaper_f34.png new file mode 100644 index 00000000..a377c8de Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f34.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f35.png b/app/src/main/res/drawable/emoji_a_eatpaper_f35.png new file mode 100644 index 00000000..79005786 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f35.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f36.png b/app/src/main/res/drawable/emoji_a_eatpaper_f36.png new file mode 100644 index 00000000..a377c8de Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f36.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f37.png b/app/src/main/res/drawable/emoji_a_eatpaper_f37.png new file mode 100644 index 00000000..79005786 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f37.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f38.png b/app/src/main/res/drawable/emoji_a_eatpaper_f38.png new file mode 100644 index 00000000..a377c8de Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f38.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f39.png b/app/src/main/res/drawable/emoji_a_eatpaper_f39.png new file mode 100644 index 00000000..79005786 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f39.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f4.png b/app/src/main/res/drawable/emoji_a_eatpaper_f4.png new file mode 100644 index 00000000..5b5ed6af Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f4.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f40.png b/app/src/main/res/drawable/emoji_a_eatpaper_f40.png new file mode 100644 index 00000000..f03c9b0f Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f40.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f41.png b/app/src/main/res/drawable/emoji_a_eatpaper_f41.png new file mode 100644 index 00000000..1edd15af Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f41.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f42.png b/app/src/main/res/drawable/emoji_a_eatpaper_f42.png new file mode 100644 index 00000000..ad2d5736 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f42.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f43.png b/app/src/main/res/drawable/emoji_a_eatpaper_f43.png new file mode 100644 index 00000000..dc7e23f7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f43.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f44.png b/app/src/main/res/drawable/emoji_a_eatpaper_f44.png new file mode 100644 index 00000000..f03b1ccb Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f44.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f45.png b/app/src/main/res/drawable/emoji_a_eatpaper_f45.png new file mode 100644 index 00000000..f08c2fd3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f45.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f46.png b/app/src/main/res/drawable/emoji_a_eatpaper_f46.png new file mode 100644 index 00000000..5ebca0c6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f46.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f47.png b/app/src/main/res/drawable/emoji_a_eatpaper_f47.png new file mode 100644 index 00000000..58a3f539 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f47.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f48.png b/app/src/main/res/drawable/emoji_a_eatpaper_f48.png new file mode 100644 index 00000000..5c39f649 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f48.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f49.png b/app/src/main/res/drawable/emoji_a_eatpaper_f49.png new file mode 100644 index 00000000..865bde38 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f49.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f5.png b/app/src/main/res/drawable/emoji_a_eatpaper_f5.png new file mode 100644 index 00000000..982d75f7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f5.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f50.png b/app/src/main/res/drawable/emoji_a_eatpaper_f50.png new file mode 100644 index 00000000..5428903e Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f50.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f51.png b/app/src/main/res/drawable/emoji_a_eatpaper_f51.png new file mode 100644 index 00000000..494878ce Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f51.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f52.png b/app/src/main/res/drawable/emoji_a_eatpaper_f52.png new file mode 100644 index 00000000..a48da48c Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f52.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f53.png b/app/src/main/res/drawable/emoji_a_eatpaper_f53.png new file mode 100644 index 00000000..865bde38 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f53.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f54.png b/app/src/main/res/drawable/emoji_a_eatpaper_f54.png new file mode 100644 index 00000000..6b6d1347 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f54.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f55.png b/app/src/main/res/drawable/emoji_a_eatpaper_f55.png new file mode 100644 index 00000000..a23dbae0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f55.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f56.png b/app/src/main/res/drawable/emoji_a_eatpaper_f56.png new file mode 100644 index 00000000..bda0f6b3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f56.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f57.png b/app/src/main/res/drawable/emoji_a_eatpaper_f57.png new file mode 100644 index 00000000..0dfe9a4d Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f57.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f58.png b/app/src/main/res/drawable/emoji_a_eatpaper_f58.png new file mode 100644 index 00000000..cce641cd Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f58.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f59.png b/app/src/main/res/drawable/emoji_a_eatpaper_f59.png new file mode 100644 index 00000000..880d577a Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f59.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f6.png b/app/src/main/res/drawable/emoji_a_eatpaper_f6.png new file mode 100644 index 00000000..40db766c Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f6.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f60.png b/app/src/main/res/drawable/emoji_a_eatpaper_f60.png new file mode 100644 index 00000000..cce641cd Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f60.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f61.png b/app/src/main/res/drawable/emoji_a_eatpaper_f61.png new file mode 100644 index 00000000..6e293fc2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f61.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f62.png b/app/src/main/res/drawable/emoji_a_eatpaper_f62.png new file mode 100644 index 00000000..cce641cd Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f62.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f63.png b/app/src/main/res/drawable/emoji_a_eatpaper_f63.png new file mode 100644 index 00000000..880d577a Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f63.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f64.png b/app/src/main/res/drawable/emoji_a_eatpaper_f64.png new file mode 100644 index 00000000..cce641cd Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f64.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f65.png b/app/src/main/res/drawable/emoji_a_eatpaper_f65.png new file mode 100644 index 00000000..b87a94aa Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f65.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f66.png b/app/src/main/res/drawable/emoji_a_eatpaper_f66.png new file mode 100644 index 00000000..049a8740 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f66.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f67.png b/app/src/main/res/drawable/emoji_a_eatpaper_f67.png new file mode 100644 index 00000000..2eb756a3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f67.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f68.png b/app/src/main/res/drawable/emoji_a_eatpaper_f68.png new file mode 100644 index 00000000..5169300b Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f68.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f69.png b/app/src/main/res/drawable/emoji_a_eatpaper_f69.png new file mode 100644 index 00000000..68d62d34 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f69.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f7.png b/app/src/main/res/drawable/emoji_a_eatpaper_f7.png new file mode 100644 index 00000000..982d75f7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f7.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f70.png b/app/src/main/res/drawable/emoji_a_eatpaper_f70.png new file mode 100644 index 00000000..05667e6e Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f70.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f71.png b/app/src/main/res/drawable/emoji_a_eatpaper_f71.png new file mode 100644 index 00000000..a43658f7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f71.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f72.png b/app/src/main/res/drawable/emoji_a_eatpaper_f72.png new file mode 100644 index 00000000..1db4f191 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f72.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f73.png b/app/src/main/res/drawable/emoji_a_eatpaper_f73.png new file mode 100644 index 00000000..6059abf0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f73.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f74.png b/app/src/main/res/drawable/emoji_a_eatpaper_f74.png new file mode 100644 index 00000000..07d3d105 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f74.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f75.png b/app/src/main/res/drawable/emoji_a_eatpaper_f75.png new file mode 100644 index 00000000..6059abf0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f75.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f76.png b/app/src/main/res/drawable/emoji_a_eatpaper_f76.png new file mode 100644 index 00000000..07d3d105 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f76.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f77.png b/app/src/main/res/drawable/emoji_a_eatpaper_f77.png new file mode 100644 index 00000000..6059abf0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f77.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f8.png b/app/src/main/res/drawable/emoji_a_eatpaper_f8.png new file mode 100644 index 00000000..40db766c Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f8.png differ diff --git a/app/src/main/res/drawable/emoji_a_eatpaper_f9.png b/app/src/main/res/drawable/emoji_a_eatpaper_f9.png new file mode 100644 index 00000000..982d75f7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_a_eatpaper_f9.png differ diff --git a/app/src/main/res/drawable/emoji_angry.xml b/app/src/main/res/drawable/emoji_angry.xml new file mode 100644 index 00000000..71b5d10b --- /dev/null +++ b/app/src/main/res/drawable/emoji_angry.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_angry4.xml b/app/src/main/res/drawable/emoji_angry4.xml new file mode 100644 index 00000000..07cf3c3c --- /dev/null +++ b/app/src/main/res/drawable/emoji_angry4.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_angry4_f0.png b/app/src/main/res/drawable/emoji_angry4_f0.png new file mode 100644 index 00000000..a5099b20 Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry4_f0.png differ diff --git a/app/src/main/res/drawable/emoji_angry4_f1.png b/app/src/main/res/drawable/emoji_angry4_f1.png new file mode 100644 index 00000000..29d1ae8f Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry4_f1.png differ diff --git a/app/src/main/res/drawable/emoji_angry4_f2.png b/app/src/main/res/drawable/emoji_angry4_f2.png new file mode 100644 index 00000000..37b06156 Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry4_f2.png differ diff --git a/app/src/main/res/drawable/emoji_angry4_f3.png b/app/src/main/res/drawable/emoji_angry4_f3.png new file mode 100644 index 00000000..bcedf195 Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry4_f3.png differ diff --git a/app/src/main/res/drawable/emoji_angry4_f4.png b/app/src/main/res/drawable/emoji_angry4_f4.png new file mode 100644 index 00000000..39265623 Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry4_f4.png differ diff --git a/app/src/main/res/drawable/emoji_angry4_f5.png b/app/src/main/res/drawable/emoji_angry4_f5.png new file mode 100644 index 00000000..b01e6285 Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry4_f5.png differ diff --git a/app/src/main/res/drawable/emoji_angry4_f6.png b/app/src/main/res/drawable/emoji_angry4_f6.png new file mode 100644 index 00000000..81cbe582 Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry4_f6.png differ diff --git a/app/src/main/res/drawable/emoji_angry4_f7.png b/app/src/main/res/drawable/emoji_angry4_f7.png new file mode 100644 index 00000000..54049b74 Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry4_f7.png differ diff --git a/app/src/main/res/drawable/emoji_angry_f0.png b/app/src/main/res/drawable/emoji_angry_f0.png new file mode 100644 index 00000000..43a0a4a3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry_f0.png differ diff --git a/app/src/main/res/drawable/emoji_angry_f1.png b/app/src/main/res/drawable/emoji_angry_f1.png new file mode 100644 index 00000000..20772380 Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry_f1.png differ diff --git a/app/src/main/res/drawable/emoji_angry_f2.png b/app/src/main/res/drawable/emoji_angry_f2.png new file mode 100644 index 00000000..93efc776 Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry_f2.png differ diff --git a/app/src/main/res/drawable/emoji_angry_f3.png b/app/src/main/res/drawable/emoji_angry_f3.png new file mode 100644 index 00000000..20772380 Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry_f3.png differ diff --git a/app/src/main/res/drawable/emoji_angry_hot.xml b/app/src/main/res/drawable/emoji_angry_hot.xml new file mode 100644 index 00000000..14b54b18 --- /dev/null +++ b/app/src/main/res/drawable/emoji_angry_hot.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_angry_hot_f0.png b/app/src/main/res/drawable/emoji_angry_hot_f0.png new file mode 100644 index 00000000..a5099b20 Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry_hot_f0.png differ diff --git a/app/src/main/res/drawable/emoji_angry_hot_f1.png b/app/src/main/res/drawable/emoji_angry_hot_f1.png new file mode 100644 index 00000000..29d1ae8f Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry_hot_f1.png differ diff --git a/app/src/main/res/drawable/emoji_angry_hot_f2.png b/app/src/main/res/drawable/emoji_angry_hot_f2.png new file mode 100644 index 00000000..37b06156 Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry_hot_f2.png differ diff --git a/app/src/main/res/drawable/emoji_angry_hot_f3.png b/app/src/main/res/drawable/emoji_angry_hot_f3.png new file mode 100644 index 00000000..bcedf195 Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry_hot_f3.png differ diff --git a/app/src/main/res/drawable/emoji_angry_hot_f4.png b/app/src/main/res/drawable/emoji_angry_hot_f4.png new file mode 100644 index 00000000..39265623 Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry_hot_f4.png differ diff --git a/app/src/main/res/drawable/emoji_angry_hot_f5.png b/app/src/main/res/drawable/emoji_angry_hot_f5.png new file mode 100644 index 00000000..b01e6285 Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry_hot_f5.png differ diff --git a/app/src/main/res/drawable/emoji_angry_hot_f6.png b/app/src/main/res/drawable/emoji_angry_hot_f6.png new file mode 100644 index 00000000..81cbe582 Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry_hot_f6.png differ diff --git a/app/src/main/res/drawable/emoji_angry_hot_f7.png b/app/src/main/res/drawable/emoji_angry_hot_f7.png new file mode 100644 index 00000000..54049b74 Binary files /dev/null and b/app/src/main/res/drawable/emoji_angry_hot_f7.png differ diff --git a/app/src/main/res/drawable/emoji_argue.xml b/app/src/main/res/drawable/emoji_argue.xml new file mode 100644 index 00000000..2fa85234 --- /dev/null +++ b/app/src/main/res/drawable/emoji_argue.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_argue_f0.png b/app/src/main/res/drawable/emoji_argue_f0.png new file mode 100644 index 00000000..5e32d3d5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_argue_f0.png differ diff --git a/app/src/main/res/drawable/emoji_argue_f1.png b/app/src/main/res/drawable/emoji_argue_f1.png new file mode 100644 index 00000000..9d2a7361 Binary files /dev/null and b/app/src/main/res/drawable/emoji_argue_f1.png differ diff --git a/app/src/main/res/drawable/emoji_argue_f10.png b/app/src/main/res/drawable/emoji_argue_f10.png new file mode 100644 index 00000000..694ae640 Binary files /dev/null and b/app/src/main/res/drawable/emoji_argue_f10.png differ diff --git a/app/src/main/res/drawable/emoji_argue_f11.png b/app/src/main/res/drawable/emoji_argue_f11.png new file mode 100644 index 00000000..6fa7ff49 Binary files /dev/null and b/app/src/main/res/drawable/emoji_argue_f11.png differ diff --git a/app/src/main/res/drawable/emoji_argue_f12.png b/app/src/main/res/drawable/emoji_argue_f12.png new file mode 100644 index 00000000..694ae640 Binary files /dev/null and b/app/src/main/res/drawable/emoji_argue_f12.png differ diff --git a/app/src/main/res/drawable/emoji_argue_f13.png b/app/src/main/res/drawable/emoji_argue_f13.png new file mode 100644 index 00000000..6fa7ff49 Binary files /dev/null and b/app/src/main/res/drawable/emoji_argue_f13.png differ diff --git a/app/src/main/res/drawable/emoji_argue_f14.png b/app/src/main/res/drawable/emoji_argue_f14.png new file mode 100644 index 00000000..694ae640 Binary files /dev/null and b/app/src/main/res/drawable/emoji_argue_f14.png differ diff --git a/app/src/main/res/drawable/emoji_argue_f15.png b/app/src/main/res/drawable/emoji_argue_f15.png new file mode 100644 index 00000000..6fa7ff49 Binary files /dev/null and b/app/src/main/res/drawable/emoji_argue_f15.png differ diff --git a/app/src/main/res/drawable/emoji_argue_f16.png b/app/src/main/res/drawable/emoji_argue_f16.png new file mode 100644 index 00000000..694ae640 Binary files /dev/null and b/app/src/main/res/drawable/emoji_argue_f16.png differ diff --git a/app/src/main/res/drawable/emoji_argue_f2.png b/app/src/main/res/drawable/emoji_argue_f2.png new file mode 100644 index 00000000..06defab4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_argue_f2.png differ diff --git a/app/src/main/res/drawable/emoji_argue_f3.png b/app/src/main/res/drawable/emoji_argue_f3.png new file mode 100644 index 00000000..9d2a7361 Binary files /dev/null and b/app/src/main/res/drawable/emoji_argue_f3.png differ diff --git a/app/src/main/res/drawable/emoji_argue_f4.png b/app/src/main/res/drawable/emoji_argue_f4.png new file mode 100644 index 00000000..06defab4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_argue_f4.png differ diff --git a/app/src/main/res/drawable/emoji_argue_f5.png b/app/src/main/res/drawable/emoji_argue_f5.png new file mode 100644 index 00000000..9d2a7361 Binary files /dev/null and b/app/src/main/res/drawable/emoji_argue_f5.png differ diff --git a/app/src/main/res/drawable/emoji_argue_f6.png b/app/src/main/res/drawable/emoji_argue_f6.png new file mode 100644 index 00000000..06defab4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_argue_f6.png differ diff --git a/app/src/main/res/drawable/emoji_argue_f7.png b/app/src/main/res/drawable/emoji_argue_f7.png new file mode 100644 index 00000000..9d2a7361 Binary files /dev/null and b/app/src/main/res/drawable/emoji_argue_f7.png differ diff --git a/app/src/main/res/drawable/emoji_argue_f8.png b/app/src/main/res/drawable/emoji_argue_f8.png new file mode 100644 index 00000000..06defab4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_argue_f8.png differ diff --git a/app/src/main/res/drawable/emoji_argue_f9.png b/app/src/main/res/drawable/emoji_argue_f9.png new file mode 100644 index 00000000..4fc94792 Binary files /dev/null and b/app/src/main/res/drawable/emoji_argue_f9.png differ diff --git a/app/src/main/res/drawable/emoji_band.xml b/app/src/main/res/drawable/emoji_band.xml new file mode 100644 index 00000000..aacb2e4b --- /dev/null +++ b/app/src/main/res/drawable/emoji_band.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_band_f0.png b/app/src/main/res/drawable/emoji_band_f0.png new file mode 100644 index 00000000..8edd8d31 Binary files /dev/null and b/app/src/main/res/drawable/emoji_band_f0.png differ diff --git a/app/src/main/res/drawable/emoji_band_f1.png b/app/src/main/res/drawable/emoji_band_f1.png new file mode 100644 index 00000000..45a37247 Binary files /dev/null and b/app/src/main/res/drawable/emoji_band_f1.png differ diff --git a/app/src/main/res/drawable/emoji_band_f2.png b/app/src/main/res/drawable/emoji_band_f2.png new file mode 100644 index 00000000..a230daab Binary files /dev/null and b/app/src/main/res/drawable/emoji_band_f2.png differ diff --git a/app/src/main/res/drawable/emoji_band_f3.png b/app/src/main/res/drawable/emoji_band_f3.png new file mode 100644 index 00000000..5db7bf03 Binary files /dev/null and b/app/src/main/res/drawable/emoji_band_f3.png differ diff --git a/app/src/main/res/drawable/emoji_band_f4.png b/app/src/main/res/drawable/emoji_band_f4.png new file mode 100644 index 00000000..ed7f9402 Binary files /dev/null and b/app/src/main/res/drawable/emoji_band_f4.png differ diff --git a/app/src/main/res/drawable/emoji_band_f5.png b/app/src/main/res/drawable/emoji_band_f5.png new file mode 100644 index 00000000..7607d51a Binary files /dev/null and b/app/src/main/res/drawable/emoji_band_f5.png differ diff --git a/app/src/main/res/drawable/emoji_band_f6.png b/app/src/main/res/drawable/emoji_band_f6.png new file mode 100644 index 00000000..a82c904c Binary files /dev/null and b/app/src/main/res/drawable/emoji_band_f6.png differ diff --git a/app/src/main/res/drawable/emoji_band_f7.png b/app/src/main/res/drawable/emoji_band_f7.png new file mode 100644 index 00000000..dd592706 Binary files /dev/null and b/app/src/main/res/drawable/emoji_band_f7.png differ diff --git a/app/src/main/res/drawable/emoji_bang_head.xml b/app/src/main/res/drawable/emoji_bang_head.xml new file mode 100644 index 00000000..18de2cbb --- /dev/null +++ b/app/src/main/res/drawable/emoji_bang_head.xml @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_bang_head_f0.png b/app/src/main/res/drawable/emoji_bang_head_f0.png new file mode 100644 index 00000000..44184163 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bang_head_f0.png differ diff --git a/app/src/main/res/drawable/emoji_bang_head_f1.png b/app/src/main/res/drawable/emoji_bang_head_f1.png new file mode 100644 index 00000000..7c271636 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bang_head_f1.png differ diff --git a/app/src/main/res/drawable/emoji_bang_head_f2.png b/app/src/main/res/drawable/emoji_bang_head_f2.png new file mode 100644 index 00000000..46d3c83d Binary files /dev/null and b/app/src/main/res/drawable/emoji_bang_head_f2.png differ diff --git a/app/src/main/res/drawable/emoji_bang_head_f3.png b/app/src/main/res/drawable/emoji_bang_head_f3.png new file mode 100644 index 00000000..289ab1f4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bang_head_f3.png differ diff --git a/app/src/main/res/drawable/emoji_bang_head_f4.png b/app/src/main/res/drawable/emoji_bang_head_f4.png new file mode 100644 index 00000000..9075eeb3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bang_head_f4.png differ diff --git a/app/src/main/res/drawable/emoji_banned.xml b/app/src/main/res/drawable/emoji_banned.xml new file mode 100644 index 00000000..cd7ee325 --- /dev/null +++ b/app/src/main/res/drawable/emoji_banned.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_banned2.xml b/app/src/main/res/drawable/emoji_banned2.xml new file mode 100644 index 00000000..d967dde4 --- /dev/null +++ b/app/src/main/res/drawable/emoji_banned2.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_banned2_f0.png b/app/src/main/res/drawable/emoji_banned2_f0.png new file mode 100644 index 00000000..4bc0a225 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned2_f0.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f0.png b/app/src/main/res/drawable/emoji_banned_f0.png new file mode 100644 index 00000000..b40e0398 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f0.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f1.png b/app/src/main/res/drawable/emoji_banned_f1.png new file mode 100644 index 00000000..366f929b Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f1.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f10.png b/app/src/main/res/drawable/emoji_banned_f10.png new file mode 100644 index 00000000..d83245f5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f10.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f11.png b/app/src/main/res/drawable/emoji_banned_f11.png new file mode 100644 index 00000000..23c70060 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f11.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f12.png b/app/src/main/res/drawable/emoji_banned_f12.png new file mode 100644 index 00000000..adcb7df4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f12.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f13.png b/app/src/main/res/drawable/emoji_banned_f13.png new file mode 100644 index 00000000..2523ebf9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f13.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f14.png b/app/src/main/res/drawable/emoji_banned_f14.png new file mode 100644 index 00000000..2319b86e Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f14.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f15.png b/app/src/main/res/drawable/emoji_banned_f15.png new file mode 100644 index 00000000..6903d6a9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f15.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f16.png b/app/src/main/res/drawable/emoji_banned_f16.png new file mode 100644 index 00000000..2319b86e Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f16.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f17.png b/app/src/main/res/drawable/emoji_banned_f17.png new file mode 100644 index 00000000..a9b7660f Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f17.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f18.png b/app/src/main/res/drawable/emoji_banned_f18.png new file mode 100644 index 00000000..e80c95b2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f18.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f19.png b/app/src/main/res/drawable/emoji_banned_f19.png new file mode 100644 index 00000000..92bfaea3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f19.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f2.png b/app/src/main/res/drawable/emoji_banned_f2.png new file mode 100644 index 00000000..b40e0398 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f2.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f20.png b/app/src/main/res/drawable/emoji_banned_f20.png new file mode 100644 index 00000000..75827c0a Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f20.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f21.png b/app/src/main/res/drawable/emoji_banned_f21.png new file mode 100644 index 00000000..49aa88d5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f21.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f22.png b/app/src/main/res/drawable/emoji_banned_f22.png new file mode 100644 index 00000000..c714173a Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f22.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f23.png b/app/src/main/res/drawable/emoji_banned_f23.png new file mode 100644 index 00000000..7600e37d Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f23.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f24.png b/app/src/main/res/drawable/emoji_banned_f24.png new file mode 100644 index 00000000..ebbc7d3f Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f24.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f25.png b/app/src/main/res/drawable/emoji_banned_f25.png new file mode 100644 index 00000000..396bbe49 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f25.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f26.png b/app/src/main/res/drawable/emoji_banned_f26.png new file mode 100644 index 00000000..37485779 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f26.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f27.png b/app/src/main/res/drawable/emoji_banned_f27.png new file mode 100644 index 00000000..d3dc2aa1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f27.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f28.png b/app/src/main/res/drawable/emoji_banned_f28.png new file mode 100644 index 00000000..68b87909 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f28.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f29.png b/app/src/main/res/drawable/emoji_banned_f29.png new file mode 100644 index 00000000..cd8eb3c1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f29.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f3.png b/app/src/main/res/drawable/emoji_banned_f3.png new file mode 100644 index 00000000..784b2dd9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f3.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f4.png b/app/src/main/res/drawable/emoji_banned_f4.png new file mode 100644 index 00000000..b40e0398 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f4.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f5.png b/app/src/main/res/drawable/emoji_banned_f5.png new file mode 100644 index 00000000..87814ff5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f5.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f6.png b/app/src/main/res/drawable/emoji_banned_f6.png new file mode 100644 index 00000000..84b54d44 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f6.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f7.png b/app/src/main/res/drawable/emoji_banned_f7.png new file mode 100644 index 00000000..47cb5b6d Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f7.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f8.png b/app/src/main/res/drawable/emoji_banned_f8.png new file mode 100644 index 00000000..84b54d44 Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f8.png differ diff --git a/app/src/main/res/drawable/emoji_banned_f9.png b/app/src/main/res/drawable/emoji_banned_f9.png new file mode 100644 index 00000000..e763ef9a Binary files /dev/null and b/app/src/main/res/drawable/emoji_banned_f9.png differ diff --git a/app/src/main/res/drawable/emoji_bath.xml b/app/src/main/res/drawable/emoji_bath.xml new file mode 100644 index 00000000..c78e4983 --- /dev/null +++ b/app/src/main/res/drawable/emoji_bath.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_bath_f0.png b/app/src/main/res/drawable/emoji_bath_f0.png new file mode 100644 index 00000000..9b474723 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f0.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f1.png b/app/src/main/res/drawable/emoji_bath_f1.png new file mode 100644 index 00000000..74e59b82 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f1.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f10.png b/app/src/main/res/drawable/emoji_bath_f10.png new file mode 100644 index 00000000..17665ff9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f10.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f11.png b/app/src/main/res/drawable/emoji_bath_f11.png new file mode 100644 index 00000000..1be98fff Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f11.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f12.png b/app/src/main/res/drawable/emoji_bath_f12.png new file mode 100644 index 00000000..285e7071 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f12.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f13.png b/app/src/main/res/drawable/emoji_bath_f13.png new file mode 100644 index 00000000..0aa6cdda Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f13.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f14.png b/app/src/main/res/drawable/emoji_bath_f14.png new file mode 100644 index 00000000..614e7234 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f14.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f15.png b/app/src/main/res/drawable/emoji_bath_f15.png new file mode 100644 index 00000000..0aa6cdda Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f15.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f16.png b/app/src/main/res/drawable/emoji_bath_f16.png new file mode 100644 index 00000000..a4e2ad60 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f16.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f17.png b/app/src/main/res/drawable/emoji_bath_f17.png new file mode 100644 index 00000000..7b2cb172 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f17.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f18.png b/app/src/main/res/drawable/emoji_bath_f18.png new file mode 100644 index 00000000..e90149c6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f18.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f19.png b/app/src/main/res/drawable/emoji_bath_f19.png new file mode 100644 index 00000000..cadcfc3e Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f19.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f2.png b/app/src/main/res/drawable/emoji_bath_f2.png new file mode 100644 index 00000000..13f5c1db Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f2.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f20.png b/app/src/main/res/drawable/emoji_bath_f20.png new file mode 100644 index 00000000..5ce3e748 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f20.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f21.png b/app/src/main/res/drawable/emoji_bath_f21.png new file mode 100644 index 00000000..3e00ea38 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f21.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f22.png b/app/src/main/res/drawable/emoji_bath_f22.png new file mode 100644 index 00000000..a4d7c4fd Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f22.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f23.png b/app/src/main/res/drawable/emoji_bath_f23.png new file mode 100644 index 00000000..3e00ea38 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f23.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f24.png b/app/src/main/res/drawable/emoji_bath_f24.png new file mode 100644 index 00000000..a4d7c4fd Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f24.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f25.png b/app/src/main/res/drawable/emoji_bath_f25.png new file mode 100644 index 00000000..9a638d0b Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f25.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f26.png b/app/src/main/res/drawable/emoji_bath_f26.png new file mode 100644 index 00000000..e62cda7b Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f26.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f27.png b/app/src/main/res/drawable/emoji_bath_f27.png new file mode 100644 index 00000000..9a638d0b Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f27.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f28.png b/app/src/main/res/drawable/emoji_bath_f28.png new file mode 100644 index 00000000..e62cda7b Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f28.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f29.png b/app/src/main/res/drawable/emoji_bath_f29.png new file mode 100644 index 00000000..9a638d0b Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f29.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f3.png b/app/src/main/res/drawable/emoji_bath_f3.png new file mode 100644 index 00000000..2a93809f Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f3.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f30.png b/app/src/main/res/drawable/emoji_bath_f30.png new file mode 100644 index 00000000..5f327e00 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f30.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f31.png b/app/src/main/res/drawable/emoji_bath_f31.png new file mode 100644 index 00000000..dde8a55d Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f31.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f32.png b/app/src/main/res/drawable/emoji_bath_f32.png new file mode 100644 index 00000000..bf01fe90 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f32.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f33.png b/app/src/main/res/drawable/emoji_bath_f33.png new file mode 100644 index 00000000..9600f834 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f33.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f34.png b/app/src/main/res/drawable/emoji_bath_f34.png new file mode 100644 index 00000000..ebb549a6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f34.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f35.png b/app/src/main/res/drawable/emoji_bath_f35.png new file mode 100644 index 00000000..ec825945 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f35.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f36.png b/app/src/main/res/drawable/emoji_bath_f36.png new file mode 100644 index 00000000..22601647 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f36.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f37.png b/app/src/main/res/drawable/emoji_bath_f37.png new file mode 100644 index 00000000..22601647 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f37.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f38.png b/app/src/main/res/drawable/emoji_bath_f38.png new file mode 100644 index 00000000..84dfed9e Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f38.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f39.png b/app/src/main/res/drawable/emoji_bath_f39.png new file mode 100644 index 00000000..7accbc82 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f39.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f4.png b/app/src/main/res/drawable/emoji_bath_f4.png new file mode 100644 index 00000000..137d1ddb Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f4.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f5.png b/app/src/main/res/drawable/emoji_bath_f5.png new file mode 100644 index 00000000..b65acea1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f5.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f6.png b/app/src/main/res/drawable/emoji_bath_f6.png new file mode 100644 index 00000000..137d1ddb Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f6.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f7.png b/app/src/main/res/drawable/emoji_bath_f7.png new file mode 100644 index 00000000..b65acea1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f7.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f8.png b/app/src/main/res/drawable/emoji_bath_f8.png new file mode 100644 index 00000000..717a296b Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f8.png differ diff --git a/app/src/main/res/drawable/emoji_bath_f9.png b/app/src/main/res/drawable/emoji_bath_f9.png new file mode 100644 index 00000000..9b474723 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bath_f9.png differ diff --git a/app/src/main/res/drawable/emoji_beer2.xml b/app/src/main/res/drawable/emoji_beer2.xml new file mode 100644 index 00000000..f5fb814f --- /dev/null +++ b/app/src/main/res/drawable/emoji_beer2.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_beer2_f0.png b/app/src/main/res/drawable/emoji_beer2_f0.png new file mode 100644 index 00000000..c5825037 Binary files /dev/null and b/app/src/main/res/drawable/emoji_beer2_f0.png differ diff --git a/app/src/main/res/drawable/emoji_beer2_f1.png b/app/src/main/res/drawable/emoji_beer2_f1.png new file mode 100644 index 00000000..a79b0700 Binary files /dev/null and b/app/src/main/res/drawable/emoji_beer2_f1.png differ diff --git a/app/src/main/res/drawable/emoji_beer2_f2.png b/app/src/main/res/drawable/emoji_beer2_f2.png new file mode 100644 index 00000000..15d1dc8d Binary files /dev/null and b/app/src/main/res/drawable/emoji_beer2_f2.png differ diff --git a/app/src/main/res/drawable/emoji_beer2_f3.png b/app/src/main/res/drawable/emoji_beer2_f3.png new file mode 100644 index 00000000..e8839633 Binary files /dev/null and b/app/src/main/res/drawable/emoji_beer2_f3.png differ diff --git a/app/src/main/res/drawable/emoji_beer2_f4.png b/app/src/main/res/drawable/emoji_beer2_f4.png new file mode 100644 index 00000000..15d1dc8d Binary files /dev/null and b/app/src/main/res/drawable/emoji_beer2_f4.png differ diff --git a/app/src/main/res/drawable/emoji_beer2_f5.png b/app/src/main/res/drawable/emoji_beer2_f5.png new file mode 100644 index 00000000..a79b0700 Binary files /dev/null and b/app/src/main/res/drawable/emoji_beer2_f5.png differ diff --git a/app/src/main/res/drawable/emoji_beer2_f6.png b/app/src/main/res/drawable/emoji_beer2_f6.png new file mode 100644 index 00000000..c5825037 Binary files /dev/null and b/app/src/main/res/drawable/emoji_beer2_f6.png differ diff --git a/app/src/main/res/drawable/emoji_beg.xml b/app/src/main/res/drawable/emoji_beg.xml new file mode 100644 index 00000000..a4ae91c6 --- /dev/null +++ b/app/src/main/res/drawable/emoji_beg.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_beg_f0.png b/app/src/main/res/drawable/emoji_beg_f0.png new file mode 100644 index 00000000..fe97debd Binary files /dev/null and b/app/src/main/res/drawable/emoji_beg_f0.png differ diff --git a/app/src/main/res/drawable/emoji_beg_f1.png b/app/src/main/res/drawable/emoji_beg_f1.png new file mode 100644 index 00000000..5b1b2009 Binary files /dev/null and b/app/src/main/res/drawable/emoji_beg_f1.png differ diff --git a/app/src/main/res/drawable/emoji_beg_f2.png b/app/src/main/res/drawable/emoji_beg_f2.png new file mode 100644 index 00000000..e609a7a3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_beg_f2.png differ diff --git a/app/src/main/res/drawable/emoji_beg_f3.png b/app/src/main/res/drawable/emoji_beg_f3.png new file mode 100644 index 00000000..c4d94335 Binary files /dev/null and b/app/src/main/res/drawable/emoji_beg_f3.png differ diff --git a/app/src/main/res/drawable/emoji_beg_f4.png b/app/src/main/res/drawable/emoji_beg_f4.png new file mode 100644 index 00000000..3993d22e Binary files /dev/null and b/app/src/main/res/drawable/emoji_beg_f4.png differ diff --git a/app/src/main/res/drawable/emoji_beg_f5.png b/app/src/main/res/drawable/emoji_beg_f5.png new file mode 100644 index 00000000..212552c2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_beg_f5.png differ diff --git a/app/src/main/res/drawable/emoji_beg_f6.png b/app/src/main/res/drawable/emoji_beg_f6.png new file mode 100644 index 00000000..16c15c1f Binary files /dev/null and b/app/src/main/res/drawable/emoji_beg_f6.png differ diff --git a/app/src/main/res/drawable/emoji_binkybaby.xml b/app/src/main/res/drawable/emoji_binkybaby.xml new file mode 100644 index 00000000..41391329 --- /dev/null +++ b/app/src/main/res/drawable/emoji_binkybaby.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/app/src/main/res/drawable/emoji_binkybaby_f0.png b/app/src/main/res/drawable/emoji_binkybaby_f0.png new file mode 100644 index 00000000..8ba7e799 Binary files /dev/null and b/app/src/main/res/drawable/emoji_binkybaby_f0.png differ diff --git a/app/src/main/res/drawable/emoji_binkybaby_f1.png b/app/src/main/res/drawable/emoji_binkybaby_f1.png new file mode 100644 index 00000000..72303b76 Binary files /dev/null and b/app/src/main/res/drawable/emoji_binkybaby_f1.png differ diff --git a/app/src/main/res/drawable/emoji_bluescreen.xml b/app/src/main/res/drawable/emoji_bluescreen.xml new file mode 100644 index 00000000..7531d1b7 --- /dev/null +++ b/app/src/main/res/drawable/emoji_bluescreen.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_bluescreen_f0.png b/app/src/main/res/drawable/emoji_bluescreen_f0.png new file mode 100644 index 00000000..89b0e8d0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bluescreen_f0.png differ diff --git a/app/src/main/res/drawable/emoji_bluescreen_f1.png b/app/src/main/res/drawable/emoji_bluescreen_f1.png new file mode 100644 index 00000000..382ae1a5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bluescreen_f1.png differ diff --git a/app/src/main/res/drawable/emoji_bluescreen_f2.png b/app/src/main/res/drawable/emoji_bluescreen_f2.png new file mode 100644 index 00000000..692afc15 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bluescreen_f2.png differ diff --git a/app/src/main/res/drawable/emoji_bluescreen_f3.png b/app/src/main/res/drawable/emoji_bluescreen_f3.png new file mode 100644 index 00000000..147aa303 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bluescreen_f3.png differ diff --git a/app/src/main/res/drawable/emoji_bluescreen_f4.png b/app/src/main/res/drawable/emoji_bluescreen_f4.png new file mode 100644 index 00000000..662313b3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bluescreen_f4.png differ diff --git a/app/src/main/res/drawable/emoji_bluescreen_f5.png b/app/src/main/res/drawable/emoji_bluescreen_f5.png new file mode 100644 index 00000000..147aa303 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bluescreen_f5.png differ diff --git a/app/src/main/res/drawable/emoji_bluescreen_f6.png b/app/src/main/res/drawable/emoji_bluescreen_f6.png new file mode 100644 index 00000000..662313b3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bluescreen_f6.png differ diff --git a/app/src/main/res/drawable/emoji_bluescreen_f7.png b/app/src/main/res/drawable/emoji_bluescreen_f7.png new file mode 100644 index 00000000..147aa303 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bluescreen_f7.png differ diff --git a/app/src/main/res/drawable/emoji_bluescreen_f8.png b/app/src/main/res/drawable/emoji_bluescreen_f8.png new file mode 100644 index 00000000..662313b3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bluescreen_f8.png differ diff --git a/app/src/main/res/drawable/emoji_boil.xml b/app/src/main/res/drawable/emoji_boil.xml new file mode 100644 index 00000000..03f107a8 --- /dev/null +++ b/app/src/main/res/drawable/emoji_boil.xml @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_boil_f0.png b/app/src/main/res/drawable/emoji_boil_f0.png new file mode 100644 index 00000000..c0456d42 Binary files /dev/null and b/app/src/main/res/drawable/emoji_boil_f0.png differ diff --git a/app/src/main/res/drawable/emoji_boil_f1.png b/app/src/main/res/drawable/emoji_boil_f1.png new file mode 100644 index 00000000..4b8ab48a Binary files /dev/null and b/app/src/main/res/drawable/emoji_boil_f1.png differ diff --git a/app/src/main/res/drawable/emoji_boil_f2.png b/app/src/main/res/drawable/emoji_boil_f2.png new file mode 100644 index 00000000..51c9ecea Binary files /dev/null and b/app/src/main/res/drawable/emoji_boil_f2.png differ diff --git a/app/src/main/res/drawable/emoji_boil_f3.png b/app/src/main/res/drawable/emoji_boil_f3.png new file mode 100644 index 00000000..6cffbeb6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_boil_f3.png differ diff --git a/app/src/main/res/drawable/emoji_boil_f4.png b/app/src/main/res/drawable/emoji_boil_f4.png new file mode 100644 index 00000000..bef9ac1e Binary files /dev/null and b/app/src/main/res/drawable/emoji_boil_f4.png differ diff --git a/app/src/main/res/drawable/emoji_bonjour_97213.xml b/app/src/main/res/drawable/emoji_bonjour_97213.xml new file mode 100644 index 00000000..31873eaa --- /dev/null +++ b/app/src/main/res/drawable/emoji_bonjour_97213.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_bonjour_97213_f0.png b/app/src/main/res/drawable/emoji_bonjour_97213_f0.png new file mode 100644 index 00000000..9b1ccea2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bonjour_97213_f0.png differ diff --git a/app/src/main/res/drawable/emoji_bonjour_97213_f1.png b/app/src/main/res/drawable/emoji_bonjour_97213_f1.png new file mode 100644 index 00000000..eb268f31 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bonjour_97213_f1.png differ diff --git a/app/src/main/res/drawable/emoji_bonjour_97213_f10.png b/app/src/main/res/drawable/emoji_bonjour_97213_f10.png new file mode 100644 index 00000000..44d83eb4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bonjour_97213_f10.png differ diff --git a/app/src/main/res/drawable/emoji_bonjour_97213_f11.png b/app/src/main/res/drawable/emoji_bonjour_97213_f11.png new file mode 100644 index 00000000..3f068c32 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bonjour_97213_f11.png differ diff --git a/app/src/main/res/drawable/emoji_bonjour_97213_f2.png b/app/src/main/res/drawable/emoji_bonjour_97213_f2.png new file mode 100644 index 00000000..9b1ccea2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bonjour_97213_f2.png differ diff --git a/app/src/main/res/drawable/emoji_bonjour_97213_f3.png b/app/src/main/res/drawable/emoji_bonjour_97213_f3.png new file mode 100644 index 00000000..274c561e Binary files /dev/null and b/app/src/main/res/drawable/emoji_bonjour_97213_f3.png differ diff --git a/app/src/main/res/drawable/emoji_bonjour_97213_f4.png b/app/src/main/res/drawable/emoji_bonjour_97213_f4.png new file mode 100644 index 00000000..bd5d59e8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bonjour_97213_f4.png differ diff --git a/app/src/main/res/drawable/emoji_bonjour_97213_f5.png b/app/src/main/res/drawable/emoji_bonjour_97213_f5.png new file mode 100644 index 00000000..7856606e Binary files /dev/null and b/app/src/main/res/drawable/emoji_bonjour_97213_f5.png differ diff --git a/app/src/main/res/drawable/emoji_bonjour_97213_f6.png b/app/src/main/res/drawable/emoji_bonjour_97213_f6.png new file mode 100644 index 00000000..9a186020 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bonjour_97213_f6.png differ diff --git a/app/src/main/res/drawable/emoji_bonjour_97213_f7.png b/app/src/main/res/drawable/emoji_bonjour_97213_f7.png new file mode 100644 index 00000000..62e26e45 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bonjour_97213_f7.png differ diff --git a/app/src/main/res/drawable/emoji_bonjour_97213_f8.png b/app/src/main/res/drawable/emoji_bonjour_97213_f8.png new file mode 100644 index 00000000..9bf6e11b Binary files /dev/null and b/app/src/main/res/drawable/emoji_bonjour_97213_f8.png differ diff --git a/app/src/main/res/drawable/emoji_bonjour_97213_f9.png b/app/src/main/res/drawable/emoji_bonjour_97213_f9.png new file mode 100644 index 00000000..495261f6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bonjour_97213_f9.png differ diff --git a/app/src/main/res/drawable/emoji_bye.xml b/app/src/main/res/drawable/emoji_bye.xml new file mode 100644 index 00000000..ed1dfc74 --- /dev/null +++ b/app/src/main/res/drawable/emoji_bye.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_bye_f0.png b/app/src/main/res/drawable/emoji_bye_f0.png new file mode 100644 index 00000000..9c681dd7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bye_f0.png differ diff --git a/app/src/main/res/drawable/emoji_bye_f1.png b/app/src/main/res/drawable/emoji_bye_f1.png new file mode 100644 index 00000000..ba60ae0e Binary files /dev/null and b/app/src/main/res/drawable/emoji_bye_f1.png differ diff --git a/app/src/main/res/drawable/emoji_bye_f2.png b/app/src/main/res/drawable/emoji_bye_f2.png new file mode 100644 index 00000000..d598d390 Binary files /dev/null and b/app/src/main/res/drawable/emoji_bye_f2.png differ diff --git a/app/src/main/res/drawable/emoji_bye_f3.png b/app/src/main/res/drawable/emoji_bye_f3.png new file mode 100644 index 00000000..ba60ae0e Binary files /dev/null and b/app/src/main/res/drawable/emoji_bye_f3.png differ diff --git a/app/src/main/res/drawable/emoji_caffine.xml b/app/src/main/res/drawable/emoji_caffine.xml new file mode 100644 index 00000000..313d5da3 --- /dev/null +++ b/app/src/main/res/drawable/emoji_caffine.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_caffine_f0.png b/app/src/main/res/drawable/emoji_caffine_f0.png new file mode 100644 index 00000000..4e9019f7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_caffine_f0.png differ diff --git a/app/src/main/res/drawable/emoji_caffine_f1.png b/app/src/main/res/drawable/emoji_caffine_f1.png new file mode 100644 index 00000000..7dc68723 Binary files /dev/null and b/app/src/main/res/drawable/emoji_caffine_f1.png differ diff --git a/app/src/main/res/drawable/emoji_caffine_f2.png b/app/src/main/res/drawable/emoji_caffine_f2.png new file mode 100644 index 00000000..ee368dfa Binary files /dev/null and b/app/src/main/res/drawable/emoji_caffine_f2.png differ diff --git a/app/src/main/res/drawable/emoji_caffine_f3.png b/app/src/main/res/drawable/emoji_caffine_f3.png new file mode 100644 index 00000000..93638534 Binary files /dev/null and b/app/src/main/res/drawable/emoji_caffine_f3.png differ diff --git a/app/src/main/res/drawable/emoji_caffine_f4.png b/app/src/main/res/drawable/emoji_caffine_f4.png new file mode 100644 index 00000000..b37b6e70 Binary files /dev/null and b/app/src/main/res/drawable/emoji_caffine_f4.png differ diff --git a/app/src/main/res/drawable/emoji_caffine_f5.png b/app/src/main/res/drawable/emoji_caffine_f5.png new file mode 100644 index 00000000..65250951 Binary files /dev/null and b/app/src/main/res/drawable/emoji_caffine_f5.png differ diff --git a/app/src/main/res/drawable/emoji_caffine_f6.png b/app/src/main/res/drawable/emoji_caffine_f6.png new file mode 100644 index 00000000..ee368dfa Binary files /dev/null and b/app/src/main/res/drawable/emoji_caffine_f6.png differ diff --git a/app/src/main/res/drawable/emoji_callmerip.xml b/app/src/main/res/drawable/emoji_callmerip.xml new file mode 100644 index 00000000..13965f02 --- /dev/null +++ b/app/src/main/res/drawable/emoji_callmerip.xml @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_callmerip_f0.png b/app/src/main/res/drawable/emoji_callmerip_f0.png new file mode 100644 index 00000000..befcc184 Binary files /dev/null and b/app/src/main/res/drawable/emoji_callmerip_f0.png differ diff --git a/app/src/main/res/drawable/emoji_callmerip_f1.png b/app/src/main/res/drawable/emoji_callmerip_f1.png new file mode 100644 index 00000000..c6c9f1d9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_callmerip_f1.png differ diff --git a/app/src/main/res/drawable/emoji_callmerip_f2.png b/app/src/main/res/drawable/emoji_callmerip_f2.png new file mode 100644 index 00000000..d6ae9f3a Binary files /dev/null and b/app/src/main/res/drawable/emoji_callmerip_f2.png differ diff --git a/app/src/main/res/drawable/emoji_callmerip_f3.png b/app/src/main/res/drawable/emoji_callmerip_f3.png new file mode 100644 index 00000000..c6c9f1d9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_callmerip_f3.png differ diff --git a/app/src/main/res/drawable/emoji_callmerip_f4.png b/app/src/main/res/drawable/emoji_callmerip_f4.png new file mode 100644 index 00000000..d6ae9f3a Binary files /dev/null and b/app/src/main/res/drawable/emoji_callmerip_f4.png differ diff --git a/app/src/main/res/drawable/emoji_carnaval.xml b/app/src/main/res/drawable/emoji_carnaval.xml new file mode 100644 index 00000000..70760375 --- /dev/null +++ b/app/src/main/res/drawable/emoji_carnaval.xml @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_carnaval_f0.png b/app/src/main/res/drawable/emoji_carnaval_f0.png new file mode 100644 index 00000000..88527f60 Binary files /dev/null and b/app/src/main/res/drawable/emoji_carnaval_f0.png differ diff --git a/app/src/main/res/drawable/emoji_carnaval_f1.png b/app/src/main/res/drawable/emoji_carnaval_f1.png new file mode 100644 index 00000000..3b9d48c3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_carnaval_f1.png differ diff --git a/app/src/main/res/drawable/emoji_carnaval_f2.png b/app/src/main/res/drawable/emoji_carnaval_f2.png new file mode 100644 index 00000000..b8b26d22 Binary files /dev/null and b/app/src/main/res/drawable/emoji_carnaval_f2.png differ diff --git a/app/src/main/res/drawable/emoji_carnaval_f3.png b/app/src/main/res/drawable/emoji_carnaval_f3.png new file mode 100644 index 00000000..05fc302e Binary files /dev/null and b/app/src/main/res/drawable/emoji_carnaval_f3.png differ diff --git a/app/src/main/res/drawable/emoji_carnaval_f4.png b/app/src/main/res/drawable/emoji_carnaval_f4.png new file mode 100644 index 00000000..185b3fe2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_carnaval_f4.png differ diff --git a/app/src/main/res/drawable/emoji_cell_phone.xml b/app/src/main/res/drawable/emoji_cell_phone.xml new file mode 100644 index 00000000..6fd04ec5 --- /dev/null +++ b/app/src/main/res/drawable/emoji_cell_phone.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_cell_phone_f0.png b/app/src/main/res/drawable/emoji_cell_phone_f0.png new file mode 100644 index 00000000..c95f31ef Binary files /dev/null and b/app/src/main/res/drawable/emoji_cell_phone_f0.png differ diff --git a/app/src/main/res/drawable/emoji_cell_phone_f1.png b/app/src/main/res/drawable/emoji_cell_phone_f1.png new file mode 100644 index 00000000..bd652309 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cell_phone_f1.png differ diff --git a/app/src/main/res/drawable/emoji_cell_phone_f2.png b/app/src/main/res/drawable/emoji_cell_phone_f2.png new file mode 100644 index 00000000..bd652309 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cell_phone_f2.png differ diff --git a/app/src/main/res/drawable/emoji_cell_phone_f3.png b/app/src/main/res/drawable/emoji_cell_phone_f3.png new file mode 100644 index 00000000..cdaddab4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cell_phone_f3.png differ diff --git a/app/src/main/res/drawable/emoji_cheesy.xml b/app/src/main/res/drawable/emoji_cheesy.xml new file mode 100644 index 00000000..fc2d65e6 --- /dev/null +++ b/app/src/main/res/drawable/emoji_cheesy.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_cheesy_f0.png b/app/src/main/res/drawable/emoji_cheesy_f0.png new file mode 100644 index 00000000..4988faa4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cheesy_f0.png differ diff --git a/app/src/main/res/drawable/emoji_cheesy_f1.png b/app/src/main/res/drawable/emoji_cheesy_f1.png new file mode 100644 index 00000000..9a440f45 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cheesy_f1.png differ diff --git a/app/src/main/res/drawable/emoji_cheesy_f2.png b/app/src/main/res/drawable/emoji_cheesy_f2.png new file mode 100644 index 00000000..b516ba3b Binary files /dev/null and b/app/src/main/res/drawable/emoji_cheesy_f2.png differ diff --git a/app/src/main/res/drawable/emoji_cheesy_f3.png b/app/src/main/res/drawable/emoji_cheesy_f3.png new file mode 100644 index 00000000..f1ba17e8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cheesy_f3.png differ diff --git a/app/src/main/res/drawable/emoji_clap.xml b/app/src/main/res/drawable/emoji_clap.xml new file mode 100644 index 00000000..3ba321d7 --- /dev/null +++ b/app/src/main/res/drawable/emoji_clap.xml @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_clap_f0.png b/app/src/main/res/drawable/emoji_clap_f0.png new file mode 100644 index 00000000..c3574e56 Binary files /dev/null and b/app/src/main/res/drawable/emoji_clap_f0.png differ diff --git a/app/src/main/res/drawable/emoji_clap_f1.png b/app/src/main/res/drawable/emoji_clap_f1.png new file mode 100644 index 00000000..027eb7b1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_clap_f1.png differ diff --git a/app/src/main/res/drawable/emoji_clap_f2.png b/app/src/main/res/drawable/emoji_clap_f2.png new file mode 100644 index 00000000..020a9528 Binary files /dev/null and b/app/src/main/res/drawable/emoji_clap_f2.png differ diff --git a/app/src/main/res/drawable/emoji_clap_f3.png b/app/src/main/res/drawable/emoji_clap_f3.png new file mode 100644 index 00000000..027eb7b1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_clap_f3.png differ diff --git a/app/src/main/res/drawable/emoji_clap_f4.png b/app/src/main/res/drawable/emoji_clap_f4.png new file mode 100644 index 00000000..a48766f4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_clap_f4.png differ diff --git a/app/src/main/res/drawable/emoji_coffeepot.xml b/app/src/main/res/drawable/emoji_coffeepot.xml new file mode 100644 index 00000000..565e54a1 --- /dev/null +++ b/app/src/main/res/drawable/emoji_coffeepot.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_coffeepot_f0.png b/app/src/main/res/drawable/emoji_coffeepot_f0.png new file mode 100644 index 00000000..1167be5d Binary files /dev/null and b/app/src/main/res/drawable/emoji_coffeepot_f0.png differ diff --git a/app/src/main/res/drawable/emoji_coffeepot_f1.png b/app/src/main/res/drawable/emoji_coffeepot_f1.png new file mode 100644 index 00000000..f6312aff Binary files /dev/null and b/app/src/main/res/drawable/emoji_coffeepot_f1.png differ diff --git a/app/src/main/res/drawable/emoji_coffeepot_f10.png b/app/src/main/res/drawable/emoji_coffeepot_f10.png new file mode 100644 index 00000000..86f7544a Binary files /dev/null and b/app/src/main/res/drawable/emoji_coffeepot_f10.png differ diff --git a/app/src/main/res/drawable/emoji_coffeepot_f11.png b/app/src/main/res/drawable/emoji_coffeepot_f11.png new file mode 100644 index 00000000..baa5840f Binary files /dev/null and b/app/src/main/res/drawable/emoji_coffeepot_f11.png differ diff --git a/app/src/main/res/drawable/emoji_coffeepot_f12.png b/app/src/main/res/drawable/emoji_coffeepot_f12.png new file mode 100644 index 00000000..8d32d810 Binary files /dev/null and b/app/src/main/res/drawable/emoji_coffeepot_f12.png differ diff --git a/app/src/main/res/drawable/emoji_coffeepot_f13.png b/app/src/main/res/drawable/emoji_coffeepot_f13.png new file mode 100644 index 00000000..06865f9b Binary files /dev/null and b/app/src/main/res/drawable/emoji_coffeepot_f13.png differ diff --git a/app/src/main/res/drawable/emoji_coffeepot_f14.png b/app/src/main/res/drawable/emoji_coffeepot_f14.png new file mode 100644 index 00000000..4f17f86e Binary files /dev/null and b/app/src/main/res/drawable/emoji_coffeepot_f14.png differ diff --git a/app/src/main/res/drawable/emoji_coffeepot_f15.png b/app/src/main/res/drawable/emoji_coffeepot_f15.png new file mode 100644 index 00000000..58d78a60 Binary files /dev/null and b/app/src/main/res/drawable/emoji_coffeepot_f15.png differ diff --git a/app/src/main/res/drawable/emoji_coffeepot_f2.png b/app/src/main/res/drawable/emoji_coffeepot_f2.png new file mode 100644 index 00000000..65975193 Binary files /dev/null and b/app/src/main/res/drawable/emoji_coffeepot_f2.png differ diff --git a/app/src/main/res/drawable/emoji_coffeepot_f3.png b/app/src/main/res/drawable/emoji_coffeepot_f3.png new file mode 100644 index 00000000..7a4541ea Binary files /dev/null and b/app/src/main/res/drawable/emoji_coffeepot_f3.png differ diff --git a/app/src/main/res/drawable/emoji_coffeepot_f4.png b/app/src/main/res/drawable/emoji_coffeepot_f4.png new file mode 100644 index 00000000..ff996a46 Binary files /dev/null and b/app/src/main/res/drawable/emoji_coffeepot_f4.png differ diff --git a/app/src/main/res/drawable/emoji_coffeepot_f5.png b/app/src/main/res/drawable/emoji_coffeepot_f5.png new file mode 100644 index 00000000..82ba122f Binary files /dev/null and b/app/src/main/res/drawable/emoji_coffeepot_f5.png differ diff --git a/app/src/main/res/drawable/emoji_coffeepot_f6.png b/app/src/main/res/drawable/emoji_coffeepot_f6.png new file mode 100644 index 00000000..7cb6d808 Binary files /dev/null and b/app/src/main/res/drawable/emoji_coffeepot_f6.png differ diff --git a/app/src/main/res/drawable/emoji_coffeepot_f7.png b/app/src/main/res/drawable/emoji_coffeepot_f7.png new file mode 100644 index 00000000..00dcb9c1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_coffeepot_f7.png differ diff --git a/app/src/main/res/drawable/emoji_coffeepot_f8.png b/app/src/main/res/drawable/emoji_coffeepot_f8.png new file mode 100644 index 00000000..c4ea2373 Binary files /dev/null and b/app/src/main/res/drawable/emoji_coffeepot_f8.png differ diff --git a/app/src/main/res/drawable/emoji_coffeepot_f9.png b/app/src/main/res/drawable/emoji_coffeepot_f9.png new file mode 100644 index 00000000..a5d0d8e0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_coffeepot_f9.png differ diff --git a/app/src/main/res/drawable/emoji_confused.xml b/app/src/main/res/drawable/emoji_confused.xml new file mode 100644 index 00000000..16a6a64c --- /dev/null +++ b/app/src/main/res/drawable/emoji_confused.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_confused_f0.png b/app/src/main/res/drawable/emoji_confused_f0.png new file mode 100644 index 00000000..83353d7e Binary files /dev/null and b/app/src/main/res/drawable/emoji_confused_f0.png differ diff --git a/app/src/main/res/drawable/emoji_cool.xml b/app/src/main/res/drawable/emoji_cool.xml new file mode 100644 index 00000000..5f4c90f5 --- /dev/null +++ b/app/src/main/res/drawable/emoji_cool.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_cool2.png b/app/src/main/res/drawable/emoji_cool2.png new file mode 100644 index 00000000..2bd59e6e Binary files /dev/null and b/app/src/main/res/drawable/emoji_cool2.png differ diff --git a/app/src/main/res/drawable/emoji_cool_f0.png b/app/src/main/res/drawable/emoji_cool_f0.png new file mode 100644 index 00000000..7edf5342 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cool_f0.png differ diff --git a/app/src/main/res/drawable/emoji_cool_f1.png b/app/src/main/res/drawable/emoji_cool_f1.png new file mode 100644 index 00000000..28f4e8be Binary files /dev/null and b/app/src/main/res/drawable/emoji_cool_f1.png differ diff --git a/app/src/main/res/drawable/emoji_cool_f10.png b/app/src/main/res/drawable/emoji_cool_f10.png new file mode 100644 index 00000000..d899bde0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cool_f10.png differ diff --git a/app/src/main/res/drawable/emoji_cool_f11.png b/app/src/main/res/drawable/emoji_cool_f11.png new file mode 100644 index 00000000..b18ebd9f Binary files /dev/null and b/app/src/main/res/drawable/emoji_cool_f11.png differ diff --git a/app/src/main/res/drawable/emoji_cool_f12.png b/app/src/main/res/drawable/emoji_cool_f12.png new file mode 100644 index 00000000..82efe2c4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cool_f12.png differ diff --git a/app/src/main/res/drawable/emoji_cool_f13.png b/app/src/main/res/drawable/emoji_cool_f13.png new file mode 100644 index 00000000..28f4e8be Binary files /dev/null and b/app/src/main/res/drawable/emoji_cool_f13.png differ diff --git a/app/src/main/res/drawable/emoji_cool_f2.png b/app/src/main/res/drawable/emoji_cool_f2.png new file mode 100644 index 00000000..82efe2c4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cool_f2.png differ diff --git a/app/src/main/res/drawable/emoji_cool_f3.png b/app/src/main/res/drawable/emoji_cool_f3.png new file mode 100644 index 00000000..b18ebd9f Binary files /dev/null and b/app/src/main/res/drawable/emoji_cool_f3.png differ diff --git a/app/src/main/res/drawable/emoji_cool_f4.png b/app/src/main/res/drawable/emoji_cool_f4.png new file mode 100644 index 00000000..d899bde0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cool_f4.png differ diff --git a/app/src/main/res/drawable/emoji_cool_f5.png b/app/src/main/res/drawable/emoji_cool_f5.png new file mode 100644 index 00000000..53c54770 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cool_f5.png differ diff --git a/app/src/main/res/drawable/emoji_cool_f6.png b/app/src/main/res/drawable/emoji_cool_f6.png new file mode 100644 index 00000000..2e25fd66 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cool_f6.png differ diff --git a/app/src/main/res/drawable/emoji_cool_f7.png b/app/src/main/res/drawable/emoji_cool_f7.png new file mode 100644 index 00000000..d634f17d Binary files /dev/null and b/app/src/main/res/drawable/emoji_cool_f7.png differ diff --git a/app/src/main/res/drawable/emoji_cool_f8.png b/app/src/main/res/drawable/emoji_cool_f8.png new file mode 100644 index 00000000..2e25fd66 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cool_f8.png differ diff --git a/app/src/main/res/drawable/emoji_cool_f9.png b/app/src/main/res/drawable/emoji_cool_f9.png new file mode 100644 index 00000000..53c54770 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cool_f9.png differ diff --git a/app/src/main/res/drawable/emoji_crap.xml b/app/src/main/res/drawable/emoji_crap.xml new file mode 100644 index 00000000..9cb1c4d7 --- /dev/null +++ b/app/src/main/res/drawable/emoji_crap.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_crap_f0.png b/app/src/main/res/drawable/emoji_crap_f0.png new file mode 100644 index 00000000..0a9386af Binary files /dev/null and b/app/src/main/res/drawable/emoji_crap_f0.png differ diff --git a/app/src/main/res/drawable/emoji_crazy.jpg b/app/src/main/res/drawable/emoji_crazy.jpg new file mode 100644 index 00000000..c3db20d7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_crazy.jpg differ diff --git a/app/src/main/res/drawable/emoji_cry.xml b/app/src/main/res/drawable/emoji_cry.xml new file mode 100644 index 00000000..96c2ef59 --- /dev/null +++ b/app/src/main/res/drawable/emoji_cry.xml @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_cry_f0.png b/app/src/main/res/drawable/emoji_cry_f0.png new file mode 100644 index 00000000..1a06e1c7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cry_f0.png differ diff --git a/app/src/main/res/drawable/emoji_cry_f1.png b/app/src/main/res/drawable/emoji_cry_f1.png new file mode 100644 index 00000000..6487015a Binary files /dev/null and b/app/src/main/res/drawable/emoji_cry_f1.png differ diff --git a/app/src/main/res/drawable/emoji_cry_f2.png b/app/src/main/res/drawable/emoji_cry_f2.png new file mode 100644 index 00000000..72acd4e5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cry_f2.png differ diff --git a/app/src/main/res/drawable/emoji_cry_f3.png b/app/src/main/res/drawable/emoji_cry_f3.png new file mode 100644 index 00000000..2ad29800 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cry_f3.png differ diff --git a/app/src/main/res/drawable/emoji_cry_f4.png b/app/src/main/res/drawable/emoji_cry_f4.png new file mode 100644 index 00000000..a1f072b8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_cry_f4.png differ diff --git a/app/src/main/res/drawable/emoji_crybaby.xml b/app/src/main/res/drawable/emoji_crybaby.xml new file mode 100644 index 00000000..65436322 --- /dev/null +++ b/app/src/main/res/drawable/emoji_crybaby.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/app/src/main/res/drawable/emoji_crybaby_f0.png b/app/src/main/res/drawable/emoji_crybaby_f0.png new file mode 100644 index 00000000..35b015bc Binary files /dev/null and b/app/src/main/res/drawable/emoji_crybaby_f0.png differ diff --git a/app/src/main/res/drawable/emoji_crybaby_f1.png b/app/src/main/res/drawable/emoji_crybaby_f1.png new file mode 100644 index 00000000..68c302ce Binary files /dev/null and b/app/src/main/res/drawable/emoji_crybaby_f1.png differ diff --git a/app/src/main/res/drawable/emoji_curses.xml b/app/src/main/res/drawable/emoji_curses.xml new file mode 100644 index 00000000..78812229 --- /dev/null +++ b/app/src/main/res/drawable/emoji_curses.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_curses_f0.png b/app/src/main/res/drawable/emoji_curses_f0.png new file mode 100644 index 00000000..7265df10 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curses_f0.png differ diff --git a/app/src/main/res/drawable/emoji_curses_f1.png b/app/src/main/res/drawable/emoji_curses_f1.png new file mode 100644 index 00000000..44ee352d Binary files /dev/null and b/app/src/main/res/drawable/emoji_curses_f1.png differ diff --git a/app/src/main/res/drawable/emoji_curses_f10.png b/app/src/main/res/drawable/emoji_curses_f10.png new file mode 100644 index 00000000..0aadf834 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curses_f10.png differ diff --git a/app/src/main/res/drawable/emoji_curses_f11.png b/app/src/main/res/drawable/emoji_curses_f11.png new file mode 100644 index 00000000..18201dd4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curses_f11.png differ diff --git a/app/src/main/res/drawable/emoji_curses_f12.png b/app/src/main/res/drawable/emoji_curses_f12.png new file mode 100644 index 00000000..a8e7a5ca Binary files /dev/null and b/app/src/main/res/drawable/emoji_curses_f12.png differ diff --git a/app/src/main/res/drawable/emoji_curses_f13.png b/app/src/main/res/drawable/emoji_curses_f13.png new file mode 100644 index 00000000..bc4cfcec Binary files /dev/null and b/app/src/main/res/drawable/emoji_curses_f13.png differ diff --git a/app/src/main/res/drawable/emoji_curses_f2.png b/app/src/main/res/drawable/emoji_curses_f2.png new file mode 100644 index 00000000..6130fdcb Binary files /dev/null and b/app/src/main/res/drawable/emoji_curses_f2.png differ diff --git a/app/src/main/res/drawable/emoji_curses_f3.png b/app/src/main/res/drawable/emoji_curses_f3.png new file mode 100644 index 00000000..164b926b Binary files /dev/null and b/app/src/main/res/drawable/emoji_curses_f3.png differ diff --git a/app/src/main/res/drawable/emoji_curses_f4.png b/app/src/main/res/drawable/emoji_curses_f4.png new file mode 100644 index 00000000..a86e7725 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curses_f4.png differ diff --git a/app/src/main/res/drawable/emoji_curses_f5.png b/app/src/main/res/drawable/emoji_curses_f5.png new file mode 100644 index 00000000..eb51c395 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curses_f5.png differ diff --git a/app/src/main/res/drawable/emoji_curses_f6.png b/app/src/main/res/drawable/emoji_curses_f6.png new file mode 100644 index 00000000..3e8ad110 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curses_f6.png differ diff --git a/app/src/main/res/drawable/emoji_curses_f7.png b/app/src/main/res/drawable/emoji_curses_f7.png new file mode 100644 index 00000000..4d60e002 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curses_f7.png differ diff --git a/app/src/main/res/drawable/emoji_curses_f8.png b/app/src/main/res/drawable/emoji_curses_f8.png new file mode 100644 index 00000000..d168d6e2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curses_f8.png differ diff --git a/app/src/main/res/drawable/emoji_curses_f9.png b/app/src/main/res/drawable/emoji_curses_f9.png new file mode 100644 index 00000000..d699f664 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curses_f9.png differ diff --git a/app/src/main/res/drawable/emoji_curtseyqi9.xml b/app/src/main/res/drawable/emoji_curtseyqi9.xml new file mode 100644 index 00000000..c43343ae --- /dev/null +++ b/app/src/main/res/drawable/emoji_curtseyqi9.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_curtseyqi9_f0.png b/app/src/main/res/drawable/emoji_curtseyqi9_f0.png new file mode 100644 index 00000000..f0b1d919 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curtseyqi9_f0.png differ diff --git a/app/src/main/res/drawable/emoji_curtseyqi9_f1.png b/app/src/main/res/drawable/emoji_curtseyqi9_f1.png new file mode 100644 index 00000000..e5a9a92c Binary files /dev/null and b/app/src/main/res/drawable/emoji_curtseyqi9_f1.png differ diff --git a/app/src/main/res/drawable/emoji_curtseyqi9_f10.png b/app/src/main/res/drawable/emoji_curtseyqi9_f10.png new file mode 100644 index 00000000..42e867f5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curtseyqi9_f10.png differ diff --git a/app/src/main/res/drawable/emoji_curtseyqi9_f11.png b/app/src/main/res/drawable/emoji_curtseyqi9_f11.png new file mode 100644 index 00000000..1d510ac4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curtseyqi9_f11.png differ diff --git a/app/src/main/res/drawable/emoji_curtseyqi9_f12.png b/app/src/main/res/drawable/emoji_curtseyqi9_f12.png new file mode 100644 index 00000000..2ca1c3bd Binary files /dev/null and b/app/src/main/res/drawable/emoji_curtseyqi9_f12.png differ diff --git a/app/src/main/res/drawable/emoji_curtseyqi9_f13.png b/app/src/main/res/drawable/emoji_curtseyqi9_f13.png new file mode 100644 index 00000000..0d518eb6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curtseyqi9_f13.png differ diff --git a/app/src/main/res/drawable/emoji_curtseyqi9_f14.png b/app/src/main/res/drawable/emoji_curtseyqi9_f14.png new file mode 100644 index 00000000..7bed10b8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curtseyqi9_f14.png differ diff --git a/app/src/main/res/drawable/emoji_curtseyqi9_f15.png b/app/src/main/res/drawable/emoji_curtseyqi9_f15.png new file mode 100644 index 00000000..8a5ef4c5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curtseyqi9_f15.png differ diff --git a/app/src/main/res/drawable/emoji_curtseyqi9_f16.png b/app/src/main/res/drawable/emoji_curtseyqi9_f16.png new file mode 100644 index 00000000..ac956987 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curtseyqi9_f16.png differ diff --git a/app/src/main/res/drawable/emoji_curtseyqi9_f2.png b/app/src/main/res/drawable/emoji_curtseyqi9_f2.png new file mode 100644 index 00000000..f0b1d919 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curtseyqi9_f2.png differ diff --git a/app/src/main/res/drawable/emoji_curtseyqi9_f3.png b/app/src/main/res/drawable/emoji_curtseyqi9_f3.png new file mode 100644 index 00000000..0deeeb7a Binary files /dev/null and b/app/src/main/res/drawable/emoji_curtseyqi9_f3.png differ diff --git a/app/src/main/res/drawable/emoji_curtseyqi9_f4.png b/app/src/main/res/drawable/emoji_curtseyqi9_f4.png new file mode 100644 index 00000000..8e1aec43 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curtseyqi9_f4.png differ diff --git a/app/src/main/res/drawable/emoji_curtseyqi9_f5.png b/app/src/main/res/drawable/emoji_curtseyqi9_f5.png new file mode 100644 index 00000000..0f3119c2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curtseyqi9_f5.png differ diff --git a/app/src/main/res/drawable/emoji_curtseyqi9_f6.png b/app/src/main/res/drawable/emoji_curtseyqi9_f6.png new file mode 100644 index 00000000..1bb26d8a Binary files /dev/null and b/app/src/main/res/drawable/emoji_curtseyqi9_f6.png differ diff --git a/app/src/main/res/drawable/emoji_curtseyqi9_f7.png b/app/src/main/res/drawable/emoji_curtseyqi9_f7.png new file mode 100644 index 00000000..1d510ac4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curtseyqi9_f7.png differ diff --git a/app/src/main/res/drawable/emoji_curtseyqi9_f8.png b/app/src/main/res/drawable/emoji_curtseyqi9_f8.png new file mode 100644 index 00000000..195ddb66 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curtseyqi9_f8.png differ diff --git a/app/src/main/res/drawable/emoji_curtseyqi9_f9.png b/app/src/main/res/drawable/emoji_curtseyqi9_f9.png new file mode 100644 index 00000000..e6d39180 Binary files /dev/null and b/app/src/main/res/drawable/emoji_curtseyqi9_f9.png differ diff --git a/app/src/main/res/drawable/emoji_dontknow.xml b/app/src/main/res/drawable/emoji_dontknow.xml new file mode 100644 index 00000000..8df62dce --- /dev/null +++ b/app/src/main/res/drawable/emoji_dontknow.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/app/src/main/res/drawable/emoji_dontknow_f0.png b/app/src/main/res/drawable/emoji_dontknow_f0.png new file mode 100644 index 00000000..57f16f18 Binary files /dev/null and b/app/src/main/res/drawable/emoji_dontknow_f0.png differ diff --git a/app/src/main/res/drawable/emoji_dontknow_f1.png b/app/src/main/res/drawable/emoji_dontknow_f1.png new file mode 100644 index 00000000..4e7c7253 Binary files /dev/null and b/app/src/main/res/drawable/emoji_dontknow_f1.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e.xml b/app/src/main/res/drawable/emoji_e10_7_3e.xml new file mode 100644 index 00000000..62d7e7e6 --- /dev/null +++ b/app/src/main/res/drawable/emoji_e10_7_3e.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f0.png b/app/src/main/res/drawable/emoji_e10_7_3e_f0.png new file mode 100644 index 00000000..3725ba5c Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f0.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f1.png b/app/src/main/res/drawable/emoji_e10_7_3e_f1.png new file mode 100644 index 00000000..055a883a Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f1.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f10.png b/app/src/main/res/drawable/emoji_e10_7_3e_f10.png new file mode 100644 index 00000000..af2ad5bb Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f10.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f11.png b/app/src/main/res/drawable/emoji_e10_7_3e_f11.png new file mode 100644 index 00000000..3a221f17 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f11.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f12.png b/app/src/main/res/drawable/emoji_e10_7_3e_f12.png new file mode 100644 index 00000000..affbb522 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f12.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f13.png b/app/src/main/res/drawable/emoji_e10_7_3e_f13.png new file mode 100644 index 00000000..a770677a Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f13.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f14.png b/app/src/main/res/drawable/emoji_e10_7_3e_f14.png new file mode 100644 index 00000000..6c4dce97 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f14.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f15.png b/app/src/main/res/drawable/emoji_e10_7_3e_f15.png new file mode 100644 index 00000000..a5be9bcb Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f15.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f16.png b/app/src/main/res/drawable/emoji_e10_7_3e_f16.png new file mode 100644 index 00000000..49368a8a Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f16.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f17.png b/app/src/main/res/drawable/emoji_e10_7_3e_f17.png new file mode 100644 index 00000000..4002788b Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f17.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f18.png b/app/src/main/res/drawable/emoji_e10_7_3e_f18.png new file mode 100644 index 00000000..f4e635e2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f18.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f19.png b/app/src/main/res/drawable/emoji_e10_7_3e_f19.png new file mode 100644 index 00000000..12b16a0e Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f19.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f2.png b/app/src/main/res/drawable/emoji_e10_7_3e_f2.png new file mode 100644 index 00000000..9f525a3e Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f2.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f20.png b/app/src/main/res/drawable/emoji_e10_7_3e_f20.png new file mode 100644 index 00000000..c8cb8ae9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f20.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f21.png b/app/src/main/res/drawable/emoji_e10_7_3e_f21.png new file mode 100644 index 00000000..8df0e240 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f21.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f22.png b/app/src/main/res/drawable/emoji_e10_7_3e_f22.png new file mode 100644 index 00000000..08bd11d7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f22.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f23.png b/app/src/main/res/drawable/emoji_e10_7_3e_f23.png new file mode 100644 index 00000000..6abbb5d4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f23.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f24.png b/app/src/main/res/drawable/emoji_e10_7_3e_f24.png new file mode 100644 index 00000000..e7ac6bc4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f24.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f25.png b/app/src/main/res/drawable/emoji_e10_7_3e_f25.png new file mode 100644 index 00000000..84421fe7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f25.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f26.png b/app/src/main/res/drawable/emoji_e10_7_3e_f26.png new file mode 100644 index 00000000..6e91ce7d Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f26.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f27.png b/app/src/main/res/drawable/emoji_e10_7_3e_f27.png new file mode 100644 index 00000000..dc408f19 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f27.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f28.png b/app/src/main/res/drawable/emoji_e10_7_3e_f28.png new file mode 100644 index 00000000..658a4201 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f28.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f29.png b/app/src/main/res/drawable/emoji_e10_7_3e_f29.png new file mode 100644 index 00000000..031ebf42 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f29.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f3.png b/app/src/main/res/drawable/emoji_e10_7_3e_f3.png new file mode 100644 index 00000000..4870cdd4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f3.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f30.png b/app/src/main/res/drawable/emoji_e10_7_3e_f30.png new file mode 100644 index 00000000..5edaf29e Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f30.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f31.png b/app/src/main/res/drawable/emoji_e10_7_3e_f31.png new file mode 100644 index 00000000..aec7353c Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f31.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f32.png b/app/src/main/res/drawable/emoji_e10_7_3e_f32.png new file mode 100644 index 00000000..b39e3f71 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f32.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f33.png b/app/src/main/res/drawable/emoji_e10_7_3e_f33.png new file mode 100644 index 00000000..c9bc3ada Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f33.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f34.png b/app/src/main/res/drawable/emoji_e10_7_3e_f34.png new file mode 100644 index 00000000..c46d2416 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f34.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f35.png b/app/src/main/res/drawable/emoji_e10_7_3e_f35.png new file mode 100644 index 00000000..c5584d1a Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f35.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f36.png b/app/src/main/res/drawable/emoji_e10_7_3e_f36.png new file mode 100644 index 00000000..5a3aca7b Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f36.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f37.png b/app/src/main/res/drawable/emoji_e10_7_3e_f37.png new file mode 100644 index 00000000..59d2d50b Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f37.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f38.png b/app/src/main/res/drawable/emoji_e10_7_3e_f38.png new file mode 100644 index 00000000..eac5c288 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f38.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f39.png b/app/src/main/res/drawable/emoji_e10_7_3e_f39.png new file mode 100644 index 00000000..46057f4c Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f39.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f4.png b/app/src/main/res/drawable/emoji_e10_7_3e_f4.png new file mode 100644 index 00000000..5f338d6d Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f4.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f40.png b/app/src/main/res/drawable/emoji_e10_7_3e_f40.png new file mode 100644 index 00000000..91a4a692 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f40.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f41.png b/app/src/main/res/drawable/emoji_e10_7_3e_f41.png new file mode 100644 index 00000000..3129f9e6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f41.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f42.png b/app/src/main/res/drawable/emoji_e10_7_3e_f42.png new file mode 100644 index 00000000..7d6a4955 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f42.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f43.png b/app/src/main/res/drawable/emoji_e10_7_3e_f43.png new file mode 100644 index 00000000..a4f14109 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f43.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f44.png b/app/src/main/res/drawable/emoji_e10_7_3e_f44.png new file mode 100644 index 00000000..639c88ac Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f44.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f45.png b/app/src/main/res/drawable/emoji_e10_7_3e_f45.png new file mode 100644 index 00000000..084577ff Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f45.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f46.png b/app/src/main/res/drawable/emoji_e10_7_3e_f46.png new file mode 100644 index 00000000..56d7e4b9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f46.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f47.png b/app/src/main/res/drawable/emoji_e10_7_3e_f47.png new file mode 100644 index 00000000..f3236730 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f47.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f48.png b/app/src/main/res/drawable/emoji_e10_7_3e_f48.png new file mode 100644 index 00000000..af831a7f Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f48.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f49.png b/app/src/main/res/drawable/emoji_e10_7_3e_f49.png new file mode 100644 index 00000000..3294c98d Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f49.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f5.png b/app/src/main/res/drawable/emoji_e10_7_3e_f5.png new file mode 100644 index 00000000..7a2fdc1f Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f5.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f50.png b/app/src/main/res/drawable/emoji_e10_7_3e_f50.png new file mode 100644 index 00000000..0beb5030 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f50.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f51.png b/app/src/main/res/drawable/emoji_e10_7_3e_f51.png new file mode 100644 index 00000000..f6ced09f Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f51.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f52.png b/app/src/main/res/drawable/emoji_e10_7_3e_f52.png new file mode 100644 index 00000000..9f052c77 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f52.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f53.png b/app/src/main/res/drawable/emoji_e10_7_3e_f53.png new file mode 100644 index 00000000..24516b23 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f53.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f54.png b/app/src/main/res/drawable/emoji_e10_7_3e_f54.png new file mode 100644 index 00000000..8f11cb73 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f54.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f55.png b/app/src/main/res/drawable/emoji_e10_7_3e_f55.png new file mode 100644 index 00000000..93f811a6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f55.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f56.png b/app/src/main/res/drawable/emoji_e10_7_3e_f56.png new file mode 100644 index 00000000..a13e43c6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f56.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f57.png b/app/src/main/res/drawable/emoji_e10_7_3e_f57.png new file mode 100644 index 00000000..6b6468a6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f57.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f58.png b/app/src/main/res/drawable/emoji_e10_7_3e_f58.png new file mode 100644 index 00000000..1c554f2d Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f58.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f59.png b/app/src/main/res/drawable/emoji_e10_7_3e_f59.png new file mode 100644 index 00000000..3e839ec2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f59.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f6.png b/app/src/main/res/drawable/emoji_e10_7_3e_f6.png new file mode 100644 index 00000000..0dcf81f8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f6.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f60.png b/app/src/main/res/drawable/emoji_e10_7_3e_f60.png new file mode 100644 index 00000000..818e8edc Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f60.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f61.png b/app/src/main/res/drawable/emoji_e10_7_3e_f61.png new file mode 100644 index 00000000..3a75d24b Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f61.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f7.png b/app/src/main/res/drawable/emoji_e10_7_3e_f7.png new file mode 100644 index 00000000..3723a9db Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f7.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f8.png b/app/src/main/res/drawable/emoji_e10_7_3e_f8.png new file mode 100644 index 00000000..ae424423 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f8.png differ diff --git a/app/src/main/res/drawable/emoji_e10_7_3e_f9.png b/app/src/main/res/drawable/emoji_e10_7_3e_f9.png new file mode 100644 index 00000000..a6bb2828 Binary files /dev/null and b/app/src/main/res/drawable/emoji_e10_7_3e_f9.png differ diff --git a/app/src/main/res/drawable/emoji_embarrassed.xml b/app/src/main/res/drawable/emoji_embarrassed.xml new file mode 100644 index 00000000..950dbd5c --- /dev/null +++ b/app/src/main/res/drawable/emoji_embarrassed.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_embarrassed_f0.png b/app/src/main/res/drawable/emoji_embarrassed_f0.png new file mode 100644 index 00000000..b67d71e4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_embarrassed_f0.png differ diff --git a/app/src/main/res/drawable/emoji_embarrassed_f1.png b/app/src/main/res/drawable/emoji_embarrassed_f1.png new file mode 100644 index 00000000..839695a0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_embarrassed_f1.png differ diff --git a/app/src/main/res/drawable/emoji_embarrassed_f2.png b/app/src/main/res/drawable/emoji_embarrassed_f2.png new file mode 100644 index 00000000..b67d71e4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_embarrassed_f2.png differ diff --git a/app/src/main/res/drawable/emoji_embarrassed_f3.png b/app/src/main/res/drawable/emoji_embarrassed_f3.png new file mode 100644 index 00000000..839695a0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_embarrassed_f3.png differ diff --git a/app/src/main/res/drawable/emoji_esuper.xml b/app/src/main/res/drawable/emoji_esuper.xml new file mode 100644 index 00000000..4d8dcad1 --- /dev/null +++ b/app/src/main/res/drawable/emoji_esuper.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_esuper_f0.png b/app/src/main/res/drawable/emoji_esuper_f0.png new file mode 100644 index 00000000..7c7d785a Binary files /dev/null and b/app/src/main/res/drawable/emoji_esuper_f0.png differ diff --git a/app/src/main/res/drawable/emoji_extremely_shocked.png b/app/src/main/res/drawable/emoji_extremely_shocked.png new file mode 100644 index 00000000..8edcd7db Binary files /dev/null and b/app/src/main/res/drawable/emoji_extremely_shocked.png differ diff --git a/app/src/main/res/drawable/emoji_facepalm.xml b/app/src/main/res/drawable/emoji_facepalm.xml new file mode 100644 index 00000000..1a305417 --- /dev/null +++ b/app/src/main/res/drawable/emoji_facepalm.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_facepalm_f0.png b/app/src/main/res/drawable/emoji_facepalm_f0.png new file mode 100644 index 00000000..d94951d9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_facepalm_f0.png differ diff --git a/app/src/main/res/drawable/emoji_facepalm_f1.png b/app/src/main/res/drawable/emoji_facepalm_f1.png new file mode 100644 index 00000000..30c19d81 Binary files /dev/null and b/app/src/main/res/drawable/emoji_facepalm_f1.png differ diff --git a/app/src/main/res/drawable/emoji_facepalm_f2.png b/app/src/main/res/drawable/emoji_facepalm_f2.png new file mode 100644 index 00000000..0864b937 Binary files /dev/null and b/app/src/main/res/drawable/emoji_facepalm_f2.png differ diff --git a/app/src/main/res/drawable/emoji_facepalm_f3.png b/app/src/main/res/drawable/emoji_facepalm_f3.png new file mode 100644 index 00000000..1172ae3b Binary files /dev/null and b/app/src/main/res/drawable/emoji_facepalm_f3.png differ diff --git a/app/src/main/res/drawable/emoji_facepalm_f4.png b/app/src/main/res/drawable/emoji_facepalm_f4.png new file mode 100644 index 00000000..f19c3df2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_facepalm_f4.png differ diff --git a/app/src/main/res/drawable/emoji_facepalm_f5.png b/app/src/main/res/drawable/emoji_facepalm_f5.png new file mode 100644 index 00000000..5074d680 Binary files /dev/null and b/app/src/main/res/drawable/emoji_facepalm_f5.png differ diff --git a/app/src/main/res/drawable/emoji_facepalm_f6.png b/app/src/main/res/drawable/emoji_facepalm_f6.png new file mode 100644 index 00000000..32f2592c Binary files /dev/null and b/app/src/main/res/drawable/emoji_facepalm_f6.png differ diff --git a/app/src/main/res/drawable/emoji_facepalm_f7.png b/app/src/main/res/drawable/emoji_facepalm_f7.png new file mode 100644 index 00000000..d94951d9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_facepalm_f7.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia.xml b/app/src/main/res/drawable/emoji_filarakia.xml new file mode 100644 index 00000000..c0137af8 --- /dev/null +++ b/app/src/main/res/drawable/emoji_filarakia.xml @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_filarakia_f0.png b/app/src/main/res/drawable/emoji_filarakia_f0.png new file mode 100644 index 00000000..4b163c13 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f0.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f1.png b/app/src/main/res/drawable/emoji_filarakia_f1.png new file mode 100644 index 00000000..b6a31681 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f1.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f10.png b/app/src/main/res/drawable/emoji_filarakia_f10.png new file mode 100644 index 00000000..ebc656a0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f10.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f11.png b/app/src/main/res/drawable/emoji_filarakia_f11.png new file mode 100644 index 00000000..4b163c13 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f11.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f12.png b/app/src/main/res/drawable/emoji_filarakia_f12.png new file mode 100644 index 00000000..7deb9678 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f12.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f13.png b/app/src/main/res/drawable/emoji_filarakia_f13.png new file mode 100644 index 00000000..4ca56c69 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f13.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f14.png b/app/src/main/res/drawable/emoji_filarakia_f14.png new file mode 100644 index 00000000..2f7bb2ce Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f14.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f15.png b/app/src/main/res/drawable/emoji_filarakia_f15.png new file mode 100644 index 00000000..aee816e7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f15.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f16.png b/app/src/main/res/drawable/emoji_filarakia_f16.png new file mode 100644 index 00000000..2f7bb2ce Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f16.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f17.png b/app/src/main/res/drawable/emoji_filarakia_f17.png new file mode 100644 index 00000000..7deb9678 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f17.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f18.png b/app/src/main/res/drawable/emoji_filarakia_f18.png new file mode 100644 index 00000000..4b163c13 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f18.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f19.png b/app/src/main/res/drawable/emoji_filarakia_f19.png new file mode 100644 index 00000000..00ed4ec8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f19.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f2.png b/app/src/main/res/drawable/emoji_filarakia_f2.png new file mode 100644 index 00000000..4b163c13 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f2.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f20.png b/app/src/main/res/drawable/emoji_filarakia_f20.png new file mode 100644 index 00000000..5f001d77 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f20.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f21.png b/app/src/main/res/drawable/emoji_filarakia_f21.png new file mode 100644 index 00000000..3f4dc418 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f21.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f22.png b/app/src/main/res/drawable/emoji_filarakia_f22.png new file mode 100644 index 00000000..737cd950 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f22.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f23.png b/app/src/main/res/drawable/emoji_filarakia_f23.png new file mode 100644 index 00000000..4d4a1500 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f23.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f24.png b/app/src/main/res/drawable/emoji_filarakia_f24.png new file mode 100644 index 00000000..a227149b Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f24.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f25.png b/app/src/main/res/drawable/emoji_filarakia_f25.png new file mode 100644 index 00000000..8bcd1c87 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f25.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f26.png b/app/src/main/res/drawable/emoji_filarakia_f26.png new file mode 100644 index 00000000..e8c34836 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f26.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f27.png b/app/src/main/res/drawable/emoji_filarakia_f27.png new file mode 100644 index 00000000..0c7defbf Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f27.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f28.png b/app/src/main/res/drawable/emoji_filarakia_f28.png new file mode 100644 index 00000000..e8a4b47d Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f28.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f29.png b/app/src/main/res/drawable/emoji_filarakia_f29.png new file mode 100644 index 00000000..978ccfa8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f29.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f3.png b/app/src/main/res/drawable/emoji_filarakia_f3.png new file mode 100644 index 00000000..d51e3fff Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f3.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f30.png b/app/src/main/res/drawable/emoji_filarakia_f30.png new file mode 100644 index 00000000..7e3d9d2c Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f30.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f31.png b/app/src/main/res/drawable/emoji_filarakia_f31.png new file mode 100644 index 00000000..6f293463 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f31.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f32.png b/app/src/main/res/drawable/emoji_filarakia_f32.png new file mode 100644 index 00000000..91c6f30b Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f32.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f33.png b/app/src/main/res/drawable/emoji_filarakia_f33.png new file mode 100644 index 00000000..4f952bc5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f33.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f34.png b/app/src/main/res/drawable/emoji_filarakia_f34.png new file mode 100644 index 00000000..123d9d61 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f34.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f35.png b/app/src/main/res/drawable/emoji_filarakia_f35.png new file mode 100644 index 00000000..fe89974e Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f35.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f36.png b/app/src/main/res/drawable/emoji_filarakia_f36.png new file mode 100644 index 00000000..123d9d61 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f36.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f37.png b/app/src/main/res/drawable/emoji_filarakia_f37.png new file mode 100644 index 00000000..0c0dba5d Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f37.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f38.png b/app/src/main/res/drawable/emoji_filarakia_f38.png new file mode 100644 index 00000000..91c6f30b Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f38.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f39.png b/app/src/main/res/drawable/emoji_filarakia_f39.png new file mode 100644 index 00000000..6f293463 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f39.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f4.png b/app/src/main/res/drawable/emoji_filarakia_f4.png new file mode 100644 index 00000000..4b163c13 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f4.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f40.png b/app/src/main/res/drawable/emoji_filarakia_f40.png new file mode 100644 index 00000000..4b69972d Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f40.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f5.png b/app/src/main/res/drawable/emoji_filarakia_f5.png new file mode 100644 index 00000000..1b1b3045 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f5.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f6.png b/app/src/main/res/drawable/emoji_filarakia_f6.png new file mode 100644 index 00000000..8e34575d Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f6.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f7.png b/app/src/main/res/drawable/emoji_filarakia_f7.png new file mode 100644 index 00000000..20c640cd Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f7.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f8.png b/app/src/main/res/drawable/emoji_filarakia_f8.png new file mode 100644 index 00000000..c92b6612 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f8.png differ diff --git a/app/src/main/res/drawable/emoji_filarakia_f9.png b/app/src/main/res/drawable/emoji_filarakia_f9.png new file mode 100644 index 00000000..c18820f6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_filarakia_f9.png differ diff --git a/app/src/main/res/drawable/emoji_foyska.xml b/app/src/main/res/drawable/emoji_foyska.xml new file mode 100644 index 00000000..dad60676 --- /dev/null +++ b/app/src/main/res/drawable/emoji_foyska.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_foyska_f0.png b/app/src/main/res/drawable/emoji_foyska_f0.png new file mode 100644 index 00000000..ce2ec2a3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f0.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f1.png b/app/src/main/res/drawable/emoji_foyska_f1.png new file mode 100644 index 00000000..5cc5b3b5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f1.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f10.png b/app/src/main/res/drawable/emoji_foyska_f10.png new file mode 100644 index 00000000..9006a316 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f10.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f11.png b/app/src/main/res/drawable/emoji_foyska_f11.png new file mode 100644 index 00000000..f5793a5f Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f11.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f12.png b/app/src/main/res/drawable/emoji_foyska_f12.png new file mode 100644 index 00000000..c0e89616 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f12.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f13.png b/app/src/main/res/drawable/emoji_foyska_f13.png new file mode 100644 index 00000000..54f75de6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f13.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f14.png b/app/src/main/res/drawable/emoji_foyska_f14.png new file mode 100644 index 00000000..aabf3260 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f14.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f15.png b/app/src/main/res/drawable/emoji_foyska_f15.png new file mode 100644 index 00000000..396cfc75 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f15.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f16.png b/app/src/main/res/drawable/emoji_foyska_f16.png new file mode 100644 index 00000000..efa30f6f Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f16.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f17.png b/app/src/main/res/drawable/emoji_foyska_f17.png new file mode 100644 index 00000000..9f4dd5f5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f17.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f18.png b/app/src/main/res/drawable/emoji_foyska_f18.png new file mode 100644 index 00000000..9b76a5f6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f18.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f19.png b/app/src/main/res/drawable/emoji_foyska_f19.png new file mode 100644 index 00000000..bc26fa5f Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f19.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f2.png b/app/src/main/res/drawable/emoji_foyska_f2.png new file mode 100644 index 00000000..ce2ec2a3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f2.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f20.png b/app/src/main/res/drawable/emoji_foyska_f20.png new file mode 100644 index 00000000..f6af5f7a Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f20.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f21.png b/app/src/main/res/drawable/emoji_foyska_f21.png new file mode 100644 index 00000000..2f288c4d Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f21.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f22.png b/app/src/main/res/drawable/emoji_foyska_f22.png new file mode 100644 index 00000000..fc30a521 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f22.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f23.png b/app/src/main/res/drawable/emoji_foyska_f23.png new file mode 100644 index 00000000..d9a97ec8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f23.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f24.png b/app/src/main/res/drawable/emoji_foyska_f24.png new file mode 100644 index 00000000..33b4d457 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f24.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f25.png b/app/src/main/res/drawable/emoji_foyska_f25.png new file mode 100644 index 00000000..78c4b198 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f25.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f26.png b/app/src/main/res/drawable/emoji_foyska_f26.png new file mode 100644 index 00000000..9e43122a Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f26.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f27.png b/app/src/main/res/drawable/emoji_foyska_f27.png new file mode 100644 index 00000000..1e6bc232 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f27.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f28.png b/app/src/main/res/drawable/emoji_foyska_f28.png new file mode 100644 index 00000000..9d211583 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f28.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f29.png b/app/src/main/res/drawable/emoji_foyska_f29.png new file mode 100644 index 00000000..c304e59a Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f29.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f3.png b/app/src/main/res/drawable/emoji_foyska_f3.png new file mode 100644 index 00000000..3eafc321 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f3.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f30.png b/app/src/main/res/drawable/emoji_foyska_f30.png new file mode 100644 index 00000000..9d211583 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f30.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f4.png b/app/src/main/res/drawable/emoji_foyska_f4.png new file mode 100644 index 00000000..c792b9b1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f4.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f5.png b/app/src/main/res/drawable/emoji_foyska_f5.png new file mode 100644 index 00000000..3d5cd2f8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f5.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f6.png b/app/src/main/res/drawable/emoji_foyska_f6.png new file mode 100644 index 00000000..1d059a66 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f6.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f7.png b/app/src/main/res/drawable/emoji_foyska_f7.png new file mode 100644 index 00000000..d75bfe30 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f7.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f8.png b/app/src/main/res/drawable/emoji_foyska_f8.png new file mode 100644 index 00000000..1903ac25 Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f8.png differ diff --git a/app/src/main/res/drawable/emoji_foyska_f9.png b/app/src/main/res/drawable/emoji_foyska_f9.png new file mode 100644 index 00000000..def9dbec Binary files /dev/null and b/app/src/main/res/drawable/emoji_foyska_f9.png differ diff --git a/app/src/main/res/drawable/emoji_fritz.xml b/app/src/main/res/drawable/emoji_fritz.xml new file mode 100644 index 00000000..44f993b3 --- /dev/null +++ b/app/src/main/res/drawable/emoji_fritz.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_fritz_f0.png b/app/src/main/res/drawable/emoji_fritz_f0.png new file mode 100644 index 00000000..5da6e3f3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_fritz_f0.png differ diff --git a/app/src/main/res/drawable/emoji_funny.xml b/app/src/main/res/drawable/emoji_funny.xml new file mode 100644 index 00000000..98e2e70a --- /dev/null +++ b/app/src/main/res/drawable/emoji_funny.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_funny_f0.png b/app/src/main/res/drawable/emoji_funny_f0.png new file mode 100644 index 00000000..7ad296b4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_funny_f0.png differ diff --git a/app/src/main/res/drawable/emoji_grin.xml b/app/src/main/res/drawable/emoji_grin.xml new file mode 100644 index 00000000..48231668 --- /dev/null +++ b/app/src/main/res/drawable/emoji_grin.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_grin_f0.png b/app/src/main/res/drawable/emoji_grin_f0.png new file mode 100644 index 00000000..61c293c7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_grin_f0.png differ diff --git a/app/src/main/res/drawable/emoji_grin_f1.png b/app/src/main/res/drawable/emoji_grin_f1.png new file mode 100644 index 00000000..209454d1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_grin_f1.png differ diff --git a/app/src/main/res/drawable/emoji_grin_f2.png b/app/src/main/res/drawable/emoji_grin_f2.png new file mode 100644 index 00000000..09274659 Binary files /dev/null and b/app/src/main/res/drawable/emoji_grin_f2.png differ diff --git a/app/src/main/res/drawable/emoji_grin_f3.png b/app/src/main/res/drawable/emoji_grin_f3.png new file mode 100644 index 00000000..5a893e89 Binary files /dev/null and b/app/src/main/res/drawable/emoji_grin_f3.png differ diff --git a/app/src/main/res/drawable/emoji_guitar1.xml b/app/src/main/res/drawable/emoji_guitar1.xml new file mode 100644 index 00000000..6116f371 --- /dev/null +++ b/app/src/main/res/drawable/emoji_guitar1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_guitar1_f0.png b/app/src/main/res/drawable/emoji_guitar1_f0.png new file mode 100644 index 00000000..f97e0e9a Binary files /dev/null and b/app/src/main/res/drawable/emoji_guitar1_f0.png differ diff --git a/app/src/main/res/drawable/emoji_guitar1_f1.png b/app/src/main/res/drawable/emoji_guitar1_f1.png new file mode 100644 index 00000000..0556a557 Binary files /dev/null and b/app/src/main/res/drawable/emoji_guitar1_f1.png differ diff --git a/app/src/main/res/drawable/emoji_guitar1_f10.png b/app/src/main/res/drawable/emoji_guitar1_f10.png new file mode 100644 index 00000000..c4b0f7aa Binary files /dev/null and b/app/src/main/res/drawable/emoji_guitar1_f10.png differ diff --git a/app/src/main/res/drawable/emoji_guitar1_f2.png b/app/src/main/res/drawable/emoji_guitar1_f2.png new file mode 100644 index 00000000..e9b3600e Binary files /dev/null and b/app/src/main/res/drawable/emoji_guitar1_f2.png differ diff --git a/app/src/main/res/drawable/emoji_guitar1_f3.png b/app/src/main/res/drawable/emoji_guitar1_f3.png new file mode 100644 index 00000000..f3adecd6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_guitar1_f3.png differ diff --git a/app/src/main/res/drawable/emoji_guitar1_f4.png b/app/src/main/res/drawable/emoji_guitar1_f4.png new file mode 100644 index 00000000..a98222a6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_guitar1_f4.png differ diff --git a/app/src/main/res/drawable/emoji_guitar1_f5.png b/app/src/main/res/drawable/emoji_guitar1_f5.png new file mode 100644 index 00000000..9a035ce5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_guitar1_f5.png differ diff --git a/app/src/main/res/drawable/emoji_guitar1_f6.png b/app/src/main/res/drawable/emoji_guitar1_f6.png new file mode 100644 index 00000000..0ddaddcc Binary files /dev/null and b/app/src/main/res/drawable/emoji_guitar1_f6.png differ diff --git a/app/src/main/res/drawable/emoji_guitar1_f7.png b/app/src/main/res/drawable/emoji_guitar1_f7.png new file mode 100644 index 00000000..f11953c2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_guitar1_f7.png differ diff --git a/app/src/main/res/drawable/emoji_guitar1_f8.png b/app/src/main/res/drawable/emoji_guitar1_f8.png new file mode 100644 index 00000000..b7fa3600 Binary files /dev/null and b/app/src/main/res/drawable/emoji_guitar1_f8.png differ diff --git a/app/src/main/res/drawable/emoji_guitar1_f9.png b/app/src/main/res/drawable/emoji_guitar1_f9.png new file mode 100644 index 00000000..3e50fcc6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_guitar1_f9.png differ diff --git a/app/src/main/res/drawable/emoji_heart.xml b/app/src/main/res/drawable/emoji_heart.xml new file mode 100644 index 00000000..6bf29dba --- /dev/null +++ b/app/src/main/res/drawable/emoji_heart.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_heart_f0.png b/app/src/main/res/drawable/emoji_heart_f0.png new file mode 100644 index 00000000..64cea44e Binary files /dev/null and b/app/src/main/res/drawable/emoji_heart_f0.png differ diff --git a/app/src/main/res/drawable/emoji_hello.xml b/app/src/main/res/drawable/emoji_hello.xml new file mode 100644 index 00000000..6727a99c --- /dev/null +++ b/app/src/main/res/drawable/emoji_hello.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_hello_f0.png b/app/src/main/res/drawable/emoji_hello_f0.png new file mode 100644 index 00000000..6bed3934 Binary files /dev/null and b/app/src/main/res/drawable/emoji_hello_f0.png differ diff --git a/app/src/main/res/drawable/emoji_hello_f1.png b/app/src/main/res/drawable/emoji_hello_f1.png new file mode 100644 index 00000000..9e384b75 Binary files /dev/null and b/app/src/main/res/drawable/emoji_hello_f1.png differ diff --git a/app/src/main/res/drawable/emoji_hello_f2.png b/app/src/main/res/drawable/emoji_hello_f2.png new file mode 100644 index 00000000..6bed3934 Binary files /dev/null and b/app/src/main/res/drawable/emoji_hello_f2.png differ diff --git a/app/src/main/res/drawable/emoji_hello_f3.png b/app/src/main/res/drawable/emoji_hello_f3.png new file mode 100644 index 00000000..55449cc3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_hello_f3.png differ diff --git a/app/src/main/res/drawable/emoji_huh.xml b/app/src/main/res/drawable/emoji_huh.xml new file mode 100644 index 00000000..ad3f0103 --- /dev/null +++ b/app/src/main/res/drawable/emoji_huh.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/app/src/main/res/drawable/emoji_huh_f0.png b/app/src/main/res/drawable/emoji_huh_f0.png new file mode 100644 index 00000000..57db0431 Binary files /dev/null and b/app/src/main/res/drawable/emoji_huh_f0.png differ diff --git a/app/src/main/res/drawable/emoji_huh_f1.png b/app/src/main/res/drawable/emoji_huh_f1.png new file mode 100644 index 00000000..8b6e7fc6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_huh_f1.png differ diff --git a/app/src/main/res/drawable/emoji_icon_kissy.xml b/app/src/main/res/drawable/emoji_icon_kissy.xml new file mode 100644 index 00000000..04b3e7be --- /dev/null +++ b/app/src/main/res/drawable/emoji_icon_kissy.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_icon_kissy_f0.png b/app/src/main/res/drawable/emoji_icon_kissy_f0.png new file mode 100644 index 00000000..7eb67b5e Binary files /dev/null and b/app/src/main/res/drawable/emoji_icon_kissy_f0.png differ diff --git a/app/src/main/res/drawable/emoji_icon_kissy_f1.png b/app/src/main/res/drawable/emoji_icon_kissy_f1.png new file mode 100644 index 00000000..8df25729 Binary files /dev/null and b/app/src/main/res/drawable/emoji_icon_kissy_f1.png differ diff --git a/app/src/main/res/drawable/emoji_icon_kissy_f10.png b/app/src/main/res/drawable/emoji_icon_kissy_f10.png new file mode 100644 index 00000000..69f24123 Binary files /dev/null and b/app/src/main/res/drawable/emoji_icon_kissy_f10.png differ diff --git a/app/src/main/res/drawable/emoji_icon_kissy_f11.png b/app/src/main/res/drawable/emoji_icon_kissy_f11.png new file mode 100644 index 00000000..6478f974 Binary files /dev/null and b/app/src/main/res/drawable/emoji_icon_kissy_f11.png differ diff --git a/app/src/main/res/drawable/emoji_icon_kissy_f12.png b/app/src/main/res/drawable/emoji_icon_kissy_f12.png new file mode 100644 index 00000000..0de1672b Binary files /dev/null and b/app/src/main/res/drawable/emoji_icon_kissy_f12.png differ diff --git a/app/src/main/res/drawable/emoji_icon_kissy_f13.png b/app/src/main/res/drawable/emoji_icon_kissy_f13.png new file mode 100644 index 00000000..33c902d6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_icon_kissy_f13.png differ diff --git a/app/src/main/res/drawable/emoji_icon_kissy_f14.png b/app/src/main/res/drawable/emoji_icon_kissy_f14.png new file mode 100644 index 00000000..8df25729 Binary files /dev/null and b/app/src/main/res/drawable/emoji_icon_kissy_f14.png differ diff --git a/app/src/main/res/drawable/emoji_icon_kissy_f15.png b/app/src/main/res/drawable/emoji_icon_kissy_f15.png new file mode 100644 index 00000000..7eb67b5e Binary files /dev/null and b/app/src/main/res/drawable/emoji_icon_kissy_f15.png differ diff --git a/app/src/main/res/drawable/emoji_icon_kissy_f2.png b/app/src/main/res/drawable/emoji_icon_kissy_f2.png new file mode 100644 index 00000000..f7dd34bc Binary files /dev/null and b/app/src/main/res/drawable/emoji_icon_kissy_f2.png differ diff --git a/app/src/main/res/drawable/emoji_icon_kissy_f3.png b/app/src/main/res/drawable/emoji_icon_kissy_f3.png new file mode 100644 index 00000000..edbbdcf2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_icon_kissy_f3.png differ diff --git a/app/src/main/res/drawable/emoji_icon_kissy_f4.png b/app/src/main/res/drawable/emoji_icon_kissy_f4.png new file mode 100644 index 00000000..11a8aeea Binary files /dev/null and b/app/src/main/res/drawable/emoji_icon_kissy_f4.png differ diff --git a/app/src/main/res/drawable/emoji_icon_kissy_f5.png b/app/src/main/res/drawable/emoji_icon_kissy_f5.png new file mode 100644 index 00000000..e04bd087 Binary files /dev/null and b/app/src/main/res/drawable/emoji_icon_kissy_f5.png differ diff --git a/app/src/main/res/drawable/emoji_icon_kissy_f6.png b/app/src/main/res/drawable/emoji_icon_kissy_f6.png new file mode 100644 index 00000000..7d9e8446 Binary files /dev/null and b/app/src/main/res/drawable/emoji_icon_kissy_f6.png differ diff --git a/app/src/main/res/drawable/emoji_icon_kissy_f7.png b/app/src/main/res/drawable/emoji_icon_kissy_f7.png new file mode 100644 index 00000000..e4b65057 Binary files /dev/null and b/app/src/main/res/drawable/emoji_icon_kissy_f7.png differ diff --git a/app/src/main/res/drawable/emoji_icon_kissy_f8.png b/app/src/main/res/drawable/emoji_icon_kissy_f8.png new file mode 100644 index 00000000..e815e2d5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_icon_kissy_f8.png differ diff --git a/app/src/main/res/drawable/emoji_icon_kissy_f9.png b/app/src/main/res/drawable/emoji_icon_kissy_f9.png new file mode 100644 index 00000000..8884a865 Binary files /dev/null and b/app/src/main/res/drawable/emoji_icon_kissy_f9.png differ diff --git a/app/src/main/res/drawable/emoji_idiot.xml b/app/src/main/res/drawable/emoji_idiot.xml new file mode 100644 index 00000000..913a07d7 --- /dev/null +++ b/app/src/main/res/drawable/emoji_idiot.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_idiot_f0.png b/app/src/main/res/drawable/emoji_idiot_f0.png new file mode 100644 index 00000000..b8e66b44 Binary files /dev/null and b/app/src/main/res/drawable/emoji_idiot_f0.png differ diff --git a/app/src/main/res/drawable/emoji_idiot_f1.png b/app/src/main/res/drawable/emoji_idiot_f1.png new file mode 100644 index 00000000..8d7f5ecc Binary files /dev/null and b/app/src/main/res/drawable/emoji_idiot_f1.png differ diff --git a/app/src/main/res/drawable/emoji_idiot_f2.png b/app/src/main/res/drawable/emoji_idiot_f2.png new file mode 100644 index 00000000..ae60770b Binary files /dev/null and b/app/src/main/res/drawable/emoji_idiot_f2.png differ diff --git a/app/src/main/res/drawable/emoji_idiot_f3.png b/app/src/main/res/drawable/emoji_idiot_f3.png new file mode 100644 index 00000000..e9caad36 Binary files /dev/null and b/app/src/main/res/drawable/emoji_idiot_f3.png differ diff --git a/app/src/main/res/drawable/emoji_idiot_f4.png b/app/src/main/res/drawable/emoji_idiot_f4.png new file mode 100644 index 00000000..93262ce9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_idiot_f4.png differ diff --git a/app/src/main/res/drawable/emoji_idiot_f5.png b/app/src/main/res/drawable/emoji_idiot_f5.png new file mode 100644 index 00000000..a8aa5c6b Binary files /dev/null and b/app/src/main/res/drawable/emoji_idiot_f5.png differ diff --git a/app/src/main/res/drawable/emoji_idiot_f6.png b/app/src/main/res/drawable/emoji_idiot_f6.png new file mode 100644 index 00000000..e188cb5e Binary files /dev/null and b/app/src/main/res/drawable/emoji_idiot_f6.png differ diff --git a/app/src/main/res/drawable/emoji_idiot_f7.png b/app/src/main/res/drawable/emoji_idiot_f7.png new file mode 100644 index 00000000..f5b042e0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_idiot_f7.png differ diff --git a/app/src/main/res/drawable/emoji_innocent.xml b/app/src/main/res/drawable/emoji_innocent.xml new file mode 100644 index 00000000..8c0dcb41 --- /dev/null +++ b/app/src/main/res/drawable/emoji_innocent.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_innocent_f0.png b/app/src/main/res/drawable/emoji_innocent_f0.png new file mode 100644 index 00000000..20ae78b8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_innocent_f0.png differ diff --git a/app/src/main/res/drawable/emoji_ivres.xml b/app/src/main/res/drawable/emoji_ivres.xml new file mode 100644 index 00000000..ff345881 --- /dev/null +++ b/app/src/main/res/drawable/emoji_ivres.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_ivres_f0.png b/app/src/main/res/drawable/emoji_ivres_f0.png new file mode 100644 index 00000000..970f6885 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f0.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f1.png b/app/src/main/res/drawable/emoji_ivres_f1.png new file mode 100644 index 00000000..e32a928b Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f1.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f10.png b/app/src/main/res/drawable/emoji_ivres_f10.png new file mode 100644 index 00000000..e3dd6a52 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f10.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f11.png b/app/src/main/res/drawable/emoji_ivres_f11.png new file mode 100644 index 00000000..9c7bc126 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f11.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f12.png b/app/src/main/res/drawable/emoji_ivres_f12.png new file mode 100644 index 00000000..d68428d1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f12.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f13.png b/app/src/main/res/drawable/emoji_ivres_f13.png new file mode 100644 index 00000000..b1dc6d30 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f13.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f14.png b/app/src/main/res/drawable/emoji_ivres_f14.png new file mode 100644 index 00000000..5680f8d1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f14.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f15.png b/app/src/main/res/drawable/emoji_ivres_f15.png new file mode 100644 index 00000000..884d25dd Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f15.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f16.png b/app/src/main/res/drawable/emoji_ivres_f16.png new file mode 100644 index 00000000..4de406f4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f16.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f17.png b/app/src/main/res/drawable/emoji_ivres_f17.png new file mode 100644 index 00000000..aac2690b Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f17.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f18.png b/app/src/main/res/drawable/emoji_ivres_f18.png new file mode 100644 index 00000000..52788019 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f18.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f19.png b/app/src/main/res/drawable/emoji_ivres_f19.png new file mode 100644 index 00000000..4ddfe486 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f19.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f2.png b/app/src/main/res/drawable/emoji_ivres_f2.png new file mode 100644 index 00000000..793fc3f7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f2.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f20.png b/app/src/main/res/drawable/emoji_ivres_f20.png new file mode 100644 index 00000000..39a39725 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f20.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f21.png b/app/src/main/res/drawable/emoji_ivres_f21.png new file mode 100644 index 00000000..e8d2b4f4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f21.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f22.png b/app/src/main/res/drawable/emoji_ivres_f22.png new file mode 100644 index 00000000..c0a4e4f9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f22.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f23.png b/app/src/main/res/drawable/emoji_ivres_f23.png new file mode 100644 index 00000000..50b3b3e3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f23.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f24.png b/app/src/main/res/drawable/emoji_ivres_f24.png new file mode 100644 index 00000000..c0a4e4f9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f24.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f25.png b/app/src/main/res/drawable/emoji_ivres_f25.png new file mode 100644 index 00000000..b2280395 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f25.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f26.png b/app/src/main/res/drawable/emoji_ivres_f26.png new file mode 100644 index 00000000..c0a4e4f9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f26.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f27.png b/app/src/main/res/drawable/emoji_ivres_f27.png new file mode 100644 index 00000000..50b3b3e3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f27.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f28.png b/app/src/main/res/drawable/emoji_ivres_f28.png new file mode 100644 index 00000000..c0a4e4f9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f28.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f29.png b/app/src/main/res/drawable/emoji_ivres_f29.png new file mode 100644 index 00000000..b2280395 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f29.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f3.png b/app/src/main/res/drawable/emoji_ivres_f3.png new file mode 100644 index 00000000..e65ae45b Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f3.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f30.png b/app/src/main/res/drawable/emoji_ivres_f30.png new file mode 100644 index 00000000..74f02ea8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f30.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f31.png b/app/src/main/res/drawable/emoji_ivres_f31.png new file mode 100644 index 00000000..5dab1cd7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f31.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f32.png b/app/src/main/res/drawable/emoji_ivres_f32.png new file mode 100644 index 00000000..51c429f9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f32.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f33.png b/app/src/main/res/drawable/emoji_ivres_f33.png new file mode 100644 index 00000000..5dab1cd7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f33.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f34.png b/app/src/main/res/drawable/emoji_ivres_f34.png new file mode 100644 index 00000000..74f02ea8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f34.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f35.png b/app/src/main/res/drawable/emoji_ivres_f35.png new file mode 100644 index 00000000..86903e5c Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f35.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f36.png b/app/src/main/res/drawable/emoji_ivres_f36.png new file mode 100644 index 00000000..8c92ed57 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f36.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f37.png b/app/src/main/res/drawable/emoji_ivres_f37.png new file mode 100644 index 00000000..ea775656 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f37.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f38.png b/app/src/main/res/drawable/emoji_ivres_f38.png new file mode 100644 index 00000000..a924c587 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f38.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f39.png b/app/src/main/res/drawable/emoji_ivres_f39.png new file mode 100644 index 00000000..eba360dd Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f39.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f4.png b/app/src/main/res/drawable/emoji_ivres_f4.png new file mode 100644 index 00000000..980f5d5b Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f4.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f40.png b/app/src/main/res/drawable/emoji_ivres_f40.png new file mode 100644 index 00000000..c14cf628 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f40.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f41.png b/app/src/main/res/drawable/emoji_ivres_f41.png new file mode 100644 index 00000000..e1e6c4c5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f41.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f42.png b/app/src/main/res/drawable/emoji_ivres_f42.png new file mode 100644 index 00000000..c14cf628 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f42.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f43.png b/app/src/main/res/drawable/emoji_ivres_f43.png new file mode 100644 index 00000000..e483e305 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f43.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f44.png b/app/src/main/res/drawable/emoji_ivres_f44.png new file mode 100644 index 00000000..e483e305 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f44.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f45.png b/app/src/main/res/drawable/emoji_ivres_f45.png new file mode 100644 index 00000000..5b6f45cc Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f45.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f46.png b/app/src/main/res/drawable/emoji_ivres_f46.png new file mode 100644 index 00000000..c4e858f1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f46.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f47.png b/app/src/main/res/drawable/emoji_ivres_f47.png new file mode 100644 index 00000000..47987449 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f47.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f48.png b/app/src/main/res/drawable/emoji_ivres_f48.png new file mode 100644 index 00000000..b5c2cb32 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f48.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f5.png b/app/src/main/res/drawable/emoji_ivres_f5.png new file mode 100644 index 00000000..b618328b Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f5.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f6.png b/app/src/main/res/drawable/emoji_ivres_f6.png new file mode 100644 index 00000000..6f24a8b0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f6.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f7.png b/app/src/main/res/drawable/emoji_ivres_f7.png new file mode 100644 index 00000000..ba6a4453 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f7.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f8.png b/app/src/main/res/drawable/emoji_ivres_f8.png new file mode 100644 index 00000000..e1de8dfb Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f8.png differ diff --git a/app/src/main/res/drawable/emoji_ivres_f9.png b/app/src/main/res/drawable/emoji_ivres_f9.png new file mode 100644 index 00000000..d62560e2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ivres_f9.png differ diff --git a/app/src/main/res/drawable/emoji_jerk.xml b/app/src/main/res/drawable/emoji_jerk.xml new file mode 100644 index 00000000..c0e24185 --- /dev/null +++ b/app/src/main/res/drawable/emoji_jerk.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/app/src/main/res/drawable/emoji_jerk_f0.png b/app/src/main/res/drawable/emoji_jerk_f0.png new file mode 100644 index 00000000..9c4af342 Binary files /dev/null and b/app/src/main/res/drawable/emoji_jerk_f0.png differ diff --git a/app/src/main/res/drawable/emoji_jerk_f1.png b/app/src/main/res/drawable/emoji_jerk_f1.png new file mode 100644 index 00000000..30e2626d Binary files /dev/null and b/app/src/main/res/drawable/emoji_jerk_f1.png differ diff --git a/app/src/main/res/drawable/emoji_kaloe.xml b/app/src/main/res/drawable/emoji_kaloe.xml new file mode 100644 index 00000000..b9a7f0bd --- /dev/null +++ b/app/src/main/res/drawable/emoji_kaloe.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_kaloe_f0.png b/app/src/main/res/drawable/emoji_kaloe_f0.png new file mode 100644 index 00000000..e1b17209 Binary files /dev/null and b/app/src/main/res/drawable/emoji_kaloe_f0.png differ diff --git a/app/src/main/res/drawable/emoji_kaloe_f1.png b/app/src/main/res/drawable/emoji_kaloe_f1.png new file mode 100644 index 00000000..3d47c160 Binary files /dev/null and b/app/src/main/res/drawable/emoji_kaloe_f1.png differ diff --git a/app/src/main/res/drawable/emoji_kaloe_f2.png b/app/src/main/res/drawable/emoji_kaloe_f2.png new file mode 100644 index 00000000..95bf702b Binary files /dev/null and b/app/src/main/res/drawable/emoji_kaloe_f2.png differ diff --git a/app/src/main/res/drawable/emoji_kaloe_f3.png b/app/src/main/res/drawable/emoji_kaloe_f3.png new file mode 100644 index 00000000..80c30ba4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_kaloe_f3.png differ diff --git a/app/src/main/res/drawable/emoji_kaloe_f4.png b/app/src/main/res/drawable/emoji_kaloe_f4.png new file mode 100644 index 00000000..a120c76f Binary files /dev/null and b/app/src/main/res/drawable/emoji_kaloe_f4.png differ diff --git a/app/src/main/res/drawable/emoji_kaloe_f5.png b/app/src/main/res/drawable/emoji_kaloe_f5.png new file mode 100644 index 00000000..80c30ba4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_kaloe_f5.png differ diff --git a/app/src/main/res/drawable/emoji_kaloe_f6.png b/app/src/main/res/drawable/emoji_kaloe_f6.png new file mode 100644 index 00000000..95bf702b Binary files /dev/null and b/app/src/main/res/drawable/emoji_kaloe_f6.png differ diff --git a/app/src/main/res/drawable/emoji_kaloe_f7.png b/app/src/main/res/drawable/emoji_kaloe_f7.png new file mode 100644 index 00000000..3d47c160 Binary files /dev/null and b/app/src/main/res/drawable/emoji_kaloe_f7.png differ diff --git a/app/src/main/res/drawable/emoji_kiss.xml b/app/src/main/res/drawable/emoji_kiss.xml new file mode 100644 index 00000000..84d8ad63 --- /dev/null +++ b/app/src/main/res/drawable/emoji_kiss.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_kiss_f0.png b/app/src/main/res/drawable/emoji_kiss_f0.png new file mode 100644 index 00000000..84a26f3c Binary files /dev/null and b/app/src/main/res/drawable/emoji_kiss_f0.png differ diff --git a/app/src/main/res/drawable/emoji_kiss_f1.png b/app/src/main/res/drawable/emoji_kiss_f1.png new file mode 100644 index 00000000..e5e59f7a Binary files /dev/null and b/app/src/main/res/drawable/emoji_kiss_f1.png differ diff --git a/app/src/main/res/drawable/emoji_kiss_f2.png b/app/src/main/res/drawable/emoji_kiss_f2.png new file mode 100644 index 00000000..7c0fd36f Binary files /dev/null and b/app/src/main/res/drawable/emoji_kiss_f2.png differ diff --git a/app/src/main/res/drawable/emoji_kiss_f3.png b/app/src/main/res/drawable/emoji_kiss_f3.png new file mode 100644 index 00000000..e5e59f7a Binary files /dev/null and b/app/src/main/res/drawable/emoji_kiss_f3.png differ diff --git a/app/src/main/res/drawable/emoji_knuppel.xml b/app/src/main/res/drawable/emoji_knuppel.xml new file mode 100644 index 00000000..4a86c97d --- /dev/null +++ b/app/src/main/res/drawable/emoji_knuppel.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_knuppel_f0.png b/app/src/main/res/drawable/emoji_knuppel_f0.png new file mode 100644 index 00000000..a85cc152 Binary files /dev/null and b/app/src/main/res/drawable/emoji_knuppel_f0.png differ diff --git a/app/src/main/res/drawable/emoji_knuppel_f1.png b/app/src/main/res/drawable/emoji_knuppel_f1.png new file mode 100644 index 00000000..2916ab8e Binary files /dev/null and b/app/src/main/res/drawable/emoji_knuppel_f1.png differ diff --git a/app/src/main/res/drawable/emoji_knuppel_f2.png b/app/src/main/res/drawable/emoji_knuppel_f2.png new file mode 100644 index 00000000..49d5bcf5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_knuppel_f2.png differ diff --git a/app/src/main/res/drawable/emoji_knuppel_f3.png b/app/src/main/res/drawable/emoji_knuppel_f3.png new file mode 100644 index 00000000..eaef94ba Binary files /dev/null and b/app/src/main/res/drawable/emoji_knuppel_f3.png differ diff --git a/app/src/main/res/drawable/emoji_kremala.xml b/app/src/main/res/drawable/emoji_kremala.xml new file mode 100644 index 00000000..60d11150 --- /dev/null +++ b/app/src/main/res/drawable/emoji_kremala.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_kremala_f0.png b/app/src/main/res/drawable/emoji_kremala_f0.png new file mode 100644 index 00000000..158e3a04 Binary files /dev/null and b/app/src/main/res/drawable/emoji_kremala_f0.png differ diff --git a/app/src/main/res/drawable/emoji_kremala_f1.png b/app/src/main/res/drawable/emoji_kremala_f1.png new file mode 100644 index 00000000..93bf9bef Binary files /dev/null and b/app/src/main/res/drawable/emoji_kremala_f1.png differ diff --git a/app/src/main/res/drawable/emoji_kremala_f2.png b/app/src/main/res/drawable/emoji_kremala_f2.png new file mode 100644 index 00000000..9156b76c Binary files /dev/null and b/app/src/main/res/drawable/emoji_kremala_f2.png differ diff --git a/app/src/main/res/drawable/emoji_kremala_f3.png b/app/src/main/res/drawable/emoji_kremala_f3.png new file mode 100644 index 00000000..b9075117 Binary files /dev/null and b/app/src/main/res/drawable/emoji_kremala_f3.png differ diff --git a/app/src/main/res/drawable/emoji_kremala_f4.png b/app/src/main/res/drawable/emoji_kremala_f4.png new file mode 100644 index 00000000..86951ae8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_kremala_f4.png differ diff --git a/app/src/main/res/drawable/emoji_kremala_f5.png b/app/src/main/res/drawable/emoji_kremala_f5.png new file mode 100644 index 00000000..640a6c22 Binary files /dev/null and b/app/src/main/res/drawable/emoji_kremala_f5.png differ diff --git a/app/src/main/res/drawable/emoji_kremala_f6.png b/app/src/main/res/drawable/emoji_kremala_f6.png new file mode 100644 index 00000000..064c3382 Binary files /dev/null and b/app/src/main/res/drawable/emoji_kremala_f6.png differ diff --git a/app/src/main/res/drawable/emoji_kremala_f7.png b/app/src/main/res/drawable/emoji_kremala_f7.png new file mode 100644 index 00000000..bc458f12 Binary files /dev/null and b/app/src/main/res/drawable/emoji_kremala_f7.png differ diff --git a/app/src/main/res/drawable/emoji_lips_sealed.xml b/app/src/main/res/drawable/emoji_lips_sealed.xml new file mode 100644 index 00000000..1ff52026 --- /dev/null +++ b/app/src/main/res/drawable/emoji_lips_sealed.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_lips_sealed_f0.png b/app/src/main/res/drawable/emoji_lips_sealed_f0.png new file mode 100644 index 00000000..08c8a1d2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lips_sealed_f0.png differ diff --git a/app/src/main/res/drawable/emoji_lipsrsealed.xml b/app/src/main/res/drawable/emoji_lipsrsealed.xml new file mode 100644 index 00000000..61d57b53 --- /dev/null +++ b/app/src/main/res/drawable/emoji_lipsrsealed.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/app/src/main/res/drawable/emoji_lipsrsealed_f0.png b/app/src/main/res/drawable/emoji_lipsrsealed_f0.png new file mode 100644 index 00000000..80261952 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lipsrsealed_f0.png differ diff --git a/app/src/main/res/drawable/emoji_lipsrsealed_f1.png b/app/src/main/res/drawable/emoji_lipsrsealed_f1.png new file mode 100644 index 00000000..bdc7f10f Binary files /dev/null and b/app/src/main/res/drawable/emoji_lipsrsealed_f1.png differ diff --git a/app/src/main/res/drawable/emoji_locked.xml b/app/src/main/res/drawable/emoji_locked.xml new file mode 100644 index 00000000..ba602fbd --- /dev/null +++ b/app/src/main/res/drawable/emoji_locked.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_locked_f0.png b/app/src/main/res/drawable/emoji_locked_f0.png new file mode 100644 index 00000000..22936a92 Binary files /dev/null and b/app/src/main/res/drawable/emoji_locked_f0.png differ diff --git a/app/src/main/res/drawable/emoji_locked_f1.png b/app/src/main/res/drawable/emoji_locked_f1.png new file mode 100644 index 00000000..04740512 Binary files /dev/null and b/app/src/main/res/drawable/emoji_locked_f1.png differ diff --git a/app/src/main/res/drawable/emoji_locked_f2.png b/app/src/main/res/drawable/emoji_locked_f2.png new file mode 100644 index 00000000..45cf038e Binary files /dev/null and b/app/src/main/res/drawable/emoji_locked_f2.png differ diff --git a/app/src/main/res/drawable/emoji_locked_f3.png b/app/src/main/res/drawable/emoji_locked_f3.png new file mode 100644 index 00000000..d42848a4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_locked_f3.png differ diff --git a/app/src/main/res/drawable/emoji_locked_f4.png b/app/src/main/res/drawable/emoji_locked_f4.png new file mode 100644 index 00000000..0b6ebe22 Binary files /dev/null and b/app/src/main/res/drawable/emoji_locked_f4.png differ diff --git a/app/src/main/res/drawable/emoji_locked_f5.png b/app/src/main/res/drawable/emoji_locked_f5.png new file mode 100644 index 00000000..ba1014fa Binary files /dev/null and b/app/src/main/res/drawable/emoji_locked_f5.png differ diff --git a/app/src/main/res/drawable/emoji_locked_f6.png b/app/src/main/res/drawable/emoji_locked_f6.png new file mode 100644 index 00000000..27d93b44 Binary files /dev/null and b/app/src/main/res/drawable/emoji_locked_f6.png differ diff --git a/app/src/main/res/drawable/emoji_locked_f7.png b/app/src/main/res/drawable/emoji_locked_f7.png new file mode 100644 index 00000000..3a093b47 Binary files /dev/null and b/app/src/main/res/drawable/emoji_locked_f7.png differ diff --git a/app/src/main/res/drawable/emoji_lol.jpg b/app/src/main/res/drawable/emoji_lol.jpg new file mode 100644 index 00000000..af90dee5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lol.jpg differ diff --git a/app/src/main/res/drawable/emoji_love.jpg b/app/src/main/res/drawable/emoji_love.jpg new file mode 100644 index 00000000..ffb90822 Binary files /dev/null and b/app/src/main/res/drawable/emoji_love.jpg differ diff --git a/app/src/main/res/drawable/emoji_lypi.xml b/app/src/main/res/drawable/emoji_lypi.xml new file mode 100644 index 00000000..db3cd7b3 --- /dev/null +++ b/app/src/main/res/drawable/emoji_lypi.xml @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_lypi_f0.png b/app/src/main/res/drawable/emoji_lypi_f0.png new file mode 100644 index 00000000..938be9b7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f0.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f1.png b/app/src/main/res/drawable/emoji_lypi_f1.png new file mode 100644 index 00000000..fccf406f Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f1.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f10.png b/app/src/main/res/drawable/emoji_lypi_f10.png new file mode 100644 index 00000000..095060e1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f10.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f11.png b/app/src/main/res/drawable/emoji_lypi_f11.png new file mode 100644 index 00000000..99f08605 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f11.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f12.png b/app/src/main/res/drawable/emoji_lypi_f12.png new file mode 100644 index 00000000..de3a8868 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f12.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f13.png b/app/src/main/res/drawable/emoji_lypi_f13.png new file mode 100644 index 00000000..9b584f64 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f13.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f14.png b/app/src/main/res/drawable/emoji_lypi_f14.png new file mode 100644 index 00000000..291dcb38 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f14.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f15.png b/app/src/main/res/drawable/emoji_lypi_f15.png new file mode 100644 index 00000000..fccf406f Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f15.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f16.png b/app/src/main/res/drawable/emoji_lypi_f16.png new file mode 100644 index 00000000..557748a3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f16.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f17.png b/app/src/main/res/drawable/emoji_lypi_f17.png new file mode 100644 index 00000000..bddcd5bc Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f17.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f18.png b/app/src/main/res/drawable/emoji_lypi_f18.png new file mode 100644 index 00000000..06bc01b8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f18.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f19.png b/app/src/main/res/drawable/emoji_lypi_f19.png new file mode 100644 index 00000000..bddcd5bc Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f19.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f2.png b/app/src/main/res/drawable/emoji_lypi_f2.png new file mode 100644 index 00000000..291dcb38 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f2.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f20.png b/app/src/main/res/drawable/emoji_lypi_f20.png new file mode 100644 index 00000000..06bc01b8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f20.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f21.png b/app/src/main/res/drawable/emoji_lypi_f21.png new file mode 100644 index 00000000..bddcd5bc Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f21.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f22.png b/app/src/main/res/drawable/emoji_lypi_f22.png new file mode 100644 index 00000000..7b51b6c4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f22.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f23.png b/app/src/main/res/drawable/emoji_lypi_f23.png new file mode 100644 index 00000000..d9d071e5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f23.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f24.png b/app/src/main/res/drawable/emoji_lypi_f24.png new file mode 100644 index 00000000..2a8bac69 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f24.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f25.png b/app/src/main/res/drawable/emoji_lypi_f25.png new file mode 100644 index 00000000..31dd4034 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f25.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f26.png b/app/src/main/res/drawable/emoji_lypi_f26.png new file mode 100644 index 00000000..ebfc7cd2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f26.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f27.png b/app/src/main/res/drawable/emoji_lypi_f27.png new file mode 100644 index 00000000..3613345a Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f27.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f28.png b/app/src/main/res/drawable/emoji_lypi_f28.png new file mode 100644 index 00000000..ebfc7cd2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f28.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f29.png b/app/src/main/res/drawable/emoji_lypi_f29.png new file mode 100644 index 00000000..47b659dc Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f29.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f3.png b/app/src/main/res/drawable/emoji_lypi_f3.png new file mode 100644 index 00000000..5a27320c Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f3.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f30.png b/app/src/main/res/drawable/emoji_lypi_f30.png new file mode 100644 index 00000000..5da8f57a Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f30.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f31.png b/app/src/main/res/drawable/emoji_lypi_f31.png new file mode 100644 index 00000000..af6ba1a2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f31.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f32.png b/app/src/main/res/drawable/emoji_lypi_f32.png new file mode 100644 index 00000000..7ad87276 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f32.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f33.png b/app/src/main/res/drawable/emoji_lypi_f33.png new file mode 100644 index 00000000..c393136d Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f33.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f34.png b/app/src/main/res/drawable/emoji_lypi_f34.png new file mode 100644 index 00000000..e1654116 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f34.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f35.png b/app/src/main/res/drawable/emoji_lypi_f35.png new file mode 100644 index 00000000..ca04ca8e Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f35.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f36.png b/app/src/main/res/drawable/emoji_lypi_f36.png new file mode 100644 index 00000000..ba6916b8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f36.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f37.png b/app/src/main/res/drawable/emoji_lypi_f37.png new file mode 100644 index 00000000..0519397d Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f37.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f38.png b/app/src/main/res/drawable/emoji_lypi_f38.png new file mode 100644 index 00000000..08fd8614 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f38.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f39.png b/app/src/main/res/drawable/emoji_lypi_f39.png new file mode 100644 index 00000000..f15d9e8d Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f39.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f4.png b/app/src/main/res/drawable/emoji_lypi_f4.png new file mode 100644 index 00000000..2e72a0bb Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f4.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f40.png b/app/src/main/res/drawable/emoji_lypi_f40.png new file mode 100644 index 00000000..5173570c Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f40.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f41.png b/app/src/main/res/drawable/emoji_lypi_f41.png new file mode 100644 index 00000000..839cf11a Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f41.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f42.png b/app/src/main/res/drawable/emoji_lypi_f42.png new file mode 100644 index 00000000..0ef64d9a Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f42.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f43.png b/app/src/main/res/drawable/emoji_lypi_f43.png new file mode 100644 index 00000000..dc98198b Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f43.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f44.png b/app/src/main/res/drawable/emoji_lypi_f44.png new file mode 100644 index 00000000..0ef64d9a Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f44.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f45.png b/app/src/main/res/drawable/emoji_lypi_f45.png new file mode 100644 index 00000000..839cf11a Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f45.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f46.png b/app/src/main/res/drawable/emoji_lypi_f46.png new file mode 100644 index 00000000..6d7113e5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f46.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f47.png b/app/src/main/res/drawable/emoji_lypi_f47.png new file mode 100644 index 00000000..0ef64d9a Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f47.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f48.png b/app/src/main/res/drawable/emoji_lypi_f48.png new file mode 100644 index 00000000..6d7113e5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f48.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f49.png b/app/src/main/res/drawable/emoji_lypi_f49.png new file mode 100644 index 00000000..5be44e8c Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f49.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f5.png b/app/src/main/res/drawable/emoji_lypi_f5.png new file mode 100644 index 00000000..b45850ae Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f5.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f50.png b/app/src/main/res/drawable/emoji_lypi_f50.png new file mode 100644 index 00000000..44ac5be2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f50.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f51.png b/app/src/main/res/drawable/emoji_lypi_f51.png new file mode 100644 index 00000000..80b8f9a1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f51.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f52.png b/app/src/main/res/drawable/emoji_lypi_f52.png new file mode 100644 index 00000000..2c103782 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f52.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f53.png b/app/src/main/res/drawable/emoji_lypi_f53.png new file mode 100644 index 00000000..e6e3697e Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f53.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f54.png b/app/src/main/res/drawable/emoji_lypi_f54.png new file mode 100644 index 00000000..432aa168 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f54.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f55.png b/app/src/main/res/drawable/emoji_lypi_f55.png new file mode 100644 index 00000000..71dd3512 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f55.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f56.png b/app/src/main/res/drawable/emoji_lypi_f56.png new file mode 100644 index 00000000..1a3548d2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f56.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f57.png b/app/src/main/res/drawable/emoji_lypi_f57.png new file mode 100644 index 00000000..ad92d02a Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f57.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f58.png b/app/src/main/res/drawable/emoji_lypi_f58.png new file mode 100644 index 00000000..c8774257 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f58.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f59.png b/app/src/main/res/drawable/emoji_lypi_f59.png new file mode 100644 index 00000000..f61cbaee Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f59.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f6.png b/app/src/main/res/drawable/emoji_lypi_f6.png new file mode 100644 index 00000000..de3a8868 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f6.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f7.png b/app/src/main/res/drawable/emoji_lypi_f7.png new file mode 100644 index 00000000..9b584f64 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f7.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f8.png b/app/src/main/res/drawable/emoji_lypi_f8.png new file mode 100644 index 00000000..de3a8868 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f8.png differ diff --git a/app/src/main/res/drawable/emoji_lypi_f9.png b/app/src/main/res/drawable/emoji_lypi_f9.png new file mode 100644 index 00000000..9b584f64 Binary files /dev/null and b/app/src/main/res/drawable/emoji_lypi_f9.png differ diff --git a/app/src/main/res/drawable/emoji_mad.jpg b/app/src/main/res/drawable/emoji_mad.jpg new file mode 100644 index 00000000..6a6c48c5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_mad.jpg differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq.xml b/app/src/main/res/drawable/emoji_megashok1wq.xml new file mode 100644 index 00000000..c4c185cc --- /dev/null +++ b/app/src/main/res/drawable/emoji_megashok1wq.xml @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f0.png b/app/src/main/res/drawable/emoji_megashok1wq_f0.png new file mode 100644 index 00000000..e76119d3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f0.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f1.png b/app/src/main/res/drawable/emoji_megashok1wq_f1.png new file mode 100644 index 00000000..b754007b Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f1.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f10.png b/app/src/main/res/drawable/emoji_megashok1wq_f10.png new file mode 100644 index 00000000..569b385c Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f10.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f11.png b/app/src/main/res/drawable/emoji_megashok1wq_f11.png new file mode 100644 index 00000000..733113aa Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f11.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f12.png b/app/src/main/res/drawable/emoji_megashok1wq_f12.png new file mode 100644 index 00000000..b7115eb3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f12.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f13.png b/app/src/main/res/drawable/emoji_megashok1wq_f13.png new file mode 100644 index 00000000..a7672693 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f13.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f14.png b/app/src/main/res/drawable/emoji_megashok1wq_f14.png new file mode 100644 index 00000000..33618197 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f14.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f15.png b/app/src/main/res/drawable/emoji_megashok1wq_f15.png new file mode 100644 index 00000000..64804643 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f15.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f16.png b/app/src/main/res/drawable/emoji_megashok1wq_f16.png new file mode 100644 index 00000000..1b812be4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f16.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f17.png b/app/src/main/res/drawable/emoji_megashok1wq_f17.png new file mode 100644 index 00000000..2d16a4ab Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f17.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f18.png b/app/src/main/res/drawable/emoji_megashok1wq_f18.png new file mode 100644 index 00000000..4cc813e3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f18.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f19.png b/app/src/main/res/drawable/emoji_megashok1wq_f19.png new file mode 100644 index 00000000..c912e52c Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f19.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f2.png b/app/src/main/res/drawable/emoji_megashok1wq_f2.png new file mode 100644 index 00000000..e76119d3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f2.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f20.png b/app/src/main/res/drawable/emoji_megashok1wq_f20.png new file mode 100644 index 00000000..abee8af8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f20.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f21.png b/app/src/main/res/drawable/emoji_megashok1wq_f21.png new file mode 100644 index 00000000..26fd289b Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f21.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f22.png b/app/src/main/res/drawable/emoji_megashok1wq_f22.png new file mode 100644 index 00000000..d5464d78 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f22.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f23.png b/app/src/main/res/drawable/emoji_megashok1wq_f23.png new file mode 100644 index 00000000..57e9c68d Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f23.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f24.png b/app/src/main/res/drawable/emoji_megashok1wq_f24.png new file mode 100644 index 00000000..015e4cbf Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f24.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f25.png b/app/src/main/res/drawable/emoji_megashok1wq_f25.png new file mode 100644 index 00000000..44f295dc Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f25.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f26.png b/app/src/main/res/drawable/emoji_megashok1wq_f26.png new file mode 100644 index 00000000..eda0a26f Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f26.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f27.png b/app/src/main/res/drawable/emoji_megashok1wq_f27.png new file mode 100644 index 00000000..06db33d9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f27.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f28.png b/app/src/main/res/drawable/emoji_megashok1wq_f28.png new file mode 100644 index 00000000..91fee3cb Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f28.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f29.png b/app/src/main/res/drawable/emoji_megashok1wq_f29.png new file mode 100644 index 00000000..a8325a0e Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f29.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f3.png b/app/src/main/res/drawable/emoji_megashok1wq_f3.png new file mode 100644 index 00000000..76f118bc Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f3.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f30.png b/app/src/main/res/drawable/emoji_megashok1wq_f30.png new file mode 100644 index 00000000..b9303621 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f30.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f31.png b/app/src/main/res/drawable/emoji_megashok1wq_f31.png new file mode 100644 index 00000000..88c4c9f4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f31.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f32.png b/app/src/main/res/drawable/emoji_megashok1wq_f32.png new file mode 100644 index 00000000..1016e738 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f32.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f33.png b/app/src/main/res/drawable/emoji_megashok1wq_f33.png new file mode 100644 index 00000000..50206403 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f33.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f34.png b/app/src/main/res/drawable/emoji_megashok1wq_f34.png new file mode 100644 index 00000000..f15fe052 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f34.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f35.png b/app/src/main/res/drawable/emoji_megashok1wq_f35.png new file mode 100644 index 00000000..5076af41 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f35.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f36.png b/app/src/main/res/drawable/emoji_megashok1wq_f36.png new file mode 100644 index 00000000..75c94582 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f36.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f37.png b/app/src/main/res/drawable/emoji_megashok1wq_f37.png new file mode 100644 index 00000000..93b8d5b5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f37.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f38.png b/app/src/main/res/drawable/emoji_megashok1wq_f38.png new file mode 100644 index 00000000..a6498384 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f38.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f39.png b/app/src/main/res/drawable/emoji_megashok1wq_f39.png new file mode 100644 index 00000000..5073f1f2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f39.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f4.png b/app/src/main/res/drawable/emoji_megashok1wq_f4.png new file mode 100644 index 00000000..9c10b0cb Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f4.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f40.png b/app/src/main/res/drawable/emoji_megashok1wq_f40.png new file mode 100644 index 00000000..7d82a719 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f40.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f41.png b/app/src/main/res/drawable/emoji_megashok1wq_f41.png new file mode 100644 index 00000000..44ca7a4c Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f41.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f42.png b/app/src/main/res/drawable/emoji_megashok1wq_f42.png new file mode 100644 index 00000000..cb34099b Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f42.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f43.png b/app/src/main/res/drawable/emoji_megashok1wq_f43.png new file mode 100644 index 00000000..8bb8455c Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f43.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f44.png b/app/src/main/res/drawable/emoji_megashok1wq_f44.png new file mode 100644 index 00000000..9fc4468a Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f44.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f45.png b/app/src/main/res/drawable/emoji_megashok1wq_f45.png new file mode 100644 index 00000000..667b0614 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f45.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f46.png b/app/src/main/res/drawable/emoji_megashok1wq_f46.png new file mode 100644 index 00000000..2f339236 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f46.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f47.png b/app/src/main/res/drawable/emoji_megashok1wq_f47.png new file mode 100644 index 00000000..ecd65be4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f47.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f48.png b/app/src/main/res/drawable/emoji_megashok1wq_f48.png new file mode 100644 index 00000000..91b0befb Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f48.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f49.png b/app/src/main/res/drawable/emoji_megashok1wq_f49.png new file mode 100644 index 00000000..22c04d5e Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f49.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f5.png b/app/src/main/res/drawable/emoji_megashok1wq_f5.png new file mode 100644 index 00000000..208a858c Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f5.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f6.png b/app/src/main/res/drawable/emoji_megashok1wq_f6.png new file mode 100644 index 00000000..f228704a Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f6.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f7.png b/app/src/main/res/drawable/emoji_megashok1wq_f7.png new file mode 100644 index 00000000..15d52d5f Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f7.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f8.png b/app/src/main/res/drawable/emoji_megashok1wq_f8.png new file mode 100644 index 00000000..569b385c Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f8.png differ diff --git a/app/src/main/res/drawable/emoji_megashok1wq_f9.png b/app/src/main/res/drawable/emoji_megashok1wq_f9.png new file mode 100644 index 00000000..75f920ea Binary files /dev/null and b/app/src/main/res/drawable/emoji_megashok1wq_f9.png differ diff --git a/app/src/main/res/drawable/emoji_monster.png b/app/src/main/res/drawable/emoji_monster.png new file mode 100644 index 00000000..24f2a020 Binary files /dev/null and b/app/src/main/res/drawable/emoji_monster.png differ diff --git a/app/src/main/res/drawable/emoji_moon.xml b/app/src/main/res/drawable/emoji_moon.xml new file mode 100644 index 00000000..9de7c70a --- /dev/null +++ b/app/src/main/res/drawable/emoji_moon.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_moon_f0.png b/app/src/main/res/drawable/emoji_moon_f0.png new file mode 100644 index 00000000..ca43112a Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f0.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f1.png b/app/src/main/res/drawable/emoji_moon_f1.png new file mode 100644 index 00000000..ca43112a Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f1.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f10.png b/app/src/main/res/drawable/emoji_moon_f10.png new file mode 100644 index 00000000..b58c67ef Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f10.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f11.png b/app/src/main/res/drawable/emoji_moon_f11.png new file mode 100644 index 00000000..9c2139df Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f11.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f12.png b/app/src/main/res/drawable/emoji_moon_f12.png new file mode 100644 index 00000000..7d078147 Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f12.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f13.png b/app/src/main/res/drawable/emoji_moon_f13.png new file mode 100644 index 00000000..9c2139df Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f13.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f14.png b/app/src/main/res/drawable/emoji_moon_f14.png new file mode 100644 index 00000000..b58c67ef Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f14.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f15.png b/app/src/main/res/drawable/emoji_moon_f15.png new file mode 100644 index 00000000..c2c18e73 Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f15.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f16.png b/app/src/main/res/drawable/emoji_moon_f16.png new file mode 100644 index 00000000..73546635 Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f16.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f17.png b/app/src/main/res/drawable/emoji_moon_f17.png new file mode 100644 index 00000000..23747ff9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f17.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f18.png b/app/src/main/res/drawable/emoji_moon_f18.png new file mode 100644 index 00000000..bcf82d98 Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f18.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f19.png b/app/src/main/res/drawable/emoji_moon_f19.png new file mode 100644 index 00000000..cc9f3367 Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f19.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f2.png b/app/src/main/res/drawable/emoji_moon_f2.png new file mode 100644 index 00000000..21335f2a Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f2.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f20.png b/app/src/main/res/drawable/emoji_moon_f20.png new file mode 100644 index 00000000..1a19e785 Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f20.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f21.png b/app/src/main/res/drawable/emoji_moon_f21.png new file mode 100644 index 00000000..21335f2a Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f21.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f22.png b/app/src/main/res/drawable/emoji_moon_f22.png new file mode 100644 index 00000000..ca43112a Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f22.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f3.png b/app/src/main/res/drawable/emoji_moon_f3.png new file mode 100644 index 00000000..1a19e785 Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f3.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f4.png b/app/src/main/res/drawable/emoji_moon_f4.png new file mode 100644 index 00000000..cc9f3367 Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f4.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f5.png b/app/src/main/res/drawable/emoji_moon_f5.png new file mode 100644 index 00000000..bcf82d98 Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f5.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f6.png b/app/src/main/res/drawable/emoji_moon_f6.png new file mode 100644 index 00000000..23747ff9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f6.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f7.png b/app/src/main/res/drawable/emoji_moon_f7.png new file mode 100644 index 00000000..501ee5cd Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f7.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f8.png b/app/src/main/res/drawable/emoji_moon_f8.png new file mode 100644 index 00000000..73546635 Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f8.png differ diff --git a/app/src/main/res/drawable/emoji_moon_f9.png b/app/src/main/res/drawable/emoji_moon_f9.png new file mode 100644 index 00000000..c2c18e73 Binary files /dev/null and b/app/src/main/res/drawable/emoji_moon_f9.png differ diff --git a/app/src/main/res/drawable/emoji_mopping.xml b/app/src/main/res/drawable/emoji_mopping.xml new file mode 100644 index 00000000..52af8587 --- /dev/null +++ b/app/src/main/res/drawable/emoji_mopping.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_mopping_f0.png b/app/src/main/res/drawable/emoji_mopping_f0.png new file mode 100644 index 00000000..4b23cf74 Binary files /dev/null and b/app/src/main/res/drawable/emoji_mopping_f0.png differ diff --git a/app/src/main/res/drawable/emoji_mopping_f1.png b/app/src/main/res/drawable/emoji_mopping_f1.png new file mode 100644 index 00000000..af851828 Binary files /dev/null and b/app/src/main/res/drawable/emoji_mopping_f1.png differ diff --git a/app/src/main/res/drawable/emoji_mopping_f2.png b/app/src/main/res/drawable/emoji_mopping_f2.png new file mode 100644 index 00000000..fc120283 Binary files /dev/null and b/app/src/main/res/drawable/emoji_mopping_f2.png differ diff --git a/app/src/main/res/drawable/emoji_mopping_f3.png b/app/src/main/res/drawable/emoji_mopping_f3.png new file mode 100644 index 00000000..f26890dd Binary files /dev/null and b/app/src/main/res/drawable/emoji_mopping_f3.png differ diff --git a/app/src/main/res/drawable/emoji_mopping_f4.png b/app/src/main/res/drawable/emoji_mopping_f4.png new file mode 100644 index 00000000..0e9751a8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_mopping_f4.png differ diff --git a/app/src/main/res/drawable/emoji_mopping_f5.png b/app/src/main/res/drawable/emoji_mopping_f5.png new file mode 100644 index 00000000..f26890dd Binary files /dev/null and b/app/src/main/res/drawable/emoji_mopping_f5.png differ diff --git a/app/src/main/res/drawable/emoji_mopping_f6.png b/app/src/main/res/drawable/emoji_mopping_f6.png new file mode 100644 index 00000000..31fdaf10 Binary files /dev/null and b/app/src/main/res/drawable/emoji_mopping_f6.png differ diff --git a/app/src/main/res/drawable/emoji_mountza.xml b/app/src/main/res/drawable/emoji_mountza.xml new file mode 100644 index 00000000..0c6274b9 --- /dev/null +++ b/app/src/main/res/drawable/emoji_mountza.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_mountza_f0.png b/app/src/main/res/drawable/emoji_mountza_f0.png new file mode 100644 index 00000000..c50905db Binary files /dev/null and b/app/src/main/res/drawable/emoji_mountza_f0.png differ diff --git a/app/src/main/res/drawable/emoji_music.xml b/app/src/main/res/drawable/emoji_music.xml new file mode 100644 index 00000000..a68731d4 --- /dev/null +++ b/app/src/main/res/drawable/emoji_music.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_music_f0.png b/app/src/main/res/drawable/emoji_music_f0.png new file mode 100644 index 00000000..9d4bd390 Binary files /dev/null and b/app/src/main/res/drawable/emoji_music_f0.png differ diff --git a/app/src/main/res/drawable/emoji_nista.xml b/app/src/main/res/drawable/emoji_nista.xml new file mode 100644 index 00000000..3cbc03c5 --- /dev/null +++ b/app/src/main/res/drawable/emoji_nista.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_nista_f0.png b/app/src/main/res/drawable/emoji_nista_f0.png new file mode 100644 index 00000000..663ae5da Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f0.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f1.png b/app/src/main/res/drawable/emoji_nista_f1.png new file mode 100644 index 00000000..502b6615 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f1.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f10.png b/app/src/main/res/drawable/emoji_nista_f10.png new file mode 100644 index 00000000..0927a454 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f10.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f11.png b/app/src/main/res/drawable/emoji_nista_f11.png new file mode 100644 index 00000000..c28277b0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f11.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f12.png b/app/src/main/res/drawable/emoji_nista_f12.png new file mode 100644 index 00000000..227c19b7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f12.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f13.png b/app/src/main/res/drawable/emoji_nista_f13.png new file mode 100644 index 00000000..c28277b0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f13.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f14.png b/app/src/main/res/drawable/emoji_nista_f14.png new file mode 100644 index 00000000..0927a454 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f14.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f15.png b/app/src/main/res/drawable/emoji_nista_f15.png new file mode 100644 index 00000000..c28277b0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f15.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f16.png b/app/src/main/res/drawable/emoji_nista_f16.png new file mode 100644 index 00000000..977a6c12 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f16.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f17.png b/app/src/main/res/drawable/emoji_nista_f17.png new file mode 100644 index 00000000..d919c2c7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f17.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f18.png b/app/src/main/res/drawable/emoji_nista_f18.png new file mode 100644 index 00000000..e879e5cc Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f18.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f19.png b/app/src/main/res/drawable/emoji_nista_f19.png new file mode 100644 index 00000000..ce739dd8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f19.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f2.png b/app/src/main/res/drawable/emoji_nista_f2.png new file mode 100644 index 00000000..663ae5da Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f2.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f20.png b/app/src/main/res/drawable/emoji_nista_f20.png new file mode 100644 index 00000000..d7fac787 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f20.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f21.png b/app/src/main/res/drawable/emoji_nista_f21.png new file mode 100644 index 00000000..bc7997f1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f21.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f22.png b/app/src/main/res/drawable/emoji_nista_f22.png new file mode 100644 index 00000000..b0c13ea0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f22.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f23.png b/app/src/main/res/drawable/emoji_nista_f23.png new file mode 100644 index 00000000..bc7997f1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f23.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f24.png b/app/src/main/res/drawable/emoji_nista_f24.png new file mode 100644 index 00000000..b0c13ea0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f24.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f25.png b/app/src/main/res/drawable/emoji_nista_f25.png new file mode 100644 index 00000000..bc7997f1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f25.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f26.png b/app/src/main/res/drawable/emoji_nista_f26.png new file mode 100644 index 00000000..9c75529f Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f26.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f27.png b/app/src/main/res/drawable/emoji_nista_f27.png new file mode 100644 index 00000000..65afbe37 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f27.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f28.png b/app/src/main/res/drawable/emoji_nista_f28.png new file mode 100644 index 00000000..322036fd Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f28.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f29.png b/app/src/main/res/drawable/emoji_nista_f29.png new file mode 100644 index 00000000..27706e3b Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f29.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f3.png b/app/src/main/res/drawable/emoji_nista_f3.png new file mode 100644 index 00000000..614425a3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f3.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f30.png b/app/src/main/res/drawable/emoji_nista_f30.png new file mode 100644 index 00000000..322036fd Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f30.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f31.png b/app/src/main/res/drawable/emoji_nista_f31.png new file mode 100644 index 00000000..27706e3b Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f31.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f32.png b/app/src/main/res/drawable/emoji_nista_f32.png new file mode 100644 index 00000000..322036fd Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f32.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f33.png b/app/src/main/res/drawable/emoji_nista_f33.png new file mode 100644 index 00000000..27706e3b Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f33.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f34.png b/app/src/main/res/drawable/emoji_nista_f34.png new file mode 100644 index 00000000..65afbe37 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f34.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f35.png b/app/src/main/res/drawable/emoji_nista_f35.png new file mode 100644 index 00000000..e32ad996 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f35.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f36.png b/app/src/main/res/drawable/emoji_nista_f36.png new file mode 100644 index 00000000..adb1118e Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f36.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f37.png b/app/src/main/res/drawable/emoji_nista_f37.png new file mode 100644 index 00000000..9bcf4b07 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f37.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f38.png b/app/src/main/res/drawable/emoji_nista_f38.png new file mode 100644 index 00000000..993eb770 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f38.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f39.png b/app/src/main/res/drawable/emoji_nista_f39.png new file mode 100644 index 00000000..c14208ff Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f39.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f4.png b/app/src/main/res/drawable/emoji_nista_f4.png new file mode 100644 index 00000000..663ae5da Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f4.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f40.png b/app/src/main/res/drawable/emoji_nista_f40.png new file mode 100644 index 00000000..993eb770 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f40.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f41.png b/app/src/main/res/drawable/emoji_nista_f41.png new file mode 100644 index 00000000..d0c5635d Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f41.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f42.png b/app/src/main/res/drawable/emoji_nista_f42.png new file mode 100644 index 00000000..64d04059 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f42.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f5.png b/app/src/main/res/drawable/emoji_nista_f5.png new file mode 100644 index 00000000..7a733540 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f5.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f6.png b/app/src/main/res/drawable/emoji_nista_f6.png new file mode 100644 index 00000000..6591d377 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f6.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f7.png b/app/src/main/res/drawable/emoji_nista_f7.png new file mode 100644 index 00000000..227c19b7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f7.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f8.png b/app/src/main/res/drawable/emoji_nista_f8.png new file mode 100644 index 00000000..6591d377 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f8.png differ diff --git a/app/src/main/res/drawable/emoji_nista_f9.png b/app/src/main/res/drawable/emoji_nista_f9.png new file mode 100644 index 00000000..7a733540 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nista_f9.png differ diff --git a/app/src/main/res/drawable/emoji_noffe.xml b/app/src/main/res/drawable/emoji_noffe.xml new file mode 100644 index 00000000..c0ee41dd --- /dev/null +++ b/app/src/main/res/drawable/emoji_noffe.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_noffe_f0.png b/app/src/main/res/drawable/emoji_noffe_f0.png new file mode 100644 index 00000000..8f3c9412 Binary files /dev/null and b/app/src/main/res/drawable/emoji_noffe_f0.png differ diff --git a/app/src/main/res/drawable/emoji_nono.xml b/app/src/main/res/drawable/emoji_nono.xml new file mode 100644 index 00000000..3060984a --- /dev/null +++ b/app/src/main/res/drawable/emoji_nono.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/app/src/main/res/drawable/emoji_nono_f0.png b/app/src/main/res/drawable/emoji_nono_f0.png new file mode 100644 index 00000000..813535c3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_nono_f0.png differ diff --git a/app/src/main/res/drawable/emoji_nono_f1.png b/app/src/main/res/drawable/emoji_nono_f1.png new file mode 100644 index 00000000..ab0750dc Binary files /dev/null and b/app/src/main/res/drawable/emoji_nono_f1.png differ diff --git a/app/src/main/res/drawable/emoji_notworthy.xml b/app/src/main/res/drawable/emoji_notworthy.xml new file mode 100644 index 00000000..84a3de5c --- /dev/null +++ b/app/src/main/res/drawable/emoji_notworthy.xml @@ -0,0 +1,24 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_notworthy_f0.png b/app/src/main/res/drawable/emoji_notworthy_f0.png new file mode 100644 index 00000000..36829b94 Binary files /dev/null and b/app/src/main/res/drawable/emoji_notworthy_f0.png differ diff --git a/app/src/main/res/drawable/emoji_notworthy_f1.png b/app/src/main/res/drawable/emoji_notworthy_f1.png new file mode 100644 index 00000000..fbc18ba9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_notworthy_f1.png differ diff --git a/app/src/main/res/drawable/emoji_notworthy_f2.png b/app/src/main/res/drawable/emoji_notworthy_f2.png new file mode 100644 index 00000000..629d2666 Binary files /dev/null and b/app/src/main/res/drawable/emoji_notworthy_f2.png differ diff --git a/app/src/main/res/drawable/emoji_notworthy_f3.png b/app/src/main/res/drawable/emoji_notworthy_f3.png new file mode 100644 index 00000000..fbc18ba9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_notworthy_f3.png differ diff --git a/app/src/main/res/drawable/emoji_notworthy_f4.png b/app/src/main/res/drawable/emoji_notworthy_f4.png new file mode 100644 index 00000000..36829b94 Binary files /dev/null and b/app/src/main/res/drawable/emoji_notworthy_f4.png differ diff --git a/app/src/main/res/drawable/emoji_notworthy_f5.png b/app/src/main/res/drawable/emoji_notworthy_f5.png new file mode 100644 index 00000000..7b2a6af5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_notworthy_f5.png differ diff --git a/app/src/main/res/drawable/emoji_off_topic.xml b/app/src/main/res/drawable/emoji_off_topic.xml new file mode 100644 index 00000000..3746d2a7 --- /dev/null +++ b/app/src/main/res/drawable/emoji_off_topic.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_off_topic_f0.png b/app/src/main/res/drawable/emoji_off_topic_f0.png new file mode 100644 index 00000000..5fdc4c91 Binary files /dev/null and b/app/src/main/res/drawable/emoji_off_topic_f0.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep.xml b/app/src/main/res/drawable/emoji_pcsleep.xml new file mode 100644 index 00000000..d9366382 --- /dev/null +++ b/app/src/main/res/drawable/emoji_pcsleep.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_pcsleep_f0.png b/app/src/main/res/drawable/emoji_pcsleep_f0.png new file mode 100644 index 00000000..d2679e6c Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f0.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep_f1.png b/app/src/main/res/drawable/emoji_pcsleep_f1.png new file mode 100644 index 00000000..fe85b982 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f1.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep_f10.png b/app/src/main/res/drawable/emoji_pcsleep_f10.png new file mode 100644 index 00000000..a9ae707d Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f10.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep_f11.png b/app/src/main/res/drawable/emoji_pcsleep_f11.png new file mode 100644 index 00000000..acbbfbf7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f11.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep_f12.png b/app/src/main/res/drawable/emoji_pcsleep_f12.png new file mode 100644 index 00000000..3347966c Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f12.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep_f13.png b/app/src/main/res/drawable/emoji_pcsleep_f13.png new file mode 100644 index 00000000..24fc6412 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f13.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep_f14.png b/app/src/main/res/drawable/emoji_pcsleep_f14.png new file mode 100644 index 00000000..9c4b1c29 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f14.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep_f15.png b/app/src/main/res/drawable/emoji_pcsleep_f15.png new file mode 100644 index 00000000..16243edd Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f15.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep_f16.png b/app/src/main/res/drawable/emoji_pcsleep_f16.png new file mode 100644 index 00000000..3350fe69 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f16.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep_f17.png b/app/src/main/res/drawable/emoji_pcsleep_f17.png new file mode 100644 index 00000000..820f3660 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f17.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep_f18.png b/app/src/main/res/drawable/emoji_pcsleep_f18.png new file mode 100644 index 00000000..7acd19e9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f18.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep_f2.png b/app/src/main/res/drawable/emoji_pcsleep_f2.png new file mode 100644 index 00000000..3b9a7411 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f2.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep_f3.png b/app/src/main/res/drawable/emoji_pcsleep_f3.png new file mode 100644 index 00000000..d7c77645 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f3.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep_f4.png b/app/src/main/res/drawable/emoji_pcsleep_f4.png new file mode 100644 index 00000000..331f8d7c Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f4.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep_f5.png b/app/src/main/res/drawable/emoji_pcsleep_f5.png new file mode 100644 index 00000000..3eec3495 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f5.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep_f6.png b/app/src/main/res/drawable/emoji_pcsleep_f6.png new file mode 100644 index 00000000..f3da2b5e Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f6.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep_f7.png b/app/src/main/res/drawable/emoji_pcsleep_f7.png new file mode 100644 index 00000000..9cff4c49 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f7.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep_f8.png b/app/src/main/res/drawable/emoji_pcsleep_f8.png new file mode 100644 index 00000000..8c15e1ce Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f8.png differ diff --git a/app/src/main/res/drawable/emoji_pcsleep_f9.png b/app/src/main/res/drawable/emoji_pcsleep_f9.png new file mode 100644 index 00000000..40dccdf1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pcsleep_f9.png differ diff --git a/app/src/main/res/drawable/emoji_peace.xml b/app/src/main/res/drawable/emoji_peace.xml new file mode 100644 index 00000000..9f9793e7 --- /dev/null +++ b/app/src/main/res/drawable/emoji_peace.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_peace_f0.png b/app/src/main/res/drawable/emoji_peace_f0.png new file mode 100644 index 00000000..8eb1c133 Binary files /dev/null and b/app/src/main/res/drawable/emoji_peace_f0.png differ diff --git a/app/src/main/res/drawable/emoji_peace_f1.png b/app/src/main/res/drawable/emoji_peace_f1.png new file mode 100644 index 00000000..ea6cf0d1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_peace_f1.png differ diff --git a/app/src/main/res/drawable/emoji_peace_f2.png b/app/src/main/res/drawable/emoji_peace_f2.png new file mode 100644 index 00000000..01180501 Binary files /dev/null and b/app/src/main/res/drawable/emoji_peace_f2.png differ diff --git a/app/src/main/res/drawable/emoji_peace_f3.png b/app/src/main/res/drawable/emoji_peace_f3.png new file mode 100644 index 00000000..ea6cf0d1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_peace_f3.png differ diff --git a/app/src/main/res/drawable/emoji_pinokio.xml b/app/src/main/res/drawable/emoji_pinokio.xml new file mode 100644 index 00000000..c60662d9 --- /dev/null +++ b/app/src/main/res/drawable/emoji_pinokio.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_pinokio_f0.png b/app/src/main/res/drawable/emoji_pinokio_f0.png new file mode 100644 index 00000000..1d7a1414 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pinokio_f0.png differ diff --git a/app/src/main/res/drawable/emoji_pinokio_f1.png b/app/src/main/res/drawable/emoji_pinokio_f1.png new file mode 100644 index 00000000..fead7171 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pinokio_f1.png differ diff --git a/app/src/main/res/drawable/emoji_pinokio_f10.png b/app/src/main/res/drawable/emoji_pinokio_f10.png new file mode 100644 index 00000000..4dda0f7e Binary files /dev/null and b/app/src/main/res/drawable/emoji_pinokio_f10.png differ diff --git a/app/src/main/res/drawable/emoji_pinokio_f11.png b/app/src/main/res/drawable/emoji_pinokio_f11.png new file mode 100644 index 00000000..0fa55fb5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pinokio_f11.png differ diff --git a/app/src/main/res/drawable/emoji_pinokio_f12.png b/app/src/main/res/drawable/emoji_pinokio_f12.png new file mode 100644 index 00000000..37f785ee Binary files /dev/null and b/app/src/main/res/drawable/emoji_pinokio_f12.png differ diff --git a/app/src/main/res/drawable/emoji_pinokio_f13.png b/app/src/main/res/drawable/emoji_pinokio_f13.png new file mode 100644 index 00000000..b4a95612 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pinokio_f13.png differ diff --git a/app/src/main/res/drawable/emoji_pinokio_f14.png b/app/src/main/res/drawable/emoji_pinokio_f14.png new file mode 100644 index 00000000..5b3ae4b1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pinokio_f14.png differ diff --git a/app/src/main/res/drawable/emoji_pinokio_f15.png b/app/src/main/res/drawable/emoji_pinokio_f15.png new file mode 100644 index 00000000..fead7171 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pinokio_f15.png differ diff --git a/app/src/main/res/drawable/emoji_pinokio_f2.png b/app/src/main/res/drawable/emoji_pinokio_f2.png new file mode 100644 index 00000000..5b3ae4b1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pinokio_f2.png differ diff --git a/app/src/main/res/drawable/emoji_pinokio_f3.png b/app/src/main/res/drawable/emoji_pinokio_f3.png new file mode 100644 index 00000000..b4a95612 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pinokio_f3.png differ diff --git a/app/src/main/res/drawable/emoji_pinokio_f4.png b/app/src/main/res/drawable/emoji_pinokio_f4.png new file mode 100644 index 00000000..37f785ee Binary files /dev/null and b/app/src/main/res/drawable/emoji_pinokio_f4.png differ diff --git a/app/src/main/res/drawable/emoji_pinokio_f5.png b/app/src/main/res/drawable/emoji_pinokio_f5.png new file mode 100644 index 00000000..0fa55fb5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pinokio_f5.png differ diff --git a/app/src/main/res/drawable/emoji_pinokio_f6.png b/app/src/main/res/drawable/emoji_pinokio_f6.png new file mode 100644 index 00000000..4dda0f7e Binary files /dev/null and b/app/src/main/res/drawable/emoji_pinokio_f6.png differ diff --git a/app/src/main/res/drawable/emoji_pinokio_f7.png b/app/src/main/res/drawable/emoji_pinokio_f7.png new file mode 100644 index 00000000..0fa55fb5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pinokio_f7.png differ diff --git a/app/src/main/res/drawable/emoji_pinokio_f8.png b/app/src/main/res/drawable/emoji_pinokio_f8.png new file mode 100644 index 00000000..37f785ee Binary files /dev/null and b/app/src/main/res/drawable/emoji_pinokio_f8.png differ diff --git a/app/src/main/res/drawable/emoji_pinokio_f9.png b/app/src/main/res/drawable/emoji_pinokio_f9.png new file mode 100644 index 00000000..0fa55fb5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_pinokio_f9.png differ diff --git a/app/src/main/res/drawable/emoji_poke.xml b/app/src/main/res/drawable/emoji_poke.xml new file mode 100644 index 00000000..0a4f16f4 --- /dev/null +++ b/app/src/main/res/drawable/emoji_poke.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_poke_f0.png b/app/src/main/res/drawable/emoji_poke_f0.png new file mode 100644 index 00000000..fbc344a2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_poke_f0.png differ diff --git a/app/src/main/res/drawable/emoji_poke_f1.png b/app/src/main/res/drawable/emoji_poke_f1.png new file mode 100644 index 00000000..297a4157 Binary files /dev/null and b/app/src/main/res/drawable/emoji_poke_f1.png differ diff --git a/app/src/main/res/drawable/emoji_poke_f2.png b/app/src/main/res/drawable/emoji_poke_f2.png new file mode 100644 index 00000000..ba635ad6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_poke_f2.png differ diff --git a/app/src/main/res/drawable/emoji_poke_f3.png b/app/src/main/res/drawable/emoji_poke_f3.png new file mode 100644 index 00000000..297a4157 Binary files /dev/null and b/app/src/main/res/drawable/emoji_poke_f3.png differ diff --git a/app/src/main/res/drawable/emoji_police.xml b/app/src/main/res/drawable/emoji_police.xml new file mode 100644 index 00000000..f505c57e --- /dev/null +++ b/app/src/main/res/drawable/emoji_police.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_police_f0.png b/app/src/main/res/drawable/emoji_police_f0.png new file mode 100644 index 00000000..893418a2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_police_f0.png differ diff --git a/app/src/main/res/drawable/emoji_puke.xml b/app/src/main/res/drawable/emoji_puke.xml new file mode 100644 index 00000000..e07e8691 --- /dev/null +++ b/app/src/main/res/drawable/emoji_puke.xml @@ -0,0 +1,24 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_puke_f0.png b/app/src/main/res/drawable/emoji_puke_f0.png new file mode 100644 index 00000000..1e6a7d57 Binary files /dev/null and b/app/src/main/res/drawable/emoji_puke_f0.png differ diff --git a/app/src/main/res/drawable/emoji_puke_f1.png b/app/src/main/res/drawable/emoji_puke_f1.png new file mode 100644 index 00000000..163492a5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_puke_f1.png differ diff --git a/app/src/main/res/drawable/emoji_puke_f2.png b/app/src/main/res/drawable/emoji_puke_f2.png new file mode 100644 index 00000000..db81bf9a Binary files /dev/null and b/app/src/main/res/drawable/emoji_puke_f2.png differ diff --git a/app/src/main/res/drawable/emoji_puke_f3.png b/app/src/main/res/drawable/emoji_puke_f3.png new file mode 100644 index 00000000..d4d1edd2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_puke_f3.png differ diff --git a/app/src/main/res/drawable/emoji_puke_f4.png b/app/src/main/res/drawable/emoji_puke_f4.png new file mode 100644 index 00000000..1e9df3e6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_puke_f4.png differ diff --git a/app/src/main/res/drawable/emoji_puke_f5.png b/app/src/main/res/drawable/emoji_puke_f5.png new file mode 100644 index 00000000..30922183 Binary files /dev/null and b/app/src/main/res/drawable/emoji_puke_f5.png differ diff --git a/app/src/main/res/drawable/emoji_question.xml b/app/src/main/res/drawable/emoji_question.xml new file mode 100644 index 00000000..708d6d99 --- /dev/null +++ b/app/src/main/res/drawable/emoji_question.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_question_f0.png b/app/src/main/res/drawable/emoji_question_f0.png new file mode 100644 index 00000000..00aaeb0a Binary files /dev/null and b/app/src/main/res/drawable/emoji_question_f0.png differ diff --git a/app/src/main/res/drawable/emoji_redface.xml b/app/src/main/res/drawable/emoji_redface.xml new file mode 100644 index 00000000..faca124d --- /dev/null +++ b/app/src/main/res/drawable/emoji_redface.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_redface_f0.png b/app/src/main/res/drawable/emoji_redface_f0.png new file mode 100644 index 00000000..574666ba Binary files /dev/null and b/app/src/main/res/drawable/emoji_redface_f0.png differ diff --git a/app/src/main/res/drawable/emoji_rofl.xml b/app/src/main/res/drawable/emoji_rofl.xml new file mode 100644 index 00000000..da50345d --- /dev/null +++ b/app/src/main/res/drawable/emoji_rofl.xml @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_rofl_f0.png b/app/src/main/res/drawable/emoji_rofl_f0.png new file mode 100644 index 00000000..47902e6f Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f0.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f1.png b/app/src/main/res/drawable/emoji_rofl_f1.png new file mode 100644 index 00000000..49c08b5a Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f1.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f10.png b/app/src/main/res/drawable/emoji_rofl_f10.png new file mode 100644 index 00000000..66ee549a Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f10.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f11.png b/app/src/main/res/drawable/emoji_rofl_f11.png new file mode 100644 index 00000000..af3359ef Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f11.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f12.png b/app/src/main/res/drawable/emoji_rofl_f12.png new file mode 100644 index 00000000..66ee549a Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f12.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f13.png b/app/src/main/res/drawable/emoji_rofl_f13.png new file mode 100644 index 00000000..af3359ef Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f13.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f14.png b/app/src/main/res/drawable/emoji_rofl_f14.png new file mode 100644 index 00000000..66ee549a Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f14.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f15.png b/app/src/main/res/drawable/emoji_rofl_f15.png new file mode 100644 index 00000000..af3359ef Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f15.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f16.png b/app/src/main/res/drawable/emoji_rofl_f16.png new file mode 100644 index 00000000..66ee549a Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f16.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f17.png b/app/src/main/res/drawable/emoji_rofl_f17.png new file mode 100644 index 00000000..af3359ef Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f17.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f18.png b/app/src/main/res/drawable/emoji_rofl_f18.png new file mode 100644 index 00000000..2170aa66 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f18.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f19.png b/app/src/main/res/drawable/emoji_rofl_f19.png new file mode 100644 index 00000000..6551feea Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f19.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f2.png b/app/src/main/res/drawable/emoji_rofl_f2.png new file mode 100644 index 00000000..66ee549a Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f2.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f20.png b/app/src/main/res/drawable/emoji_rofl_f20.png new file mode 100644 index 00000000..2170aa66 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f20.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f21.png b/app/src/main/res/drawable/emoji_rofl_f21.png new file mode 100644 index 00000000..4e888717 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f21.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f22.png b/app/src/main/res/drawable/emoji_rofl_f22.png new file mode 100644 index 00000000..9b8d6ee8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f22.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f23.png b/app/src/main/res/drawable/emoji_rofl_f23.png new file mode 100644 index 00000000..d8c9db19 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f23.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f24.png b/app/src/main/res/drawable/emoji_rofl_f24.png new file mode 100644 index 00000000..9b8d6ee8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f24.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f25.png b/app/src/main/res/drawable/emoji_rofl_f25.png new file mode 100644 index 00000000..d8c9db19 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f25.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f26.png b/app/src/main/res/drawable/emoji_rofl_f26.png new file mode 100644 index 00000000..9b8d6ee8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f26.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f27.png b/app/src/main/res/drawable/emoji_rofl_f27.png new file mode 100644 index 00000000..d8c9db19 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f27.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f28.png b/app/src/main/res/drawable/emoji_rofl_f28.png new file mode 100644 index 00000000..9b8d6ee8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f28.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f29.png b/app/src/main/res/drawable/emoji_rofl_f29.png new file mode 100644 index 00000000..9446cca2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f29.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f3.png b/app/src/main/res/drawable/emoji_rofl_f3.png new file mode 100644 index 00000000..af3359ef Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f3.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f30.png b/app/src/main/res/drawable/emoji_rofl_f30.png new file mode 100644 index 00000000..9b8d6ee8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f30.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f31.png b/app/src/main/res/drawable/emoji_rofl_f31.png new file mode 100644 index 00000000..9446cca2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f31.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f32.png b/app/src/main/res/drawable/emoji_rofl_f32.png new file mode 100644 index 00000000..9b8d6ee8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f32.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f33.png b/app/src/main/res/drawable/emoji_rofl_f33.png new file mode 100644 index 00000000..9446cca2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f33.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f34.png b/app/src/main/res/drawable/emoji_rofl_f34.png new file mode 100644 index 00000000..9b8d6ee8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f34.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f35.png b/app/src/main/res/drawable/emoji_rofl_f35.png new file mode 100644 index 00000000..9446cca2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f35.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f36.png b/app/src/main/res/drawable/emoji_rofl_f36.png new file mode 100644 index 00000000..9b8d6ee8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f36.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f37.png b/app/src/main/res/drawable/emoji_rofl_f37.png new file mode 100644 index 00000000..9446cca2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f37.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f38.png b/app/src/main/res/drawable/emoji_rofl_f38.png new file mode 100644 index 00000000..9b8d6ee8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f38.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f39.png b/app/src/main/res/drawable/emoji_rofl_f39.png new file mode 100644 index 00000000..d8c9db19 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f39.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f4.png b/app/src/main/res/drawable/emoji_rofl_f4.png new file mode 100644 index 00000000..66ee549a Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f4.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f40.png b/app/src/main/res/drawable/emoji_rofl_f40.png new file mode 100644 index 00000000..6551feea Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f40.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f41.png b/app/src/main/res/drawable/emoji_rofl_f41.png new file mode 100644 index 00000000..9d9ea79a Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f41.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f42.png b/app/src/main/res/drawable/emoji_rofl_f42.png new file mode 100644 index 00000000..b49b4594 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f42.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f43.png b/app/src/main/res/drawable/emoji_rofl_f43.png new file mode 100644 index 00000000..b442de32 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f43.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f44.png b/app/src/main/res/drawable/emoji_rofl_f44.png new file mode 100644 index 00000000..b49b4594 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f44.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f45.png b/app/src/main/res/drawable/emoji_rofl_f45.png new file mode 100644 index 00000000..b442de32 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f45.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f46.png b/app/src/main/res/drawable/emoji_rofl_f46.png new file mode 100644 index 00000000..b49b4594 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f46.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f47.png b/app/src/main/res/drawable/emoji_rofl_f47.png new file mode 100644 index 00000000..b442de32 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f47.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f48.png b/app/src/main/res/drawable/emoji_rofl_f48.png new file mode 100644 index 00000000..b49b4594 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f48.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f49.png b/app/src/main/res/drawable/emoji_rofl_f49.png new file mode 100644 index 00000000..b442de32 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f49.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f5.png b/app/src/main/res/drawable/emoji_rofl_f5.png new file mode 100644 index 00000000..af3359ef Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f5.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f50.png b/app/src/main/res/drawable/emoji_rofl_f50.png new file mode 100644 index 00000000..b49b4594 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f50.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f51.png b/app/src/main/res/drawable/emoji_rofl_f51.png new file mode 100644 index 00000000..b442de32 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f51.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f52.png b/app/src/main/res/drawable/emoji_rofl_f52.png new file mode 100644 index 00000000..b49b4594 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f52.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f53.png b/app/src/main/res/drawable/emoji_rofl_f53.png new file mode 100644 index 00000000..b442de32 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f53.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f54.png b/app/src/main/res/drawable/emoji_rofl_f54.png new file mode 100644 index 00000000..9bb29a97 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f54.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f55.png b/app/src/main/res/drawable/emoji_rofl_f55.png new file mode 100644 index 00000000..fa7cd9cb Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f55.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f56.png b/app/src/main/res/drawable/emoji_rofl_f56.png new file mode 100644 index 00000000..9bb29a97 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f56.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f57.png b/app/src/main/res/drawable/emoji_rofl_f57.png new file mode 100644 index 00000000..fa7cd9cb Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f57.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f58.png b/app/src/main/res/drawable/emoji_rofl_f58.png new file mode 100644 index 00000000..220df804 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f58.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f59.png b/app/src/main/res/drawable/emoji_rofl_f59.png new file mode 100644 index 00000000..9d9ea79a Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f59.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f6.png b/app/src/main/res/drawable/emoji_rofl_f6.png new file mode 100644 index 00000000..66ee549a Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f6.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f7.png b/app/src/main/res/drawable/emoji_rofl_f7.png new file mode 100644 index 00000000..af3359ef Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f7.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f8.png b/app/src/main/res/drawable/emoji_rofl_f8.png new file mode 100644 index 00000000..66ee549a Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f8.png differ diff --git a/app/src/main/res/drawable/emoji_rofl_f9.png b/app/src/main/res/drawable/emoji_rofl_f9.png new file mode 100644 index 00000000..af3359ef Binary files /dev/null and b/app/src/main/res/drawable/emoji_rofl_f9.png differ diff --git a/app/src/main/res/drawable/emoji_roll_over.xml b/app/src/main/res/drawable/emoji_roll_over.xml new file mode 100644 index 00000000..19ed640e --- /dev/null +++ b/app/src/main/res/drawable/emoji_roll_over.xml @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_roll_over_f0.png b/app/src/main/res/drawable/emoji_roll_over_f0.png new file mode 100644 index 00000000..54492625 Binary files /dev/null and b/app/src/main/res/drawable/emoji_roll_over_f0.png differ diff --git a/app/src/main/res/drawable/emoji_roll_over_f1.png b/app/src/main/res/drawable/emoji_roll_over_f1.png new file mode 100644 index 00000000..c9caddf4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_roll_over_f1.png differ diff --git a/app/src/main/res/drawable/emoji_roll_over_f2.png b/app/src/main/res/drawable/emoji_roll_over_f2.png new file mode 100644 index 00000000..99638afb Binary files /dev/null and b/app/src/main/res/drawable/emoji_roll_over_f2.png differ diff --git a/app/src/main/res/drawable/emoji_roll_over_f3.png b/app/src/main/res/drawable/emoji_roll_over_f3.png new file mode 100644 index 00000000..4082f870 Binary files /dev/null and b/app/src/main/res/drawable/emoji_roll_over_f3.png differ diff --git a/app/src/main/res/drawable/emoji_roll_over_f4.png b/app/src/main/res/drawable/emoji_roll_over_f4.png new file mode 100644 index 00000000..54492625 Binary files /dev/null and b/app/src/main/res/drawable/emoji_roll_over_f4.png differ diff --git a/app/src/main/res/drawable/emoji_rolleyes.xml b/app/src/main/res/drawable/emoji_rolleyes.xml new file mode 100644 index 00000000..df939933 --- /dev/null +++ b/app/src/main/res/drawable/emoji_rolleyes.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_rolleyes_f0.png b/app/src/main/res/drawable/emoji_rolleyes_f0.png new file mode 100644 index 00000000..e3b30848 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rolleyes_f0.png differ diff --git a/app/src/main/res/drawable/emoji_rolleyes_f1.png b/app/src/main/res/drawable/emoji_rolleyes_f1.png new file mode 100644 index 00000000..8e6f05c8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rolleyes_f1.png differ diff --git a/app/src/main/res/drawable/emoji_rolleyes_f2.png b/app/src/main/res/drawable/emoji_rolleyes_f2.png new file mode 100644 index 00000000..256b2261 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rolleyes_f2.png differ diff --git a/app/src/main/res/drawable/emoji_rolleyes_f3.png b/app/src/main/res/drawable/emoji_rolleyes_f3.png new file mode 100644 index 00000000..de856762 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rolleyes_f3.png differ diff --git a/app/src/main/res/drawable/emoji_rolleyes_f4.png b/app/src/main/res/drawable/emoji_rolleyes_f4.png new file mode 100644 index 00000000..fcfb3be8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rolleyes_f4.png differ diff --git a/app/src/main/res/drawable/emoji_rolleyes_f5.png b/app/src/main/res/drawable/emoji_rolleyes_f5.png new file mode 100644 index 00000000..12440296 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rolleyes_f5.png differ diff --git a/app/src/main/res/drawable/emoji_rolleyes_f6.png b/app/src/main/res/drawable/emoji_rolleyes_f6.png new file mode 100644 index 00000000..e8a9746d Binary files /dev/null and b/app/src/main/res/drawable/emoji_rolleyes_f6.png differ diff --git a/app/src/main/res/drawable/emoji_rolleyes_f7.png b/app/src/main/res/drawable/emoji_rolleyes_f7.png new file mode 100644 index 00000000..12440296 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rolleyes_f7.png differ diff --git a/app/src/main/res/drawable/emoji_rotfl.xml b/app/src/main/res/drawable/emoji_rotfl.xml new file mode 100644 index 00000000..0067d6b5 --- /dev/null +++ b/app/src/main/res/drawable/emoji_rotfl.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_rotfl_f0.png b/app/src/main/res/drawable/emoji_rotfl_f0.png new file mode 100644 index 00000000..72ef4987 Binary files /dev/null and b/app/src/main/res/drawable/emoji_rotfl_f0.png differ diff --git a/app/src/main/res/drawable/emoji_sad.xml b/app/src/main/res/drawable/emoji_sad.xml new file mode 100644 index 00000000..f2400f5a --- /dev/null +++ b/app/src/main/res/drawable/emoji_sad.xml @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_sad_f0.png b/app/src/main/res/drawable/emoji_sad_f0.png new file mode 100644 index 00000000..66c43608 Binary files /dev/null and b/app/src/main/res/drawable/emoji_sad_f0.png differ diff --git a/app/src/main/res/drawable/emoji_sad_f1.png b/app/src/main/res/drawable/emoji_sad_f1.png new file mode 100644 index 00000000..c65145ac Binary files /dev/null and b/app/src/main/res/drawable/emoji_sad_f1.png differ diff --git a/app/src/main/res/drawable/emoji_sad_f2.png b/app/src/main/res/drawable/emoji_sad_f2.png new file mode 100644 index 00000000..8cdca688 Binary files /dev/null and b/app/src/main/res/drawable/emoji_sad_f2.png differ diff --git a/app/src/main/res/drawable/emoji_sad_f3.png b/app/src/main/res/drawable/emoji_sad_f3.png new file mode 100644 index 00000000..fd603cf0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_sad_f3.png differ diff --git a/app/src/main/res/drawable/emoji_sad_f4.png b/app/src/main/res/drawable/emoji_sad_f4.png new file mode 100644 index 00000000..194fc0ba Binary files /dev/null and b/app/src/main/res/drawable/emoji_sad_f4.png differ diff --git a/app/src/main/res/drawable/emoji_seestars.xml b/app/src/main/res/drawable/emoji_seestars.xml new file mode 100644 index 00000000..e7321061 --- /dev/null +++ b/app/src/main/res/drawable/emoji_seestars.xml @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_seestars_f0.png b/app/src/main/res/drawable/emoji_seestars_f0.png new file mode 100644 index 00000000..c4ab6356 Binary files /dev/null and b/app/src/main/res/drawable/emoji_seestars_f0.png differ diff --git a/app/src/main/res/drawable/emoji_seestars_f1.png b/app/src/main/res/drawable/emoji_seestars_f1.png new file mode 100644 index 00000000..a9744021 Binary files /dev/null and b/app/src/main/res/drawable/emoji_seestars_f1.png differ diff --git a/app/src/main/res/drawable/emoji_seestars_f2.png b/app/src/main/res/drawable/emoji_seestars_f2.png new file mode 100644 index 00000000..14c95e00 Binary files /dev/null and b/app/src/main/res/drawable/emoji_seestars_f2.png differ diff --git a/app/src/main/res/drawable/emoji_seestars_f3.png b/app/src/main/res/drawable/emoji_seestars_f3.png new file mode 100644 index 00000000..166cafb2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_seestars_f3.png differ diff --git a/app/src/main/res/drawable/emoji_seestars_f4.png b/app/src/main/res/drawable/emoji_seestars_f4.png new file mode 100644 index 00000000..c2c2ec10 Binary files /dev/null and b/app/src/main/res/drawable/emoji_seestars_f4.png differ diff --git a/app/src/main/res/drawable/emoji_sfyri.xml b/app/src/main/res/drawable/emoji_sfyri.xml new file mode 100644 index 00000000..fadbbb87 --- /dev/null +++ b/app/src/main/res/drawable/emoji_sfyri.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_sfyri_f0.png b/app/src/main/res/drawable/emoji_sfyri_f0.png new file mode 100644 index 00000000..d0f10bd6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_sfyri_f0.png differ diff --git a/app/src/main/res/drawable/emoji_sfyri_f1.png b/app/src/main/res/drawable/emoji_sfyri_f1.png new file mode 100644 index 00000000..7116f325 Binary files /dev/null and b/app/src/main/res/drawable/emoji_sfyri_f1.png differ diff --git a/app/src/main/res/drawable/emoji_sfyri_f2.png b/app/src/main/res/drawable/emoji_sfyri_f2.png new file mode 100644 index 00000000..6bff82c7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_sfyri_f2.png differ diff --git a/app/src/main/res/drawable/emoji_sfyri_f3.png b/app/src/main/res/drawable/emoji_sfyri_f3.png new file mode 100644 index 00000000..fa2d87d7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_sfyri_f3.png differ diff --git a/app/src/main/res/drawable/emoji_shamed_bag.jpg b/app/src/main/res/drawable/emoji_shamed_bag.jpg new file mode 100644 index 00000000..b383aeee Binary files /dev/null and b/app/src/main/res/drawable/emoji_shamed_bag.jpg differ diff --git a/app/src/main/res/drawable/emoji_shifty.xml b/app/src/main/res/drawable/emoji_shifty.xml new file mode 100644 index 00000000..889f92ed --- /dev/null +++ b/app/src/main/res/drawable/emoji_shifty.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_shifty_f0.png b/app/src/main/res/drawable/emoji_shifty_f0.png new file mode 100644 index 00000000..94e3b51f Binary files /dev/null and b/app/src/main/res/drawable/emoji_shifty_f0.png differ diff --git a/app/src/main/res/drawable/emoji_shifty_f1.png b/app/src/main/res/drawable/emoji_shifty_f1.png new file mode 100644 index 00000000..811f7990 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shifty_f1.png differ diff --git a/app/src/main/res/drawable/emoji_shifty_f2.png b/app/src/main/res/drawable/emoji_shifty_f2.png new file mode 100644 index 00000000..0ab85a0e Binary files /dev/null and b/app/src/main/res/drawable/emoji_shifty_f2.png differ diff --git a/app/src/main/res/drawable/emoji_shifty_f3.png b/app/src/main/res/drawable/emoji_shifty_f3.png new file mode 100644 index 00000000..c0c6fbc2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shifty_f3.png differ diff --git a/app/src/main/res/drawable/emoji_shifty_f4.png b/app/src/main/res/drawable/emoji_shifty_f4.png new file mode 100644 index 00000000..0ab85a0e Binary files /dev/null and b/app/src/main/res/drawable/emoji_shifty_f4.png differ diff --git a/app/src/main/res/drawable/emoji_shifty_f5.png b/app/src/main/res/drawable/emoji_shifty_f5.png new file mode 100644 index 00000000..811f7990 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shifty_f5.png differ diff --git a/app/src/main/res/drawable/emoji_shifty_f6.png b/app/src/main/res/drawable/emoji_shifty_f6.png new file mode 100644 index 00000000..86cf28b0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shifty_f6.png differ diff --git a/app/src/main/res/drawable/emoji_shocked.xml b/app/src/main/res/drawable/emoji_shocked.xml new file mode 100644 index 00000000..ffa322e0 --- /dev/null +++ b/app/src/main/res/drawable/emoji_shocked.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_shocked2.png b/app/src/main/res/drawable/emoji_shocked2.png new file mode 100644 index 00000000..cc4689f2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shocked2.png differ diff --git a/app/src/main/res/drawable/emoji_shocked_f0.png b/app/src/main/res/drawable/emoji_shocked_f0.png new file mode 100644 index 00000000..8a182faf Binary files /dev/null and b/app/src/main/res/drawable/emoji_shocked_f0.png differ diff --git a/app/src/main/res/drawable/emoji_shocked_f1.png b/app/src/main/res/drawable/emoji_shocked_f1.png new file mode 100644 index 00000000..b1575ac9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shocked_f1.png differ diff --git a/app/src/main/res/drawable/emoji_shocked_f2.png b/app/src/main/res/drawable/emoji_shocked_f2.png new file mode 100644 index 00000000..c4b98248 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shocked_f2.png differ diff --git a/app/src/main/res/drawable/emoji_shocked_f3.png b/app/src/main/res/drawable/emoji_shocked_f3.png new file mode 100644 index 00000000..5c245250 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shocked_f3.png differ diff --git a/app/src/main/res/drawable/emoji_shocked_f4.png b/app/src/main/res/drawable/emoji_shocked_f4.png new file mode 100644 index 00000000..bdfaefc1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shocked_f4.png differ diff --git a/app/src/main/res/drawable/emoji_shocked_f5.png b/app/src/main/res/drawable/emoji_shocked_f5.png new file mode 100644 index 00000000..5c245250 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shocked_f5.png differ diff --git a/app/src/main/res/drawable/emoji_shocked_f6.png b/app/src/main/res/drawable/emoji_shocked_f6.png new file mode 100644 index 00000000..bdfaefc1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shocked_f6.png differ diff --git a/app/src/main/res/drawable/emoji_shocked_f7.png b/app/src/main/res/drawable/emoji_shocked_f7.png new file mode 100644 index 00000000..5c245250 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shocked_f7.png differ diff --git a/app/src/main/res/drawable/emoji_shocked_f8.png b/app/src/main/res/drawable/emoji_shocked_f8.png new file mode 100644 index 00000000..bdfaefc1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shocked_f8.png differ diff --git a/app/src/main/res/drawable/emoji_shocked_f9.png b/app/src/main/res/drawable/emoji_shocked_f9.png new file mode 100644 index 00000000..9c3b43f2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shocked_f9.png differ diff --git a/app/src/main/res/drawable/emoji_shout.xml b/app/src/main/res/drawable/emoji_shout.xml new file mode 100644 index 00000000..61cb436d --- /dev/null +++ b/app/src/main/res/drawable/emoji_shout.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_shout_f0.png b/app/src/main/res/drawable/emoji_shout_f0.png new file mode 100644 index 00000000..c777ccc8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shout_f0.png differ diff --git a/app/src/main/res/drawable/emoji_shout_f1.png b/app/src/main/res/drawable/emoji_shout_f1.png new file mode 100644 index 00000000..597b44e7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shout_f1.png differ diff --git a/app/src/main/res/drawable/emoji_shout_f10.png b/app/src/main/res/drawable/emoji_shout_f10.png new file mode 100644 index 00000000..89d19086 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shout_f10.png differ diff --git a/app/src/main/res/drawable/emoji_shout_f11.png b/app/src/main/res/drawable/emoji_shout_f11.png new file mode 100644 index 00000000..d4b0e7b0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shout_f11.png differ diff --git a/app/src/main/res/drawable/emoji_shout_f12.png b/app/src/main/res/drawable/emoji_shout_f12.png new file mode 100644 index 00000000..597b44e7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shout_f12.png differ diff --git a/app/src/main/res/drawable/emoji_shout_f13.png b/app/src/main/res/drawable/emoji_shout_f13.png new file mode 100644 index 00000000..89d19086 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shout_f13.png differ diff --git a/app/src/main/res/drawable/emoji_shout_f14.png b/app/src/main/res/drawable/emoji_shout_f14.png new file mode 100644 index 00000000..c777ccc8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shout_f14.png differ diff --git a/app/src/main/res/drawable/emoji_shout_f15.png b/app/src/main/res/drawable/emoji_shout_f15.png new file mode 100644 index 00000000..d4b0e7b0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shout_f15.png differ diff --git a/app/src/main/res/drawable/emoji_shout_f16.png b/app/src/main/res/drawable/emoji_shout_f16.png new file mode 100644 index 00000000..89d19086 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shout_f16.png differ diff --git a/app/src/main/res/drawable/emoji_shout_f2.png b/app/src/main/res/drawable/emoji_shout_f2.png new file mode 100644 index 00000000..89d19086 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shout_f2.png differ diff --git a/app/src/main/res/drawable/emoji_shout_f3.png b/app/src/main/res/drawable/emoji_shout_f3.png new file mode 100644 index 00000000..d4b0e7b0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shout_f3.png differ diff --git a/app/src/main/res/drawable/emoji_shout_f4.png b/app/src/main/res/drawable/emoji_shout_f4.png new file mode 100644 index 00000000..c777ccc8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shout_f4.png differ diff --git a/app/src/main/res/drawable/emoji_shout_f5.png b/app/src/main/res/drawable/emoji_shout_f5.png new file mode 100644 index 00000000..d4b0e7b0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shout_f5.png differ diff --git a/app/src/main/res/drawable/emoji_shout_f6.png b/app/src/main/res/drawable/emoji_shout_f6.png new file mode 100644 index 00000000..597b44e7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shout_f6.png differ diff --git a/app/src/main/res/drawable/emoji_shout_f7.png b/app/src/main/res/drawable/emoji_shout_f7.png new file mode 100644 index 00000000..d4b0e7b0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shout_f7.png differ diff --git a/app/src/main/res/drawable/emoji_shout_f8.png b/app/src/main/res/drawable/emoji_shout_f8.png new file mode 100644 index 00000000..89d19086 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shout_f8.png differ diff --git a/app/src/main/res/drawable/emoji_shout_f9.png b/app/src/main/res/drawable/emoji_shout_f9.png new file mode 100644 index 00000000..c777ccc8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_shout_f9.png differ diff --git a/app/src/main/res/drawable/emoji_shy.png b/app/src/main/res/drawable/emoji_shy.png new file mode 100644 index 00000000..4ae8582e Binary files /dev/null and b/app/src/main/res/drawable/emoji_shy.png differ diff --git a/app/src/main/res/drawable/emoji_sleep.xml b/app/src/main/res/drawable/emoji_sleep.xml new file mode 100644 index 00000000..11bde4aa --- /dev/null +++ b/app/src/main/res/drawable/emoji_sleep.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_sleep_f0.png b/app/src/main/res/drawable/emoji_sleep_f0.png new file mode 100644 index 00000000..87b441bf Binary files /dev/null and b/app/src/main/res/drawable/emoji_sleep_f0.png differ diff --git a/app/src/main/res/drawable/emoji_sleep_f1.png b/app/src/main/res/drawable/emoji_sleep_f1.png new file mode 100644 index 00000000..9bcec111 Binary files /dev/null and b/app/src/main/res/drawable/emoji_sleep_f1.png differ diff --git a/app/src/main/res/drawable/emoji_sleep_f2.png b/app/src/main/res/drawable/emoji_sleep_f2.png new file mode 100644 index 00000000..1cee740f Binary files /dev/null and b/app/src/main/res/drawable/emoji_sleep_f2.png differ diff --git a/app/src/main/res/drawable/emoji_sleep_f3.png b/app/src/main/res/drawable/emoji_sleep_f3.png new file mode 100644 index 00000000..4f77a26a Binary files /dev/null and b/app/src/main/res/drawable/emoji_sleep_f3.png differ diff --git a/app/src/main/res/drawable/emoji_slurp.xml b/app/src/main/res/drawable/emoji_slurp.xml new file mode 100644 index 00000000..a1731568 --- /dev/null +++ b/app/src/main/res/drawable/emoji_slurp.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_slurp_f0.png b/app/src/main/res/drawable/emoji_slurp_f0.png new file mode 100644 index 00000000..8d628cc5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f0.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f1.png b/app/src/main/res/drawable/emoji_slurp_f1.png new file mode 100644 index 00000000..52bdbad4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f1.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f10.png b/app/src/main/res/drawable/emoji_slurp_f10.png new file mode 100644 index 00000000..63d42c06 Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f10.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f11.png b/app/src/main/res/drawable/emoji_slurp_f11.png new file mode 100644 index 00000000..8e4723dc Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f11.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f12.png b/app/src/main/res/drawable/emoji_slurp_f12.png new file mode 100644 index 00000000..2d1dbe33 Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f12.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f13.png b/app/src/main/res/drawable/emoji_slurp_f13.png new file mode 100644 index 00000000..68a827c0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f13.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f14.png b/app/src/main/res/drawable/emoji_slurp_f14.png new file mode 100644 index 00000000..bfb9632a Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f14.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f15.png b/app/src/main/res/drawable/emoji_slurp_f15.png new file mode 100644 index 00000000..6d8d599d Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f15.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f16.png b/app/src/main/res/drawable/emoji_slurp_f16.png new file mode 100644 index 00000000..a0cbe47e Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f16.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f17.png b/app/src/main/res/drawable/emoji_slurp_f17.png new file mode 100644 index 00000000..1af10452 Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f17.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f18.png b/app/src/main/res/drawable/emoji_slurp_f18.png new file mode 100644 index 00000000..188ab92f Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f18.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f19.png b/app/src/main/res/drawable/emoji_slurp_f19.png new file mode 100644 index 00000000..188ab92f Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f19.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f2.png b/app/src/main/res/drawable/emoji_slurp_f2.png new file mode 100644 index 00000000..5de8f49a Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f2.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f20.png b/app/src/main/res/drawable/emoji_slurp_f20.png new file mode 100644 index 00000000..188ab92f Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f20.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f21.png b/app/src/main/res/drawable/emoji_slurp_f21.png new file mode 100644 index 00000000..188ab92f Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f21.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f22.png b/app/src/main/res/drawable/emoji_slurp_f22.png new file mode 100644 index 00000000..188ab92f Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f22.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f3.png b/app/src/main/res/drawable/emoji_slurp_f3.png new file mode 100644 index 00000000..48ef9602 Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f3.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f4.png b/app/src/main/res/drawable/emoji_slurp_f4.png new file mode 100644 index 00000000..07fe57d1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f4.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f5.png b/app/src/main/res/drawable/emoji_slurp_f5.png new file mode 100644 index 00000000..9807edb6 Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f5.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f6.png b/app/src/main/res/drawable/emoji_slurp_f6.png new file mode 100644 index 00000000..90337fa4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f6.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f7.png b/app/src/main/res/drawable/emoji_slurp_f7.png new file mode 100644 index 00000000..4c6c6523 Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f7.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f8.png b/app/src/main/res/drawable/emoji_slurp_f8.png new file mode 100644 index 00000000..5b93e050 Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f8.png differ diff --git a/app/src/main/res/drawable/emoji_slurp_f9.png b/app/src/main/res/drawable/emoji_slurp_f9.png new file mode 100644 index 00000000..2c03ec8f Binary files /dev/null and b/app/src/main/res/drawable/emoji_slurp_f9.png differ diff --git a/app/src/main/res/drawable/emoji_smiley.xml b/app/src/main/res/drawable/emoji_smiley.xml new file mode 100644 index 00000000..4436a531 --- /dev/null +++ b/app/src/main/res/drawable/emoji_smiley.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_smiley_f0.png b/app/src/main/res/drawable/emoji_smiley_f0.png new file mode 100644 index 00000000..cdf51d8f Binary files /dev/null and b/app/src/main/res/drawable/emoji_smiley_f0.png differ diff --git a/app/src/main/res/drawable/emoji_smiley_f1.png b/app/src/main/res/drawable/emoji_smiley_f1.png new file mode 100644 index 00000000..2d2ea42c Binary files /dev/null and b/app/src/main/res/drawable/emoji_smiley_f1.png differ diff --git a/app/src/main/res/drawable/emoji_smiley_f2.png b/app/src/main/res/drawable/emoji_smiley_f2.png new file mode 100644 index 00000000..654e56b5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_smiley_f2.png differ diff --git a/app/src/main/res/drawable/emoji_smiley_f3.png b/app/src/main/res/drawable/emoji_smiley_f3.png new file mode 100644 index 00000000..2d2ea42c Binary files /dev/null and b/app/src/main/res/drawable/emoji_smiley_f3.png differ diff --git a/app/src/main/res/drawable/emoji_smurf.xml b/app/src/main/res/drawable/emoji_smurf.xml new file mode 100644 index 00000000..06743d62 --- /dev/null +++ b/app/src/main/res/drawable/emoji_smurf.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_smurf_f0.png b/app/src/main/res/drawable/emoji_smurf_f0.png new file mode 100644 index 00000000..bc0cd569 Binary files /dev/null and b/app/src/main/res/drawable/emoji_smurf_f0.png differ diff --git a/app/src/main/res/drawable/emoji_spam2.xml b/app/src/main/res/drawable/emoji_spam2.xml new file mode 100644 index 00000000..c7e23124 --- /dev/null +++ b/app/src/main/res/drawable/emoji_spam2.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_spam2_f0.png b/app/src/main/res/drawable/emoji_spam2_f0.png new file mode 100644 index 00000000..be7ede96 Binary files /dev/null and b/app/src/main/res/drawable/emoji_spam2_f0.png differ diff --git a/app/src/main/res/drawable/emoji_spam2_f1.png b/app/src/main/res/drawable/emoji_spam2_f1.png new file mode 100644 index 00000000..f73fd2f9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_spam2_f1.png differ diff --git a/app/src/main/res/drawable/emoji_spam2_f2.png b/app/src/main/res/drawable/emoji_spam2_f2.png new file mode 100644 index 00000000..be7ede96 Binary files /dev/null and b/app/src/main/res/drawable/emoji_spam2_f2.png differ diff --git a/app/src/main/res/drawable/emoji_spam2_f3.png b/app/src/main/res/drawable/emoji_spam2_f3.png new file mode 100644 index 00000000..0548bfb9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_spam2_f3.png differ diff --git a/app/src/main/res/drawable/emoji_speech.xml b/app/src/main/res/drawable/emoji_speech.xml new file mode 100644 index 00000000..a1068f74 --- /dev/null +++ b/app/src/main/res/drawable/emoji_speech.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_speech_f0.png b/app/src/main/res/drawable/emoji_speech_f0.png new file mode 100644 index 00000000..c4844ae9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_speech_f0.png differ diff --git a/app/src/main/res/drawable/emoji_superconfused.xml b/app/src/main/res/drawable/emoji_superconfused.xml new file mode 100644 index 00000000..5a23ef93 --- /dev/null +++ b/app/src/main/res/drawable/emoji_superconfused.xml @@ -0,0 +1,15 @@ + + + + + + + diff --git a/app/src/main/res/drawable/emoji_superconfused_f0.png b/app/src/main/res/drawable/emoji_superconfused_f0.png new file mode 100644 index 00000000..c7ca5710 Binary files /dev/null and b/app/src/main/res/drawable/emoji_superconfused_f0.png differ diff --git a/app/src/main/res/drawable/emoji_superconfused_f1.png b/app/src/main/res/drawable/emoji_superconfused_f1.png new file mode 100644 index 00000000..0f270c48 Binary files /dev/null and b/app/src/main/res/drawable/emoji_superconfused_f1.png differ diff --git a/app/src/main/res/drawable/emoji_superconfused_f2.png b/app/src/main/res/drawable/emoji_superconfused_f2.png new file mode 100644 index 00000000..4da7d1ae Binary files /dev/null and b/app/src/main/res/drawable/emoji_superconfused_f2.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent.xml b/app/src/main/res/drawable/emoji_superinnocent.xml new file mode 100644 index 00000000..511d12f4 --- /dev/null +++ b/app/src/main/res/drawable/emoji_superinnocent.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_superinnocent_f0.png b/app/src/main/res/drawable/emoji_superinnocent_f0.png new file mode 100644 index 00000000..d74bb37f Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f0.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent_f1.png b/app/src/main/res/drawable/emoji_superinnocent_f1.png new file mode 100644 index 00000000..68da8fdf Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f1.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent_f10.png b/app/src/main/res/drawable/emoji_superinnocent_f10.png new file mode 100644 index 00000000..066ac3fe Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f10.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent_f11.png b/app/src/main/res/drawable/emoji_superinnocent_f11.png new file mode 100644 index 00000000..6605b9e2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f11.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent_f12.png b/app/src/main/res/drawable/emoji_superinnocent_f12.png new file mode 100644 index 00000000..87c08086 Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f12.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent_f13.png b/app/src/main/res/drawable/emoji_superinnocent_f13.png new file mode 100644 index 00000000..56451f81 Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f13.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent_f14.png b/app/src/main/res/drawable/emoji_superinnocent_f14.png new file mode 100644 index 00000000..5b2d4011 Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f14.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent_f15.png b/app/src/main/res/drawable/emoji_superinnocent_f15.png new file mode 100644 index 00000000..1432f605 Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f15.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent_f16.png b/app/src/main/res/drawable/emoji_superinnocent_f16.png new file mode 100644 index 00000000..172ef597 Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f16.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent_f17.png b/app/src/main/res/drawable/emoji_superinnocent_f17.png new file mode 100644 index 00000000..d74bb37f Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f17.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent_f18.png b/app/src/main/res/drawable/emoji_superinnocent_f18.png new file mode 100644 index 00000000..02cb2c30 Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f18.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent_f2.png b/app/src/main/res/drawable/emoji_superinnocent_f2.png new file mode 100644 index 00000000..c2a83e65 Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f2.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent_f3.png b/app/src/main/res/drawable/emoji_superinnocent_f3.png new file mode 100644 index 00000000..b34fc295 Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f3.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent_f4.png b/app/src/main/res/drawable/emoji_superinnocent_f4.png new file mode 100644 index 00000000..82bc77d4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f4.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent_f5.png b/app/src/main/res/drawable/emoji_superinnocent_f5.png new file mode 100644 index 00000000..bb4ea75c Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f5.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent_f6.png b/app/src/main/res/drawable/emoji_superinnocent_f6.png new file mode 100644 index 00000000..3c24d885 Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f6.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent_f7.png b/app/src/main/res/drawable/emoji_superinnocent_f7.png new file mode 100644 index 00000000..cfcf5a9c Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f7.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent_f8.png b/app/src/main/res/drawable/emoji_superinnocent_f8.png new file mode 100644 index 00000000..179fbd68 Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f8.png differ diff --git a/app/src/main/res/drawable/emoji_superinnocent_f9.png b/app/src/main/res/drawable/emoji_superinnocent_f9.png new file mode 100644 index 00000000..76a41c42 Binary files /dev/null and b/app/src/main/res/drawable/emoji_superinnocent_f9.png differ diff --git a/app/src/main/res/drawable/emoji_suspicious.xml b/app/src/main/res/drawable/emoji_suspicious.xml new file mode 100644 index 00000000..c7002314 --- /dev/null +++ b/app/src/main/res/drawable/emoji_suspicious.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/app/src/main/res/drawable/emoji_suspicious_f0.png b/app/src/main/res/drawable/emoji_suspicious_f0.png new file mode 100644 index 00000000..b0ed4b38 Binary files /dev/null and b/app/src/main/res/drawable/emoji_suspicious_f0.png differ diff --git a/app/src/main/res/drawable/emoji_suspicious_f1.png b/app/src/main/res/drawable/emoji_suspicious_f1.png new file mode 100644 index 00000000..edea05b9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_suspicious_f1.png differ diff --git a/app/src/main/res/drawable/emoji_tafos.xml b/app/src/main/res/drawable/emoji_tafos.xml new file mode 100644 index 00000000..f5bb9378 --- /dev/null +++ b/app/src/main/res/drawable/emoji_tafos.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_tafos_f0.png b/app/src/main/res/drawable/emoji_tafos_f0.png new file mode 100644 index 00000000..5cc6626c Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f0.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f1.png b/app/src/main/res/drawable/emoji_tafos_f1.png new file mode 100644 index 00000000..d927e988 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f1.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f10.png b/app/src/main/res/drawable/emoji_tafos_f10.png new file mode 100644 index 00000000..5cc6626c Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f10.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f11.png b/app/src/main/res/drawable/emoji_tafos_f11.png new file mode 100644 index 00000000..ac155bd3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f11.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f12.png b/app/src/main/res/drawable/emoji_tafos_f12.png new file mode 100644 index 00000000..1bc1c719 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f12.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f13.png b/app/src/main/res/drawable/emoji_tafos_f13.png new file mode 100644 index 00000000..0ca3f000 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f13.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f14.png b/app/src/main/res/drawable/emoji_tafos_f14.png new file mode 100644 index 00000000..1c4b4779 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f14.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f15.png b/app/src/main/res/drawable/emoji_tafos_f15.png new file mode 100644 index 00000000..d0df071f Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f15.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f16.png b/app/src/main/res/drawable/emoji_tafos_f16.png new file mode 100644 index 00000000..51a95519 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f16.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f17.png b/app/src/main/res/drawable/emoji_tafos_f17.png new file mode 100644 index 00000000..78d44e1e Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f17.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f18.png b/app/src/main/res/drawable/emoji_tafos_f18.png new file mode 100644 index 00000000..ddab5930 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f18.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f19.png b/app/src/main/res/drawable/emoji_tafos_f19.png new file mode 100644 index 00000000..cbd6065c Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f19.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f2.png b/app/src/main/res/drawable/emoji_tafos_f2.png new file mode 100644 index 00000000..5434870b Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f2.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f20.png b/app/src/main/res/drawable/emoji_tafos_f20.png new file mode 100644 index 00000000..b65fe8ab Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f20.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f21.png b/app/src/main/res/drawable/emoji_tafos_f21.png new file mode 100644 index 00000000..38a77eeb Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f21.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f22.png b/app/src/main/res/drawable/emoji_tafos_f22.png new file mode 100644 index 00000000..6a3c7863 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f22.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f23.png b/app/src/main/res/drawable/emoji_tafos_f23.png new file mode 100644 index 00000000..f6a8db0c Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f23.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f24.png b/app/src/main/res/drawable/emoji_tafos_f24.png new file mode 100644 index 00000000..946f1677 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f24.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f25.png b/app/src/main/res/drawable/emoji_tafos_f25.png new file mode 100644 index 00000000..bcb9eb85 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f25.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f26.png b/app/src/main/res/drawable/emoji_tafos_f26.png new file mode 100644 index 00000000..731caa96 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f26.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f27.png b/app/src/main/res/drawable/emoji_tafos_f27.png new file mode 100644 index 00000000..3933d018 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f27.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f28.png b/app/src/main/res/drawable/emoji_tafos_f28.png new file mode 100644 index 00000000..db6f1934 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f28.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f29.png b/app/src/main/res/drawable/emoji_tafos_f29.png new file mode 100644 index 00000000..775deabc Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f29.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f3.png b/app/src/main/res/drawable/emoji_tafos_f3.png new file mode 100644 index 00000000..8d7de55e Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f3.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f30.png b/app/src/main/res/drawable/emoji_tafos_f30.png new file mode 100644 index 00000000..f331f431 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f30.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f31.png b/app/src/main/res/drawable/emoji_tafos_f31.png new file mode 100644 index 00000000..98f642b3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f31.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f32.png b/app/src/main/res/drawable/emoji_tafos_f32.png new file mode 100644 index 00000000..9749f799 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f32.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f33.png b/app/src/main/res/drawable/emoji_tafos_f33.png new file mode 100644 index 00000000..132bd283 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f33.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f34.png b/app/src/main/res/drawable/emoji_tafos_f34.png new file mode 100644 index 00000000..b8124abb Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f34.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f35.png b/app/src/main/res/drawable/emoji_tafos_f35.png new file mode 100644 index 00000000..389fa988 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f35.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f36.png b/app/src/main/res/drawable/emoji_tafos_f36.png new file mode 100644 index 00000000..82b3f192 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f36.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f37.png b/app/src/main/res/drawable/emoji_tafos_f37.png new file mode 100644 index 00000000..74085dbd Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f37.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f38.png b/app/src/main/res/drawable/emoji_tafos_f38.png new file mode 100644 index 00000000..795c7654 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f38.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f39.png b/app/src/main/res/drawable/emoji_tafos_f39.png new file mode 100644 index 00000000..1d177223 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f39.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f4.png b/app/src/main/res/drawable/emoji_tafos_f4.png new file mode 100644 index 00000000..c5025e09 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f4.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f40.png b/app/src/main/res/drawable/emoji_tafos_f40.png new file mode 100644 index 00000000..37d20e13 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f40.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f41.png b/app/src/main/res/drawable/emoji_tafos_f41.png new file mode 100644 index 00000000..62219fa8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f41.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f42.png b/app/src/main/res/drawable/emoji_tafos_f42.png new file mode 100644 index 00000000..ab488f10 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f42.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f5.png b/app/src/main/res/drawable/emoji_tafos_f5.png new file mode 100644 index 00000000..434d437b Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f5.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f6.png b/app/src/main/res/drawable/emoji_tafos_f6.png new file mode 100644 index 00000000..7d3e1395 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f6.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f7.png b/app/src/main/res/drawable/emoji_tafos_f7.png new file mode 100644 index 00000000..5985411b Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f7.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f8.png b/app/src/main/res/drawable/emoji_tafos_f8.png new file mode 100644 index 00000000..626146a0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f8.png differ diff --git a/app/src/main/res/drawable/emoji_tafos_f9.png b/app/src/main/res/drawable/emoji_tafos_f9.png new file mode 100644 index 00000000..76ce6b78 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tafos_f9.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff.xml b/app/src/main/res/drawable/emoji_tickedoff.xml new file mode 100644 index 00000000..907942df --- /dev/null +++ b/app/src/main/res/drawable/emoji_tickedoff.xml @@ -0,0 +1,510 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_tickedoff_f0.png b/app/src/main/res/drawable/emoji_tickedoff_f0.png new file mode 100644 index 00000000..6b28f094 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f0.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f1.png b/app/src/main/res/drawable/emoji_tickedoff_f1.png new file mode 100644 index 00000000..3e876f0f Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f1.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f10.png b/app/src/main/res/drawable/emoji_tickedoff_f10.png new file mode 100644 index 00000000..cd1669d3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f10.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f100.png b/app/src/main/res/drawable/emoji_tickedoff_f100.png new file mode 100644 index 00000000..abdb2688 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f100.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f101.png b/app/src/main/res/drawable/emoji_tickedoff_f101.png new file mode 100644 index 00000000..a903042d Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f101.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f102.png b/app/src/main/res/drawable/emoji_tickedoff_f102.png new file mode 100644 index 00000000..abdb2688 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f102.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f103.png b/app/src/main/res/drawable/emoji_tickedoff_f103.png new file mode 100644 index 00000000..5f9386db Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f103.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f104.png b/app/src/main/res/drawable/emoji_tickedoff_f104.png new file mode 100644 index 00000000..36bd1bfe Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f104.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f105.png b/app/src/main/res/drawable/emoji_tickedoff_f105.png new file mode 100644 index 00000000..dd309461 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f105.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f106.png b/app/src/main/res/drawable/emoji_tickedoff_f106.png new file mode 100644 index 00000000..95a479e5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f106.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f107.png b/app/src/main/res/drawable/emoji_tickedoff_f107.png new file mode 100644 index 00000000..5f9386db Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f107.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f108.png b/app/src/main/res/drawable/emoji_tickedoff_f108.png new file mode 100644 index 00000000..36bd1bfe Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f108.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f109.png b/app/src/main/res/drawable/emoji_tickedoff_f109.png new file mode 100644 index 00000000..5f9386db Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f109.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f11.png b/app/src/main/res/drawable/emoji_tickedoff_f11.png new file mode 100644 index 00000000..e6f1289a Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f11.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f110.png b/app/src/main/res/drawable/emoji_tickedoff_f110.png new file mode 100644 index 00000000..36bd1bfe Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f110.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f111.png b/app/src/main/res/drawable/emoji_tickedoff_f111.png new file mode 100644 index 00000000..dd309461 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f111.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f112.png b/app/src/main/res/drawable/emoji_tickedoff_f112.png new file mode 100644 index 00000000..95a479e5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f112.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f113.png b/app/src/main/res/drawable/emoji_tickedoff_f113.png new file mode 100644 index 00000000..6788dd3c Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f113.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f114.png b/app/src/main/res/drawable/emoji_tickedoff_f114.png new file mode 100644 index 00000000..8abb11c1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f114.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f115.png b/app/src/main/res/drawable/emoji_tickedoff_f115.png new file mode 100644 index 00000000..71c774f1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f115.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f116.png b/app/src/main/res/drawable/emoji_tickedoff_f116.png new file mode 100644 index 00000000..7ffc40e5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f116.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f117.png b/app/src/main/res/drawable/emoji_tickedoff_f117.png new file mode 100644 index 00000000..71c774f1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f117.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f118.png b/app/src/main/res/drawable/emoji_tickedoff_f118.png new file mode 100644 index 00000000..7ffc40e5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f118.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f119.png b/app/src/main/res/drawable/emoji_tickedoff_f119.png new file mode 100644 index 00000000..a903042d Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f119.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f12.png b/app/src/main/res/drawable/emoji_tickedoff_f12.png new file mode 100644 index 00000000..cd1669d3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f12.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f120.png b/app/src/main/res/drawable/emoji_tickedoff_f120.png new file mode 100644 index 00000000..abdb2688 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f120.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f121.png b/app/src/main/res/drawable/emoji_tickedoff_f121.png new file mode 100644 index 00000000..a903042d Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f121.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f122.png b/app/src/main/res/drawable/emoji_tickedoff_f122.png new file mode 100644 index 00000000..abdb2688 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f122.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f123.png b/app/src/main/res/drawable/emoji_tickedoff_f123.png new file mode 100644 index 00000000..0b13465a Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f123.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f124.png b/app/src/main/res/drawable/emoji_tickedoff_f124.png new file mode 100644 index 00000000..abdb2688 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f124.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f125.png b/app/src/main/res/drawable/emoji_tickedoff_f125.png new file mode 100644 index 00000000..71c774f1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f125.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f126.png b/app/src/main/res/drawable/emoji_tickedoff_f126.png new file mode 100644 index 00000000..7ffc40e5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f126.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f127.png b/app/src/main/res/drawable/emoji_tickedoff_f127.png new file mode 100644 index 00000000..71c774f1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f127.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f128.png b/app/src/main/res/drawable/emoji_tickedoff_f128.png new file mode 100644 index 00000000..7ffc40e5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f128.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f129.png b/app/src/main/res/drawable/emoji_tickedoff_f129.png new file mode 100644 index 00000000..71c774f1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f129.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f13.png b/app/src/main/res/drawable/emoji_tickedoff_f13.png new file mode 100644 index 00000000..e6f1289a Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f13.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f130.png b/app/src/main/res/drawable/emoji_tickedoff_f130.png new file mode 100644 index 00000000..7ffc40e5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f130.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f131.png b/app/src/main/res/drawable/emoji_tickedoff_f131.png new file mode 100644 index 00000000..71c774f1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f131.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f132.png b/app/src/main/res/drawable/emoji_tickedoff_f132.png new file mode 100644 index 00000000..7ffc40e5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f132.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f133.png b/app/src/main/res/drawable/emoji_tickedoff_f133.png new file mode 100644 index 00000000..71c774f1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f133.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f134.png b/app/src/main/res/drawable/emoji_tickedoff_f134.png new file mode 100644 index 00000000..7ffc40e5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f134.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f135.png b/app/src/main/res/drawable/emoji_tickedoff_f135.png new file mode 100644 index 00000000..71c774f1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f135.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f136.png b/app/src/main/res/drawable/emoji_tickedoff_f136.png new file mode 100644 index 00000000..b0f62364 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f136.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f137.png b/app/src/main/res/drawable/emoji_tickedoff_f137.png new file mode 100644 index 00000000..71c774f1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f137.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f138.png b/app/src/main/res/drawable/emoji_tickedoff_f138.png new file mode 100644 index 00000000..7ffc40e5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f138.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f139.png b/app/src/main/res/drawable/emoji_tickedoff_f139.png new file mode 100644 index 00000000..4be959fa Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f139.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f14.png b/app/src/main/res/drawable/emoji_tickedoff_f14.png new file mode 100644 index 00000000..00f63cd8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f14.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f140.png b/app/src/main/res/drawable/emoji_tickedoff_f140.png new file mode 100644 index 00000000..a020550d Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f140.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f141.png b/app/src/main/res/drawable/emoji_tickedoff_f141.png new file mode 100644 index 00000000..4be959fa Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f141.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f142.png b/app/src/main/res/drawable/emoji_tickedoff_f142.png new file mode 100644 index 00000000..a020550d Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f142.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f143.png b/app/src/main/res/drawable/emoji_tickedoff_f143.png new file mode 100644 index 00000000..b81b38a3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f143.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f144.png b/app/src/main/res/drawable/emoji_tickedoff_f144.png new file mode 100644 index 00000000..34b417b3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f144.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f145.png b/app/src/main/res/drawable/emoji_tickedoff_f145.png new file mode 100644 index 00000000..cd1669d3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f145.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f146.png b/app/src/main/res/drawable/emoji_tickedoff_f146.png new file mode 100644 index 00000000..41ee7015 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f146.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f147.png b/app/src/main/res/drawable/emoji_tickedoff_f147.png new file mode 100644 index 00000000..4b28f270 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f147.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f148.png b/app/src/main/res/drawable/emoji_tickedoff_f148.png new file mode 100644 index 00000000..e6f1289a Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f148.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f149.png b/app/src/main/res/drawable/emoji_tickedoff_f149.png new file mode 100644 index 00000000..4b28f270 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f149.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f15.png b/app/src/main/res/drawable/emoji_tickedoff_f15.png new file mode 100644 index 00000000..e32e747b Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f15.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f150.png b/app/src/main/res/drawable/emoji_tickedoff_f150.png new file mode 100644 index 00000000..e6f1289a Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f150.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f151.png b/app/src/main/res/drawable/emoji_tickedoff_f151.png new file mode 100644 index 00000000..4b28f270 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f151.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f152.png b/app/src/main/res/drawable/emoji_tickedoff_f152.png new file mode 100644 index 00000000..41ee7015 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f152.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f153.png b/app/src/main/res/drawable/emoji_tickedoff_f153.png new file mode 100644 index 00000000..4b28f270 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f153.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f154.png b/app/src/main/res/drawable/emoji_tickedoff_f154.png new file mode 100644 index 00000000..3e3cb89f Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f154.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f155.png b/app/src/main/res/drawable/emoji_tickedoff_f155.png new file mode 100644 index 00000000..f901420d Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f155.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f156.png b/app/src/main/res/drawable/emoji_tickedoff_f156.png new file mode 100644 index 00000000..5a98d257 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f156.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f157.png b/app/src/main/res/drawable/emoji_tickedoff_f157.png new file mode 100644 index 00000000..3e3cb89f Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f157.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f158.png b/app/src/main/res/drawable/emoji_tickedoff_f158.png new file mode 100644 index 00000000..5a98d257 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f158.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f159.png b/app/src/main/res/drawable/emoji_tickedoff_f159.png new file mode 100644 index 00000000..3e3cb89f Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f159.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f16.png b/app/src/main/res/drawable/emoji_tickedoff_f16.png new file mode 100644 index 00000000..b4a6f37b Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f16.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f160.png b/app/src/main/res/drawable/emoji_tickedoff_f160.png new file mode 100644 index 00000000..b81b38a3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f160.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f161.png b/app/src/main/res/drawable/emoji_tickedoff_f161.png new file mode 100644 index 00000000..34b417b3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f161.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f162.png b/app/src/main/res/drawable/emoji_tickedoff_f162.png new file mode 100644 index 00000000..b81b38a3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f162.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f163.png b/app/src/main/res/drawable/emoji_tickedoff_f163.png new file mode 100644 index 00000000..9262fac1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f163.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f164.png b/app/src/main/res/drawable/emoji_tickedoff_f164.png new file mode 100644 index 00000000..b81b38a3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f164.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f165.png b/app/src/main/res/drawable/emoji_tickedoff_f165.png new file mode 100644 index 00000000..34b417b3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f165.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f166.png b/app/src/main/res/drawable/emoji_tickedoff_f166.png new file mode 100644 index 00000000..b81b38a3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f166.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f167.png b/app/src/main/res/drawable/emoji_tickedoff_f167.png new file mode 100644 index 00000000..34b417b3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f167.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f17.png b/app/src/main/res/drawable/emoji_tickedoff_f17.png new file mode 100644 index 00000000..5ccceaab Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f17.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f18.png b/app/src/main/res/drawable/emoji_tickedoff_f18.png new file mode 100644 index 00000000..86e1b29c Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f18.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f19.png b/app/src/main/res/drawable/emoji_tickedoff_f19.png new file mode 100644 index 00000000..ff14608a Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f19.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f2.png b/app/src/main/res/drawable/emoji_tickedoff_f2.png new file mode 100644 index 00000000..e6f1289a Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f2.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f20.png b/app/src/main/res/drawable/emoji_tickedoff_f20.png new file mode 100644 index 00000000..b253aab3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f20.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f21.png b/app/src/main/res/drawable/emoji_tickedoff_f21.png new file mode 100644 index 00000000..ff14608a Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f21.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f22.png b/app/src/main/res/drawable/emoji_tickedoff_f22.png new file mode 100644 index 00000000..b253aab3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f22.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f23.png b/app/src/main/res/drawable/emoji_tickedoff_f23.png new file mode 100644 index 00000000..ff14608a Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f23.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f24.png b/app/src/main/res/drawable/emoji_tickedoff_f24.png new file mode 100644 index 00000000..4be9efcf Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f24.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f25.png b/app/src/main/res/drawable/emoji_tickedoff_f25.png new file mode 100644 index 00000000..6b28f094 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f25.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f26.png b/app/src/main/res/drawable/emoji_tickedoff_f26.png new file mode 100644 index 00000000..3e876f0f Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f26.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f27.png b/app/src/main/res/drawable/emoji_tickedoff_f27.png new file mode 100644 index 00000000..e6f1289a Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f27.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f28.png b/app/src/main/res/drawable/emoji_tickedoff_f28.png new file mode 100644 index 00000000..5bf9a321 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f28.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f29.png b/app/src/main/res/drawable/emoji_tickedoff_f29.png new file mode 100644 index 00000000..e7d0baba Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f29.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f3.png b/app/src/main/res/drawable/emoji_tickedoff_f3.png new file mode 100644 index 00000000..cd1669d3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f3.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f30.png b/app/src/main/res/drawable/emoji_tickedoff_f30.png new file mode 100644 index 00000000..00f63cd8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f30.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f31.png b/app/src/main/res/drawable/emoji_tickedoff_f31.png new file mode 100644 index 00000000..6b28f094 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f31.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f32.png b/app/src/main/res/drawable/emoji_tickedoff_f32.png new file mode 100644 index 00000000..3e876f0f Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f32.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f33.png b/app/src/main/res/drawable/emoji_tickedoff_f33.png new file mode 100644 index 00000000..6b28f094 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f33.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f34.png b/app/src/main/res/drawable/emoji_tickedoff_f34.png new file mode 100644 index 00000000..3e876f0f Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f34.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f35.png b/app/src/main/res/drawable/emoji_tickedoff_f35.png new file mode 100644 index 00000000..6b28f094 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f35.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f36.png b/app/src/main/res/drawable/emoji_tickedoff_f36.png new file mode 100644 index 00000000..0891d714 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f36.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f37.png b/app/src/main/res/drawable/emoji_tickedoff_f37.png new file mode 100644 index 00000000..e7d0baba Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f37.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f38.png b/app/src/main/res/drawable/emoji_tickedoff_f38.png new file mode 100644 index 00000000..08f7f636 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f38.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f39.png b/app/src/main/res/drawable/emoji_tickedoff_f39.png new file mode 100644 index 00000000..1ecadda9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f39.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f4.png b/app/src/main/res/drawable/emoji_tickedoff_f4.png new file mode 100644 index 00000000..e6f1289a Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f4.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f40.png b/app/src/main/res/drawable/emoji_tickedoff_f40.png new file mode 100644 index 00000000..00f63cd8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f40.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f41.png b/app/src/main/res/drawable/emoji_tickedoff_f41.png new file mode 100644 index 00000000..5a5b8aa8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f41.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f42.png b/app/src/main/res/drawable/emoji_tickedoff_f42.png new file mode 100644 index 00000000..35ddac94 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f42.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f43.png b/app/src/main/res/drawable/emoji_tickedoff_f43.png new file mode 100644 index 00000000..d1b6c89f Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f43.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f44.png b/app/src/main/res/drawable/emoji_tickedoff_f44.png new file mode 100644 index 00000000..c4b314e9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f44.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f45.png b/app/src/main/res/drawable/emoji_tickedoff_f45.png new file mode 100644 index 00000000..dd0c821f Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f45.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f46.png b/app/src/main/res/drawable/emoji_tickedoff_f46.png new file mode 100644 index 00000000..c4b314e9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f46.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f47.png b/app/src/main/res/drawable/emoji_tickedoff_f47.png new file mode 100644 index 00000000..dd0c821f Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f47.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f48.png b/app/src/main/res/drawable/emoji_tickedoff_f48.png new file mode 100644 index 00000000..c4b314e9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f48.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f49.png b/app/src/main/res/drawable/emoji_tickedoff_f49.png new file mode 100644 index 00000000..dd0c821f Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f49.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f5.png b/app/src/main/res/drawable/emoji_tickedoff_f5.png new file mode 100644 index 00000000..7ec9a77a Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f5.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f50.png b/app/src/main/res/drawable/emoji_tickedoff_f50.png new file mode 100644 index 00000000..c4b314e9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f50.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f51.png b/app/src/main/res/drawable/emoji_tickedoff_f51.png new file mode 100644 index 00000000..dd0c821f Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f51.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f52.png b/app/src/main/res/drawable/emoji_tickedoff_f52.png new file mode 100644 index 00000000..c4b314e9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f52.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f53.png b/app/src/main/res/drawable/emoji_tickedoff_f53.png new file mode 100644 index 00000000..dd0c821f Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f53.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f54.png b/app/src/main/res/drawable/emoji_tickedoff_f54.png new file mode 100644 index 00000000..c4b314e9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f54.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f55.png b/app/src/main/res/drawable/emoji_tickedoff_f55.png new file mode 100644 index 00000000..9699906a Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f55.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f56.png b/app/src/main/res/drawable/emoji_tickedoff_f56.png new file mode 100644 index 00000000..da3b7292 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f56.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f57.png b/app/src/main/res/drawable/emoji_tickedoff_f57.png new file mode 100644 index 00000000..9699906a Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f57.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f58.png b/app/src/main/res/drawable/emoji_tickedoff_f58.png new file mode 100644 index 00000000..00aca8cf Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f58.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f59.png b/app/src/main/res/drawable/emoji_tickedoff_f59.png new file mode 100644 index 00000000..9699906a Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f59.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f6.png b/app/src/main/res/drawable/emoji_tickedoff_f6.png new file mode 100644 index 00000000..6b28f094 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f6.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f60.png b/app/src/main/res/drawable/emoji_tickedoff_f60.png new file mode 100644 index 00000000..00aca8cf Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f60.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f61.png b/app/src/main/res/drawable/emoji_tickedoff_f61.png new file mode 100644 index 00000000..9699906a Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f61.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f62.png b/app/src/main/res/drawable/emoji_tickedoff_f62.png new file mode 100644 index 00000000..00aca8cf Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f62.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f63.png b/app/src/main/res/drawable/emoji_tickedoff_f63.png new file mode 100644 index 00000000..6b28f094 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f63.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f64.png b/app/src/main/res/drawable/emoji_tickedoff_f64.png new file mode 100644 index 00000000..3e876f0f Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f64.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f65.png b/app/src/main/res/drawable/emoji_tickedoff_f65.png new file mode 100644 index 00000000..6b28f094 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f65.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f66.png b/app/src/main/res/drawable/emoji_tickedoff_f66.png new file mode 100644 index 00000000..00aca8cf Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f66.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f67.png b/app/src/main/res/drawable/emoji_tickedoff_f67.png new file mode 100644 index 00000000..9699906a Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f67.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f68.png b/app/src/main/res/drawable/emoji_tickedoff_f68.png new file mode 100644 index 00000000..00aca8cf Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f68.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f69.png b/app/src/main/res/drawable/emoji_tickedoff_f69.png new file mode 100644 index 00000000..6b28f094 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f69.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f7.png b/app/src/main/res/drawable/emoji_tickedoff_f7.png new file mode 100644 index 00000000..3e876f0f Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f7.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f70.png b/app/src/main/res/drawable/emoji_tickedoff_f70.png new file mode 100644 index 00000000..0891d714 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f70.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f71.png b/app/src/main/res/drawable/emoji_tickedoff_f71.png new file mode 100644 index 00000000..6b28f094 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f71.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f72.png b/app/src/main/res/drawable/emoji_tickedoff_f72.png new file mode 100644 index 00000000..4be959fa Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f72.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f73.png b/app/src/main/res/drawable/emoji_tickedoff_f73.png new file mode 100644 index 00000000..a020550d Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f73.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f74.png b/app/src/main/res/drawable/emoji_tickedoff_f74.png new file mode 100644 index 00000000..4be959fa Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f74.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f75.png b/app/src/main/res/drawable/emoji_tickedoff_f75.png new file mode 100644 index 00000000..a020550d Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f75.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f76.png b/app/src/main/res/drawable/emoji_tickedoff_f76.png new file mode 100644 index 00000000..4be959fa Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f76.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f77.png b/app/src/main/res/drawable/emoji_tickedoff_f77.png new file mode 100644 index 00000000..a020550d Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f77.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f78.png b/app/src/main/res/drawable/emoji_tickedoff_f78.png new file mode 100644 index 00000000..4be959fa Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f78.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f79.png b/app/src/main/res/drawable/emoji_tickedoff_f79.png new file mode 100644 index 00000000..a020550d Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f79.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f8.png b/app/src/main/res/drawable/emoji_tickedoff_f8.png new file mode 100644 index 00000000..6b28f094 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f8.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f80.png b/app/src/main/res/drawable/emoji_tickedoff_f80.png new file mode 100644 index 00000000..4be959fa Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f80.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f81.png b/app/src/main/res/drawable/emoji_tickedoff_f81.png new file mode 100644 index 00000000..a020550d Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f81.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f82.png b/app/src/main/res/drawable/emoji_tickedoff_f82.png new file mode 100644 index 00000000..a903042d Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f82.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f83.png b/app/src/main/res/drawable/emoji_tickedoff_f83.png new file mode 100644 index 00000000..abdb2688 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f83.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f84.png b/app/src/main/res/drawable/emoji_tickedoff_f84.png new file mode 100644 index 00000000..a903042d Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f84.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f85.png b/app/src/main/res/drawable/emoji_tickedoff_f85.png new file mode 100644 index 00000000..abdb2688 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f85.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f86.png b/app/src/main/res/drawable/emoji_tickedoff_f86.png new file mode 100644 index 00000000..0b13465a Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f86.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f87.png b/app/src/main/res/drawable/emoji_tickedoff_f87.png new file mode 100644 index 00000000..abdb2688 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f87.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f88.png b/app/src/main/res/drawable/emoji_tickedoff_f88.png new file mode 100644 index 00000000..c9e8b6cb Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f88.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f89.png b/app/src/main/res/drawable/emoji_tickedoff_f89.png new file mode 100644 index 00000000..92388fc1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f89.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f9.png b/app/src/main/res/drawable/emoji_tickedoff_f9.png new file mode 100644 index 00000000..3e876f0f Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f9.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f90.png b/app/src/main/res/drawable/emoji_tickedoff_f90.png new file mode 100644 index 00000000..c9e8b6cb Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f90.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f91.png b/app/src/main/res/drawable/emoji_tickedoff_f91.png new file mode 100644 index 00000000..92388fc1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f91.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f92.png b/app/src/main/res/drawable/emoji_tickedoff_f92.png new file mode 100644 index 00000000..7ffc40e5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f92.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f93.png b/app/src/main/res/drawable/emoji_tickedoff_f93.png new file mode 100644 index 00000000..71c774f1 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f93.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f94.png b/app/src/main/res/drawable/emoji_tickedoff_f94.png new file mode 100644 index 00000000..7ffc40e5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f94.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f95.png b/app/src/main/res/drawable/emoji_tickedoff_f95.png new file mode 100644 index 00000000..a903042d Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f95.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f96.png b/app/src/main/res/drawable/emoji_tickedoff_f96.png new file mode 100644 index 00000000..abdb2688 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f96.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f97.png b/app/src/main/res/drawable/emoji_tickedoff_f97.png new file mode 100644 index 00000000..a903042d Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f97.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f98.png b/app/src/main/res/drawable/emoji_tickedoff_f98.png new file mode 100644 index 00000000..abdb2688 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f98.png differ diff --git a/app/src/main/res/drawable/emoji_tickedoff_f99.png b/app/src/main/res/drawable/emoji_tickedoff_f99.png new file mode 100644 index 00000000..a903042d Binary files /dev/null and b/app/src/main/res/drawable/emoji_tickedoff_f99.png differ diff --git a/app/src/main/res/drawable/emoji_tomatomourh.xml b/app/src/main/res/drawable/emoji_tomatomourh.xml new file mode 100644 index 00000000..1423a189 --- /dev/null +++ b/app/src/main/res/drawable/emoji_tomatomourh.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_tomatomourh_f0.png b/app/src/main/res/drawable/emoji_tomatomourh_f0.png new file mode 100644 index 00000000..b486baf0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tomatomourh_f0.png differ diff --git a/app/src/main/res/drawable/emoji_tomatomourh_f1.png b/app/src/main/res/drawable/emoji_tomatomourh_f1.png new file mode 100644 index 00000000..b74d694c Binary files /dev/null and b/app/src/main/res/drawable/emoji_tomatomourh_f1.png differ diff --git a/app/src/main/res/drawable/emoji_tomatomourh_f10.png b/app/src/main/res/drawable/emoji_tomatomourh_f10.png new file mode 100644 index 00000000..9615d1e0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tomatomourh_f10.png differ diff --git a/app/src/main/res/drawable/emoji_tomatomourh_f11.png b/app/src/main/res/drawable/emoji_tomatomourh_f11.png new file mode 100644 index 00000000..b486baf0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tomatomourh_f11.png differ diff --git a/app/src/main/res/drawable/emoji_tomatomourh_f2.png b/app/src/main/res/drawable/emoji_tomatomourh_f2.png new file mode 100644 index 00000000..4b2fc02b Binary files /dev/null and b/app/src/main/res/drawable/emoji_tomatomourh_f2.png differ diff --git a/app/src/main/res/drawable/emoji_tomatomourh_f3.png b/app/src/main/res/drawable/emoji_tomatomourh_f3.png new file mode 100644 index 00000000..a4df0254 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tomatomourh_f3.png differ diff --git a/app/src/main/res/drawable/emoji_tomatomourh_f4.png b/app/src/main/res/drawable/emoji_tomatomourh_f4.png new file mode 100644 index 00000000..33264f59 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tomatomourh_f4.png differ diff --git a/app/src/main/res/drawable/emoji_tomatomourh_f5.png b/app/src/main/res/drawable/emoji_tomatomourh_f5.png new file mode 100644 index 00000000..d25763ff Binary files /dev/null and b/app/src/main/res/drawable/emoji_tomatomourh_f5.png differ diff --git a/app/src/main/res/drawable/emoji_tomatomourh_f6.png b/app/src/main/res/drawable/emoji_tomatomourh_f6.png new file mode 100644 index 00000000..00b79451 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tomatomourh_f6.png differ diff --git a/app/src/main/res/drawable/emoji_tomatomourh_f7.png b/app/src/main/res/drawable/emoji_tomatomourh_f7.png new file mode 100644 index 00000000..cef1de03 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tomatomourh_f7.png differ diff --git a/app/src/main/res/drawable/emoji_tomatomourh_f8.png b/app/src/main/res/drawable/emoji_tomatomourh_f8.png new file mode 100644 index 00000000..5d94d57f Binary files /dev/null and b/app/src/main/res/drawable/emoji_tomatomourh_f8.png differ diff --git a/app/src/main/res/drawable/emoji_tomatomourh_f9.png b/app/src/main/res/drawable/emoji_tomatomourh_f9.png new file mode 100644 index 00000000..9615d1e0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tomatomourh_f9.png differ diff --git a/app/src/main/res/drawable/emoji_tongue.xml b/app/src/main/res/drawable/emoji_tongue.xml new file mode 100644 index 00000000..edb8cbbd --- /dev/null +++ b/app/src/main/res/drawable/emoji_tongue.xml @@ -0,0 +1,24 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_tongue_f0.png b/app/src/main/res/drawable/emoji_tongue_f0.png new file mode 100644 index 00000000..916d4050 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tongue_f0.png differ diff --git a/app/src/main/res/drawable/emoji_tongue_f1.png b/app/src/main/res/drawable/emoji_tongue_f1.png new file mode 100644 index 00000000..f1685b7e Binary files /dev/null and b/app/src/main/res/drawable/emoji_tongue_f1.png differ diff --git a/app/src/main/res/drawable/emoji_tongue_f2.png b/app/src/main/res/drawable/emoji_tongue_f2.png new file mode 100644 index 00000000..9dbd19dc Binary files /dev/null and b/app/src/main/res/drawable/emoji_tongue_f2.png differ diff --git a/app/src/main/res/drawable/emoji_tongue_f3.png b/app/src/main/res/drawable/emoji_tongue_f3.png new file mode 100644 index 00000000..e8e2b1a2 Binary files /dev/null and b/app/src/main/res/drawable/emoji_tongue_f3.png differ diff --git a/app/src/main/res/drawable/emoji_tongue_f4.png b/app/src/main/res/drawable/emoji_tongue_f4.png new file mode 100644 index 00000000..9dbd19dc Binary files /dev/null and b/app/src/main/res/drawable/emoji_tongue_f4.png differ diff --git a/app/src/main/res/drawable/emoji_tongue_f5.png b/app/src/main/res/drawable/emoji_tongue_f5.png new file mode 100644 index 00000000..f1685b7e Binary files /dev/null and b/app/src/main/res/drawable/emoji_tongue_f5.png differ diff --git a/app/src/main/res/drawable/emoji_undecided.xml b/app/src/main/res/drawable/emoji_undecided.xml new file mode 100644 index 00000000..07b305bb --- /dev/null +++ b/app/src/main/res/drawable/emoji_undecided.xml @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_undecided_f0.png b/app/src/main/res/drawable/emoji_undecided_f0.png new file mode 100644 index 00000000..7b486e04 Binary files /dev/null and b/app/src/main/res/drawable/emoji_undecided_f0.png differ diff --git a/app/src/main/res/drawable/emoji_undecided_f1.png b/app/src/main/res/drawable/emoji_undecided_f1.png new file mode 100644 index 00000000..04c52a5e Binary files /dev/null and b/app/src/main/res/drawable/emoji_undecided_f1.png differ diff --git a/app/src/main/res/drawable/emoji_undecided_f2.png b/app/src/main/res/drawable/emoji_undecided_f2.png new file mode 100644 index 00000000..7b486e04 Binary files /dev/null and b/app/src/main/res/drawable/emoji_undecided_f2.png differ diff --git a/app/src/main/res/drawable/emoji_undecided_f3.png b/app/src/main/res/drawable/emoji_undecided_f3.png new file mode 100644 index 00000000..8b08c3b3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_undecided_f3.png differ diff --git a/app/src/main/res/drawable/emoji_undecided_f4.png b/app/src/main/res/drawable/emoji_undecided_f4.png new file mode 100644 index 00000000..7b486e04 Binary files /dev/null and b/app/src/main/res/drawable/emoji_undecided_f4.png differ diff --git a/app/src/main/res/drawable/emoji_victory.xml b/app/src/main/res/drawable/emoji_victory.xml new file mode 100644 index 00000000..c07d1299 --- /dev/null +++ b/app/src/main/res/drawable/emoji_victory.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_victory_f0.png b/app/src/main/res/drawable/emoji_victory_f0.png new file mode 100644 index 00000000..4fb5f3c9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_victory_f0.png differ diff --git a/app/src/main/res/drawable/emoji_victory_f1.png b/app/src/main/res/drawable/emoji_victory_f1.png new file mode 100644 index 00000000..6a184998 Binary files /dev/null and b/app/src/main/res/drawable/emoji_victory_f1.png differ diff --git a/app/src/main/res/drawable/emoji_victory_f2.png b/app/src/main/res/drawable/emoji_victory_f2.png new file mode 100644 index 00000000..4fb5f3c9 Binary files /dev/null and b/app/src/main/res/drawable/emoji_victory_f2.png differ diff --git a/app/src/main/res/drawable/emoji_victory_f3.png b/app/src/main/res/drawable/emoji_victory_f3.png new file mode 100644 index 00000000..e9be5175 Binary files /dev/null and b/app/src/main/res/drawable/emoji_victory_f3.png differ diff --git a/app/src/main/res/drawable/emoji_victory_f4.png b/app/src/main/res/drawable/emoji_victory_f4.png new file mode 100644 index 00000000..f4cbc857 Binary files /dev/null and b/app/src/main/res/drawable/emoji_victory_f4.png differ diff --git a/app/src/main/res/drawable/emoji_victory_f5.png b/app/src/main/res/drawable/emoji_victory_f5.png new file mode 100644 index 00000000..2faffe77 Binary files /dev/null and b/app/src/main/res/drawable/emoji_victory_f5.png differ diff --git a/app/src/main/res/drawable/emoji_victory_f6.png b/app/src/main/res/drawable/emoji_victory_f6.png new file mode 100644 index 00000000..4eba4cc7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_victory_f6.png differ diff --git a/app/src/main/res/drawable/emoji_victory_f7.png b/app/src/main/res/drawable/emoji_victory_f7.png new file mode 100644 index 00000000..e9be5175 Binary files /dev/null and b/app/src/main/res/drawable/emoji_victory_f7.png differ diff --git a/app/src/main/res/drawable/emoji_wade.xml b/app/src/main/res/drawable/emoji_wade.xml new file mode 100644 index 00000000..4e19b8c9 --- /dev/null +++ b/app/src/main/res/drawable/emoji_wade.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/emoji_wade_f0.png b/app/src/main/res/drawable/emoji_wade_f0.png new file mode 100644 index 00000000..60c536d8 Binary files /dev/null and b/app/src/main/res/drawable/emoji_wade_f0.png differ diff --git a/app/src/main/res/drawable/emoji_wav.xml b/app/src/main/res/drawable/emoji_wav.xml new file mode 100644 index 00000000..40eef56d --- /dev/null +++ b/app/src/main/res/drawable/emoji_wav.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_wav_f0.png b/app/src/main/res/drawable/emoji_wav_f0.png new file mode 100644 index 00000000..7170fe6a Binary files /dev/null and b/app/src/main/res/drawable/emoji_wav_f0.png differ diff --git a/app/src/main/res/drawable/emoji_wav_f1.png b/app/src/main/res/drawable/emoji_wav_f1.png new file mode 100644 index 00000000..b7cbae32 Binary files /dev/null and b/app/src/main/res/drawable/emoji_wav_f1.png differ diff --git a/app/src/main/res/drawable/emoji_wav_f10.png b/app/src/main/res/drawable/emoji_wav_f10.png new file mode 100644 index 00000000..8e745000 Binary files /dev/null and b/app/src/main/res/drawable/emoji_wav_f10.png differ diff --git a/app/src/main/res/drawable/emoji_wav_f11.png b/app/src/main/res/drawable/emoji_wav_f11.png new file mode 100644 index 00000000..4455d08c Binary files /dev/null and b/app/src/main/res/drawable/emoji_wav_f11.png differ diff --git a/app/src/main/res/drawable/emoji_wav_f2.png b/app/src/main/res/drawable/emoji_wav_f2.png new file mode 100644 index 00000000..ba8cdd4e Binary files /dev/null and b/app/src/main/res/drawable/emoji_wav_f2.png differ diff --git a/app/src/main/res/drawable/emoji_wav_f3.png b/app/src/main/res/drawable/emoji_wav_f3.png new file mode 100644 index 00000000..e70cabff Binary files /dev/null and b/app/src/main/res/drawable/emoji_wav_f3.png differ diff --git a/app/src/main/res/drawable/emoji_wav_f4.png b/app/src/main/res/drawable/emoji_wav_f4.png new file mode 100644 index 00000000..3e9e045c Binary files /dev/null and b/app/src/main/res/drawable/emoji_wav_f4.png differ diff --git a/app/src/main/res/drawable/emoji_wav_f5.png b/app/src/main/res/drawable/emoji_wav_f5.png new file mode 100644 index 00000000..b3676fb0 Binary files /dev/null and b/app/src/main/res/drawable/emoji_wav_f5.png differ diff --git a/app/src/main/res/drawable/emoji_wav_f6.png b/app/src/main/res/drawable/emoji_wav_f6.png new file mode 100644 index 00000000..c15bf194 Binary files /dev/null and b/app/src/main/res/drawable/emoji_wav_f6.png differ diff --git a/app/src/main/res/drawable/emoji_wav_f7.png b/app/src/main/res/drawable/emoji_wav_f7.png new file mode 100644 index 00000000..793cb710 Binary files /dev/null and b/app/src/main/res/drawable/emoji_wav_f7.png differ diff --git a/app/src/main/res/drawable/emoji_wav_f8.png b/app/src/main/res/drawable/emoji_wav_f8.png new file mode 100644 index 00000000..4841730d Binary files /dev/null and b/app/src/main/res/drawable/emoji_wav_f8.png differ diff --git a/app/src/main/res/drawable/emoji_wav_f9.png b/app/src/main/res/drawable/emoji_wav_f9.png new file mode 100644 index 00000000..7884f80a Binary files /dev/null and b/app/src/main/res/drawable/emoji_wav_f9.png differ diff --git a/app/src/main/res/drawable/emoji_wink.xml b/app/src/main/res/drawable/emoji_wink.xml new file mode 100644 index 00000000..35eca0fa --- /dev/null +++ b/app/src/main/res/drawable/emoji_wink.xml @@ -0,0 +1,24 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_wink_f0.png b/app/src/main/res/drawable/emoji_wink_f0.png new file mode 100644 index 00000000..ba64e073 Binary files /dev/null and b/app/src/main/res/drawable/emoji_wink_f0.png differ diff --git a/app/src/main/res/drawable/emoji_wink_f1.png b/app/src/main/res/drawable/emoji_wink_f1.png new file mode 100644 index 00000000..7982d894 Binary files /dev/null and b/app/src/main/res/drawable/emoji_wink_f1.png differ diff --git a/app/src/main/res/drawable/emoji_wink_f2.png b/app/src/main/res/drawable/emoji_wink_f2.png new file mode 100644 index 00000000..04687694 Binary files /dev/null and b/app/src/main/res/drawable/emoji_wink_f2.png differ diff --git a/app/src/main/res/drawable/emoji_wink_f3.png b/app/src/main/res/drawable/emoji_wink_f3.png new file mode 100644 index 00000000..be2bf021 Binary files /dev/null and b/app/src/main/res/drawable/emoji_wink_f3.png differ diff --git a/app/src/main/res/drawable/emoji_wink_f4.png b/app/src/main/res/drawable/emoji_wink_f4.png new file mode 100644 index 00000000..5217d2d5 Binary files /dev/null and b/app/src/main/res/drawable/emoji_wink_f4.png differ diff --git a/app/src/main/res/drawable/emoji_wink_f5.png b/app/src/main/res/drawable/emoji_wink_f5.png new file mode 100644 index 00000000..e3e34711 Binary files /dev/null and b/app/src/main/res/drawable/emoji_wink_f5.png differ diff --git a/app/src/main/res/drawable/emoji_ytold.xml b/app/src/main/res/drawable/emoji_ytold.xml new file mode 100644 index 00000000..7a257e01 --- /dev/null +++ b/app/src/main/res/drawable/emoji_ytold.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_ytold_f0.png b/app/src/main/res/drawable/emoji_ytold_f0.png new file mode 100644 index 00000000..b5e11ce4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ytold_f0.png differ diff --git a/app/src/main/res/drawable/emoji_ytold_f1.png b/app/src/main/res/drawable/emoji_ytold_f1.png new file mode 100644 index 00000000..84e7bd0d Binary files /dev/null and b/app/src/main/res/drawable/emoji_ytold_f1.png differ diff --git a/app/src/main/res/drawable/emoji_ytold_f10.png b/app/src/main/res/drawable/emoji_ytold_f10.png new file mode 100644 index 00000000..fb08167a Binary files /dev/null and b/app/src/main/res/drawable/emoji_ytold_f10.png differ diff --git a/app/src/main/res/drawable/emoji_ytold_f11.png b/app/src/main/res/drawable/emoji_ytold_f11.png new file mode 100644 index 00000000..8a6531cb Binary files /dev/null and b/app/src/main/res/drawable/emoji_ytold_f11.png differ diff --git a/app/src/main/res/drawable/emoji_ytold_f2.png b/app/src/main/res/drawable/emoji_ytold_f2.png new file mode 100644 index 00000000..1e6a259f Binary files /dev/null and b/app/src/main/res/drawable/emoji_ytold_f2.png differ diff --git a/app/src/main/res/drawable/emoji_ytold_f3.png b/app/src/main/res/drawable/emoji_ytold_f3.png new file mode 100644 index 00000000..36aaf44c Binary files /dev/null and b/app/src/main/res/drawable/emoji_ytold_f3.png differ diff --git a/app/src/main/res/drawable/emoji_ytold_f4.png b/app/src/main/res/drawable/emoji_ytold_f4.png new file mode 100644 index 00000000..c3d85f68 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ytold_f4.png differ diff --git a/app/src/main/res/drawable/emoji_ytold_f5.png b/app/src/main/res/drawable/emoji_ytold_f5.png new file mode 100644 index 00000000..8a6531cb Binary files /dev/null and b/app/src/main/res/drawable/emoji_ytold_f5.png differ diff --git a/app/src/main/res/drawable/emoji_ytold_f6.png b/app/src/main/res/drawable/emoji_ytold_f6.png new file mode 100644 index 00000000..b5e11ce4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ytold_f6.png differ diff --git a/app/src/main/res/drawable/emoji_ytold_f7.png b/app/src/main/res/drawable/emoji_ytold_f7.png new file mode 100644 index 00000000..84e7bd0d Binary files /dev/null and b/app/src/main/res/drawable/emoji_ytold_f7.png differ diff --git a/app/src/main/res/drawable/emoji_ytold_f8.png b/app/src/main/res/drawable/emoji_ytold_f8.png new file mode 100644 index 00000000..b5e11ce4 Binary files /dev/null and b/app/src/main/res/drawable/emoji_ytold_f8.png differ diff --git a/app/src/main/res/drawable/emoji_ytold_f9.png b/app/src/main/res/drawable/emoji_ytold_f9.png new file mode 100644 index 00000000..36aaf44c Binary files /dev/null and b/app/src/main/res/drawable/emoji_ytold_f9.png differ diff --git a/app/src/main/res/drawable/emoji_yu.xml b/app/src/main/res/drawable/emoji_yu.xml new file mode 100644 index 00000000..21e2613d --- /dev/null +++ b/app/src/main/res/drawable/emoji_yu.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/emoji_yu_f0.png b/app/src/main/res/drawable/emoji_yu_f0.png new file mode 100644 index 00000000..11c4b56c Binary files /dev/null and b/app/src/main/res/drawable/emoji_yu_f0.png differ diff --git a/app/src/main/res/drawable/emoji_yu_f1.png b/app/src/main/res/drawable/emoji_yu_f1.png new file mode 100644 index 00000000..da31de46 Binary files /dev/null and b/app/src/main/res/drawable/emoji_yu_f1.png differ diff --git a/app/src/main/res/drawable/emoji_yu_f10.png b/app/src/main/res/drawable/emoji_yu_f10.png new file mode 100644 index 00000000..16cda02f Binary files /dev/null and b/app/src/main/res/drawable/emoji_yu_f10.png differ diff --git a/app/src/main/res/drawable/emoji_yu_f11.png b/app/src/main/res/drawable/emoji_yu_f11.png new file mode 100644 index 00000000..5efc1ef3 Binary files /dev/null and b/app/src/main/res/drawable/emoji_yu_f11.png differ diff --git a/app/src/main/res/drawable/emoji_yu_f12.png b/app/src/main/res/drawable/emoji_yu_f12.png new file mode 100644 index 00000000..50a44870 Binary files /dev/null and b/app/src/main/res/drawable/emoji_yu_f12.png differ diff --git a/app/src/main/res/drawable/emoji_yu_f13.png b/app/src/main/res/drawable/emoji_yu_f13.png new file mode 100644 index 00000000..6f429e14 Binary files /dev/null and b/app/src/main/res/drawable/emoji_yu_f13.png differ diff --git a/app/src/main/res/drawable/emoji_yu_f2.png b/app/src/main/res/drawable/emoji_yu_f2.png new file mode 100644 index 00000000..f9b5f959 Binary files /dev/null and b/app/src/main/res/drawable/emoji_yu_f2.png differ diff --git a/app/src/main/res/drawable/emoji_yu_f3.png b/app/src/main/res/drawable/emoji_yu_f3.png new file mode 100644 index 00000000..b394700f Binary files /dev/null and b/app/src/main/res/drawable/emoji_yu_f3.png differ diff --git a/app/src/main/res/drawable/emoji_yu_f4.png b/app/src/main/res/drawable/emoji_yu_f4.png new file mode 100644 index 00000000..c5484aca Binary files /dev/null and b/app/src/main/res/drawable/emoji_yu_f4.png differ diff --git a/app/src/main/res/drawable/emoji_yu_f5.png b/app/src/main/res/drawable/emoji_yu_f5.png new file mode 100644 index 00000000..080f172c Binary files /dev/null and b/app/src/main/res/drawable/emoji_yu_f5.png differ diff --git a/app/src/main/res/drawable/emoji_yu_f6.png b/app/src/main/res/drawable/emoji_yu_f6.png new file mode 100644 index 00000000..083aaa39 Binary files /dev/null and b/app/src/main/res/drawable/emoji_yu_f6.png differ diff --git a/app/src/main/res/drawable/emoji_yu_f7.png b/app/src/main/res/drawable/emoji_yu_f7.png new file mode 100644 index 00000000..ff8e975e Binary files /dev/null and b/app/src/main/res/drawable/emoji_yu_f7.png differ diff --git a/app/src/main/res/drawable/emoji_yu_f8.png b/app/src/main/res/drawable/emoji_yu_f8.png new file mode 100644 index 00000000..de988ba7 Binary files /dev/null and b/app/src/main/res/drawable/emoji_yu_f8.png differ diff --git a/app/src/main/res/drawable/emoji_yu_f9.png b/app/src/main/res/drawable/emoji_yu_f9.png new file mode 100644 index 00000000..080ff68a Binary files /dev/null and b/app/src/main/res/drawable/emoji_yu_f9.png differ diff --git a/app/src/main/res/drawable/ic_arrow_drop_down_accent_24dp.xml b/app/src/main/res/drawable/ic_arrow_drop_down_accent_24dp.xml new file mode 100644 index 00000000..f100d7d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_drop_down_accent_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_arrow_drop_up_accent_24dp.xml b/app/src/main/res/drawable/ic_arrow_drop_up_accent_24dp.xml new file mode 100644 index 00000000..ff9c29f4 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_drop_up_accent_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_attach_file_white_24dp.xml b/app/src/main/res/drawable/ic_attach_file_white_24dp.xml new file mode 100644 index 00000000..4834305b --- /dev/null +++ b/app/src/main/res/drawable/ic_attach_file_white_24dp.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/src/main/res/drawable/ic_backspace_black_24dp.xml b/app/src/main/res/drawable/ic_backspace_black_24dp.xml new file mode 100644 index 00000000..5ecf7ae2 --- /dev/null +++ b/app/src/main/res/drawable/ic_backspace_black_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_bookmark_false_accent_24dp.xml b/app/src/main/res/drawable/ic_bookmark_false_accent_24dp.xml new file mode 100644 index 00000000..c5178cf2 --- /dev/null +++ b/app/src/main/res/drawable/ic_bookmark_false_accent_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_bookmark_true_accent_24dp.xml b/app/src/main/res/drawable/ic_bookmark_true_accent_24dp.xml new file mode 100644 index 00000000..a1a12213 --- /dev/null +++ b/app/src/main/res/drawable/ic_bookmark_true_accent_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_code.xml b/app/src/main/res/drawable/ic_code.xml new file mode 100644 index 00000000..fc50feea --- /dev/null +++ b/app/src/main/res/drawable/ic_code.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_default_user_thumbnail.png b/app/src/main/res/drawable/ic_default_user_thumbnail.png deleted file mode 100644 index 0803edc6..00000000 Binary files a/app/src/main/res/drawable/ic_default_user_thumbnail.png and /dev/null differ diff --git a/app/src/main/res/drawable/ic_default_user_thumbnail_white_24dp.xml b/app/src/main/res/drawable/ic_default_user_thumbnail_white_24dp.xml new file mode 100644 index 00000000..d7366bda --- /dev/null +++ b/app/src/main/res/drawable/ic_default_user_thumbnail_white_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_delete_accent_24dp.xml b/app/src/main/res/drawable/ic_delete_accent_24dp.xml new file mode 100644 index 00000000..cda3e2fb --- /dev/null +++ b/app/src/main/res/drawable/ic_delete_accent_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_delete_white_24dp.xml b/app/src/main/res/drawable/ic_delete_white_24dp.xml new file mode 100644 index 00000000..8bed121a --- /dev/null +++ b/app/src/main/res/drawable/ic_delete_white_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_edit_white_24dp.xml b/app/src/main/res/drawable/ic_edit_white_24dp.xml new file mode 100644 index 00000000..46462b57 --- /dev/null +++ b/app/src/main/res/drawable/ic_edit_white_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_file_upload.xml b/app/src/main/res/drawable/ic_file_upload.xml deleted file mode 100644 index 74f3b4ca..00000000 --- a/app/src/main/res/drawable/ic_file_upload.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_file_upload_white_24dp.xml b/app/src/main/res/drawable/ic_file_upload_white_24dp.xml new file mode 100644 index 00000000..70e55133 --- /dev/null +++ b/app/src/main/res/drawable/ic_file_upload_white_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_format_align_center.xml b/app/src/main/res/drawable/ic_format_align_center.xml new file mode 100644 index 00000000..3970a13c --- /dev/null +++ b/app/src/main/res/drawable/ic_format_align_center.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_format_align_left.xml b/app/src/main/res/drawable/ic_format_align_left.xml new file mode 100644 index 00000000..27759704 --- /dev/null +++ b/app/src/main/res/drawable/ic_format_align_left.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_format_align_right.xml b/app/src/main/res/drawable/ic_format_align_right.xml new file mode 100644 index 00000000..94f1f326 --- /dev/null +++ b/app/src/main/res/drawable/ic_format_align_right.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_format_bold.xml b/app/src/main/res/drawable/ic_format_bold.xml new file mode 100644 index 00000000..612b8927 --- /dev/null +++ b/app/src/main/res/drawable/ic_format_bold.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_format_color_text.xml b/app/src/main/res/drawable/ic_format_color_text.xml new file mode 100644 index 00000000..9e8b6a46 --- /dev/null +++ b/app/src/main/res/drawable/ic_format_color_text.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/drawable/ic_format_italic.xml b/app/src/main/res/drawable/ic_format_italic.xml new file mode 100644 index 00000000..92b9cc5a --- /dev/null +++ b/app/src/main/res/drawable/ic_format_italic.xml @@ -0,0 +1,4 @@ + + + diff --git a/app/src/main/res/drawable/ic_format_list_bulleted.xml b/app/src/main/res/drawable/ic_format_list_bulleted.xml new file mode 100644 index 00000000..90969e5c --- /dev/null +++ b/app/src/main/res/drawable/ic_format_list_bulleted.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_format_quote.xml b/app/src/main/res/drawable/ic_format_quote.xml new file mode 100644 index 00000000..92e96f25 --- /dev/null +++ b/app/src/main/res/drawable/ic_format_quote.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_format_quote_checked_accent_24dp.xml b/app/src/main/res/drawable/ic_format_quote_checked_accent_24dp.xml new file mode 100644 index 00000000..1207e178 --- /dev/null +++ b/app/src/main/res/drawable/ic_format_quote_checked_accent_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_format_quote_unchecked_24dp.xml b/app/src/main/res/drawable/ic_format_quote_unchecked_24dp.xml new file mode 100644 index 00000000..1b05e2a7 --- /dev/null +++ b/app/src/main/res/drawable/ic_format_quote_unchecked_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_format_size.xml b/app/src/main/res/drawable/ic_format_size.xml new file mode 100644 index 00000000..7b5d129a --- /dev/null +++ b/app/src/main/res/drawable/ic_format_size.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_format_underlined.xml b/app/src/main/res/drawable/ic_format_underlined.xml new file mode 100644 index 00000000..738d6cb8 --- /dev/null +++ b/app/src/main/res/drawable/ic_format_underlined.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_functions.xml b/app/src/main/res/drawable/ic_functions.xml new file mode 100644 index 00000000..834d56e1 --- /dev/null +++ b/app/src/main/res/drawable/ic_functions.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_info_outline_white_24dp.xml b/app/src/main/res/drawable/ic_info_outline_white_24dp.xml new file mode 100644 index 00000000..af0d4d06 --- /dev/null +++ b/app/src/main/res/drawable/ic_info_outline_white_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_insert_drive_file_white_24dp.xml b/app/src/main/res/drawable/ic_insert_drive_file_white_24dp.xml new file mode 100644 index 00000000..a431a5e9 --- /dev/null +++ b/app/src/main/res/drawable/ic_insert_drive_file_white_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_insert_link.xml b/app/src/main/res/drawable/ic_insert_link.xml new file mode 100644 index 00000000..199089f0 --- /dev/null +++ b/app/src/main/res/drawable/ic_insert_link.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_keyboard_24dp.xml b/app/src/main/res/drawable/ic_keyboard_24dp.xml new file mode 100644 index 00000000..e050ce50 --- /dev/null +++ b/app/src/main/res/drawable/ic_keyboard_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_more_vert_white_24dp.xml b/app/src/main/res/drawable/ic_more_vert_white_24dp.xml new file mode 100644 index 00000000..c097d3e4 --- /dev/null +++ b/app/src/main/res/drawable/ic_more_vert_white_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_photo_camera_white_24dp.xml b/app/src/main/res/drawable/ic_photo_camera_white_24dp.xml new file mode 100644 index 00000000..9835771a --- /dev/null +++ b/app/src/main/res/drawable/ic_photo_camera_white_24dp.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_send_accent_24dp.xml b/app/src/main/res/drawable/ic_send_accent_24dp.xml new file mode 100644 index 00000000..4d65d14e --- /dev/null +++ b/app/src/main/res/drawable/ic_send_accent_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_share_white_24dp.xml b/app/src/main/res/drawable/ic_share_white_24dp.xml new file mode 100644 index 00000000..045bbc0c --- /dev/null +++ b/app/src/main/res/drawable/ic_share_white_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_strikethrough_s.xml b/app/src/main/res/drawable/ic_strikethrough_s.xml new file mode 100644 index 00000000..cb93bbc1 --- /dev/null +++ b/app/src/main/res/drawable/ic_strikethrough_s.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_tag_faces_24dp.xml b/app/src/main/res/drawable/ic_tag_faces_24dp.xml new file mode 100644 index 00000000..8deae1ed --- /dev/null +++ b/app/src/main/res/drawable/ic_tag_faces_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_text_format.xml b/app/src/main/res/drawable/ic_text_format.xml new file mode 100644 index 00000000..529a6fdb --- /dev/null +++ b/app/src/main/res/drawable/ic_text_format.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/mention_card.xml b/app/src/main/res/drawable/mention_card.xml new file mode 100644 index 00000000..974d3d67 --- /dev/null +++ b/app/src/main/res/drawable/mention_card.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-v21/activity_profile.xml b/app/src/main/res/layout-v21/activity_profile.xml index 21a187bd..22f819cc 100644 --- a/app/src/main/res/layout-v21/activity_profile.xml +++ b/app/src/main/res/layout-v21/activity_profile.xml @@ -41,7 +41,7 @@ android:adjustViewBounds="true" android:contentDescription="@string/post_thumbnail" android:fitsSystemWindows="true" - android:src="@drawable/ic_default_user_thumbnail" + app:srcCompat="@drawable/ic_default_user_thumbnail_white_24dp" android:transitionName="user_thumbnail" app:layout_collapseMode="parallax"/> diff --git a/app/src/main/res/layout-v21/activity_topic_post_row.xml b/app/src/main/res/layout-v21/activity_topic_post_row.xml index 6f00298e..ad66a8a7 100644 --- a/app/src/main/res/layout-v21/activity_topic_post_row.xml +++ b/app/src/main/res/layout-v21/activity_topic_post_row.xml @@ -1,5 +1,6 @@ @@ -94,8 +95,8 @@ android:clickable="true" android:contentDescription="@string/post_quote_button" android:focusable="true" - android:src="@drawable/ic_format_quote_unchecked" /> - + + + + + + app:srcCompat="@drawable/ic_bookmark_false_accent_24dp"/> diff --git a/app/src/main/res/layout/activity_board_sub_board.xml b/app/src/main/res/layout/activity_board_sub_board.xml index 6362e043..eadcd8b4 100644 --- a/app/src/main/res/layout/activity_board_sub_board.xml +++ b/app/src/main/res/layout/activity_board_sub_board.xml @@ -1,5 +1,6 @@ + app:srcCompat="@drawable/ic_arrow_drop_down_accent_24dp" /> + + + app:srcCompat="@drawable/ic_arrow_drop_down_accent_24dp" /> - - - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_create_content.xml b/app/src/main/res/layout/activity_create_content.xml new file mode 100644 index 00000000..60028c0c --- /dev/null +++ b/app/src/main/res/layout/activity_create_content.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_downloads.xml b/app/src/main/res/layout/activity_downloads.xml index f8fb406d..0856b9c3 100644 --- a/app/src/main/res/layout/activity_downloads.xml +++ b/app/src/main/res/layout/activity_downloads.xml @@ -48,15 +48,15 @@ app:mpb_indeterminateTint="@color/accent" app:mpb_progressStyle="horizontal"/> - + app:srcCompat="@drawable/ic_file_upload_white_24dp"/>--> diff --git a/app/src/main/res/layout/activity_downloads_row.xml b/app/src/main/res/layout/activity_downloads_row.xml index d6c664c9..53ab2f78 100644 --- a/app/src/main/res/layout/activity_downloads_row.xml +++ b/app/src/main/res/layout/activity_downloads_row.xml @@ -1,6 +1,7 @@ + app:srcCompat="@drawable/ic_arrow_drop_down_accent_24dp"/> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_topic.xml b/app/src/main/res/layout/activity_topic.xml index cb98088e..ac653015 100644 --- a/app/src/main/res/layout/activity_topic.xml +++ b/app/src/main/res/layout/activity_topic.xml @@ -1,51 +1,75 @@ - - + android:layout_height="match_parent"> - + android:layout_height="wrap_content" + android:paddingTop="@dimen/appbar_padding_top" + android:theme="@style/ToolbarTheme"> - - - - - - + android:layout_height="?attr/actionBarSize" + android:background="?attr/colorPrimary" + app:contentInsetStartWithNavigation="0dp" + app:popupTheme="@style/ToolbarTheme"> + + + + + + + + + + + + app:srcCompat="@drawable/page_first" /> + app:srcCompat="@drawable/page_previous" /> + android:textSize="22sp" /> + app:srcCompat="@drawable/page_next" /> + app:srcCompat="@drawable/page_last" /> + app:mpb_progressStyle="horizontal" /> + app:srcCompat="@drawable/ic_reply" /> diff --git a/app/src/main/res/layout/activity_topic_edit_row.xml b/app/src/main/res/layout/activity_topic_edit_row.xml new file mode 100644 index 00000000..2feeaa0d --- /dev/null +++ b/app/src/main/res/layout/activity_topic_edit_row.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_topic_overflow_menu.xml b/app/src/main/res/layout/activity_topic_overflow_menu.xml new file mode 100644 index 00000000..3341d45f --- /dev/null +++ b/app/src/main/res/layout/activity_topic_overflow_menu.xml @@ -0,0 +1,49 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_topic_poll.xml b/app/src/main/res/layout/activity_topic_poll.xml new file mode 100644 index 00000000..60b7c96d --- /dev/null +++ b/app/src/main/res/layout/activity_topic_poll.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_topic_post_row.xml b/app/src/main/res/layout/activity_topic_post_row.xml index 9805fd2b..d0a88796 100644 --- a/app/src/main/res/layout/activity_topic_post_row.xml +++ b/app/src/main/res/layout/activity_topic_post_row.xml @@ -1,5 +1,6 @@ + app:srcCompat="@drawable/ic_default_user_thumbnail_white_24dp" /> - + + + app:srcCompat="@drawable/ic_default_user_thumbnail_white_24dp" /> - - - - - - - - - - + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" + android:background="@color/card_background" + card_view:hint="Post message" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_upload.xml b/app/src/main/res/layout/activity_upload.xml new file mode 100644 index 00000000..d2f81b4c --- /dev/null +++ b/app/src/main/res/layout/activity_upload.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_upload_fields_builder.xml b/app/src/main/res/layout/activity_upload_fields_builder.xml new file mode 100644 index 00000000..af3daae6 --- /dev/null +++ b/app/src/main/res/layout/activity_upload_fields_builder.xml @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_create_link.xml b/app/src/main/res/layout/dialog_create_link.xml new file mode 100644 index 00000000..1901ed8b --- /dev/null +++ b/app/src/main/res/layout/dialog_create_link.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/editor_view.xml b/app/src/main/res/layout/editor_view.xml new file mode 100644 index 00000000..b95ecc61 --- /dev/null +++ b/app/src/main/res/layout/editor_view.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/editor_view_color_picker.xml b/app/src/main/res/layout/editor_view_color_picker.xml new file mode 100644 index 00000000..b71214e1 --- /dev/null +++ b/app/src/main/res/layout/editor_view_color_picker.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/emoji_keyboard.xml b/app/src/main/res/layout/emoji_keyboard.xml new file mode 100644 index 00000000..57fa9606 --- /dev/null +++ b/app/src/main/res/layout/emoji_keyboard.xml @@ -0,0 +1,27 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/emoji_keyboard_grid_cell.xml b/app/src/main/res/layout/emoji_keyboard_grid_cell.xml new file mode 100644 index 00000000..53f119f6 --- /dev/null +++ b/app/src/main/res/layout/emoji_keyboard_grid_cell.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/format_button_grid_cell.xml b/app/src/main/res/layout/format_button_grid_cell.xml new file mode 100644 index 00000000..b91575c0 --- /dev/null +++ b/app/src/main/res/layout/format_button_grid_cell.xml @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_bookmarks_board_row.xml b/app/src/main/res/layout/fragment_bookmarks_board_row.xml deleted file mode 100644 index 621f218e..00000000 --- a/app/src/main/res/layout/fragment_bookmarks_board_row.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_bookmarks_topic_row.xml b/app/src/main/res/layout/fragment_bookmarks_row.xml similarity index 96% rename from app/src/main/res/layout/fragment_bookmarks_topic_row.xml rename to app/src/main/res/layout/fragment_bookmarks_row.xml index 2708318e..b3e17ebe 100644 --- a/app/src/main/res/layout/fragment_bookmarks_topic_row.xml +++ b/app/src/main/res/layout/fragment_bookmarks_row.xml @@ -46,5 +46,5 @@ android:layout_marginEnd="12dp" android:background="@android:color/transparent" android:contentDescription="@string/remove_bookmark" - android:src="@drawable/ic_delete"/> + app:srcCompat="@drawable/ic_delete_accent_24dp"/> \ No newline at end of file diff --git a/app/src/main/res/layout/spinner_dropdown_item.xml b/app/src/main/res/layout/spinner_dropdown_item.xml new file mode 100644 index 00000000..ebe364c6 --- /dev/null +++ b/app/src/main/res/layout/spinner_dropdown_item.xml @@ -0,0 +1,14 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/spinner_item.xml b/app/src/main/res/layout/spinner_item.xml new file mode 100644 index 00000000..1fb5f1c4 --- /dev/null +++ b/app/src/main/res/layout/spinner_item.xml @@ -0,0 +1,14 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/downloads_menu.xml b/app/src/main/res/menu/downloads_menu.xml new file mode 100644 index 00000000..4cee5c91 --- /dev/null +++ b/app/src/main/res/menu/downloads_menu.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/topic_menu.xml b/app/src/main/res/menu/topic_menu.xml index a6321db2..cd10259d 100644 --- a/app/src/main/res/menu/topic_menu.xml +++ b/app/src/main/res/menu/topic_menu.xml @@ -3,19 +3,19 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml index 72e2ac82..7011b5f0 100644 --- a/app/src/main/res/values-v21/styles.xml +++ b/app/src/main/res/values-v21/styles.xml @@ -1,27 +1,9 @@ - - diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml index e1c4971b..ea1b50c0 100644 --- a/app/src/main/res/values-w820dp/dimens.xml +++ b/app/src/main/res/values-w820dp/dimens.xml @@ -9,5 +9,6 @@ 144dp 64dp 40dp + 16sp 24sp diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml new file mode 100644 index 00000000..b00e9866 --- /dev/null +++ b/app/src/main/res/values/arrays.xml @@ -0,0 +1,13 @@ + + + + Recent + Forum + Unread + + + 0 + 1 + 2 + + \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml new file mode 100644 index 00000000..a086e88b --- /dev/null +++ b/app/src/main/res/values/attrs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index c864d4e3..f2209027 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -16,12 +16,35 @@ #323232 #3C3F41 #8B8B8B - #FF9800 + #FAA61A #FFFFFF #CCCCCC #E7E7E7 #D926A69A + #D92B2B2B #E91E63 + @color/primary_text + + #FF0000 + #800000 + #A52A2A + #FFA500 + #FFFF00 + #808000 + #008000 + #800080 + #FF00FF + #FFC0CB + #F5F5DC + #00FF00 + #32CD32 + #008080 + #00FFFF + #0000FF + #000080 + #000000 + #808080 + #C0C0C0 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 20a265af..ea69690c 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -7,5 +7,8 @@ 36dp 16dp 10dp + 16sp 24sp + 24dp + 6dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index df0d3cd4..bc145117 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,10 +6,16 @@ Authenticating… Logout Downloads + Upload + Settings About Home Bookmarks Info + OK + Cancel + "To use mTHMMY you have to agree to our Privacy Policy by choosing one of the options below. Choose \"Yes, I want to help\", if you consent to the collection of anonymized data that will help us improve the app. Otherwise, choose \"Nope, leave me alone\". You can change your preferences any time through the app's Settings. + user_consent_shared_preference_key thmmy.gr @@ -37,7 +43,10 @@ Post Thumbnail Quote button - Share button + Overflow menu button + Share + Delete + Edit #%1$d first previous @@ -45,8 +54,20 @@ next last Quick reply… - Subject… - Submit + Subject… + Submit + Message… + Could not connect to thmmy.gr\n\nTap to retry + Network error + retry + This topic is either missing or off limits to you + Remove vote + show results + + You may only select %d option + You may only select %d options + + hide results Username @@ -69,11 +90,13 @@ Open Source The source code of mTHMMY can be found on Github (https://github.com/ThmmyNoLife/mTHMMY) along with further details of how one can contribute. You should see a funny pic! + Privacy policy Remove You have no bookmarked boards You have no bookmarked topics + Toggle Notification @@ -87,17 +110,94 @@ - - - - Toggle Notification + File \"%1$s\" already exists. Download again?" Download Symbol - Cancel Open Download + + + Upload + + + Generate title and description + Title + Description + Select file + Take photo + Select a category + + + Select type of upload + Exam subjects + Exam solutions + Course notes + Select period + February + June + September + Select year + Year + Generate + Upload fields generator + + + Settings + Settings + + App + Default home tab + Sets a home screen tab as default + Default home tab + + Notifications + Vibration + Notifications led + Enables/disables the notifications led (if the device has one) + Notifications sound + Sets your preferred notification sound + + Posting + App signature + Appends a \"sent from mTHMMY\" message to your posts + + Uploading + App signature + Appends an \"uploaded from mTHMMY\" message to the descriptions of your uploads + + Privacy + pref_privacy_crashlytics_enable_key + Crash data reports + Automatically send us anonymized reports of errors and crashes + pref_privacy_analytics_enable_key + Analytics data reports + Automatically send us anonymized data for analytical purposes + + + Black + Red + Yellow + Pink + Green + Purple + Orange + Blue + Beige + Brown + Teal + Navy + Maroon + Lime Green + Create link + Link URL + Link text + Required + + + New topic + Create topic diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 3f32d79c..9d79d36d 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,8 +1,6 @@ - - - - + + + + + + + + + + + + - + + + + + + diff --git a/app/src/main/res/xml-v26/app_preferences_guest.xml b/app/src/main/res/xml-v26/app_preferences_guest.xml new file mode 100644 index 00000000..ee4ff969 --- /dev/null +++ b/app/src/main/res/xml-v26/app_preferences_guest.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/xml-v26/app_preferences_user.xml b/app/src/main/res/xml-v26/app_preferences_user.xml new file mode 100644 index 00000000..4b62ebdb --- /dev/null +++ b/app/src/main/res/xml-v26/app_preferences_user.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/xml/app_preferences_guest.xml b/app/src/main/res/xml/app_preferences_guest.xml new file mode 100644 index 00000000..4aa2227f --- /dev/null +++ b/app/src/main/res/xml/app_preferences_guest.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/app_preferences_user.xml b/app/src/main/res/xml/app_preferences_user.xml new file mode 100644 index 00000000..4c7c7f6b --- /dev/null +++ b/app/src/main/res/xml/app_preferences_user.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 42582a20..11cbc2e0 100644 --- a/build.gradle +++ b/build.gradle @@ -8,9 +8,9 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.3' - classpath 'com.google.gms:google-services:4.0.1' - classpath 'io.fabric.tools:gradle:1.25.4' + classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'com.google.gms:google-services:4.1.0' + classpath 'io.fabric.tools:gradle:1.26.1' } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3cae3bf9..07d9d5c1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Apr 07 11:11:36 EEST 2018 +#Fri Sep 28 13:21:54 EEST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip