diff --git a/receivers/android/app/build.gradle b/receivers/android/app/build.gradle index 28e1614..3e9d910 100644 --- a/receivers/android/app/build.gradle +++ b/receivers/android/app/build.gradle @@ -78,7 +78,6 @@ android { } dependencies { - implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.8.0' diff --git a/receivers/android/app/src/defaultFlavor/AndroidManifest.xml b/receivers/android/app/src/defaultFlavor/AndroidManifest.xml new file mode 100644 index 0000000..b3adb41 --- /dev/null +++ b/receivers/android/app/src/defaultFlavor/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/receivers/android/app/src/main/java/com/futo/fcast/receiver/MainActivity.kt b/receivers/android/app/src/main/java/com/futo/fcast/receiver/MainActivity.kt index c69aa78..2271082 100644 --- a/receivers/android/app/src/main/java/com/futo/fcast/receiver/MainActivity.kt +++ b/receivers/android/app/src/main/java/com/futo/fcast/receiver/MainActivity.kt @@ -1,12 +1,14 @@ package com.futo.fcast.receiver import android.Manifest +import android.animation.ValueAnimator import android.app.AlertDialog import android.app.PendingIntent import android.content.Intent import android.content.pm.PackageInstaller import android.content.pm.PackageManager import android.graphics.drawable.Animatable +import android.graphics.drawable.TransitionDrawable import android.net.Uri import android.os.Build import android.os.Bundle @@ -14,10 +16,21 @@ import android.provider.Settings import android.util.Log import android.view.View import android.view.WindowManager +import android.view.animation.AccelerateDecelerateInterpolator import android.widget.* import androidx.appcompat.app.AppCompatActivity +import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat +import com.google.android.exoplayer2.ExoPlayer +import com.google.android.exoplayer2.MediaItem +import com.google.android.exoplayer2.Player +import com.google.android.exoplayer2.SimpleExoPlayer +import com.google.android.exoplayer2.ui.PlayerView +import com.google.android.exoplayer2.ui.StyledPlayerView +import com.google.android.exoplayer2.upstream.DataSource +import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory +import com.google.android.exoplayer2.util.Util import kotlinx.coroutines.* import okhttp3.OkHttpClient import java.io.InputStream @@ -31,7 +44,10 @@ class MainActivity : AppCompatActivity() { private lateinit var _textIPs: TextView private lateinit var _textProgress: TextView private lateinit var _updateSpinner: ImageView - private lateinit var _layoutUpdate: LinearLayout; + private lateinit var _imageSpinner: ImageView + private lateinit var _layoutConnectionInfo: ConstraintLayout + private lateinit var _videoBackground: StyledPlayerView + private lateinit var _player: ExoPlayer private var _updating: Boolean = false private val _scope: CoroutineScope = CoroutineScope(Dispatchers.Main) @@ -45,10 +61,15 @@ class MainActivity : AppCompatActivity() { _textIPs = findViewById(R.id.text_ips) _textProgress = findViewById(R.id.text_progress) _updateSpinner = findViewById(R.id.update_spinner) - _layoutUpdate = findViewById(R.id.layout_update) + _imageSpinner = findViewById(R.id.image_spinner) + _layoutConnectionInfo = findViewById(R.id.layout_connection_info) + _videoBackground = findViewById(R.id.video_background) + + startVideo() + startAnimations() _text.text = getString(R.string.checking_for_updates) - _buttonUpdate.visibility = View.INVISIBLE + _buttonUpdate.visibility = View.GONE _buttonUpdate.setOnClickListener { if (_updating) { @@ -60,11 +81,13 @@ class MainActivity : AppCompatActivity() { } if (BuildConfig.IS_PLAYSTORE_VERSION) { - _layoutUpdate.visibility = View.GONE + _text.visibility = View.GONE + _buttonUpdate.visibility = View.GONE _updateSpinner.visibility = View.GONE (_updateSpinner.drawable as Animatable?)?.stop() } else { - _layoutUpdate.visibility = View.VISIBLE + _text.visibility = View.VISIBLE + _buttonUpdate.visibility = View.VISIBLE _updateSpinner.visibility = View.VISIBLE (_updateSpinner.drawable as Animatable?)?.start() @@ -86,10 +109,23 @@ class MainActivity : AppCompatActivity() { requestSystemAlertWindowPermission() } + override fun onPause() { + super.onPause() + _player.playWhenReady = false + _player.pause() + } + + override fun onResume() { + super.onResume() + _player.playWhenReady = true + _player.play() + } + override fun onDestroy() { super.onDestroy() InstallReceiver.onReceiveResult = null _scope.cancel() + _player.release() TcpListenerService.activityCount-- } @@ -102,6 +138,22 @@ class MainActivity : AppCompatActivity() { startService(Intent(this, TcpListenerService::class.java)) } + private fun startVideo() { + _player = ExoPlayer.Builder(this).build() + _videoBackground.player = _player + + val mediaItem = MediaItem.fromUri(Uri.parse("android.resource://" + packageName + "/" + R.raw.c)) + _player.setMediaItem(mediaItem) + _player.prepare() + _player.repeatMode = Player.REPEAT_MODE_ALL + _player.playWhenReady = true + } + + private fun startAnimations() { + //Spinner animation + (_imageSpinner.drawable as Animatable?)?.start() + } + private fun checkAndRequestPermissions(): Boolean { val listPermissionsNeeded = arrayListOf() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { @@ -202,7 +254,7 @@ class MainActivity : AppCompatActivity() { withContext(Dispatchers.Main) { try { (_updateSpinner.drawable as Animatable?)?.stop() - _updateSpinner.visibility = View.INVISIBLE + _updateSpinner.visibility = View.GONE _text.text = resources.getText(R.string.there_is_an_update_available_do_you_wish_to_update) _buttonUpdate.visibility = View.VISIBLE } catch (e: Throwable) { @@ -212,7 +264,7 @@ class MainActivity : AppCompatActivity() { } } else { withContext(Dispatchers.Main) { - _updateSpinner.visibility = View.INVISIBLE + _updateSpinner.visibility = View.GONE _text.text = getString(R.string.no_updates_available) Toast.makeText(this@MainActivity, "Already on latest version", Toast.LENGTH_LONG).show(); } @@ -251,7 +303,7 @@ class MainActivity : AppCompatActivity() { private fun update() { _updateSpinner.visibility = View.VISIBLE - _buttonUpdate.visibility = Button.INVISIBLE + _buttonUpdate.visibility = Button.GONE window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) _text.text = resources.getText(R.string.downloading_update) diff --git a/receivers/android/app/src/main/res/animator/rotation_2000_clockwise.xml b/receivers/android/app/src/main/res/animator/rotation_2000_clockwise.xml new file mode 100644 index 0000000..d787bff --- /dev/null +++ b/receivers/android/app/src/main/res/animator/rotation_2000_clockwise.xml @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/receivers/android/app/src/main/res/animator/rotation_2500_counter_clockwise.xml b/receivers/android/app/src/main/res/animator/rotation_2500_counter_clockwise.xml new file mode 100644 index 0000000..8e9c943 --- /dev/null +++ b/receivers/android/app/src/main/res/animator/rotation_2500_counter_clockwise.xml @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/receivers/android/app/src/main/res/drawable/background_manual_connect.xml b/receivers/android/app/src/main/res/drawable/background_manual_connect.xml new file mode 100644 index 0000000..12ef942 --- /dev/null +++ b/receivers/android/app/src/main/res/drawable/background_manual_connect.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/receivers/android/app/src/main/res/drawable/ic_loader.xml b/receivers/android/app/src/main/res/drawable/ic_loader.xml new file mode 100644 index 0000000..02667f3 --- /dev/null +++ b/receivers/android/app/src/main/res/drawable/ic_loader.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + diff --git a/receivers/android/app/src/main/res/drawable/ic_loader_animated.xml b/receivers/android/app/src/main/res/drawable/ic_loader_animated.xml new file mode 100644 index 0000000..bb84663 --- /dev/null +++ b/receivers/android/app/src/main/res/drawable/ic_loader_animated.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/receivers/android/app/src/main/res/font/inter_light.ttf b/receivers/android/app/src/main/res/font/inter_light.ttf new file mode 100644 index 0000000..9e265d8 Binary files /dev/null and b/receivers/android/app/src/main/res/font/inter_light.ttf differ diff --git a/receivers/android/app/src/main/res/layout/activity_main.xml b/receivers/android/app/src/main/res/layout/activity_main.xml index 037ca9b..bdf3cfe 100644 --- a/receivers/android/app/src/main/res/layout/activity_main.xml +++ b/receivers/android/app/src/main/res/layout/activity_main.xml @@ -1,121 +1,184 @@ - + android:background="#000000"> + + + + + android:orientation="vertical" + android:background="@drawable/background_manual_connect" + android:paddingStart="55dp" + android:paddingEnd="55dp" + android:paddingTop="25dp" + android:paddingBottom="25dp" + app:layout_constraintTop_toBottomOf="@id/text_title" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintBottom_toTopOf="@id/text_dialog"> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintBottom_toTopOf="@id/text_manual_connection_information" /> - + + + android:textColor="#919191" + android:gravity="center" + android:fontFamily="@font/inter_light" + android:textSize="12sp" + android:text="Manual connection information" + android:layout_marginTop="20dp" + app:layout_constraintTop_toBottomOf="@id/text_waiting_for_connection" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintBottom_toTopOf="parent" /> - + - - - + + android:paddingStart="30dp" + android:gravity="center" + app:layout_constraintTop_toBottomOf="@id/layout_connection_info" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintBottom_toTopOf="@id/button_update" /> + android:background="@drawable/background_button_primary" + android:layout_marginEnd="2dp" + android:clickable="true" + app:layout_constraintTop_toBottomOf="@id/text_dialog" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintBottom_toBottomOf="parent"> - - - - - - - - + android:paddingTop="10dp" + android:paddingBottom="10dp" + android:paddingStart="28dp" + android:paddingEnd="28dp"/> - \ No newline at end of file + + + + + + + + \ No newline at end of file diff --git a/receivers/android/app/src/main/res/raw/b.mp4 b/receivers/android/app/src/main/res/raw/b.mp4 new file mode 100644 index 0000000..03d331e Binary files /dev/null and b/receivers/android/app/src/main/res/raw/b.mp4 differ diff --git a/receivers/android/app/src/main/res/raw/c.mp4 b/receivers/android/app/src/main/res/raw/c.mp4 new file mode 100644 index 0000000..b689378 Binary files /dev/null and b/receivers/android/app/src/main/res/raw/c.mp4 differ diff --git a/receivers/android/app/src/playstore/AndroidManifest.xml b/receivers/android/app/src/playstore/AndroidManifest.xml new file mode 100644 index 0000000..6046704 --- /dev/null +++ b/receivers/android/app/src/playstore/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file