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