├── app
├── .gitignore
├── memoria_keystore.jks
├── release
│ └── app-release.aab
├── src
│ ├── main
│ │ ├── res
│ │ │ ├── font
│ │ │ │ └── pacifico.ttf
│ │ │ ├── mipmap
│ │ │ │ ├── logo.png
│ │ │ │ └── logo_round.png
│ │ │ ├── drawable
│ │ │ │ ├── default_map.png
│ │ │ │ ├── play_image.png
│ │ │ │ ├── default_profile.png
│ │ │ │ ├── side_nav_bar.xml
│ │ │ │ ├── layout_border.xml
│ │ │ │ ├── ic_comment.xml
│ │ │ │ ├── ic_account.xml
│ │ │ │ ├── ic_add_circle.xml
│ │ │ │ ├── like_icon_grey.xml
│ │ │ │ ├── like_icon_red.xml
│ │ │ │ ├── default_audio.xml
│ │ │ │ ├── ic_password.xml
│ │ │ │ └── night_mode.xml
│ │ │ ├── drawable-nodpi
│ │ │ │ └── example_appwidget_preview.png
│ │ │ ├── values-land
│ │ │ │ └── dimens.xml
│ │ │ ├── values
│ │ │ │ ├── preloaded_fonts.xml
│ │ │ │ ├── drawables.xml
│ │ │ │ ├── colors.xml
│ │ │ │ ├── styles.xml
│ │ │ │ ├── dimens.xml
│ │ │ │ ├── strings.xml
│ │ │ │ └── font_certs.xml
│ │ │ ├── values-v21
│ │ │ │ └── styles.xml
│ │ │ ├── values-v14
│ │ │ │ └── dimens.xml
│ │ │ ├── values-sw600dp
│ │ │ │ └── dimens.xml
│ │ │ ├── layout
│ │ │ │ ├── activity_maps.xml
│ │ │ │ ├── content_main.xml
│ │ │ │ ├── activity_main.xml
│ │ │ │ ├── widget_activity.xml
│ │ │ │ ├── fragment_home.xml
│ │ │ │ ├── app_bar_main.xml
│ │ │ │ ├── widget_row_item.xml
│ │ │ │ ├── nav_header_main.xml
│ │ │ │ ├── fragment_gallery.xml
│ │ │ │ ├── comments_card.xml
│ │ │ │ ├── activity_settings.xml
│ │ │ │ ├── activity_new_memory.xml
│ │ │ │ ├── activity_store_memory.xml
│ │ │ │ ├── activity_login.xml
│ │ │ │ ├── activity_register.xml
│ │ │ │ ├── activity_comment.xml
│ │ │ │ └── memory_card.xml
│ │ │ ├── drawable-v21
│ │ │ │ ├── ic_menu_slideshow.xml
│ │ │ │ ├── ic_menu_gallery.xml
│ │ │ │ └── ic_menu_camera.xml
│ │ │ ├── xml
│ │ │ │ └── widget_activity_info.xml
│ │ │ ├── values-night
│ │ │ │ ├── colors.xml
│ │ │ │ ├── styles.xml
│ │ │ │ └── strings.xml
│ │ │ ├── menu
│ │ │ │ ├── activity_main_drawer.xml
│ │ │ │ └── main.xml
│ │ │ └── navigation
│ │ │ │ └── mobile_navigation.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── example
│ │ │ │ └── memoria
│ │ │ │ ├── model
│ │ │ │ ├── MemoryId.java
│ │ │ │ ├── Comment.java
│ │ │ │ └── Memory.java
│ │ │ │ ├── ui
│ │ │ │ ├── home
│ │ │ │ │ ├── HomeViewModel.java
│ │ │ │ │ └── HomeFragment.java
│ │ │ │ └── gallery
│ │ │ │ │ ├── GalleryViewModel.java
│ │ │ │ │ └── GalleryFragment.java
│ │ │ │ ├── database
│ │ │ │ ├── CommentDao.java
│ │ │ │ ├── ViewModel.java
│ │ │ │ └── CommentsDatabase.java
│ │ │ │ ├── widget
│ │ │ │ ├── WidgetActivity.java
│ │ │ │ └── WidgetService.java
│ │ │ │ ├── loadMemory
│ │ │ │ ├── CommentsAdapter.java
│ │ │ │ ├── PostAdapter.java
│ │ │ │ └── CommentActivity.java
│ │ │ │ ├── LoginActivity.java
│ │ │ │ ├── signup
│ │ │ │ ├── RegisterActivity.java
│ │ │ │ └── SettingsActivity.java
│ │ │ │ ├── newMemory
│ │ │ │ ├── NewMemoryActivity.java
│ │ │ │ └── StoreMemory.java
│ │ │ │ ├── maps
│ │ │ │ └── MapsActivity.java
│ │ │ │ └── MainActivity.java
│ │ └── AndroidManifest.xml
│ ├── test
│ │ └── java
│ │ │ └── com
│ │ │ └── example
│ │ │ └── memoria
│ │ │ └── ExampleUnitTest.java
│ ├── release
│ │ └── res
│ │ │ └── values
│ │ │ └── google_maps_api.xml
│ ├── androidTest
│ │ └── java
│ │ │ └── com
│ │ │ └── example
│ │ │ └── memoria
│ │ │ └── ExampleInstrumentedTest.java
│ └── debug
│ │ └── res
│ │ └── values
│ │ └── google_maps_api.xml
├── proguard-rules.pro
├── google-services.json
└── build.gradle
├── settings.gradle
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── .idea
├── vcs.xml
├── runConfigurations.xml
├── gradle.xml
├── misc.xml
└── codeStyles
│ └── Project.xml
├── .gitignore
├── LICENSE
├── gradle.properties
├── gradlew.bat
└── gradlew
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | rootProject.name='Memoria'
2 | include ':app'
3 |
--------------------------------------------------------------------------------
/app/memoria_keystore.jks:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saisukesh04/Memoria/HEAD/app/memoria_keystore.jks
--------------------------------------------------------------------------------
/app/release/app-release.aab:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saisukesh04/Memoria/HEAD/app/release/app-release.aab
--------------------------------------------------------------------------------
/app/src/main/res/font/pacifico.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saisukesh04/Memoria/HEAD/app/src/main/res/font/pacifico.ttf
--------------------------------------------------------------------------------
/app/src/main/res/mipmap/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saisukesh04/Memoria/HEAD/app/src/main/res/mipmap/logo.png
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saisukesh04/Memoria/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/app/src/main/res/mipmap/logo_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saisukesh04/Memoria/HEAD/app/src/main/res/mipmap/logo_round.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/default_map.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saisukesh04/Memoria/HEAD/app/src/main/res/drawable/default_map.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/play_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saisukesh04/Memoria/HEAD/app/src/main/res/drawable/play_image.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/default_profile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saisukesh04/Memoria/HEAD/app/src/main/res/drawable/default_profile.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-nodpi/example_appwidget_preview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saisukesh04/Memoria/HEAD/app/src/main/res/drawable-nodpi/example_appwidget_preview.png
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/values-land/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 | 16dp
3 | 70dp
4 | 220dp
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/values/preloaded_fonts.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - @font/pacifico
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/caches
5 | /.idea/libraries
6 | /.idea/modules.xml
7 | /.idea/workspace.xml
8 | /.idea/navEditor.xml
9 | /.idea/assetWizardSettings.xml
10 | .DS_Store
11 | /build
12 | /captures
13 | .externalNativeBuild
14 | .cxx
15 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Thu May 07 20:19:58 IST 2020
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v21/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v14/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
8 | 0dp
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/side_nav_bar.xml:
--------------------------------------------------------------------------------
1 |
3 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/layout_border.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/model/MemoryId.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.model;
2 |
3 | import androidx.annotation.NonNull;
4 |
5 | import com.google.firebase.database.Exclude;
6 |
7 | public class MemoryId {
8 |
9 | @Exclude
10 | public String MemoryId;
11 |
12 | public T withId (@NonNull final String id){
13 | this.MemoryId = id;
14 | return (T) this;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_comment.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw600dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 | 16dp
3 | 90dp
4 | 300dp
5 | 40sp
6 | 200dp
7 |
8 | 17sp
9 | 55dp
10 | 24sp
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_account.xml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_maps.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_add_circle.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/like_icon_grey.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/like_icon_red.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/test/java/com/example/memoria/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v21/ic_menu_slideshow.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v21/ic_menu_gallery.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/default_audio.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/widget_activity_info.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/values/drawables.xml:
--------------------------------------------------------------------------------
1 |
2 | - @android:drawable/ic_menu_camera
3 | - @android:drawable/ic_menu_gallery
4 | - @android:drawable/ic_menu_manage
5 | - @android:drawable/ic_menu_share
6 | - @android:drawable/ic_menu_send
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #6200EE
4 | #3700B3
5 | #03DAC5
6 |
7 | #FFFFFF
8 | #000000
9 |
10 | #FFFFFF
11 | #000000
12 | #FFFFFF
13 | #808080
14 |
15 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/ui/home/HomeViewModel.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.ui.home;
2 |
3 | import androidx.lifecycle.LiveData;
4 | import androidx.lifecycle.MutableLiveData;
5 | import androidx.lifecycle.ViewModel;
6 |
7 | public class HomeViewModel extends ViewModel {
8 |
9 | private MutableLiveData mText;
10 |
11 | public HomeViewModel() {
12 | mText = new MutableLiveData<>();
13 | mText.setValue("This is home fragment");
14 | }
15 |
16 | public LiveData getText() {
17 | return mText;
18 | }
19 | }
--------------------------------------------------------------------------------
/app/src/main/res/values-night/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #03DAC5
4 | #03DAC5
5 | #6200EE
6 |
7 | #000000
8 | #FFFFFF
9 |
10 | #2D313D
11 | #FFFFFF
12 | #3C3C3C
13 | #AAAAAA
14 |
15 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_password.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/ui/gallery/GalleryViewModel.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.ui.gallery;
2 |
3 | import androidx.lifecycle.LiveData;
4 | import androidx.lifecycle.MutableLiveData;
5 | import androidx.lifecycle.ViewModel;
6 |
7 | public class GalleryViewModel extends ViewModel {
8 |
9 | private MutableLiveData mText;
10 |
11 | public GalleryViewModel() {
12 | mText = new MutableLiveData<>();
13 | mText.setValue("This is gallery fragment");
14 | }
15 |
16 | public LiveData getText() {
17 | return mText;
18 | }
19 | }
--------------------------------------------------------------------------------
/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v21/ic_menu_camera.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/activity_main_drawer.xml:
--------------------------------------------------------------------------------
1 |
2 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/main.xml:
--------------------------------------------------------------------------------
1 |
2 |
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/database/CommentDao.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.database;
2 |
3 | import androidx.room.Dao;
4 | import androidx.room.Insert;
5 | import androidx.room.OnConflictStrategy;
6 | import androidx.room.Query;
7 | import androidx.room.Update;
8 |
9 | import com.example.memoria.model.Comment;
10 |
11 | import java.util.List;
12 |
13 | @Dao
14 | public interface CommentDao {
15 |
16 | @Query("SELECT * FROM comment")
17 | List loadAllComments();
18 |
19 | @Insert
20 | void insertComments(Comment comment);
21 |
22 | @Update(onConflict = OnConflictStrategy.REPLACE)
23 | void updateComments(Comment comment);
24 |
25 | @Query("DELETE FROM comment")
26 | void deleteAll();
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/night_mode.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
10 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/database/ViewModel.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.database;
2 |
3 | import android.app.Application;
4 |
5 | import androidx.annotation.NonNull;
6 | import androidx.lifecycle.AndroidViewModel;
7 |
8 | import com.example.memoria.model.Comment;
9 |
10 | import java.util.List;
11 |
12 | public class ViewModel extends AndroidViewModel {
13 |
14 | private List comments;
15 |
16 | public ViewModel(@NonNull Application application) {
17 | super(application);
18 | CommentsDatabase commentsDatabase = CommentsDatabase.getInstance(this.getApplication());
19 | comments = commentsDatabase.CommentDao().loadAllComments();
20 | }
21 |
22 | public List getComment() {
23 | return comments;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/res/values-night/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
--------------------------------------------------------------------------------
/app/src/release/res/values/google_maps_api.xml:
--------------------------------------------------------------------------------
1 |
2 |
19 | YOUR_KEY_HERE
20 |
21 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/example/memoria/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria;
2 |
3 | import android.content.Context;
4 |
5 | import androidx.test.platform.app.InstrumentationRegistry;
6 | import androidx.test.ext.junit.runners.AndroidJUnit4;
7 |
8 | import org.junit.Test;
9 | import org.junit.runner.RunWith;
10 |
11 | import static org.junit.Assert.*;
12 |
13 | /**
14 | * Instrumented test, which will execute on an Android device.
15 | *
16 | * @see Testing documentation
17 | */
18 | @RunWith(AndroidJUnit4.class)
19 | public class ExampleInstrumentedTest {
20 | @Test
21 | public void useAppContext() {
22 | // Context of the app under test.
23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
24 |
25 | assertEquals("com.example.memoria", appContext.getPackageName());
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 18dp
4 | 16dp
5 | 8dp
6 | 176dp
7 | 16dp
8 | 28sp
9 |
10 | 8dp
11 | 64dp
12 | 120dp
13 | 200dp
14 |
15 | 14sp
16 | 40dp
17 | 20sp
18 |
19 |
23 | 8dp
24 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/content_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
20 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
15 |
16 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/widget_activity.xml:
--------------------------------------------------------------------------------
1 |
7 |
8 |
19 |
20 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/app/src/debug/res/values/google_maps_api.xml:
--------------------------------------------------------------------------------
1 |
2 |
23 | AIzaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
24 |
25 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Sai Sukesh
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/database/CommentsDatabase.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.database;
2 |
3 | import android.content.Context;
4 |
5 | import androidx.room.Database;
6 | import androidx.room.Room;
7 | import androidx.room.RoomDatabase;
8 |
9 | import com.example.memoria.model.Comment;
10 |
11 | @Database(entities = {Comment.class},version = 1, exportSchema = false)
12 | public abstract class CommentsDatabase extends RoomDatabase {
13 |
14 | private static final Object LOCK = new Object();
15 | private static final String DATABASE_NAME = "comment";
16 | private static CommentsDatabase sInstance;
17 |
18 | public static CommentsDatabase getInstance(Context context) {
19 | if (sInstance == null) {
20 | synchronized (LOCK) {
21 | sInstance = Room.databaseBuilder(context.getApplicationContext(),
22 | CommentsDatabase.class, CommentsDatabase.DATABASE_NAME)
23 | .allowMainThreadQueries()
24 | .build();
25 | }
26 | }
27 | return sInstance;
28 | }
29 |
30 | public abstract CommentDao CommentDao();
31 | }
32 |
--------------------------------------------------------------------------------
/app/google-services.json:
--------------------------------------------------------------------------------
1 | {
2 | "project_info": {
3 | "project_number": "184174357057",
4 | "firebase_url": "https://memoria-5e59c.firebaseio.com",
5 | "project_id": "memoria-5e59c",
6 | "storage_bucket": "memoria-5e59c.appspot.com"
7 | },
8 | "client": [
9 | {
10 | "client_info": {
11 | "mobilesdk_app_id": "1:184174357057:android:36cf72241c8cedf508b4c0",
12 | "android_client_info": {
13 | "package_name": "com.example.memoria"
14 | }
15 | },
16 | "oauth_client": [
17 | {
18 | "client_id": "184174357057-03fvs6eo6qibchbm2o5qhlvuhtk8i17f.apps.googleusercontent.com",
19 | "client_type": 3
20 | }
21 | ],
22 | "api_key": [
23 | {
24 | "current_key": "AIzaSyCthlAHs7wEvfx8s-eaqDJclGhalNdF9Xc"
25 | }
26 | ],
27 | "services": {
28 | "appinvite_service": {
29 | "other_platform_oauth_client": [
30 | {
31 | "client_id": "184174357057-03fvs6eo6qibchbm2o5qhlvuhtk8i17f.apps.googleusercontent.com",
32 | "client_type": 3
33 | }
34 | ]
35 | }
36 | }
37 | }
38 | ],
39 | "configuration_version": "1"
40 | }
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | package com.example.memoria.adapter;
2 |
3 | import android.content.Context;
4 | import android.net.Uri;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.view.ViewGroup;
8 | import android.widget.ImageView;
9 | import android.widget.TextView;
10 | import android.widget.Toast;
11 |
12 | import androidx.annotation.NonNull;
13 | import androidx.recyclerview.widget.RecyclerView;
14 |
15 | import com.bumptech.glide.Glide;
16 | import com.example.memoria.R;
17 | import com.example.memoria.model.Memory;
18 | import com.google.android.exoplayer2.ui.SimpleExoPlayerView;
19 | import com.google.firebase.database.DataSnapshot;
20 | import com.google.firebase.database.DatabaseError;
21 | import com.google.firebase.database.DatabaseReference;
22 | import com.google.firebase.database.FirebaseDatabase;
23 | import com.google.firebase.database.ValueEventListener;
24 |
25 | import java.util.List;
26 | import java.util.Map;
27 |
28 | import de.hdodenhof.circleimageview.CircleImageView;
29 |
30 | import static com.example.memoria.newMemory.NewMemoryActivity.AUDIO_CODE;
31 | import static com.example.memoria.newMemory.NewMemoryActivity.IMAGE_CODE;
32 | import static
33 | android.useAndroidX=true
34 | android.enableJetifier=true
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/model/Comment.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.model;
2 |
3 | import androidx.annotation.NonNull;
4 | import androidx.room.Entity;
5 | import androidx.room.Ignore;
6 | import androidx.room.PrimaryKey;
7 |
8 | @Entity(tableName = "comment")
9 | public class Comment {
10 |
11 | @NonNull
12 | @PrimaryKey
13 | private String timestamp;
14 | private String username, comment;
15 |
16 | @Ignore
17 | public Comment(){
18 | }
19 |
20 | public Comment(String username, String comment, String timestamp) {
21 | this.username = username;
22 | this.comment = comment;
23 | this.timestamp = timestamp;
24 | }
25 |
26 | public String getUsername() {
27 | return username;
28 | }
29 |
30 | public void setUsername(String username) {
31 | this.username = username;
32 | }
33 |
34 | public String getComment() {
35 | return comment;
36 | }
37 |
38 | public void setComment(String comment) {
39 | this.comment = comment;
40 | }
41 |
42 | public String getTimestamp() {
43 | return timestamp;
44 | }
45 |
46 | public void setTimestamp(String timestamp) {
47 | this.timestamp = timestamp;
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_home.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
18 |
19 |
28 |
29 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/app_bar_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
20 |
21 |
22 |
23 |
24 |
25 |
32 |
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/model/Memory.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.model;
2 |
3 | import android.text.format.DateFormat;
4 |
5 | public class Memory extends MemoryId{
6 |
7 | private String Description, Link, TimeStamp, Type, Username;
8 |
9 | public Memory(){
10 | }
11 |
12 | public Memory(String description, String link, String timeStamp, String type, String username) {
13 | Description = description;
14 | Link = link;
15 | TimeStamp = timeStamp;
16 | Type = type;
17 | Username = username;
18 | }
19 |
20 | public String getDescription() {
21 | return Description;
22 | }
23 |
24 | public void setDescription(String description) {
25 | Description = description;
26 | }
27 |
28 | public String getLink() {
29 | return Link;
30 | }
31 |
32 | public void setLink(String link) {
33 | Link = link;
34 | }
35 |
36 | public String getTimeStamp() {
37 | return DateFormat.format("MM/dd/yyyy", Long.parseLong(TimeStamp)).toString();
38 | }
39 |
40 | public void setTimeStamp(String timeStamp) {
41 | TimeStamp = timeStamp;
42 | }
43 |
44 | public String getType() {
45 | return Type;
46 | }
47 |
48 | public void setType(String type) {
49 | Type = type;
50 | }
51 |
52 | public String getUsername() {
53 | return Username;
54 | }
55 |
56 | public void setUsername(String username) {
57 | Username = username;
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/app/src/main/res/navigation/mobile_navigation.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
13 |
14 |
17 |
18 |
23 |
26 |
27 |
30 |
31 |
32 |
37 |
38 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/widget_row_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
22 |
23 |
34 |
35 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/nav_header_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
14 |
15 |
24 |
25 |
34 |
35 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_gallery.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
20 |
21 |
32 |
33 |
41 |
42 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/widget/WidgetActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.widget;
2 |
3 | import android.app.PendingIntent;
4 | import android.appwidget.AppWidgetManager;
5 | import android.appwidget.AppWidgetProvider;
6 | import android.content.Context;
7 | import android.content.Intent;
8 | import android.net.Uri;
9 | import android.widget.RemoteViews;
10 |
11 | import com.example.memoria.MainActivity;
12 | import com.example.memoria.R;
13 |
14 | /**
15 | * Implementation of App Widget functionality.
16 | */
17 | public class WidgetActivity extends AppWidgetProvider {
18 |
19 | static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
20 |
21 | Intent intent = new Intent(context, MainActivity.class);
22 | PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
23 |
24 | Intent serviceIntent = new Intent(context, WidgetService.class);
25 | serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
26 | serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)));
27 |
28 | // Construct the RemoteViews object
29 | RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_activity);
30 | views.setOnClickPendingIntent(R.id.appwidget_text, pendingIntent);
31 | views.setRemoteAdapter(R.id.list_view_comments, serviceIntent);
32 | appWidgetManager.updateAppWidget(appWidgetId, views);
33 | }
34 |
35 | @Override
36 | public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
37 | // There may be multiple widgets active, so update all of them
38 | for (int appWidgetId : appWidgetIds) {
39 | updateAppWidget(context, appWidgetManager, appWidgetId);
40 | }
41 | }
42 |
43 | @Override
44 | public void onEnabled(Context context) {
45 | // Enter relevant functionality for when the first widget is created
46 | }
47 |
48 | @Override
49 | public void onDisabled(Context context) {
50 | // Enter relevant functionality for when the last widget is disabled
51 | }
52 | }
53 |
54 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | set DIRNAME=%~dp0
12 | if "%DIRNAME%" == "" set DIRNAME=.
13 | set APP_BASE_NAME=%~n0
14 | set APP_HOME=%DIRNAME%
15 |
16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 | set DEFAULT_JVM_OPTS=
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 |
53 | :win9xME_args
54 | @rem Slurp the command line arguments.
55 | set CMD_LINE_ARGS=
56 | set _SKIP=2
57 |
58 | :win9xME_args_slurp
59 | if "x%~1" == "x" goto execute
60 |
61 | set CMD_LINE_ARGS=%*
62 |
63 | :execute
64 | @rem Setup the command line
65 |
66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67 |
68 | @rem Execute Gradle
69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70 |
71 | :end
72 | @rem End local scope for the variables with windows NT shell
73 | if "%ERRORLEVEL%"=="0" goto mainEnd
74 |
75 | :fail
76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77 | rem the _cmd.exe /c_ return code!
78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79 | exit /b 1
80 |
81 | :mainEnd
82 | if "%OS%"=="Windows_NT" endlocal
83 |
84 | :omega
85 |
--------------------------------------------------------------------------------
/app/src/main/res/values-night/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Memoria
3 | Open navigation drawer
4 | Close navigation drawer
5 | Android Studio
6 | android.studio@android.com
7 | Navigation header
8 | Logout
9 | Settings
10 |
11 | Home
12 | Gallery
13 |
14 | Home Second
15 |
16 | Login
17 | E-mail
18 | Password
19 | Login
20 | New User?
21 |
22 | Register
23 | Confirm Password
24 | Already have an account
25 | Sign Up
26 | Username
27 | Save Profile
28 |
29 | New Memory
30 | Image Memory
31 | Video Memory
32 | Audio Memory
33 | Location Memory
34 | Continue
35 | Add Description....
36 | Post Memory
37 |
38 | Upload Date
39 | lorem ipsum dolor sit amet soluta regione urbanitas vis qui elit populo ut.
40 | 0 Likes
41 |
42 | ca-app-pub-xxxxxxxxxxxxxxxx~xxxxxxxxxx
43 | ca-app-pub-3940256099942544/6300978111
44 | "ca-app-pub-3940256099942544/1033173712"
45 |
46 | 0 Comments
47 | Comment...
48 | Send Comment
49 | Map
50 | Change Mode
51 |
52 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/comments_card.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
16 |
17 |
27 |
28 |
41 |
42 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
17 |
18 |
19 |
20 |
21 |
22 |
25 |
26 |
27 |
30 |
31 |
34 |
35 |
36 |
39 |
40 |
41 |
42 |
45 |
46 |
49 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
62 |
63 |
65 |
66 |
67 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/widget/WidgetService.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.widget;
2 |
3 | import android.appwidget.AppWidgetManager;
4 | import android.content.Context;
5 | import android.content.Intent;
6 | import android.util.Log;
7 | import android.widget.RemoteViews;
8 | import android.widget.RemoteViewsService;
9 |
10 | import com.example.memoria.R;
11 | import com.example.memoria.database.CommentsDatabase;
12 | import com.example.memoria.model.Comment;
13 |
14 | import java.util.ArrayList;
15 | import java.util.List;
16 |
17 | public class WidgetService extends RemoteViewsService {
18 | @Override
19 | public RemoteViewsFactory onGetViewFactory(Intent intent) {
20 | return new WidgetViewsFactory(getApplicationContext(), intent);
21 | }
22 |
23 | class WidgetViewsFactory implements RemoteViewsFactory {
24 |
25 | private Context context;
26 | private int appWidgetId;
27 | private List commentsList = new ArrayList<>();
28 | CommentsDatabase mDatabase;
29 |
30 | public WidgetViewsFactory(Context context, Intent intent) {
31 | this.context = context;
32 | this.appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
33 | }
34 |
35 | @Override
36 | public void onCreate() {
37 | }
38 |
39 | @Override
40 | public void onDataSetChanged() {
41 | mDatabase = CommentsDatabase.getInstance(context);
42 | commentsList.clear();
43 | Log.i("Info: ", "Cleared");
44 | List comments = mDatabase.CommentDao().loadAllComments();
45 | commentsList.addAll(comments);
46 | Log.i("Info: ", "Cleared: " + commentsList);
47 | }
48 |
49 | @Override
50 | public void onDestroy() {
51 | }
52 |
53 | @Override
54 | public int getCount() {
55 | return commentsList != null? commentsList.size(): 0;
56 | }
57 |
58 | @Override
59 | public RemoteViews getViewAt(int position) {
60 | RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget_row_item);
61 | Comment comment = commentsList.get(position);
62 | remoteView.setTextViewText(R.id.widget_username, comment.getUsername());
63 | remoteView.setTextViewText(R.id.widget_comment, comment.getComment());
64 | return remoteView;
65 | }
66 |
67 | @Override
68 | public RemoteViews getLoadingView() {
69 | return null;
70 | }
71 |
72 | @Override
73 | public int getViewTypeCount() {
74 | return 1;
75 | }
76 |
77 | @Override
78 | public long getItemId(int position) {
79 | return position;
80 | }
81 |
82 | @Override
83 | public boolean hasStableIds() {
84 | return true;
85 | }
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
21 |
22 |
34 |
35 |
41 |
42 |
43 |
55 |
56 |
66 |
67 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 | apply plugin: 'com.google.gms.google-services'
3 |
4 | android {
5 | signingConfigs {
6 | release {
7 | keyAlias "key0"
8 | keyPassword "Memoria@Key"
9 | storeFile file("memoria_keystore.jks")
10 | storePassword "Memoria@Key"
11 | }
12 | }
13 | compileSdkVersion 29
14 | buildToolsVersion "29.0.3"
15 |
16 | defaultConfig {
17 | applicationId "com.example.memoria"
18 | minSdkVersion 16
19 | targetSdkVersion 29
20 | versionCode 1
21 | multiDexEnabled true
22 | versionName "1.0"
23 |
24 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
25 | vectorDrawables.useSupportLibrary = true
26 | }
27 |
28 | buildTypes {
29 | release {
30 | minifyEnabled false
31 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
32 | signingConfig signingConfigs.release
33 | }
34 | }
35 |
36 | compileOptions {
37 | sourceCompatibility JavaVersion.VERSION_1_8
38 | targetCompatibility JavaVersion.VERSION_1_8
39 | }
40 | }
41 |
42 | dependencies {
43 | implementation fileTree(dir: 'libs', include: ['*.jar'])
44 |
45 | implementation 'androidx.appcompat:appcompat:1.1.0'
46 | implementation 'androidx.legacy:legacy-support-v4:1.0.0'
47 | implementation 'com.google.android.material:material:1.1.0'
48 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
49 | implementation 'androidx.navigation:navigation-fragment:2.2.2'
50 | implementation 'androidx.navigation:navigation-ui:2.2.2'
51 | implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
52 |
53 | implementation 'com.google.firebase:firebase-auth:19.3.1'
54 | implementation 'com.google.firebase:firebase-database:19.3.0'
55 | implementation 'com.google.firebase:firebase-storage:19.1.1'
56 |
57 | implementation 'com.google.android.gms:play-services-maps:17.0.0'
58 | testImplementation 'junit:junit:4.12'
59 | androidTestImplementation 'androidx.test.ext:junit:1.1.1'
60 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
61 |
62 | implementation 'com.jakewharton:butterknife:10.2.1'
63 | annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1'
64 |
65 | implementation 'de.hdodenhof:circleimageview:3.1.0'
66 | api 'com.theartofdev.edmodo:android-image-cropper:2.8.0'
67 |
68 | implementation 'com.github.bumptech.glide:glide:4.11.0'
69 | annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
70 |
71 | implementation 'com.google.android.exoplayer:exoplayer:2.10.3'
72 | implementation 'com.google.android.exoplayer:exoplayer-core:2.10.3'
73 | implementation 'com.google.android.exoplayer:exoplayer-dash:2.10.3'
74 | implementation 'com.google.android.exoplayer:exoplayer-ui:2.10.3'
75 |
76 | implementation 'com.google.android.gms:play-services-ads:19.1.0'
77 | implementation 'androidx.multidex:multidex:2.0.1'
78 |
79 | implementation "android.arch.persistence.room:runtime:1.1.1"
80 | annotationProcessor "android.arch.persistence.room:compiler:1.1.1"
81 | }
82 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Memoria
3 | Open navigation drawer
4 | Close navigation drawer
5 | Android Studio
6 | android.studio@android.com
7 | Navigation header
8 | Logout
9 | Settings
10 |
11 | Home
12 | Gallery
13 |
14 | Home Second
15 |
16 | Login
17 | E-mail
18 | Password
19 | Login
20 | New User?
21 |
22 | Register
23 | Confirm Password
24 | Already have an account
25 | Sign Up
26 | Username
27 | Save Profile
28 |
29 | New Memory
30 | Image Memory
31 | Video Memory
32 | Audio Memory
33 | Location Memory
34 | Continue
35 | Add Description....
36 | Post Memory
37 |
38 | Upload Date
39 | lorem ipsum dolor sit amet soluta regione urbanitas vis qui elit populo ut.
40 | 0 Likes
41 |
42 | ca-app-pub-xxxxxxxxxxxxxxxx~xxxxxxxxxx
43 | ca-app-pub-3940256099942544/6300978111
44 | "ca-app-pub-3940256099942544/1033173712"
45 |
46 | 0 Comments
47 | Comment...
48 | Send Comment
49 | Map
50 | Change Mode
51 | EXAMPLE
52 | Add widget
53 | My Memories
54 | Image of the retrieved memory
55 | Image that is going to be uploaded
56 | ImageView to show the retrieved image
57 | like button
58 | "%d Likes"
59 | "%d Comments"
60 | profile Image
61 |
62 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/loadMemory/CommentsAdapter.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.loadMemory;
2 |
3 | import android.content.Context;
4 | import android.net.Uri;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.view.ViewGroup;
8 | import android.widget.TextView;
9 | import android.widget.Toast;
10 |
11 | import androidx.annotation.NonNull;
12 | import androidx.recyclerview.widget.RecyclerView;
13 |
14 | import com.bumptech.glide.Glide;
15 | import com.example.memoria.R;
16 | import com.example.memoria.model.Comment;
17 | import com.google.firebase.database.DataSnapshot;
18 | import com.google.firebase.database.DatabaseError;
19 | import com.google.firebase.database.DatabaseReference;
20 | import com.google.firebase.database.FirebaseDatabase;
21 | import com.google.firebase.database.ValueEventListener;
22 |
23 | import java.util.List;
24 | import java.util.Map;
25 |
26 | import de.hdodenhof.circleimageview.CircleImageView;
27 |
28 | public class CommentsAdapter extends RecyclerView.Adapter {
29 |
30 | private List commentsList;
31 | private Context context;
32 | private DatabaseReference mRef;
33 |
34 | public CommentsAdapter(Context context, List commentsList) {
35 | this.context = context;
36 | this.commentsList = commentsList;
37 | }
38 |
39 | @NonNull
40 | @Override
41 | public CommentsAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
42 | View view= LayoutInflater.from(context).inflate(R.layout.comments_card,parent,false);
43 | mRef = FirebaseDatabase.getInstance().getReference();
44 | return new ViewHolder(view);
45 | }
46 |
47 | @Override
48 | public void onBindViewHolder(@NonNull CommentsAdapter.ViewHolder holder, int position) {
49 | Comment comment = commentsList.get(position);
50 | holder.commentText.setText(comment.getComment());
51 |
52 | mRef.child("Users").addListenerForSingleValueEvent(new ValueEventListener() {
53 | @Override
54 | public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
55 | Map retrieveMap = (Map) dataSnapshot.child(comment.getUsername()).getValue();
56 | holder.usernameCom.setText(String.valueOf(retrieveMap.get("Name")));
57 | Glide.with(context).load(Uri.parse(retrieveMap.get("Image"))).into(holder.userDpCom);
58 | }
59 | @Override
60 | public void onCancelled(@NonNull DatabaseError databaseError) {
61 | Toast.makeText(context,databaseError.getMessage(), Toast.LENGTH_SHORT).show();
62 | }
63 | });
64 | }
65 |
66 | @Override
67 | public int getItemCount() {
68 | return commentsList != null ? commentsList.size() :0;
69 | }
70 |
71 | public class ViewHolder extends RecyclerView.ViewHolder{
72 |
73 | CircleImageView userDpCom;
74 | TextView usernameCom, commentText;
75 |
76 | public ViewHolder(@NonNull View itemView) {
77 | super(itemView);
78 |
79 | userDpCom = itemView.findViewById(R.id.userDpCom);
80 | usernameCom = itemView.findViewById(R.id.usernameCom);
81 | commentText = itemView.findViewById(R.id.commentText);
82 | }
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/app/src/main/res/values/font_certs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - @array/com_google_android_gms_fonts_certs_dev
5 | - @array/com_google_android_gms_fonts_certs_prod
6 |
7 |
8 | -
9 | MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=
10 |
11 |
12 |
13 | -
14 | MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/ui/gallery/GalleryFragment.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.ui.gallery;
2 |
3 | import android.os.Bundle;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 | import android.widget.ProgressBar;
8 | import android.widget.Toast;
9 |
10 | import androidx.annotation.NonNull;
11 | import androidx.fragment.app.Fragment;
12 | import androidx.lifecycle.ViewModelProviders;
13 | import androidx.recyclerview.widget.LinearLayoutManager;
14 | import androidx.recyclerview.widget.RecyclerView;
15 |
16 | import com.example.memoria.R;
17 | import com.example.memoria.loadMemory.PostAdapter;
18 | import com.example.memoria.model.Memory;
19 | import com.google.firebase.database.DataSnapshot;
20 | import com.google.firebase.database.DatabaseError;
21 | import com.google.firebase.database.DatabaseReference;
22 | import com.google.firebase.database.FirebaseDatabase;
23 | import com.google.firebase.database.ValueEventListener;
24 |
25 | import java.util.ArrayList;
26 | import java.util.List;
27 |
28 | import static com.example.memoria.MainActivity.userId;
29 |
30 | public class GalleryFragment extends Fragment {
31 |
32 | private DatabaseReference mRef;
33 | private List listData;
34 | private ProgressBar progressBar;
35 | private RecyclerView myRecyclerView;
36 | private PostAdapter adapter;
37 |
38 | public View onCreateView(@NonNull LayoutInflater inflater,
39 | ViewGroup container, Bundle savedInstanceState) {
40 | GalleryViewModel galleryViewModel = ViewModelProviders.of(this).get(GalleryViewModel.class);
41 | View root = inflater.inflate(R.layout.fragment_gallery, container, false);
42 |
43 | mRef = FirebaseDatabase.getInstance().getReference("Memories");
44 | mRef.keepSynced(true);
45 |
46 | progressBar = root.findViewById(R.id.progressBar2);
47 | myRecyclerView = root.findViewById(R.id.myRecyclerView);
48 | LinearLayoutManager mLayout = new LinearLayoutManager(getContext());
49 |
50 | myRecyclerView.setHasFixedSize(true);
51 | mLayout.setReverseLayout(true);
52 | mLayout.setStackFromEnd(true);
53 | myRecyclerView.setLayoutManager(mLayout);
54 | loadMemories();
55 |
56 | return root;
57 | }
58 |
59 | private void loadMemories() {
60 | listData = new ArrayList<>();
61 | progressBar.setVisibility(View.VISIBLE);
62 | mRef.addListenerForSingleValueEvent(new ValueEventListener() {
63 | @Override
64 | public void onDataChange(DataSnapshot dataSnapshot) {
65 | if (dataSnapshot.exists()){
66 | for (DataSnapshot data : dataSnapshot.getChildren()){
67 | String memoryId = data.getKey();
68 | Memory memory = data.getValue(Memory.class).withId(memoryId);
69 | if(userId.equals(memory.getUsername()))
70 | listData.add(memory);
71 | }
72 | adapter = new PostAdapter(getContext(), listData);
73 | myRecyclerView.setAdapter(adapter);
74 | progressBar.setVisibility(View.INVISIBLE);
75 | }
76 | }
77 | @Override
78 | public void onCancelled(DatabaseError databaseError) {
79 | Toast.makeText(getContext(),databaseError.getMessage(),Toast.LENGTH_SHORT).show();
80 | progressBar.setVisibility(View.INVISIBLE);
81 | }
82 | });
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/LoginActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria;
2 |
3 | import androidx.annotation.NonNull;
4 | import androidx.appcompat.app.AppCompatActivity;
5 |
6 | import android.content.Intent;
7 | import android.os.Bundle;
8 | import android.text.TextUtils;
9 | import android.util.Log;
10 | import android.view.View;
11 | import android.view.inputmethod.InputMethodManager;
12 | import android.widget.Button;
13 | import android.widget.ProgressBar;
14 |
15 | import com.example.memoria.signup.RegisterActivity;
16 | import com.google.android.gms.tasks.OnCompleteListener;
17 | import com.google.android.gms.tasks.Task;
18 | import com.google.android.material.snackbar.Snackbar;
19 | import com.google.android.material.textfield.TextInputEditText;
20 | import com.google.firebase.auth.AuthResult;
21 | import com.google.firebase.auth.FirebaseAuth;
22 |
23 | import butterknife.BindView;
24 | import butterknife.ButterKnife;
25 |
26 | public class LoginActivity extends AppCompatActivity {
27 |
28 | @BindView(R.id.newAccountBtn) Button newAccountBtn;
29 | @BindView(R.id.loginEmail) TextInputEditText loginEmail;
30 | @BindView(R.id.loginPassword) TextInputEditText loginPassword;
31 | @BindView(R.id.loginBtn) Button loginBtn;
32 | @BindView(R.id.loginProgressBar) ProgressBar progressBar;
33 |
34 | private FirebaseAuth mAuth;
35 |
36 | @Override
37 | protected void onCreate(Bundle savedInstanceState) {
38 | super.onCreate(savedInstanceState);
39 | setContentView(R.layout.activity_login);
40 |
41 | ButterKnife.bind(this);
42 | mAuth = FirebaseAuth.getInstance();
43 |
44 | newAccountBtn.setOnClickListener(new View.OnClickListener() {
45 | @Override
46 | public void onClick(View v) {
47 | startActivity(new Intent(LoginActivity.this, RegisterActivity.class));
48 | finish();
49 | }
50 | });
51 |
52 | loginBtn.setOnClickListener(new View.OnClickListener() {
53 | @Override
54 | public void onClick(View v) {
55 | InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
56 | assert imm != null;
57 | imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
58 |
59 | String email = loginEmail.getText().toString();
60 | String password = loginPassword.getText().toString();
61 | if(TextUtils.isEmpty(email) || TextUtils.isEmpty(password)){
62 | Snackbar.make(v, "Please enter all the credentials", Snackbar.LENGTH_LONG).show();
63 | }else {
64 | progressBar.setVisibility(View.VISIBLE);
65 | mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener() {
66 | @Override
67 | public void onComplete(@NonNull Task task) {
68 | if (task.isSuccessful()) {
69 | startActivity(new Intent(LoginActivity.this, MainActivity.class));
70 | finish();
71 | } else {
72 | Log.i("LoginActivity: ", "signInWithEmail:failure", task.getException());
73 | Snackbar.make(v, "Sign-In failed." + task.getException(), Snackbar.LENGTH_LONG).show();
74 | }
75 | progressBar.setVisibility(View.INVISIBLE);
76 | }
77 | });
78 | }
79 | }
80 | });
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/signup/RegisterActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.signup;
2 |
3 | import androidx.annotation.NonNull;
4 | import androidx.appcompat.app.AppCompatActivity;
5 |
6 | import android.content.Intent;
7 | import android.os.Bundle;
8 | import android.text.TextUtils;
9 | import android.util.Log;
10 | import android.view.View;
11 | import android.view.inputmethod.InputMethodManager;
12 | import android.widget.Button;
13 | import android.widget.ProgressBar;
14 |
15 | import com.example.memoria.R;
16 | import com.google.android.gms.tasks.OnCompleteListener;
17 | import com.google.android.gms.tasks.Task;
18 | import com.google.android.material.snackbar.Snackbar;
19 | import com.google.android.material.textfield.TextInputEditText;
20 | import com.google.firebase.auth.AuthResult;
21 | import com.google.firebase.auth.FirebaseAuth;
22 |
23 | import butterknife.BindView;
24 | import butterknife.ButterKnife;
25 |
26 | public class RegisterActivity extends AppCompatActivity {
27 |
28 | @BindView(R.id.regEmail) TextInputEditText regEmail;
29 | @BindView(R.id.regPass) TextInputEditText regPass;
30 | @BindView(R.id.regConfPass) TextInputEditText regConfPass;
31 | @BindView(R.id.signUpBtn) Button signUpBtn;
32 | @BindView(R.id.regProgressBar) ProgressBar progressBar;
33 |
34 | @Override
35 | protected void onCreate(Bundle savedInstanceState) {
36 | super.onCreate(savedInstanceState);
37 | setContentView(R.layout.activity_register);
38 |
39 | ButterKnife.bind(this);
40 |
41 | FirebaseAuth mAuth = FirebaseAuth.getInstance();
42 |
43 | signUpBtn.setOnClickListener(new View.OnClickListener() {
44 | @Override
45 | public void onClick(View v) {
46 | InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
47 | assert imm != null;
48 | imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
49 |
50 | String email = regEmail.getText().toString();
51 | String pass = regPass.getText().toString();
52 | String passConf = regConfPass.getText().toString();
53 |
54 | if(TextUtils.isEmpty(email) || TextUtils.isEmpty(pass) || TextUtils.isEmpty(passConf)){
55 | Snackbar.make(v, "Please fill all entries", Snackbar.LENGTH_LONG).show();
56 | }else if (!pass.equals(passConf)){
57 | Snackbar.make(v, "Passwords do not match", Snackbar.LENGTH_LONG).show();
58 | }else{
59 | progressBar.setVisibility(View.VISIBLE);
60 | mAuth.createUserWithEmailAndPassword(email, pass).addOnCompleteListener(new OnCompleteListener() {
61 | @Override
62 | public void onComplete(@NonNull Task task) {
63 | if (task.isSuccessful()) {
64 | Log.i("RegisterActivity", "createUserWithEmail : success");
65 | Intent intent = new Intent(RegisterActivity.this, SettingsActivity.class);
66 | intent.putExtra("firstTime", true);
67 | startActivity(intent);
68 | finish();
69 | } else {
70 | Log.e("RegisterActivity", "createUserWithEmail : failure", task.getException());
71 | Snackbar.make(v, "Authentication failed. \n" + task.getException(), Snackbar.LENGTH_LONG).show();
72 | }
73 | progressBar.setVisibility(View.INVISIBLE);
74 | }
75 | });
76 | }
77 | }
78 | });
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_new_memory.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
23 |
24 |
33 |
34 |
43 |
44 |
53 |
54 |
63 |
64 |
73 |
74 |
75 |
87 |
--------------------------------------------------------------------------------
/.idea/codeStyles/Project.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | xmlns:android
14 |
15 | ^$
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 | xmlns:.*
25 |
26 | ^$
27 |
28 |
29 | BY_NAME
30 |
31 |
32 |
33 |
34 |
35 |
36 | .*:id
37 |
38 | http://schemas.android.com/apk/res/android
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 | .*:name
48 |
49 | http://schemas.android.com/apk/res/android
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 | name
59 |
60 | ^$
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 | style
70 |
71 | ^$
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 | .*
81 |
82 | ^$
83 |
84 |
85 | BY_NAME
86 |
87 |
88 |
89 |
90 |
91 |
92 | .*
93 |
94 | http://schemas.android.com/apk/res/android
95 |
96 |
97 | ANDROID_ATTRIBUTE_ORDER
98 |
99 |
100 |
101 |
102 |
103 |
104 | .*
105 |
106 | .*
107 |
108 |
109 | BY_NAME
110 |
111 |
112 |
113 |
114 |
115 |
116 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/ui/home/HomeFragment.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.ui.home;
2 |
3 | import android.os.Bundle;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 | import android.widget.ProgressBar;
8 | import android.widget.Toast;
9 |
10 | import androidx.annotation.NonNull;
11 | import androidx.fragment.app.Fragment;
12 | import androidx.recyclerview.widget.LinearLayoutManager;
13 | import androidx.recyclerview.widget.RecyclerView;
14 |
15 | import com.example.memoria.R;
16 | import com.example.memoria.loadMemory.PostAdapter;
17 | import com.example.memoria.model.Memory;
18 | import com.google.firebase.database.DataSnapshot;
19 | import com.google.firebase.database.DatabaseError;
20 | import com.google.firebase.database.DatabaseReference;
21 | import com.google.firebase.database.FirebaseDatabase;
22 | import com.google.firebase.database.ValueEventListener;
23 |
24 | import java.util.ArrayList;
25 | import java.util.List;
26 |
27 | public class HomeFragment extends Fragment {
28 |
29 | private DatabaseReference mRef;
30 | private List listData;
31 | private ProgressBar progressBar;
32 | private RecyclerView memoryRecyclerView;
33 | private PostAdapter adapter;
34 |
35 | public View onCreateView(@NonNull LayoutInflater inflater,
36 | ViewGroup container, Bundle savedInstanceState) {
37 | View root = inflater.inflate(R.layout.fragment_home, container, false);
38 |
39 | mRef = FirebaseDatabase.getInstance().getReference("Memories");
40 | mRef.keepSynced(true);
41 |
42 | progressBar = root.findViewById(R.id.progressBar);
43 | memoryRecyclerView = root.findViewById(R.id.memoryRecyclerView);
44 | LinearLayoutManager mLayout = new LinearLayoutManager(getContext());
45 |
46 | memoryRecyclerView.setHasFixedSize(true);
47 | mLayout.setReverseLayout(true);
48 | mLayout.setStackFromEnd(true);
49 |
50 | memoryRecyclerView.setLayoutManager(mLayout);
51 |
52 | memoryRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
53 | @Override
54 | public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
55 | super.onScrolled(recyclerView, dx, dy);
56 |
57 | boolean reachedBottom = !recyclerView.canScrollVertically(1);
58 | if(reachedBottom){
59 | Toast.makeText(getContext(),"You have viewed all the memories.",Toast.LENGTH_SHORT).show();
60 | }
61 | }
62 | });
63 |
64 | return root;
65 | }
66 |
67 | private void loadMemories() {
68 | listData = new ArrayList<>();
69 | progressBar.setVisibility(View.VISIBLE);
70 | mRef.addListenerForSingleValueEvent(new ValueEventListener() {
71 | @Override
72 | public void onDataChange(DataSnapshot dataSnapshot) {
73 | if (dataSnapshot.exists()){
74 | for (DataSnapshot data : dataSnapshot.getChildren()){
75 | String memoryId = data.getKey();
76 | Memory memory = data.getValue(Memory.class).withId(memoryId);
77 | listData.add(memory);
78 | }
79 | adapter = new PostAdapter(getContext(), listData);
80 | memoryRecyclerView.setAdapter(adapter);
81 | progressBar.setVisibility(View.INVISIBLE);
82 | }
83 | }
84 | @Override
85 | public void onCancelled(DatabaseError databaseError) {
86 | Toast.makeText(getContext(),databaseError.getMessage(),Toast.LENGTH_SHORT).show();
87 | progressBar.setVisibility(View.INVISIBLE);
88 | }
89 | });
90 | }
91 |
92 | @Override
93 | public void onStart() {
94 | super.onStart();
95 | loadMemories();
96 | }
97 | }
98 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_store_memory.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
21 |
22 |
30 |
31 |
42 |
43 |
55 |
56 |
61 |
62 |
67 |
68 |
69 |
76 |
77 |
87 |
88 |
89 |
99 |
100 |
101 |
111 |
112 |
118 |
119 |
120 |
121 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | package com.example.memoria.ui.home;
2 |
3 | import android.os.Bundle;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 | import android.widget.TextView;
8 | import android.widget.Toast;
9 |
10 | import androidx.annotation.NonNull;
11 | import androidx.annotation.Nullable;
12 | import androidx.fragment.app.Fragment;
13 | import androidx.lifecycle.Observer;
14 | import androidx.lifecycle.ViewModelProviders;
15 | import androidx.recyclerview.widget.LinearLayoutManager;
16 | import androidx.recyclerview.widget.RecyclerView;
17 |
18 | import com.example.memoria.R;
19 | import com.example.memoria.model.Memory;
20 | import com.google.firebase.database.DataSnapshot;
21 | import com.google.firebase.database.DatabaseError;
22 | import com.google.firebase.database.DatabaseReference;
23 | import com.google.firebase.database.ValueEventListener;
24 |
25 | public class HomeFragment extends Fragment {
26 |
27 | private DatabaseReference mRef;
28 |
29 | public View onCreateView(@NonNull LayoutInflater inflater,
30 | ViewGroup container, Bundle savedInstanceState) {
31 | View root = inflater.inflate(R.layout.fragment_home, container, false);
32 |
33 | RecyclerView memoryRecyclerView = root.findViewById(R.id.memoryRecyclerView);
34 | LinearLayoutManager mLayout = new LinearLayoutManager(getContext());
35 |
36 | memoryRecyclerView.setHasFixedSize(true);
37 | mLayout.setReverseLayout(true);
38 | mLayout.setStackFromEnd(true);
39 |
40 | memoryRecyclerView.setLayoutManager(mLayout);
41 |
42 | memoryRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
43 | @Override
44 | public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
45 | super.onScrolled(recyclerView, dx, dy);
46 |
47 | Boolean reachedBottom = !recyclerView.canScrollVertically(1);
48 | if(reachedBottom){
49 | Toast.makeText(getContext(),"You have viewed all the memories.",Toast.LENGTH_SHORT).show();
50 | }
51 | }
52 | });
53 |
54 | mRef.addListenerForSingleValueEvent(new ValueEventListener() {
55 | @Override
56 | public void onDataChange(DataSnapshot dataSnapshot) {
57 | if (dataSnapshot.exists()){
58 | for (DataSnapshot data : dataSnapshot.getChildren()){
59 | String memoryId = data.getKey();
60 | Memory memory = data.getValue(Memory.class).withId(memoryId);
61 | listData.add(memory);
62 | }
63 | adapter = new MyAdapter(listData);
64 | memoryRecyclerView.setAdapter(adapter);
65 | }
66 | }
67 | @Override
68 | public void onCancelled(DatabaseError databaseError) {
69 | Toast.makeText(getContext(),databaseError.getMessage(),Toast.LENGTH_SHORT).show();
70 | }
71 | });
72 |
73 | return root;
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/newMemory/NewMemoryActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.newMemory;
2 |
3 | import androidx.annotation.Nullable;
4 | import androidx.appcompat.app.AppCompatActivity;
5 | import androidx.core.app.ActivityCompat;
6 | import androidx.core.content.ContextCompat;
7 |
8 | import android.Manifest;
9 | import android.app.ProgressDialog;
10 | import android.content.Intent;
11 | import android.content.pm.PackageManager;
12 | import android.net.Uri;
13 | import android.os.Bundle;
14 | import android.view.View;
15 | import android.widget.Button;
16 | import android.widget.RadioButton;
17 | import android.widget.RadioGroup;
18 | import android.widget.Toast;
19 |
20 | import com.example.memoria.R;
21 | import com.example.memoria.maps.MapsActivity;
22 | import com.google.android.material.snackbar.Snackbar;
23 | import com.google.firebase.storage.FirebaseStorage;
24 | import com.google.firebase.storage.StorageReference;
25 |
26 | import butterknife.BindView;
27 | import butterknife.ButterKnife;
28 |
29 | public class NewMemoryActivity extends AppCompatActivity {
30 |
31 | @BindView(R.id.radioButton1) RadioButton image;
32 | @BindView(R.id.radioButton2) RadioButton video;
33 | @BindView(R.id.radioButton3) RadioButton text;
34 | @BindView(R.id.radioButton4) RadioButton location;
35 | @BindView(R.id.radioGroup) RadioGroup radioGroup;
36 | @BindView(R.id.newMemoryContinue) Button newMemoryContinue;
37 |
38 | final public static int IMAGE_CODE = 1;
39 | final public static int VIDEO_CODE = 2;
40 | final public static int AUDIO_CODE = 3;
41 | final public static int LOCATION_CODE = 4;
42 |
43 | private FirebaseStorage mStorage;
44 | private StorageReference storagePath;
45 | private ProgressDialog progressDialog;
46 |
47 | @Override
48 | protected void onCreate(Bundle savedInstanceState) {
49 | super.onCreate(savedInstanceState);
50 | setContentView(R.layout.activity_new_memory);
51 |
52 | ButterKnife.bind(this);
53 |
54 | mStorage = FirebaseStorage.getInstance();
55 | newMemoryContinue.setOnClickListener(new View.OnClickListener() {
56 | @Override
57 | public void onClick(View v) {
58 |
59 | if(ContextCompat.checkSelfPermission(NewMemoryActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
60 | ActivityCompat.requestPermissions(NewMemoryActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1);
61 | }else{
62 | int selectedId = radioGroup.getCheckedRadioButtonId();
63 | if(selectedId == R.id.radioButton1){
64 | selectImage();
65 | }else if(selectedId == R.id.radioButton2){
66 | selectVideo();
67 | }else if(selectedId == R.id.radioButton3){
68 | selectAudio();
69 | }else if(selectedId == R.id.radioButton4){
70 | startActivity(new Intent(NewMemoryActivity.this, MapsActivity.class));
71 | }else{
72 | Snackbar.make(v, "Please choose any one of the options", Snackbar.LENGTH_LONG).show();
73 | }
74 | }
75 | }
76 | });
77 | }
78 |
79 | private void selectImage() {
80 | Intent intent = new Intent();
81 | intent.setType("image/*");
82 | intent.setAction(Intent.ACTION_GET_CONTENT);
83 | startActivityForResult(intent, IMAGE_CODE);
84 | }
85 |
86 | private void selectVideo() {
87 | Intent intent = new Intent();
88 | intent.setType("video/*");
89 | intent.setAction(Intent.ACTION_GET_CONTENT);
90 | startActivityForResult(intent, VIDEO_CODE);
91 | }
92 |
93 | private void selectAudio() {
94 | Intent intent = new Intent();
95 | intent.setType("audio/*");
96 | intent.setAction(Intent.ACTION_GET_CONTENT);
97 | startActivityForResult(intent, AUDIO_CODE);
98 | }
99 |
100 | @Override
101 | protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
102 | super.onActivityResult(requestCode, resultCode, data);
103 |
104 | if (requestCode == IMAGE_CODE && resultCode == RESULT_OK && data != null) {
105 | Uri imageUri = data.getData();
106 | Intent intent = new Intent(NewMemoryActivity.this, StoreMemory.class);
107 | intent.putExtra("URI", imageUri.toString());
108 | intent.putExtra("type", IMAGE_CODE);
109 | startActivity(intent);
110 | }else if (requestCode == VIDEO_CODE && resultCode == RESULT_OK && data != null) {
111 | Uri videoUri = data.getData();
112 | Intent intent = new Intent(NewMemoryActivity.this, StoreMemory.class);
113 | intent.putExtra("URI", videoUri.toString());
114 | intent.putExtra("type", VIDEO_CODE);
115 | startActivity(intent);
116 | } else if (requestCode == AUDIO_CODE && resultCode == RESULT_OK && data != null) {
117 | Uri audioUri = data.getData();
118 | Intent intent = new Intent(NewMemoryActivity.this, StoreMemory.class);
119 | intent.putExtra("URI", audioUri.toString());
120 | intent.putExtra("type", AUDIO_CODE);
121 | startActivity(intent);
122 | } else {
123 | Toast.makeText(NewMemoryActivity.this, "Please select a file", Toast.LENGTH_SHORT).show();
124 | }
125 | }
126 | }
127 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_login.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
22 |
23 |
35 |
36 |
48 |
49 |
58 |
59 |
60 |
72 |
73 |
84 |
85 |
86 |
96 |
97 |
110 |
111 |
121 |
122 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_register.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
22 |
23 |
35 |
36 |
48 |
49 |
58 |
59 |
60 |
72 |
73 |
84 |
85 |
86 |
98 |
99 |
110 |
111 |
112 |
122 |
123 |
133 |
134 |
135 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_comment.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
16 |
17 |
28 |
29 |
39 |
40 |
48 |
49 |
60 |
61 |
73 |
74 |
84 |
85 |
90 |
91 |
92 |
101 |
102 |
110 |
111 |
121 |
122 |
123 |
133 |
134 |
135 |
136 |
137 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/memory_card.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
15 |
16 |
26 |
27 |
40 |
41 |
53 |
54 |
68 |
69 |
84 |
85 |
97 |
98 |
111 |
112 |
123 |
124 |
131 |
132 |
142 |
143 |
152 |
153 |
154 |
155 |
156 |
157 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/maps/MapsActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.maps;
2 |
3 | import androidx.annotation.NonNull;
4 | import androidx.core.app.ActivityCompat;
5 | import androidx.core.content.ContextCompat;
6 | import androidx.fragment.app.FragmentActivity;
7 |
8 | import android.Manifest;
9 | import android.annotation.SuppressLint;
10 | import android.app.AlertDialog;
11 | import android.app.ProgressDialog;
12 | import android.content.Context;
13 | import android.content.DialogInterface;
14 | import android.content.Intent;
15 | import android.content.pm.PackageManager;
16 | import android.location.Location;
17 | import android.location.LocationListener;
18 | import android.location.LocationManager;
19 | import android.os.Build;
20 | import android.os.Bundle;
21 | import android.view.Gravity;
22 | import android.view.Window;
23 | import android.view.WindowManager;
24 |
25 | import com.example.memoria.R;
26 | import com.example.memoria.newMemory.StoreMemory;
27 | import com.google.android.gms.maps.CameraUpdateFactory;
28 | import com.google.android.gms.maps.GoogleMap;
29 | import com.google.android.gms.maps.OnMapReadyCallback;
30 | import com.google.android.gms.maps.SupportMapFragment;
31 | import com.google.android.gms.maps.model.LatLng;
32 | import com.google.android.gms.maps.model.MarkerOptions;
33 | import com.google.android.material.snackbar.Snackbar;
34 |
35 | public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleMap.OnMapLongClickListener{
36 |
37 | private GoogleMap mMap;
38 | private SupportMapFragment mapFragment;
39 | LocationManager locationManager;
40 | LocationListener locationListener;
41 |
42 | private ProgressDialog pDialog;
43 |
44 | @Override
45 | protected void onCreate(Bundle savedInstanceState) {
46 | super.onCreate(savedInstanceState);
47 | setContentView(R.layout.activity_maps);
48 | // Obtain the SupportMapFragment and get notified when the map is ready to be used.
49 | mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
50 | mapFragment.getMapAsync(this);
51 |
52 | pDialog = new ProgressDialog(MapsActivity.this);
53 | pDialog.setMessage("Fetching your current location");
54 | pDialog.setCancelable(false);
55 | pDialog.show();
56 | }
57 |
58 | @SuppressLint("MissingPermission")
59 | @Override
60 | public void onMapReady(GoogleMap googleMap) {
61 | mMap = googleMap;
62 |
63 | locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
64 | mMap.setOnMapLongClickListener(this);
65 | locationListener = new LocationListener() {
66 | @Override
67 | public void onLocationChanged(Location location) {
68 | mMap.clear();
69 | pDialog.dismiss();
70 |
71 | LatLng userLoc = new LatLng(location.getLatitude(), location.getLongitude());
72 | mMap.addMarker(new MarkerOptions().position(userLoc).title("Your Location")).showInfoWindow();
73 | mMap.moveCamera(CameraUpdateFactory.newLatLng(userLoc));
74 |
75 | locationManager.removeUpdates(locationListener);
76 |
77 | AlertDialog.Builder builder = new AlertDialog.Builder(MapsActivity.this);
78 | builder.setMessage("Do you want to share a memory of your location ?");
79 |
80 | builder.setTitle("Continue ?");
81 | builder.setCancelable(false);
82 | builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
83 | @Override
84 | public void onClick(DialogInterface dialog, int which)
85 | {
86 | Intent intent = new Intent(MapsActivity.this, StoreMemory.class);
87 | Bundle bundle = new Bundle();
88 | bundle.putParcelable("marker", userLoc);
89 | intent.putExtra("bundle", bundle);
90 | startActivity(intent);
91 | }
92 | }).setNegativeButton("No", new DialogInterface.OnClickListener() {
93 | @Override
94 | public void onClick(DialogInterface dialog, int which)
95 | {
96 | dialog.cancel();
97 | Snackbar.make(mapFragment.getView(), "Long press on the location that you want to share!", Snackbar.LENGTH_LONG).show();
98 | }
99 | });
100 |
101 | AlertDialog alertDialog = builder.create();
102 | alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
103 | WindowManager.LayoutParams wmlp = alertDialog.getWindow().getAttributes();
104 | wmlp.gravity = Gravity.BOTTOM;
105 | wmlp.y = 100;
106 | alertDialog.show();
107 | }
108 |
109 | @Override
110 | public void onStatusChanged(String provider, int status, Bundle extras) { }
111 | @Override
112 | public void onProviderEnabled(String provider) { }
113 | @Override
114 | public void onProviderDisabled(String provider) { }
115 | };
116 |
117 | if(Build.VERSION.SDK_INT < 23){
118 | locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
119 | }else{
120 | if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
121 | ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
122 | }else{
123 | locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
124 | }
125 | }
126 | }
127 |
128 | @Override
129 | public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
130 | super.onRequestPermissionsResult(requestCode, permissions, grantResults);
131 | if(requestCode == 1){
132 | if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
133 | if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
134 | locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
135 | }
136 | }
137 | }
138 | }
139 |
140 | @Override
141 | public void onMapLongClick(LatLng latLng) {
142 | mMap.clear();
143 |
144 | mMap.addMarker(new MarkerOptions().position(latLng).title("Selected Location")).showInfoWindow();
145 | mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
146 |
147 | AlertDialog.Builder builder = new AlertDialog.Builder(this);
148 | builder.setMessage("Do you want to share your memory of this location ?");
149 |
150 | builder.setTitle("Continue ?");
151 | builder.setCancelable(false);
152 | builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
153 | @Override
154 | public void onClick(DialogInterface dialog, int which)
155 | {
156 | Intent intent = new Intent(MapsActivity.this, StoreMemory.class);
157 | Bundle bundle = new Bundle();
158 | bundle.putParcelable("marker", latLng);
159 | intent.putExtra("bundle", bundle);
160 | startActivity(intent);
161 | }
162 | }).setNegativeButton("No", new DialogInterface.OnClickListener() {
163 | @Override
164 | public void onClick(DialogInterface dialog, int which)
165 | {
166 | dialog.cancel();
167 | }
168 | });
169 |
170 | AlertDialog alertDialog = builder.create();
171 | alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
172 | WindowManager.LayoutParams wmlp = alertDialog.getWindow().getAttributes();
173 | wmlp.gravity = Gravity.BOTTOM;
174 | wmlp.y = 100;
175 | alertDialog.show();
176 | }
177 | }
178 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/signup/SettingsActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.signup;
2 |
3 | import androidx.annotation.NonNull;
4 | import androidx.annotation.Nullable;
5 | import androidx.appcompat.app.AppCompatActivity;
6 | import androidx.core.app.ActivityCompat;
7 | import androidx.core.content.ContextCompat;
8 |
9 | import android.Manifest;
10 | import android.app.ProgressDialog;
11 | import android.content.Intent;
12 | import android.content.pm.PackageManager;
13 | import android.net.Uri;
14 | import android.os.Build;
15 | import android.os.Bundle;
16 | import android.text.TextUtils;
17 | import android.util.Log;
18 | import android.view.View;
19 | import android.widget.Button;
20 | import android.widget.Toast;
21 |
22 | import com.bumptech.glide.Glide;
23 | import com.example.memoria.MainActivity;
24 | import com.example.memoria.R;
25 | import com.google.android.gms.ads.AdRequest;
26 | import com.google.android.gms.ads.AdView;
27 | import com.google.android.gms.ads.MobileAds;
28 | import com.google.android.gms.tasks.Continuation;
29 | import com.google.android.gms.tasks.OnCompleteListener;
30 | import com.google.android.gms.tasks.OnFailureListener;
31 | import com.google.android.gms.tasks.OnSuccessListener;
32 | import com.google.android.gms.tasks.Task;
33 | import com.google.android.material.textfield.TextInputEditText;
34 |
35 | import butterknife.BindView;
36 | import butterknife.ButterKnife;
37 | import de.hdodenhof.circleimageview.CircleImageView;
38 |
39 | import com.google.firebase.database.DatabaseReference;
40 | import com.google.firebase.database.FirebaseDatabase;
41 | import com.google.firebase.storage.FirebaseStorage;
42 | import com.google.firebase.storage.StorageReference;
43 | import com.google.firebase.storage.UploadTask;
44 | import com.theartofdev.edmodo.cropper.CropImage;
45 | import com.theartofdev.edmodo.cropper.CropImageView;
46 |
47 | import java.util.HashMap;
48 | import java.util.Map;
49 |
50 | import static com.example.memoria.MainActivity.mAuth;
51 | import static com.example.memoria.MainActivity.mainImageURI;
52 | import static com.example.memoria.MainActivity.mainProfileImage;
53 | import static com.example.memoria.MainActivity.userName;
54 |
55 | public class SettingsActivity extends AppCompatActivity {
56 |
57 | @BindView(R.id.profileImage) CircleImageView profileImage;
58 | @BindView(R.id.username) TextInputEditText username;
59 | @BindView(R.id.saveBtn) Button saveBtn;
60 | @BindView(R.id.adView) AdView adView;
61 |
62 | private StorageReference storageReference;
63 | private StorageReference imagePath;
64 | private DatabaseReference mRef;
65 | private String userId;
66 |
67 | private Uri downloadUrl;
68 | private String usernameText;
69 | private ProgressDialog savingProgress;
70 |
71 | @Override
72 | protected void onCreate(Bundle savedInstanceState) {
73 | super.onCreate(savedInstanceState);
74 | setContentView(R.layout.activity_settings);
75 |
76 | ButterKnife.bind(this);
77 |
78 | MobileAds.initialize(this, getString(R.string.ad_app_id));
79 | loadBannerAd();
80 |
81 | Intent intent = getIntent();
82 | boolean firstTime = intent.getBooleanExtra("firstTime", false);
83 |
84 | mRef = FirebaseDatabase.getInstance().getReference();
85 | storageReference = FirebaseStorage.getInstance().getReference();
86 | savingProgress = new ProgressDialog(SettingsActivity.this);
87 | userId = mAuth.getCurrentUser().getUid();
88 |
89 | if(userName == null || firstTime) {
90 | Toast.makeText(SettingsActivity.this, "Please complete the setup", Toast.LENGTH_SHORT).show();
91 | }else {
92 | username.setText(userName);
93 | Glide.with(SettingsActivity.this).load(mainProfileImage).into(profileImage);
94 | }
95 |
96 | profileImage.setOnClickListener(new View.OnClickListener() {
97 | @Override
98 | public void onClick(View v) {
99 | if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.M){
100 | if (ContextCompat.checkSelfPermission(SettingsActivity.this,Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
101 | ActivityCompat.requestPermissions(SettingsActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1);
102 | }else{
103 | bringImageSelection();
104 | }
105 | }else{
106 | bringImageSelection();
107 | }
108 | }
109 | });
110 |
111 | saveBtn.setOnClickListener(new View.OnClickListener() {
112 | @Override
113 | public void onClick(View v) {
114 |
115 | usernameText = username.getText().toString();
116 | if(!TextUtils.isEmpty(usernameText) && mainImageURI != null){
117 | savingProgress.setMessage("Saving details. Please wait...");
118 | savingProgress.show();
119 |
120 | imagePath = storageReference.child("Profile_Images").child("Users").child(userId+".jpg");
121 | UploadTask uploadTask = imagePath.putFile(mainImageURI);
122 | storeInFirebase(uploadTask,usernameText);
123 |
124 | }else if(TextUtils.isEmpty(usernameText)){
125 | Toast.makeText(SettingsActivity.this,"Please choose a USERNAME",Toast.LENGTH_SHORT).show();
126 | }else{
127 | Toast.makeText(SettingsActivity.this,"Please choose a Profile Picture",Toast.LENGTH_SHORT).show();
128 | }
129 | }
130 | });
131 | }
132 |
133 | private void loadBannerAd() {
134 | AdRequest adRequest = new AdRequest.Builder().build();
135 | adView.loadAd(adRequest);
136 | }
137 |
138 | private void storeInFirebase(UploadTask uploadTask,final String userName) {
139 | uploadTask.addOnFailureListener(new OnFailureListener() {
140 | @Override
141 | public void onFailure(@NonNull Exception exception) {
142 | Toast.makeText(SettingsActivity.this,"Error: " + exception,Toast.LENGTH_SHORT).show();
143 | //TODO: Add loading message
144 | }
145 | }).addOnSuccessListener(new OnSuccessListener() {
146 | @Override
147 | public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
148 | Log.i("SettingsActivity","Upload Successful");
149 | }
150 | });
151 | uploadTask.continueWithTask(new Continuation>() {
152 | @Override
153 | public Task then(@NonNull Task task) throws Exception {
154 | if(!task.isSuccessful()){
155 | throw task.getException();
156 | }
157 | return imagePath.getDownloadUrl();
158 | }
159 | }).addOnCompleteListener(new OnCompleteListener() {
160 | @Override
161 | public void onComplete(@NonNull Task task) {
162 | if (task.isSuccessful()){
163 | downloadUrl = task.getResult();
164 |
165 | Map userMap = new HashMap<>();
166 | userMap.put("Name",usernameText);
167 | userMap.put("Image",downloadUrl.toString());
168 |
169 | mRef.child("Users").child(userId).setValue(userMap).addOnCompleteListener(new OnCompleteListener() {
170 | @Override
171 | public void onComplete(@NonNull Task task) {
172 | if(task.isSuccessful()){
173 |
174 | savingProgress.dismiss();
175 | Toast.makeText(SettingsActivity.this,"Changes Saved",Toast.LENGTH_SHORT).show();
176 | Intent mainIntent = new Intent(SettingsActivity.this, MainActivity.class);
177 | startActivity(mainIntent);
178 | finish();
179 |
180 | }else{
181 | String error = task.getException().getMessage();
182 | Toast.makeText(SettingsActivity.this,"(FIREBASE Error): "+error,Toast.LENGTH_SHORT).show();
183 | //TODO: Add loading message
184 | }
185 | }
186 | });
187 | }
188 | }
189 | });
190 | }
191 |
192 | private void bringImageSelection() {
193 | saveBtn.setAlpha(1);
194 | saveBtn.setEnabled(true);
195 | CropImage.activity()
196 | .setGuidelines(CropImageView.Guidelines.ON)
197 | .setAspectRatio(1,1)
198 | .start(SettingsActivity.this);
199 | }
200 |
201 | @Override
202 | protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
203 | super.onActivityResult(requestCode, resultCode, data);
204 |
205 | if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
206 | CropImage.ActivityResult result = CropImage.getActivityResult(data);
207 | if (resultCode == RESULT_OK) {
208 | mainImageURI = result.getUri();
209 | profileImage.setImageURI(mainImageURI);
210 | } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
211 | Exception error = result.getError();
212 | Toast.makeText(SettingsActivity.this,error.toString(), Toast.LENGTH_SHORT).show();
213 | }
214 | }
215 | }
216 | }
217 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/loadMemory/PostAdapter.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.loadMemory;
2 |
3 | import android.annotation.SuppressLint;
4 | import android.content.Context;
5 | import android.content.Intent;
6 | import android.net.Uri;
7 | import android.util.Log;
8 | import android.view.LayoutInflater;
9 | import android.view.View;
10 | import android.view.ViewGroup;
11 | import android.widget.ImageView;
12 | import android.widget.LinearLayout;
13 | import android.widget.TextView;
14 | import android.widget.Toast;
15 |
16 | import androidx.annotation.NonNull;
17 | import androidx.recyclerview.widget.RecyclerView;
18 |
19 | import com.bumptech.glide.Glide;
20 | import com.example.memoria.R;
21 | import com.example.memoria.model.Memory;
22 | import com.google.firebase.auth.FirebaseAuth;
23 | import com.google.firebase.database.DataSnapshot;
24 | import com.google.firebase.database.DatabaseError;
25 | import com.google.firebase.database.DatabaseReference;
26 | import com.google.firebase.database.FirebaseDatabase;
27 | import com.google.firebase.database.ValueEventListener;
28 |
29 | import java.util.HashMap;
30 | import java.util.List;
31 | import java.util.Map;
32 |
33 | import de.hdodenhof.circleimageview.CircleImageView;
34 |
35 | import static com.example.memoria.newMemory.NewMemoryActivity.AUDIO_CODE;
36 | import static com.example.memoria.newMemory.NewMemoryActivity.IMAGE_CODE;
37 | import static com.example.memoria.newMemory.NewMemoryActivity.LOCATION_CODE;
38 | import static com.example.memoria.newMemory.NewMemoryActivity.VIDEO_CODE;
39 |
40 | public class PostAdapter extends RecyclerView.Adapter {
41 |
42 | private DatabaseReference mRef;
43 | private FirebaseAuth mAuth;
44 | private List listData;
45 | private Context context;
46 |
47 | public PostAdapter(Context context, List listData) {
48 | this.context = context;
49 | this.listData = listData;
50 | }
51 |
52 | @NonNull
53 | @Override
54 | public PostAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
55 | View view= LayoutInflater.from(context).inflate(R.layout.memory_card,parent,false);
56 |
57 | mAuth = FirebaseAuth.getInstance();
58 | mRef = FirebaseDatabase.getInstance().getReference();
59 | return new ViewHolder(view);
60 | }
61 |
62 | @SuppressLint("ResourceAsColor")
63 | @Override
64 | public void onBindViewHolder(@NonNull PostAdapter.ViewHolder holder, int position) {
65 | holder.setIsRecyclable(false);
66 |
67 | Memory memory = listData.get(position);
68 | int type = Integer.parseInt(memory.getType());
69 | String currentUserId = mAuth.getCurrentUser().getUid();
70 | String memoryId = memory.MemoryId;
71 | String userName = memory.getUsername();
72 | String uriStr = memory.getLink();
73 | Uri uri = Uri.parse(uriStr);
74 |
75 | mRef.child("Users").addListenerForSingleValueEvent(new ValueEventListener() {
76 | @Override
77 | public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
78 | Map retrieveMap = (Map) dataSnapshot.child(userName).getValue();
79 | holder.username.setText(String.valueOf(retrieveMap.get("Name")));
80 | Glide.with(context).load(Uri.parse(retrieveMap.get("Image"))).into(holder.userProfileImage);
81 | }
82 |
83 | @Override
84 | public void onCancelled(@NonNull DatabaseError databaseError) {
85 | Toast.makeText(context, databaseError.getMessage(), Toast.LENGTH_SHORT).show();
86 | }
87 | });
88 |
89 | holder.uploadDate.setText(memory.getTimeStamp());
90 | holder.memoryDescription.setText(memory.getDescription());
91 |
92 | if (type == IMAGE_CODE) {
93 | holder.videoMessage.setVisibility(View.INVISIBLE);
94 | Glide.with(context).load(uri).into(holder.memoryLayout);
95 | } else if (type == VIDEO_CODE) {
96 | Glide.with(context).load(uri).into(holder.memoryLayout);
97 | holder.videoMessage.animate().alpha(0.25f).setDuration(3000);
98 | } else if (type == AUDIO_CODE) {
99 | holder.videoMessage.animate().alpha(0.25f).setDuration(3000);
100 | holder.memoryLayout.setBackgroundColor(R.color.Black);
101 | } else if (type == LOCATION_CODE) {
102 | holder.videoMessage.setVisibility(View.INVISIBLE);
103 | Glide.with(context).load(R.drawable.default_map).into(holder.memoryLayout);
104 | }
105 |
106 | mRef.child("Memories/" + memoryId + "/Likes").addValueEventListener(new ValueEventListener() {
107 | @SuppressLint("NewApi")
108 | @Override
109 | public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
110 | if (dataSnapshot.hasChildren())
111 | holder.likeCount.setText(context.getString(R.string.likes_number, dataSnapshot.getChildrenCount()));
112 | // dataSnapshot.getChildrenCount() +
113 | else
114 | holder.likeCount.setText(R.string.default_likes);
115 |
116 | if (dataSnapshot.hasChild(currentUserId)) {
117 | holder.likeIcon.setImageDrawable(context.getDrawable(R.drawable.like_icon_red));
118 | } else {
119 | holder.likeIcon.setImageDrawable(context.getDrawable(R.drawable.like_icon_grey));
120 | }
121 | }
122 |
123 | @Override
124 | public void onCancelled(@NonNull DatabaseError databaseError) {
125 | Log.e("Database Error: ", databaseError.getMessage());
126 | }
127 | });
128 |
129 | holder.likeIcon.setOnClickListener(new View.OnClickListener() {
130 | @Override
131 | public void onClick(View v) {
132 | mRef.child("Memories/" + memoryId + "/Likes").addListenerForSingleValueEvent(new ValueEventListener() {
133 | @SuppressLint("NewApi")
134 | @Override
135 | public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
136 | if (dataSnapshot.hasChild(currentUserId)) {
137 | mRef.child("Memories/" + memoryId + "/Likes").child(currentUserId).removeValue();
138 | holder.likeIcon.setImageDrawable(context.getDrawable(R.drawable.like_icon_grey));
139 | } else {
140 | Map likesMap = new HashMap<>();
141 | likesMap.put("timestamp", System.currentTimeMillis());
142 | mRef.child("Memories/" + memoryId + "/Likes").child(currentUserId).setValue(likesMap);
143 | holder.likeIcon.setImageDrawable(context.getDrawable(R.drawable.like_icon_red));
144 | }
145 | }
146 |
147 | @Override
148 | public void onCancelled(@NonNull DatabaseError databaseError) {
149 | Log.e("Database Error: ", databaseError.getMessage());
150 | }
151 | });
152 | }
153 | });
154 |
155 | holder.commentLayout.setOnClickListener(new View.OnClickListener() {
156 | @Override
157 | public void onClick(View v) {
158 | goToComments(uriStr, type, memoryId);
159 | }
160 | });
161 |
162 | holder.memoryLayout.setOnClickListener(new View.OnClickListener() {
163 | @Override
164 | public void onClick(View v) {
165 | goToComments(uriStr, type, memoryId);
166 | }
167 | });
168 |
169 | mRef.child("Memories/" + memoryId + "/Comments").addValueEventListener(new ValueEventListener() {
170 | @Override
171 | public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
172 | if (dataSnapshot.hasChildren())
173 | holder.commentsCount.setText(context.getString(R.string.comments_count, dataSnapshot.getChildrenCount()));
174 | else
175 | holder.commentsCount.setText(R.string.default_comments);
176 | }
177 |
178 | @Override
179 | public void onCancelled(@NonNull DatabaseError databaseError) {
180 | Log.e("Database Error: ", databaseError.getMessage());
181 | }
182 | });
183 | }
184 |
185 | private void goToComments(String uri, int type, String memoryId) {
186 | Intent commentIntent = new Intent(context, CommentActivity.class);
187 | commentIntent.putExtra("Uri", uri);
188 | commentIntent.putExtra("type", type);
189 | commentIntent.putExtra("memoryId", memoryId);
190 | context.startActivity(commentIntent);
191 | }
192 |
193 | @Override
194 | public int getItemCount() {
195 | return listData != null ? listData.size() :0;
196 | }
197 |
198 | public class ViewHolder extends RecyclerView.ViewHolder {
199 |
200 | CircleImageView userProfileImage;
201 | TextView username, uploadDate, memoryDescription, likeCount, commentsCount;
202 | ImageView memoryLayout ,likeIcon, videoMessage;
203 | LinearLayout commentLayout;
204 |
205 | public ViewHolder(@NonNull View itemView) {
206 | super(itemView);
207 |
208 | username = itemView.findViewById(R.id.username);
209 | uploadDate = itemView.findViewById(R.id.uploadDate);
210 | memoryDescription = itemView.findViewById(R.id.memoryDescription);
211 | userProfileImage = itemView.findViewById(R.id.userProfileImage);
212 | likeIcon = itemView.findViewById(R.id.likeIcon);
213 | likeCount = itemView.findViewById(R.id.likeCount);
214 | commentLayout = itemView.findViewById(R.id.commentLayout);
215 | commentsCount = itemView.findViewById(R.id.commentsCount);
216 | memoryLayout = itemView.findViewById(R.id.memoryLayout);
217 | videoMessage = itemView.findViewById(R.id.videoMessage);
218 | }
219 | }
220 | }
221 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/loadMemory/CommentActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.loadMemory;
2 |
3 | import androidx.annotation.NonNull;
4 | import androidx.appcompat.app.AppCompatActivity;
5 | import androidx.recyclerview.widget.LinearLayoutManager;
6 | import androidx.recyclerview.widget.RecyclerView;
7 |
8 | import android.appwidget.AppWidgetManager;
9 | import android.content.ComponentName;
10 | import android.content.Context;
11 | import android.net.Uri;
12 | import android.os.Build;
13 | import android.os.Bundle;
14 | import android.text.TextUtils;
15 | import android.util.Log;
16 | import android.view.View;
17 | import android.widget.Button;
18 | import android.widget.EditText;
19 | import android.widget.ImageView;
20 | import android.widget.LinearLayout;
21 | import android.widget.ProgressBar;
22 | import android.widget.RemoteViews;
23 | import android.widget.Toast;
24 |
25 | import com.bumptech.glide.Glide;
26 | import com.example.memoria.R;
27 | import com.example.memoria.database.CommentsDatabase;
28 | import com.example.memoria.model.Comment;
29 | import com.example.memoria.widget.WidgetActivity;
30 | import com.google.android.exoplayer2.DefaultLoadControl;
31 | import com.google.android.exoplayer2.ExoPlayerFactory;
32 | import com.google.android.exoplayer2.LoadControl;
33 | import com.google.android.exoplayer2.SimpleExoPlayer;
34 | import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory;
35 | import com.google.android.exoplayer2.extractor.ExtractorsFactory;
36 | import com.google.android.exoplayer2.source.ExtractorMediaSource;
37 | import com.google.android.exoplayer2.source.MediaSource;
38 | import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
39 | import com.google.android.exoplayer2.trackselection.TrackSelector;
40 | import com.google.android.exoplayer2.ui.SimpleExoPlayerView;
41 | import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
42 | import com.google.android.exoplayer2.util.Util;
43 | import com.google.android.gms.maps.CameraUpdateFactory;
44 | import com.google.android.gms.maps.GoogleMap;
45 | import com.google.android.gms.maps.MapFragment;
46 | import com.google.android.gms.maps.OnMapReadyCallback;
47 | import com.google.android.gms.maps.model.LatLng;
48 | import com.google.android.gms.maps.model.MarkerOptions;
49 | import com.google.firebase.auth.FirebaseAuth;
50 | import com.google.firebase.database.DataSnapshot;
51 | import com.google.firebase.database.DatabaseError;
52 | import com.google.firebase.database.DatabaseReference;
53 | import com.google.firebase.database.FirebaseDatabase;
54 | import com.google.firebase.database.ValueEventListener;
55 |
56 | import java.util.ArrayList;
57 | import java.util.HashMap;
58 | import java.util.List;
59 | import java.util.Map;
60 |
61 | import butterknife.BindView;
62 | import butterknife.ButterKnife;
63 |
64 | import static com.example.memoria.newMemory.NewMemoryActivity.AUDIO_CODE;
65 | import static com.example.memoria.newMemory.NewMemoryActivity.IMAGE_CODE;
66 | import static com.example.memoria.newMemory.NewMemoryActivity.LOCATION_CODE;
67 | import static com.example.memoria.newMemory.NewMemoryActivity.VIDEO_CODE;
68 |
69 | public class CommentActivity extends AppCompatActivity implements OnMapReadyCallback {
70 |
71 | @BindView(R.id.commentRecyclerView) RecyclerView commentRecyclerView;
72 | @BindView(R.id.commentEdit) EditText commentEdit;
73 | @BindView(R.id.postComment) Button postComment;
74 | @BindView(R.id.commentImage) ImageView commentImage;
75 | @BindView(R.id.commentPlayer) SimpleExoPlayerView commentPlayer;
76 | @BindView(R.id.commentProgress) ProgressBar progressBar;
77 | @BindView(R.id.mapLayoutComment) LinearLayout mapLayoutComment;
78 |
79 | private DatabaseReference mRef;
80 | private FirebaseAuth mAuth;
81 | private CommentsAdapter adapter;
82 | int type;
83 | GoogleMap googleMap;
84 | LatLng marker;
85 | Uri uri;
86 |
87 | public static List listData;
88 | CommentsDatabase mDatabase;
89 |
90 | private TrackSelector trackSelector;
91 | SimpleExoPlayer exoPlayer;
92 | private MediaSource mediaSource;
93 |
94 | @Override
95 | protected void onCreate(Bundle savedInstanceState) {
96 | super.onCreate(savedInstanceState);
97 | setContentView(R.layout.activity_comment);
98 |
99 | ButterKnife.bind(this);
100 |
101 | mAuth = FirebaseAuth.getInstance();
102 | mRef = FirebaseDatabase.getInstance().getReference();
103 | mDatabase = CommentsDatabase.getInstance(getApplicationContext());
104 |
105 | type = getIntent().getIntExtra("type", 0);
106 | if(type != LOCATION_CODE)
107 | uri = Uri.parse(getIntent().getStringExtra("Uri"));
108 | else {
109 | String[] latlong = getIntent().getStringExtra("Uri").split(",");
110 | double latitude = Double.parseDouble(latlong[0]);
111 | double longitude = Double.parseDouble(latlong[1]);
112 | marker = new LatLng(latitude, longitude);
113 | }
114 | String memoryId = getIntent().getStringExtra("memoryId");
115 |
116 | if(type == IMAGE_CODE){
117 | commentImage.setVisibility(View.VISIBLE);
118 | Glide.with(CommentActivity.this).load(uri).into(commentImage);
119 | }else if(type == VIDEO_CODE){
120 | commentPlayer.setVisibility(View.VISIBLE);
121 | playVideoAudio(uri, CommentActivity.this);
122 | }else if(type == AUDIO_CODE){
123 | commentPlayer.setVisibility(View.VISIBLE);
124 | playVideoAudio(uri, CommentActivity.this);
125 | }else if(type == LOCATION_CODE){
126 | mapLayoutComment.setVisibility(View.VISIBLE);
127 |
128 | MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.mapFragmentComment);
129 | mapFragment.getMapAsync(this);
130 | }
131 |
132 | postComment.setOnClickListener(new View.OnClickListener() {
133 | @Override
134 | public void onClick(View v) {
135 | String comment = commentEdit.getText().toString();
136 | String time = String.valueOf(System.currentTimeMillis());
137 | if(!TextUtils.isEmpty(comment)) {
138 | Map commentMap = new HashMap<>();
139 | commentMap.put("comment", comment);
140 | commentMap.put("username", mAuth.getCurrentUser().getUid());
141 | commentMap.put("timestamp", time);
142 | mRef.child("Memories/" + memoryId + "/Comments")
143 | .child(time)
144 | .setValue(commentMap);
145 | commentEdit.setText("");
146 | }else{
147 | Toast.makeText(CommentActivity.this, "Empty Comment", Toast.LENGTH_SHORT).show();
148 | }
149 | }
150 | });
151 |
152 | LinearLayoutManager mLayout = new LinearLayoutManager(CommentActivity.this);
153 | commentRecyclerView.setHasFixedSize(true);
154 | commentRecyclerView.setLayoutManager(mLayout);
155 |
156 | mRef.child("Memories/" + memoryId + "/Comments").addValueEventListener(new ValueEventListener() {
157 | @Override
158 | public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
159 | listData = new ArrayList<>();
160 | if (dataSnapshot.exists()){
161 | for (DataSnapshot data : dataSnapshot.getChildren()){
162 | String memoryId = data.getKey();
163 | Comment comment = data.getValue(Comment.class);
164 | listData.add(comment);
165 | }
166 | adapter = new CommentsAdapter(CommentActivity.this, listData);
167 | commentRecyclerView.setAdapter(adapter);
168 | refreshWidgets();
169 | }
170 | progressBar.setVisibility(View.INVISIBLE);
171 | }
172 | @Override
173 | public void onCancelled(@NonNull DatabaseError databaseError) {
174 | Log.e("Database Error: ", databaseError.getMessage());
175 | }
176 | });
177 | }
178 |
179 |
180 | @Override
181 | public void onMapReady(GoogleMap map) {
182 | googleMap = map;
183 | googleMap.getUiSettings().setRotateGesturesEnabled(false);
184 | googleMap.addMarker(new MarkerOptions().position(marker).title("Memory Location")).showInfoWindow();
185 | googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(marker, 10));
186 | }
187 |
188 | private void playVideoAudio(Uri uri, Context playContext) {
189 | trackSelector = new DefaultTrackSelector();
190 | LoadControl loadControl = new DefaultLoadControl();
191 | exoPlayer = ExoPlayerFactory.newSimpleInstance(playContext, trackSelector, loadControl);
192 | commentPlayer.setPlayer(exoPlayer);
193 |
194 | String userAgent = Util.getUserAgent(playContext, "MemoryVideo");
195 | DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(playContext, userAgent);
196 | ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
197 | mediaSource = new ExtractorMediaSource(uri, dataSourceFactory, extractorsFactory, null, null);
198 | exoPlayer.prepare(mediaSource);
199 | exoPlayer.setPlayWhenReady(false);
200 | }
201 |
202 | private void refreshWidgets() {
203 |
204 | mDatabase.CommentDao().deleteAll();
205 | for (int i = 0; i < listData.size(); i++) {
206 | mDatabase.CommentDao().insertComments(listData.get(i));
207 | }
208 | AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplication());
209 | int ids[] = appWidgetManager.getAppWidgetIds(new ComponentName(getApplication(), WidgetActivity.class));
210 | appWidgetManager.notifyAppWidgetViewDataChanged(ids, R.id.list_view_comments);
211 |
212 | RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.widget_activity);
213 | appWidgetManager.partiallyUpdateAppWidget(ids, remoteViews);
214 | }
215 |
216 | @Override
217 | protected void onPause() {
218 | super.onPause();
219 | if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
220 | releasePlayer();
221 | }
222 | }
223 |
224 | @Override
225 | protected void onStop() {
226 | super.onStop();
227 | if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
228 | releasePlayer();
229 | }
230 | }
231 |
232 | public void releasePlayer() {
233 | if(type == VIDEO_CODE || type == AUDIO_CODE) {
234 | exoPlayer.release();
235 | exoPlayer = null;
236 | mediaSource = null;
237 | trackSelector = null;
238 | }
239 | }
240 | }
241 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria;
2 |
3 | import android.app.NotificationChannel;
4 | import android.app.NotificationManager;
5 | import android.appwidget.AppWidgetManager;
6 | import android.content.ComponentName;
7 | import android.content.Intent;
8 | import android.content.SharedPreferences;
9 | import android.net.Uri;
10 | import android.os.Build;
11 | import android.os.Bundle;
12 | import android.util.Log;
13 | import android.view.MenuItem;
14 | import android.view.View;
15 | import android.view.Menu;
16 | import android.widget.ImageView;
17 | import android.widget.RemoteViews;
18 | import android.widget.TextView;
19 | import android.widget.Toast;
20 |
21 | import com.bumptech.glide.Glide;
22 | import com.example.memoria.database.CommentsDatabase;
23 | import com.example.memoria.model.Comment;
24 | import com.example.memoria.newMemory.NewMemoryActivity;
25 | import com.example.memoria.signup.SettingsActivity;
26 | import com.example.memoria.widget.WidgetActivity;
27 | import com.google.android.gms.ads.AdListener;
28 | import com.google.android.gms.ads.AdRequest;
29 | import com.google.android.gms.ads.InterstitialAd;
30 | import com.google.android.gms.ads.MobileAds;
31 | import com.google.android.material.floatingactionbutton.FloatingActionButton;
32 | import com.google.android.material.navigation.NavigationView;
33 | import com.google.firebase.auth.FirebaseAuth;
34 | import com.google.firebase.auth.FirebaseUser;
35 | import com.google.firebase.database.DataSnapshot;
36 | import com.google.firebase.database.DatabaseError;
37 | import com.google.firebase.database.DatabaseReference;
38 | import com.google.firebase.database.FirebaseDatabase;
39 | import com.google.firebase.database.ValueEventListener;
40 |
41 | import androidx.annotation.NonNull;
42 | import androidx.appcompat.app.AppCompatDelegate;
43 | import androidx.core.app.NotificationCompat;
44 | import androidx.core.app.NotificationManagerCompat;
45 | import androidx.navigation.NavController;
46 | import androidx.navigation.Navigation;
47 | import androidx.navigation.ui.AppBarConfiguration;
48 | import androidx.navigation.ui.NavigationUI;
49 | import androidx.drawerlayout.widget.DrawerLayout;
50 | import androidx.appcompat.app.AppCompatActivity;
51 | import androidx.appcompat.widget.Toolbar;
52 |
53 | import java.util.List;
54 | import java.util.Map;
55 |
56 | public class MainActivity extends AppCompatActivity {
57 |
58 | private AppBarConfiguration mAppBarConfiguration;
59 | public static FirebaseAuth mAuth;
60 | private DatabaseReference mRef;
61 | public static String userId = null;
62 | public static String userName;
63 | public static String mainProfileImage;
64 | public static Uri mainImageURI = null;
65 | public static long totalMemoriesCount;
66 |
67 | private ImageView img;
68 | private TextView textHeader;
69 | private TextView tv;
70 |
71 | private SharedPreferences modeSetting;
72 | private SharedPreferences.Editor modeEdit;
73 | private boolean nightMode;
74 |
75 | InterstitialAd mInterstitialAd;
76 |
77 | @Override
78 | protected void onCreate(Bundle savedInstanceState) {
79 | super.onCreate(savedInstanceState);
80 | setContentView(R.layout.activity_main);
81 |
82 | mRef = FirebaseDatabase.getInstance().getReference();
83 | mAuth = FirebaseAuth.getInstance();
84 |
85 | mRef.child("Memories").addListenerForSingleValueEvent(new ValueEventListener() {
86 | @Override
87 | public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
88 | totalMemoriesCount = dataSnapshot.getChildrenCount();
89 | }
90 | @Override
91 | public void onCancelled(@NonNull DatabaseError databaseError) {
92 |
93 | }
94 | });
95 |
96 | modeSetting = getSharedPreferences("ModeSetting",0);
97 | modeEdit = modeSetting.edit();
98 | nightMode = modeSetting.getBoolean("NightMode",false);
99 |
100 | if(nightMode) {
101 | Toast.makeText(this, "Dark Mode On", Toast.LENGTH_SHORT).show();
102 | AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
103 | }
104 |
105 | mInterstitialAd = new InterstitialAd(this);
106 | MobileAds.initialize(this, getString(R.string.ad_app_id));
107 | loadInterstitialAd();
108 |
109 | Toolbar toolbar = findViewById(R.id.toolbar);
110 | setSupportActionBar(toolbar);
111 | FloatingActionButton addMemoryFAB = findViewById(R.id.addMemoryFAB);
112 | addMemoryFAB.setOnClickListener(new View.OnClickListener() {
113 | @Override
114 | public void onClick(View view) {
115 | if (mInterstitialAd.isLoaded()) {
116 | mInterstitialAd.show();
117 | } else {
118 | Log.i("Advertisement Info: ", "The interstitial ad wasn't loaded yet.");
119 | startActivity(new Intent(MainActivity.this, NewMemoryActivity.class));
120 | }
121 | }
122 | });
123 |
124 | mInterstitialAd.setAdListener(new AdListener(){
125 | @Override
126 | public void onAdFailedToLoad(int errorCode) {
127 | Log.e("Error", "Loading Advertisement");
128 | }
129 |
130 | @Override
131 | public void onAdClosed() {
132 | startActivity(new Intent(MainActivity.this, NewMemoryActivity.class));
133 | }
134 | });
135 |
136 | DrawerLayout drawer = findViewById(R.id.drawer_layout);
137 | NavigationView navigationView = findViewById(R.id.nav_view);
138 |
139 | mAppBarConfiguration = new AppBarConfiguration.Builder(R.id.nav_home, R.id.nav_gallery)
140 | .setDrawerLayout(drawer)
141 | .build();
142 | NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
143 | NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
144 | NavigationUI.setupWithNavController(navigationView, navController);
145 |
146 | View navView = navigationView.inflateHeaderView(R.layout.nav_header_main);
147 | img = navView.findViewById(R.id.imageViewNav);
148 | textHeader = navView.findViewById(R.id.navTextHeader);
149 | tv = navView.findViewById(R.id.navTextView);
150 | }
151 |
152 | private void loadInterstitialAd() {
153 | mInterstitialAd.setAdUnitId(getString(R.string.interstitial_ad_id_test));
154 | mInterstitialAd.loadAd(new AdRequest.Builder().build());
155 | }
156 |
157 | @Override
158 | public boolean onCreateOptionsMenu(Menu menu) {
159 | getMenuInflater().inflate(R.menu.main, menu);
160 | return true;
161 | }
162 |
163 | @Override
164 | public boolean onOptionsItemSelected(@NonNull MenuItem item) {
165 | switch (item.getItemId()){
166 | case R.id.action_settings:
167 | startActivity(new Intent(MainActivity.this, SettingsActivity.class));
168 | return true;
169 |
170 | case R.id.action_change_mode:
171 | if(!nightMode) {
172 | AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
173 | nightMode = true;
174 | modeEdit.putBoolean("NightMode",true);
175 | modeEdit.apply();
176 | }else{
177 | AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
178 | nightMode = false;
179 | modeEdit.putBoolean("NightMode",false);
180 | modeEdit.apply();
181 | }
182 | return true;
183 |
184 | case R.id.action_logout:
185 | mAuth.signOut();
186 | Toast.makeText(this, "You have successfully Signed-out", Toast.LENGTH_SHORT).show();
187 | sendToLogin();
188 | return true;
189 |
190 | default: return false;
191 | }
192 | }
193 |
194 | @Override
195 | public boolean onSupportNavigateUp() {
196 | NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
197 | return NavigationUI.navigateUp(navController, mAppBarConfiguration)
198 | || super.onSupportNavigateUp();
199 | }
200 |
201 | @Override
202 | protected void onStart() {
203 | super.onStart();
204 |
205 | FirebaseUser currentUser = mAuth.getCurrentUser();
206 |
207 | if (currentUser == null) {
208 | sendToLogin();
209 | }else{
210 | userId = currentUser.getUid();
211 |
212 | mRef.child("Users").addListenerForSingleValueEvent(new ValueEventListener() {
213 | @Override
214 | public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
215 | if(dataSnapshot.hasChild(userId)){
216 |
217 | Map retrieveMap = (Map) dataSnapshot.child(userId).getValue();
218 | mainProfileImage = retrieveMap.get("Image");
219 | mainImageURI = Uri.parse(mainProfileImage);
220 | userName = retrieveMap.get("Name");
221 | Glide.with(MainActivity.this).load(mainImageURI).into(img);
222 | textHeader.setText(userName);
223 | tv.setText(currentUser.getEmail());
224 | }else{
225 | startActivity(new Intent(MainActivity.this, SettingsActivity.class));
226 | }
227 | }
228 | @Override
229 | public void onCancelled(@NonNull DatabaseError databaseError) {
230 | Log.e("Error: ", databaseError.getMessage());
231 | }
232 | });
233 |
234 | mRef.child("Memories").addValueEventListener(new ValueEventListener() {
235 | @Override
236 | public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
237 | if(dataSnapshot.hasChildren() && totalMemoriesCount < dataSnapshot.getChildrenCount()){
238 | totalMemoriesCount = dataSnapshot.getChildrenCount();
239 | notifications();
240 | }
241 | }
242 | @Override
243 | public void onCancelled(@NonNull DatabaseError databaseError) {
244 | Log.e("Database Error: ", databaseError.getMessage());
245 | }
246 | });
247 | }
248 | }
249 |
250 | public void notifications(){
251 | //Notifications will be displayed only if the application
252 | //is running the background.
253 | if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
254 | NotificationChannel channel = new NotificationChannel("1", "Memoria", NotificationManager.IMPORTANCE_DEFAULT);
255 | NotificationManager manager = getSystemService(NotificationManager.class);
256 | manager.createNotificationChannel(channel);
257 | }
258 |
259 | NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "1")
260 | .setContentTitle("Memoria")
261 | .setSmallIcon(R.mipmap.logo_round)
262 | .setAutoCancel(true)
263 | .setContentText("New Memory is Uploaded");
264 |
265 | NotificationManagerCompat managerCompat = NotificationManagerCompat.from(this);
266 | managerCompat.notify(0, builder.build());
267 | }
268 |
269 | private void sendToLogin() {
270 | userName = null;
271 | mainProfileImage = null;
272 | Intent loginIntent = new Intent(this, LoginActivity.class);
273 | startActivity(loginIntent);
274 | finish();
275 | }
276 | }
277 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/memoria/newMemory/StoreMemory.java:
--------------------------------------------------------------------------------
1 | package com.example.memoria.newMemory;
2 |
3 | import androidx.annotation.NonNull;
4 | import androidx.appcompat.app.AppCompatActivity;
5 |
6 | import android.content.Context;
7 | import android.content.Intent;
8 | import android.database.Cursor;
9 | import android.net.Uri;
10 | import android.os.Build;
11 | import android.os.Bundle;
12 | import android.provider.MediaStore;
13 | import android.text.TextUtils;
14 | import android.util.Log;
15 | import android.view.View;
16 | import android.widget.Button;
17 | import android.widget.EditText;
18 | import android.widget.ImageView;
19 | import android.widget.LinearLayout;
20 | import android.widget.Toast;
21 |
22 | import com.bumptech.glide.Glide;
23 | import com.example.memoria.MainActivity;
24 | import com.example.memoria.R;
25 | import com.google.android.exoplayer2.DefaultLoadControl;
26 | import com.google.android.exoplayer2.ExoPlayerFactory;
27 | import com.google.android.exoplayer2.LoadControl;
28 | import com.google.android.exoplayer2.SimpleExoPlayer;
29 | import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory;
30 | import com.google.android.exoplayer2.extractor.ExtractorsFactory;
31 | import com.google.android.exoplayer2.source.ExtractorMediaSource;
32 | import com.google.android.exoplayer2.source.MediaSource;
33 | import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
34 | import com.google.android.exoplayer2.trackselection.TrackSelector;
35 | import com.google.android.exoplayer2.ui.PlayerView;
36 | import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
37 | import com.google.android.exoplayer2.util.Util;
38 | import com.google.android.gms.maps.CameraUpdateFactory;
39 | import com.google.android.gms.maps.GoogleMap;
40 | import com.google.android.gms.maps.MapFragment;
41 | import com.google.android.gms.maps.OnMapReadyCallback;
42 | import com.google.android.gms.maps.model.LatLng;
43 | import com.google.android.gms.maps.model.MarkerOptions;
44 | import com.google.android.gms.tasks.Continuation;
45 | import com.google.android.gms.tasks.OnCompleteListener;
46 | import com.google.android.gms.tasks.OnFailureListener;
47 | import com.google.android.gms.tasks.OnSuccessListener;
48 | import com.google.android.gms.tasks.Task;
49 | import com.google.android.material.snackbar.Snackbar;
50 | import com.google.firebase.auth.FirebaseAuth;
51 | import com.google.firebase.database.DatabaseReference;
52 | import com.google.firebase.database.FirebaseDatabase;
53 | import com.google.firebase.storage.FirebaseStorage;
54 | import com.google.firebase.storage.StorageReference;
55 | import com.google.firebase.storage.UploadTask;
56 |
57 | import java.util.HashMap;
58 | import java.util.Map;
59 |
60 | import butterknife.BindView;
61 | import butterknife.ButterKnife;
62 |
63 | import static com.example.memoria.newMemory.NewMemoryActivity.AUDIO_CODE;
64 | import static com.example.memoria.newMemory.NewMemoryActivity.IMAGE_CODE;
65 | import static com.example.memoria.newMemory.NewMemoryActivity.LOCATION_CODE;
66 | import static com.example.memoria.newMemory.NewMemoryActivity.VIDEO_CODE;
67 |
68 | public class StoreMemory extends AppCompatActivity implements OnMapReadyCallback {
69 |
70 | @BindView(R.id.memoryVideoView) PlayerView exoPlayerView;
71 | @BindView(R.id.memoryImageView) ImageView imageView;
72 | @BindView(R.id.memoryDesc) EditText memoryDesc;
73 | @BindView(R.id.postButton) Button postButton;
74 | @BindView(R.id.mapLayout) LinearLayout mapLayout;
75 |
76 | private int type;
77 | private float size;
78 | private String uriStr;
79 | LatLng marker;
80 | Uri uriFinal;
81 | SimpleExoPlayer exoPlayer;
82 | MediaSource mediaSource;
83 | TrackSelector trackSelector;
84 | GoogleMap googleMap;
85 |
86 | private StorageReference storageReference;
87 | private FirebaseAuth mAuth;
88 | private DatabaseReference mRef;
89 | private StorageReference storagePath;
90 | private Uri downloadUrl;
91 | private String userId;
92 |
93 | @Override
94 | protected void onCreate(Bundle savedInstanceState) {
95 | super.onCreate(savedInstanceState);
96 | setContentView(R.layout.activity_store_memory);
97 |
98 | ButterKnife.bind(this);
99 |
100 | mAuth = FirebaseAuth.getInstance();
101 | storageReference = FirebaseStorage.getInstance().getReference();
102 | mRef = FirebaseDatabase.getInstance().getReference();
103 | userId = mAuth.getCurrentUser().getUid();
104 |
105 | Intent intent = getIntent();
106 | uriStr = intent.getStringExtra("URI");
107 | type = intent.getIntExtra("type", LOCATION_CODE);
108 | Log.i("Info: ", "Type" + type);
109 |
110 | Bundle bundle = getIntent().getParcelableExtra("bundle");
111 | if(type == LOCATION_CODE) {
112 | marker = bundle.getParcelable("marker");
113 | mapLayout.setVisibility(View.VISIBLE);
114 | }
115 |
116 | if (type != LOCATION_CODE) {
117 | uriFinal = Uri.parse(uriStr);
118 | size = Float.parseFloat(getSizeFromUri(getApplicationContext(), uriFinal)) / (1024 * 1024);
119 | } else {
120 | size = 0;
121 | MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.mapFragment);
122 | mapFragment.getMapAsync(this);
123 | }
124 |
125 | if (size > 10) {
126 | Toast.makeText(this, "Size of the file exceeds 10MB !", Toast.LENGTH_LONG).show();
127 | finish();
128 | } else {
129 | if (type == IMAGE_CODE) {
130 | imageView.setVisibility(View.VISIBLE);
131 | Glide.with(StoreMemory.this).load(uriFinal).into(imageView);
132 | } else if (type == VIDEO_CODE) {
133 | exoPlayerView.setVisibility(View.VISIBLE);
134 | playVideoAudio(uriFinal);
135 | } else if (type == AUDIO_CODE) {
136 | exoPlayerView.setVisibility(View.VISIBLE);
137 | playVideoAudio(uriFinal);
138 | } else if (type == LOCATION_CODE) {
139 | uriStr = marker.latitude + "," + marker.longitude;
140 | } else {
141 | Toast.makeText(StoreMemory.this, "An error has occurred. Please try again", Toast.LENGTH_LONG).show();
142 | finish();
143 | }
144 | }
145 |
146 | postButton.setOnClickListener(new View.OnClickListener() {
147 | @Override
148 | public void onClick(View v) {
149 | String desc = memoryDesc.getText().toString();
150 | if(!TextUtils.isEmpty(desc)){
151 | if(type != LOCATION_CODE)
152 | uploadMemory(uriFinal, desc);
153 | else
154 | uploadLocationMemory(uriStr, desc);
155 | }else{
156 | Snackbar.make(v, "Give a description of the memory", Snackbar.LENGTH_LONG).show();
157 | }
158 | }
159 | });
160 | }
161 |
162 | @Override
163 | public void onMapReady(GoogleMap map) {
164 | googleMap = map;
165 | googleMap.getUiSettings().setRotateGesturesEnabled(false);
166 | googleMap.getUiSettings().setScrollGesturesEnabled(false);
167 | googleMap.addMarker(new MarkerOptions().position(marker).title("Your Location")).showInfoWindow();
168 | googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(marker, 10));
169 | }
170 |
171 | private String getSizeFromUri(Context context, Uri uri) {
172 | Cursor cursor = null;
173 | try {
174 | String[] proj = {MediaStore.Audio.Media.SIZE};
175 | cursor = context.getContentResolver().query(uri, proj, null, null, null);
176 | int column_index = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE);
177 | cursor.moveToFirst();
178 | return cursor.getString(column_index);
179 | } finally {
180 | if (cursor != null) {
181 | cursor.close();
182 | }
183 | }
184 | }
185 |
186 | private void playVideoAudio(Uri uri) {
187 | trackSelector = new DefaultTrackSelector();
188 | LoadControl loadControl = new DefaultLoadControl();
189 | exoPlayer = ExoPlayerFactory.newSimpleInstance(StoreMemory.this, trackSelector, loadControl);
190 | exoPlayerView.setPlayer(exoPlayer);
191 |
192 | String userAgent = Util.getUserAgent(StoreMemory.this, "MemoryVideo");
193 | DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(StoreMemory.this, userAgent);
194 | ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
195 | mediaSource = new ExtractorMediaSource(uri, dataSourceFactory, extractorsFactory, null, null);
196 | exoPlayer.prepare(mediaSource);
197 | exoPlayer.setPlayWhenReady(true);
198 | }
199 |
200 | private void uploadMemory(Uri uri, String desc) {
201 |
202 | LinearLayout uploadProgress = findViewById(R.id.uploadProgress);
203 |
204 | uploadProgress.setVisibility(View.VISIBLE);
205 | String currentUNIX = String.valueOf(System.currentTimeMillis());
206 | storagePath = storageReference.child("Memories").child(userId + " " + currentUNIX);
207 | UploadTask uploadMemoryTask = storagePath.putFile(uri);
208 |
209 | uploadMemoryTask.addOnFailureListener(new OnFailureListener() {
210 | @Override
211 | public void onFailure(@NonNull Exception exception) {
212 | Toast.makeText(StoreMemory.this, "An error has occurred. Please try again!", Toast.LENGTH_SHORT).show();
213 | Log.e("Error: ", exception.getMessage());
214 | uploadProgress.setVisibility(View.GONE);
215 | }
216 | }).addOnSuccessListener(new OnSuccessListener() {
217 | @Override
218 | public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
219 | Log.i("StoreMemory: ", "Memory Upload Successful");
220 | }
221 | });
222 | uploadMemoryTask.continueWithTask(new Continuation>() {
223 | @Override
224 | public Task then(@NonNull Task task) throws Exception {
225 | if (!task.isSuccessful()) {
226 | throw task.getException();
227 | }
228 | return storagePath.getDownloadUrl();
229 | }
230 | }).addOnCompleteListener(new OnCompleteListener() {
231 | @Override
232 | public void onComplete(@NonNull Task task) {
233 | if (task.isSuccessful()) {
234 | downloadUrl = task.getResult();
235 |
236 | Map userMap = new HashMap<>();
237 | userMap.put("Description", desc);
238 | userMap.put("Link", downloadUrl.toString());
239 | userMap.put("TimeStamp", currentUNIX);
240 | userMap.put("Username", userId);
241 | userMap.put("Type", String.valueOf(type));
242 |
243 | mRef.child("Memories").child(currentUNIX).setValue(userMap).addOnCompleteListener(new OnCompleteListener() {
244 | @Override
245 | public void onComplete(@NonNull Task task) {
246 | if (task.isSuccessful()) {
247 |
248 | Toast.makeText(StoreMemory.this, "Memory Uploaded", Toast.LENGTH_SHORT).show();
249 | startActivity(new Intent(StoreMemory.this, MainActivity.class));
250 | finish();
251 |
252 | } else {
253 | String error = task.getException().getMessage();
254 | Toast.makeText(StoreMemory.this, "(FIREBASE Error): " + error, Toast.LENGTH_SHORT).show();
255 | uploadProgress.setVisibility(View.GONE);
256 | }
257 | }
258 | });
259 | }
260 | }
261 | });
262 | }
263 |
264 | private void uploadLocationMemory(String uriStr, String desc) {
265 |
266 | LinearLayout uploadProgress = findViewById(R.id.uploadProgress);
267 |
268 | uploadProgress.setVisibility(View.VISIBLE);
269 | String currentUNIX = String.valueOf(System.currentTimeMillis());
270 | storagePath = storageReference.child("Memories").child(userId + " " + currentUNIX);
271 |
272 | Map userMap = new HashMap<>();
273 | userMap.put("Description", desc);
274 | userMap.put("Link", uriStr);
275 | userMap.put("TimeStamp", currentUNIX);
276 | userMap.put("Username", userId);
277 | userMap.put("Type", String.valueOf(type));
278 |
279 | mRef.child("Memories").child(currentUNIX).setValue(userMap).addOnCompleteListener(new OnCompleteListener() {
280 | @Override
281 | public void onComplete(@NonNull Task task) {
282 | if (task.isSuccessful()) {
283 |
284 | Toast.makeText(StoreMemory.this, "Memory Uploaded", Toast.LENGTH_SHORT).show();
285 | startActivity(new Intent(StoreMemory.this, MainActivity.class));
286 | finish();
287 |
288 | } else {
289 | String error = task.getException().getMessage();
290 | Toast.makeText(StoreMemory.this, "(FIREBASE Error): " + error, Toast.LENGTH_SHORT).show();
291 | uploadProgress.setVisibility(View.GONE);
292 | }
293 | }
294 | });
295 | }
296 |
297 | @Override
298 | public void onPause() {
299 | super.onPause();
300 | if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
301 | releasePlayer();
302 | }
303 | }
304 |
305 | @Override
306 | public void onStop() {
307 | super.onStop();
308 | if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
309 | releasePlayer();
310 | }
311 | }
312 |
313 | private void releasePlayer() {
314 | if (type == VIDEO_CODE || type == AUDIO_CODE) {
315 | exoPlayer.release();
316 | exoPlayer = null;
317 | mediaSource = null;
318 | trackSelector = null;
319 | }
320 | }
321 | }
322 |
--------------------------------------------------------------------------------