diff --git a/.gitignore b/.gitignore
index 7745f96..424590e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,3 +30,6 @@
# generated files
bin/
gen/
+
+# Kotlin files
+.kotlin
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 57fa92c..cd5b2ac 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -3,62 +3,65 @@ apply plugin: 'kotlin-kapt'
apply plugin: 'com.android.application'
android {
- compileSdk 34
+ namespace = 'com.brain'
+ compileSdk = 35
defaultConfig {
- applicationId "com.brain"
- minSdk 24
- targetSdk 34
- versionCode 1
- versionName "1.0"
- testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ applicationId = "com.brain"
+ minSdk = 24
+ targetSdk = 35
+ versionCode = 1
+ versionName = "1.0"
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
- minifyEnabled false
+ minifyEnabled = false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_17
- targetCompatibility JavaVersion.VERSION_17
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '17'
}
- namespace 'com.brain'
}
dependencies {
implementation project(path: ':multimediaslider')
implementation project(path: ':multimediapuzzlesviewer')
- implementation 'com.github.stfalcon-studio:StfalconImageViewer:v1.0.1'
- implementation 'com.github.bumptech.glide:glide:4.12.0'
+ implementation project(path: ':multimediaplayer')
+ implementation project(path: ':multimediaposts')
+ implementation project(path: ':userprofile')
+ implementation 'com.github.bumptech.glide:glide:4.16.0'
implementation 'com.android.volley:volley:1.2.1'
implementation 'in.srain.cube:grid-view-with-header-footer:1.0.12'
implementation 'de.hdodenhof:circleimageview:3.1.0'
+ implementation 'com.auth0.android:jwtdecode:2.0.2'
implementation 'com.google.android.material:material:1.12.0'
- implementation 'com.google.code.gson:gson:2.10.1'
- implementation 'androidx.media3:media3-exoplayer:1.3.1'
- implementation 'androidx.media3:media3-exoplayer-dash:1.3.1'
- implementation 'androidx.media3:media3-ui:1.3.1'
- implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'com.google.code.gson:gson:2.11.0'
+ implementation 'androidx.media3:media3-exoplayer:1.7.1'
+ implementation 'androidx.media3:media3-exoplayer-dash:1.7.1'
+ implementation 'androidx.media3:media3-ui:1.7.1'
+ implementation 'androidx.appcompat:appcompat:1.7.0'
implementation "androidx.cardview:cardview:1.0.0"
- implementation "androidx.recyclerview:recyclerview:1.3.2"
- implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+ implementation "androidx.recyclerview:recyclerview:1.4.0"
+ implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
- implementation 'androidx.core:core-ktx:1.13.1'
- implementation "com.squareup.retrofit2:retrofit:2.9.0"
- implementation "com.squareup.retrofit2:converter-gson:2.9.0"
- implementation 'com.squareup.okhttp3:okhttp:4.9.2'
- implementation 'com.squareup.okhttp3:logging-interceptor:4.9.2'
+ implementation 'com.squareup.retrofit2:retrofit:2.11.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.11.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.12.0'
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
+ implementation 'com.airbnb.android:lottie:6.1.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
testImplementation 'junit:junit:4.13.2'
- androidTestImplementation 'androidx.test.ext:junit:1.2.0'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.0'
+ androidTestImplementation 'androidx.test.ext:junit:1.2.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
}
repositories {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 7cd83ed..8cc8c75 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,23 +1,29 @@
+
+
+
+
+
+ android:theme="@style/AppTheme.NoActionBar"
+ android:usesCleartextTraffic="true">
@@ -26,23 +32,23 @@
-
-
-
-
-
-
-
-
-
-
+ android:screenOrientation="nosensor"
+ tools:ignore="DiscouragedApi">
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/brain/activities/HomeActivity.java b/app/src/main/java/com/brain/activities/HomeActivity.java
index 72b8bb6..1709ec2 100644
--- a/app/src/main/java/com/brain/activities/HomeActivity.java
+++ b/app/src/main/java/com/brain/activities/HomeActivity.java
@@ -1,62 +1,91 @@
package com.brain.activities;
+import static com.brain.userprofile.util.Util.URL_AVATAR_PART;
+import static com.brain.util.Util.BASE_AUTH_URL;
+
import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
+import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
-import android.widget.Toast;
+import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.Toolbar;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.ViewPager;
import com.brain.R;
import com.brain.adapters.ViewFragmentPagerAdapter;
import com.brain.fragments.GenericFragment;
-import com.brain.fragments.ThinkDialogFragment;
+import com.brain.multimediaplayer.service.MediaPlayerService;
+import com.brain.multimediaposts.fragments.AboutDialogFragment;
+import com.brain.multimediaposts.fragments.PostsDialogFragment;
+import com.brain.service.BroadcastReceiverService;
+import com.brain.userprofile.ProfileActivity;
+import com.brain.userprofile.model.User;
import com.brain.util.Util;
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.DataSource;
+import com.bumptech.glide.load.engine.DiskCacheStrategy;
+import com.bumptech.glide.load.engine.GlideException;
+import com.bumptech.glide.request.RequestListener;
+import com.bumptech.glide.request.target.Target;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.tabs.TabLayout;
import java.util.Objects;
+/**
+ * @author brain30316@gmail.com
+ *
+ */
public class HomeActivity extends AppCompatActivity {
- Toolbar toolbar;
- ViewPager viewPager;
- TabLayout tabLayout;
- AppBarLayout.LayoutParams layoutParams;
- CoordinatorLayout coordinatorLayoutForFAB;
-
- FloatingActionButton fabOptionMenuTouch;
- FloatingActionButton fabTextPosting;
- FloatingActionButton fabUploadVideoClip;
-
- Animation fabOpen;
- Animation fabClose;
- Animation animationFabOptionMenuRotateForward;
- Animation animationFabOptionMenuRotateBackward;
+ private Toolbar toolbar;
+ private ViewPager viewPager;
+ private TabLayout tabLayout;
+ private AppBarLayout.LayoutParams layoutParams;
+ private CoordinatorLayout coordinatorLayoutForFAB;
+ private BroadcastReceiverService broadcastReceiverService = null;
+
+ private FloatingActionButton fabOptionMenuTouch;
+ private FloatingActionButton fabPosts;
+ private FloatingActionButton fabAbout;
+
+ private Animation fabOpen;
+ private Animation fabClose;
+ private Animation animationFabOptionMenuRotateForward;
+ private Animation animationFabOptionMenuRotateBackward;
ImageView imageView;
+ ImageView actionAvatar;
private boolean fabStatus = false;
+ private int tabSelected = -1;
+ private User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
viewPager = findViewById(R.id.pager);
- fabTextPosting = findViewById(R.id.fabTextPosting);
- fabUploadVideoClip = findViewById(R.id.fabUploadVideoClip);
+ fabPosts = findViewById(R.id.fabPosts);
+ fabAbout = findViewById(R.id.fabAbout);
imageView = findViewById(R.id.imagePost);
+ actionAvatar = findViewById(R.id.actionAvatar);
// add the toolbar
setToolbar();
@@ -69,6 +98,23 @@ protected void onCreate(Bundle savedInstanceState) {
setupTabIcons();
initFabAnimations();
+
+ configureReceiver();
+
+ fullScreenAndHideNavigationBar();
+ }
+
+ @SuppressLint("NewApi")
+ private void configureReceiver() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction("com.brain.Broadcast");
+ broadcastReceiverService = new BroadcastReceiverService();
+ registerReceiver(broadcastReceiverService, filter, Context.RECEIVER_EXPORTED);
+ }
+
+ private void fullScreenAndHideNavigationBar() {
+ getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
+ getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}
private void initFabAnimations() {
@@ -79,17 +125,16 @@ private void initFabAnimations() {
}
private void setupViewPager(ViewPager viewPager) {
- ViewFragmentPagerAdapter adapter = new ViewFragmentPagerAdapter(getSupportFragmentManager());
- adapter.addFragment(GenericFragment.newInstance(1), getString(R.string.title_section1));
- adapter.addFragment(GenericFragment.newInstance(2), getString(R.string.title_section2));
- adapter.addFragment(GenericFragment.newInstance(3), getString(R.string.title_section3));
+ ViewFragmentPagerAdapter adapter = new ViewFragmentPagerAdapter(getSupportFragmentManager(), FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
+ user = (User) getIntent().getSerializableExtra("user");
+ adapter.addFragment(GenericFragment.newInstance(1, user), getString(R.string.title_section1));
+ adapter.addFragment(GenericFragment.newInstance(2, user), getString(R.string.title_section2));
viewPager.setAdapter(adapter);
}
private void setupTabIcons() {
Objects.requireNonNull(tabLayout.getTabAt(0)).setIcon(Util.getTabIcon[0]);
Objects.requireNonNull(tabLayout.getTabAt(1)).setIcon(Util.getTabIcon[1]);
- Objects.requireNonNull(tabLayout.getTabAt(2)).setIcon(Util.getTabIcon[2]);
}
private void setToolbar() {
@@ -97,8 +142,13 @@ private void setToolbar() {
setSupportActionBar(toolbar);
Objects.requireNonNull(getSupportActionBar()).setTitle(null);
- ImageView actionAvatar = findViewById(R.id.actionAvatar);
- actionAvatar.setOnClickListener(v -> Toast.makeText(getApplication(), "Action Avatar.", Toast.LENGTH_SHORT).show());
+ actionAvatar.setOnClickListener(v -> {
+ Intent navigation = new Intent(HomeActivity.this, ProfileActivity.class);
+ navigation.putExtra("user", user);
+ startActivity(navigation);
+ });
+
+ loadAvatarProfile(actionAvatar);
}
@Override
@@ -107,6 +157,12 @@ public boolean onCreateOptionsMenu(Menu menu) {
return super.onCreateOptionsMenu(menu);
}
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ MenuItem searchMenu = menu.findItem(R.id.action_search);
+ return super.onPrepareOptionsMenu(menu);
+ }
+
@SuppressLint("NonConstantResourceId")
@Override
public boolean onOptionsItemSelected(MenuItem item) {
@@ -160,18 +216,6 @@ public void onTabSelected(TabLayout.Tab tab) {
coordinatorLayoutForFAB = findViewById(R.id.coordinatorForFAB);
coordinatorLayoutForFAB.setVisibility(CoordinatorLayout.GONE);
- layoutParams = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
- layoutParams.setScrollFlags(0);
- toolbar.setLayoutParams(layoutParams);
- toolbar.setVisibility(Toolbar.GONE);
- break;
- case 2:
- fabOptionMenuTouch = findViewById(R.id.fabOptionMenu);
- fabOptionMenuTouch.setVisibility(View.INVISIBLE);
-
- coordinatorLayoutForFAB = findViewById(R.id.coordinatorForFAB);
- coordinatorLayoutForFAB.setVisibility(CoordinatorLayout.GONE);
-
layoutParams = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
layoutParams.setScrollFlags(0);
toolbar.setLayoutParams(layoutParams);
@@ -182,11 +226,20 @@ public void onTabSelected(TabLayout.Tab tab) {
@Override
public void onTabUnselected(TabLayout.Tab tab) {
+ if (tab.getPosition() == 0) {
+ MediaPlayerService.Companion.pauseCurrentPlayingVideo();
+ tabSelected = tab.getPosition();
+ //close fab menu
+ hideFAB();
+ fabStatus = false;
+ } else if (tab.getPosition() == 1) {
+ MediaPlayerService.Companion.resumePlayerIndexCurrent();
+ tabSelected = tab.getPosition();
+ }
}
@Override
- public void onTabReselected(TabLayout.Tab tab) {
- }
+ public void onTabReselected(TabLayout.Tab tab) {}
});
tabLayout.setupWithViewPager(viewPager);
}
@@ -206,31 +259,84 @@ public void getFabOptionMenuOnClicked(View view) {
private void expandFAB() {
fabOptionMenuTouch.startAnimation(animationFabOptionMenuRotateForward);
- fabTextPosting.startAnimation(fabOpen);
- fabTextPosting.setClickable(true);
+ fabPosts.startAnimation(fabOpen);
+ fabPosts.setClickable(true);
- fabUploadVideoClip.startAnimation(fabOpen);
- fabUploadVideoClip.setClickable(true);
+ fabAbout.startAnimation(fabOpen);
+ fabAbout.setClickable(true);
}
private void hideFAB() {
fabOptionMenuTouch.startAnimation(animationFabOptionMenuRotateBackward);
- fabTextPosting.startAnimation(fabClose);
- fabTextPosting.setClickable(false);
+ fabPosts.startAnimation(fabClose);
+ fabPosts.setClickable(false);
- fabUploadVideoClip.startAnimation(fabClose);
- fabUploadVideoClip.setClickable(false);
+ fabAbout.startAnimation(fabClose);
+ fabAbout.setClickable(false);
}
- public void getFabTextPostingOnClick(View view) {
+ public void getFabPostsOnClick(View view) {
FragmentManager fm = getSupportFragmentManager();
- DialogFragment newFragment = ThinkDialogFragment.newInstance();
+ user = (User) getIntent().getSerializableExtra("user");
+ DialogFragment newFragment = PostsDialogFragment.Companion.newInstance(Objects.requireNonNull(user));
newFragment.show(fm, "Dialog");
}
- public void getFabUploadVideoClipOnClick(View view) {
- Toast.makeText(getApplication(), "Floating Action Button 2", Toast.LENGTH_SHORT).show();
+ public void getFabAboutOnClick(View view) {
+ FragmentManager fm = getSupportFragmentManager();
+ DialogFragment newFragment = AboutDialogFragment.Companion.newInstance();
+ newFragment.show(fm, "Dialog");
+ }
+
+ private void loadAvatarProfile(ImageView imgAvatar) {
+ user = (User) getIntent().getSerializableExtra("user");
+ Glide.with(getApplicationContext())
+ .load(BASE_AUTH_URL + URL_AVATAR_PART + user.getUserId())
+ .skipMemoryCache(true)
+ .circleCrop()
+ .diskCacheStrategy(DiskCacheStrategy.NONE)
+ .listener(new RequestListener<>() {
+ @Override
+ public boolean onLoadFailed(GlideException e, Object model, @NonNull Target target, boolean isFirstResource) {
+ imgAvatar.setImageResource(R.drawable.ic_account_avatar_24);
+ return true;
+ }
+
+ @Override
+ public boolean onResourceReady(@NonNull Drawable resource, @NonNull Object model, Target target, @NonNull DataSource dataSource, boolean isFirstResource) {
+ return false;
+ }
+ }).into(imgAvatar);
+ }
+
+ public ViewPager getViewPager() {
+ return viewPager;
}
+ @Override
+ protected void onPause() {
+ super.onPause();
+ MediaPlayerService.Companion.pauseCurrentPlayingVideo();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ fullScreenAndHideNavigationBar();
+ loadAvatarProfile(actionAvatar);
+
+ if (tabSelected == 0) {
+ MediaPlayerService.Companion.pauseCurrentPlayingVideo();
+ } else {
+ MediaPlayerService.Companion.resumePlayerIndexCurrent();
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ unregisterReceiver(broadcastReceiverService);
+ MediaPlayerService.Companion.releasePlayer();
+ }
}
diff --git a/app/src/main/java/com/brain/activities/LoginActivity.java b/app/src/main/java/com/brain/activities/LoginActivity.java
deleted file mode 100644
index 923c21c..0000000
--- a/app/src/main/java/com/brain/activities/LoginActivity.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.brain.activities;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.Button;
-
-import androidx.appcompat.app.AppCompatActivity;
-
-import com.brain.R;
-
-public class LoginActivity extends AppCompatActivity {
-
- private Intent navigation = null;
- protected Button btnSignIn;
- private final boolean response = true;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_login);
-
- btnSignIn = findViewById(R.id.btnSignIn);
-
- btnSignIn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (response) {
- navigation = new Intent(LoginActivity.this, HomeActivity.class);
- LoginActivity.this.startActivity(navigation);
- }
- }
- });
- }
-
- public void viewRegisterClicked(View view) {
- navigation = new Intent(LoginActivity.this, RegisterActivity.class);
- LoginActivity.this.startActivity(navigation);
- }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/brain/activities/LoginActivity.kt b/app/src/main/java/com/brain/activities/LoginActivity.kt
new file mode 100644
index 0000000..0a6c7db
--- /dev/null
+++ b/app/src/main/java/com/brain/activities/LoginActivity.kt
@@ -0,0 +1,158 @@
+package com.brain.activities
+
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import android.widget.Button
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import com.auth0.android.jwt.JWT
+import com.brain.R
+import com.brain.api.RetrofitClient
+import com.brain.model.LoginRequest
+import com.brain.model.LoginResponse
+import com.brain.model.RefreshTokenRequest
+import com.brain.model.RefreshTokenResponse
+import com.brain.userprofile.model.User
+import com.brain.util.AuthPreferences
+import com.brain.util.Util.isTokenExpired
+import com.google.android.material.textfield.TextInputEditText
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+
+/**
+ * @author brain30316@gmail.com
+ *
+ */
+class LoginActivity : AppCompatActivity() {
+ private var navigation: Intent? = null
+ private lateinit var btnSignIn: Button
+ private lateinit var btnGmail: Button
+ private lateinit var txtUserName: TextInputEditText
+ private lateinit var txtPassword: TextInputEditText
+ private lateinit var user: User
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_login)
+
+ txtUserName = findViewById(R.id.editTextUsername)
+ txtPassword = findViewById(R.id.editTextPassword)
+ btnSignIn = findViewById(R.id.btnSignIn)
+ btnGmail = findViewById(R.id.btnGmail)
+
+ btnSignIn.setOnClickListener {
+ val username = txtUserName.text.toString()
+ val password = txtPassword.text.toString()
+
+ loginUser(username, password)
+ }
+
+ btnGmail.setOnClickListener {
+ Toast.makeText(this, "Logueo con Gmail. Proximamente.",Toast.LENGTH_SHORT).show()
+ }
+ }
+
+ fun viewRegisterClicked(view: View) {
+ navigation = Intent(this@LoginActivity, RegisterActivity::class.java)
+ this@LoginActivity.startActivity(navigation)
+ }
+
+ private fun loginUser(username: String, password: String) {
+ var token: String? = validateToken()
+ val loginRequest = LoginRequest(username, password)
+ val callClient = RetrofitClient.authApiService(token!!).login(loginRequest)
+
+ callClient.enqueue(object : Callback {
+ override fun onResponse(call: Call, response: Response) {
+ if (response.isSuccessful) {
+ token = response.body()?.token
+ if (token != null) {
+ AuthPreferences.saveToken(applicationContext, token!!)
+ authenticateToken(token!!)
+ } else {
+ Toast.makeText(this@LoginActivity, "The Token is empty", Toast.LENGTH_SHORT).show()
+ }
+ } else {
+ Toast.makeText(this@LoginActivity, "The username or password is wrong", Toast.LENGTH_SHORT).show()
+ }
+ }
+
+ override fun onFailure(call: Call, t: Throwable) {
+ Toast.makeText(this@LoginActivity, "Failed Network: ${t.message}", Toast.LENGTH_SHORT).show()
+ }
+ })
+ }
+
+ private fun authenticateToken(token: String) {
+ if (isTokenExpired(token)) {
+ // The token is valid
+ // You can get user information from the token
+ val claim = JWT(token)
+ startHome(claim)
+ } else {
+ // Token has expired !
+ refreshToken(token)
+ }
+ }
+
+ private fun refreshToken(token: String) {
+ val refreshRequest = RefreshTokenRequest(token)
+ val callClient = RetrofitClient.authApiService(token).refreshToken(refreshRequest)
+
+ callClient.enqueue(object : Callback {
+ override fun onResponse(call: Call, response: Response) {
+ if (response.isSuccessful) {
+ val refreshToken = response.body()!!.refreshToken
+ AuthPreferences.clearToken(applicationContext)
+ AuthPreferences.saveToken(applicationContext, refreshToken)
+ }
+ }
+
+ override fun onFailure(call: Call, t: Throwable) {
+ Toast.makeText(this@LoginActivity, "Failed Network: ${t.message}", Toast.LENGTH_SHORT).show()
+ }
+ })
+ }
+
+ private fun startHome(claim: JWT) {
+ val userId = claim.getClaim("userid").asLong()
+ val username = claim.getClaim("username").asString()
+ val email = claim.getClaim("email").asString()
+ val fullName = claim.getClaim("fullName").asString()
+ val phone = claim.getClaim("phone").asString()
+ val dateTime = claim.getClaim("date").asString()
+
+ user = User(
+ userId!!,
+ username!!,
+ fullName!!,
+ email!!,
+ phone!!,
+ null,
+ null,
+ "",
+ dateTime!!,
+ 0,
+ true
+ )
+
+ navigation = Intent(this@LoginActivity, HomeActivity::class.java)
+ navigation!!.putExtra("user", user)
+ this@LoginActivity.startActivity(navigation)
+ }
+
+ private fun validateToken(): String? {
+ return if (AuthPreferences.getToken(applicationContext) == null) "" else AuthPreferences.getToken(applicationContext)
+ }
+
+ override fun onStart() {
+ super.onStart()
+ val token: String? = validateToken()
+
+ if (token != "") {
+ authenticateToken(token!!)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/brain/activities/RegisterActivity.java b/app/src/main/java/com/brain/activities/RegisterActivity.java
deleted file mode 100644
index e33f7b1..0000000
--- a/app/src/main/java/com/brain/activities/RegisterActivity.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.brain.activities;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-import com.brain.R;
-
-public class RegisterActivity extends Activity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_register);
- }
-}
diff --git a/app/src/main/java/com/brain/activities/RegisterActivity.kt b/app/src/main/java/com/brain/activities/RegisterActivity.kt
new file mode 100644
index 0000000..ca25467
--- /dev/null
+++ b/app/src/main/java/com/brain/activities/RegisterActivity.kt
@@ -0,0 +1,129 @@
+package com.brain.activities
+
+import android.annotation.SuppressLint
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import com.brain.R
+import com.brain.model.RegisterRequest
+import com.brain.model.RegisterResponse
+import com.brain.repository.AuthRepository
+import com.brain.userprofile.model.User
+import com.brain.util.AuthPreferences
+import com.brain.util.Util.BASE_AUTH_URL
+import com.brain.util.Util.generateUID
+import com.brain.util.Util.getCurrentDateTime
+import com.google.android.material.textfield.TextInputEditText
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+
+/**
+ * @author brain30316@gmail.com
+ *
+ */
+class RegisterActivity : AppCompatActivity() {
+ private var registerRequest: RegisterRequest? = null
+ private lateinit var txtEmail: TextInputEditText
+ private lateinit var txtUsername: TextInputEditText
+ private lateinit var txtPassword: TextInputEditText
+ private lateinit var txtFullName: TextInputEditText
+ private lateinit var txtPhoneNumber: TextInputEditText
+ private var currentDateTime: String? = null
+ private var userId: Long = 0L
+ private lateinit var user: User
+ private var navigation: Intent? = null
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_register)
+
+ txtEmail = findViewById(R.id.txtEmail)
+ txtUsername = findViewById(R.id.txtUsername)
+ txtPassword = findViewById(R.id.txtPassword)
+ txtFullName = findViewById(R.id.txtFullName)
+ txtPhoneNumber = findViewById(R.id.txtPhoneNumber)
+ }
+
+ fun onClickLogin(view: View) {
+ val navigation = Intent(this@RegisterActivity, LoginActivity::class.java)
+ this@RegisterActivity.startActivity(navigation)
+ }
+
+ @SuppressLint("NewApi")
+ fun onClickRegister(view: View) {
+ userId = generateUID()
+ currentDateTime = getCurrentDateTime()
+
+ registerRequest = RegisterRequest(
+ userId,
+ txtEmail.text.toString(),
+ txtUsername.text.toString(),
+ txtPassword.text.toString(),
+ txtFullName.text.toString(),
+ txtPhoneNumber.text.toString(),
+ currentDateTime.toString()
+ )
+
+ val call = RetrofitInstance.authService.register(registerRequest!!)
+ call.enqueue(object : Callback {
+ override fun onResponse(call: Call, response: Response) {
+ if (response.isSuccessful) {
+ val token = response.body()?.token
+ if (token != null) {
+ AuthPreferences.saveToken(applicationContext, token)
+ startHome()
+ clean()
+ } else {
+ Toast.makeText(this@RegisterActivity, "The Token is empty", Toast.LENGTH_SHORT).show()
+ }
+ } else {
+ Toast.makeText(view.context, "Register failed", Toast.LENGTH_SHORT).show()
+ }
+ }
+
+ override fun onFailure(call: Call, t: Throwable) {
+ call.cancel()
+ Toast.makeText(view.context, t.message, Toast.LENGTH_SHORT).show()
+ }
+ })
+ }
+
+ private fun startHome() {
+ user = User(
+ userId,
+ txtUsername.text.toString(),
+ txtFullName.text.toString(),
+ txtEmail.text.toString(),
+ txtPhoneNumber.text.toString(),
+ null,
+ null,
+ "",
+ currentDateTime.toString(),
+ 0
+ )
+
+ navigation = Intent(this@RegisterActivity, HomeActivity::class.java)
+ navigation!!.putExtra("user", user)
+ this@RegisterActivity.startActivity(navigation)
+ }
+
+ private fun clean() {
+ userId = 0L
+ txtEmail.text?.clear()
+ txtUsername.text?.clear()
+ txtPassword.text?.clear()
+ txtFullName.text?.clear()
+ txtPhoneNumber.text?.clear()
+ }
+
+ object RetrofitInstance {
+ val authService: AuthRepository by lazy {
+ Retrofit.Builder().baseUrl(BASE_AUTH_URL).addConverterFactory(GsonConverterFactory.create()).build().create(AuthRepository::class.java)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/brain/adapters/MultimediaAdapter.java b/app/src/main/java/com/brain/adapters/MultimediaAdapter.java
index b71cbf6..a2a24f8 100644
--- a/app/src/main/java/com/brain/adapters/MultimediaAdapter.java
+++ b/app/src/main/java/com/brain/adapters/MultimediaAdapter.java
@@ -1,70 +1,42 @@
package com.brain.adapters;
-import static com.brain.util.Util.AUDIO_MP3;
-import static com.brain.util.Util.URL;
-import static com.brain.util.Util.URL_PART;
-import static com.brain.util.Util.VIDEO_MP4;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.annotation.OptIn;
-import androidx.annotation.RequiresApi;
-import androidx.media3.common.util.UnstableApi;
-import androidx.media3.ui.PlayerView;
import androidx.recyclerview.widget.RecyclerView;
import com.brain.R;
import com.brain.holders.MultimediaViewHolder;
import com.brain.holders.ProgressViewHolder;
-import com.brain.model.MediaContent;
import com.brain.model.MediaDetail;
import com.brain.model.Profile;
-import com.brain.model.Video;
-import com.brain.multimediaslider.model.Multimedia;
-import com.brain.service.MediaPlayerService;
-import com.brain.service.OnImageViewClickListenerService;
-import com.brain.service.OnMultimediaSliderClickListener;
-import com.bumptech.glide.Glide;
-import com.bumptech.glide.RequestBuilder;
-import com.bumptech.glide.load.DataSource;
-import com.bumptech.glide.load.engine.DiskCacheStrategy;
-import com.bumptech.glide.load.engine.GlideException;
-import com.bumptech.glide.request.RequestListener;
-import com.bumptech.glide.request.target.Target;
+import com.brain.multimediaplayer.service.MediaPlayerService;
+import com.brain.multimediaslider.model.ItemPlayerView;
import java.util.ArrayList;
import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.atomic.AtomicLong;
public class MultimediaAdapter extends RecyclerView.Adapter {
private static final int VIEW_TYPE_LOADING = 0;
private static final int VIEW_TYPE_ITEM = 1;
- private static final AtomicLong autID = new AtomicLong();
private boolean isLoadingAdded = false;
private boolean retryPageLoad = false;
private String errorMsg;
- protected Context context;
- protected ArrayList multimediaList;
- protected ArrayList