34 changed files with 515 additions and 68 deletions
@ -1,8 +1,9 @@
|
||||
package org.mosad.teapod |
||||
package org.mosad.teapod.activity |
||||
|
||||
import android.content.Intent |
||||
import android.os.Bundle |
||||
import androidx.appcompat.app.AppCompatActivity |
||||
import org.mosad.teapod.activity.main.MainActivity |
||||
|
||||
|
||||
class SplashActivity : AppCompatActivity() { |
@ -1,4 +1,4 @@
|
||||
package org.mosad.teapod.ui.fragments |
||||
package org.mosad.teapod.activity.main.fragments |
||||
|
||||
import android.os.Bundle |
||||
import android.view.LayoutInflater |
@ -0,0 +1,54 @@
|
||||
package org.mosad.teapod.activity.onboarding |
||||
|
||||
import android.os.Bundle |
||||
import android.view.LayoutInflater |
||||
import android.view.View |
||||
import android.view.ViewGroup |
||||
import androidx.fragment.app.Fragment |
||||
import kotlinx.coroutines.* |
||||
import org.mosad.teapod.R |
||||
import org.mosad.teapod.databinding.FragmentOnLoginBinding |
||||
import org.mosad.teapod.parser.AoDParser |
||||
import org.mosad.teapod.preferences.EncryptedPreferences |
||||
|
||||
class OnLoginFragment: Fragment() { |
||||
|
||||
private lateinit var binding: FragmentOnLoginBinding |
||||
private var loginJob: Job? = null |
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { |
||||
binding = FragmentOnLoginBinding.inflate(inflater, container, false) |
||||
return binding.root |
||||
} |
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { |
||||
super.onViewCreated(view, savedInstanceState) |
||||
initActions() |
||||
} |
||||
|
||||
private fun initActions() { |
||||
binding.buttonLogin.setOnClickListener { |
||||
// get login credentials from gui |
||||
val email = binding.editTextLogin.text.toString() |
||||
val password = binding.editTextPassword.text.toString() |
||||
|
||||
EncryptedPreferences.saveCredentials(email, password, requireContext()) // save the credentials |
||||
|
||||
binding.buttonLogin.isClickable = false |
||||
loginJob = GlobalScope.launch { |
||||
if (AoDParser.login()) { |
||||
// if login was successful, switch to main |
||||
if (activity is OnboardingActivity) { |
||||
(activity as OnboardingActivity).launchMainActivity() |
||||
} |
||||
} else { |
||||
withContext(Dispatchers.Main) { |
||||
binding.textLoginDesc.text = getString(R.string.on_login_failed) |
||||
binding.buttonLogin.isClickable = true |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,31 @@
|
||||
package org.mosad.teapod.activity.onboarding |
||||
|
||||
import android.os.Bundle |
||||
import android.view.LayoutInflater |
||||
import android.view.View |
||||
import android.view.ViewGroup |
||||
import androidx.fragment.app.Fragment |
||||
import org.mosad.teapod.databinding.FragmentOnWelcomeBinding |
||||
|
||||
class OnWelcomeFragment: Fragment() { |
||||
|
||||
private lateinit var binding: FragmentOnWelcomeBinding |
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { |
||||
binding = FragmentOnWelcomeBinding.inflate(inflater, container, false) |
||||
return binding.root |
||||
} |
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { |
||||
super.onViewCreated(view, savedInstanceState) |
||||
initActions() |
||||
} |
||||
|
||||
private fun initActions() { |
||||
binding.buttonGetStarted.setOnClickListener { |
||||
if (activity is OnboardingActivity) { |
||||
(activity as OnboardingActivity).nextFragment() |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,78 @@
|
||||
package org.mosad.teapod.activity.onboarding |
||||
|
||||
import android.content.Intent |
||||
import android.os.Bundle |
||||
import android.view.View |
||||
import androidx.appcompat.app.AppCompatActivity |
||||
import androidx.fragment.app.Fragment |
||||
import androidx.fragment.app.FragmentActivity |
||||
import androidx.viewpager2.adapter.FragmentStateAdapter |
||||
import com.google.android.material.tabs.TabLayoutMediator |
||||
import org.mosad.teapod.activity.main.MainActivity |
||||
import org.mosad.teapod.databinding.ActivityOnboardingBinding |
||||
|
||||
class OnboardingActivity : AppCompatActivity() { |
||||
|
||||
private lateinit var binding: ActivityOnboardingBinding |
||||
private lateinit var pagerAdapter: FragmentStateAdapter |
||||
|
||||
private val fragments = arrayOf(OnLoginFragment()) |
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) { |
||||
super.onCreate(savedInstanceState) |
||||
|
||||
binding = ActivityOnboardingBinding.inflate(layoutInflater) |
||||
setContentView(binding.root) |
||||
|
||||
pagerAdapter = ScreenSlidePagerAdapter(this) |
||||
binding.viewPager.adapter = pagerAdapter |
||||
TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position -> |
||||
|
||||
}.attach() |
||||
|
||||
// we don't use the skip button, instead we use the start button to skip the last fragment |
||||
binding.buttonSkip.visibility = View.GONE |
||||
|
||||
// hide tab layout if only one tab is displayed |
||||
if (fragments.size <= 1) { |
||||
binding.tabLayout.visibility = View.GONE |
||||
} |
||||
} |
||||
|
||||
override fun onBackPressed() { |
||||
if (binding.viewPager.currentItem == 0) { |
||||
super.onBackPressed() |
||||
} else { |
||||
binding.viewPager.currentItem = binding.viewPager.currentItem - 1 |
||||
} |
||||
} |
||||
|
||||
fun nextFragment() { |
||||
if (binding.viewPager.currentItem < fragments.size - 1) { |
||||
binding.viewPager.currentItem++ |
||||
} else { |
||||
launchMainActivity() |
||||
} |
||||
} |
||||
|
||||
fun btnSkipClick(@Suppress("UNUSED_PARAMETER")v: View) { |
||||
//launchMainActivity() // currently not used in Teapod |
||||
} |
||||
|
||||
fun launchMainActivity() { |
||||
startActivity(Intent(this, MainActivity::class.java)) |
||||
finish() |
||||
} |
||||
|
||||
/** |
||||
* A simple pager adapter that represents 5 ScreenSlidePageFragment objects, in |
||||
* sequence. |
||||
*/ |
||||
private inner class ScreenSlidePagerAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) { |
||||
override fun getItemCount(): Int = fragments.size |
||||
|
||||
override fun createFragment(position: Int): Fragment = fragments[position] |
||||
} |
||||
|
||||
|
||||
} |
@ -1,4 +1,4 @@
|
||||
package org.mosad.teapod.player |
||||
package org.mosad.teapod.activity.player |
||||
|
||||
import android.animation.Animator |
||||
import android.animation.AnimatorListenerAdapter |
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> |
||||
<item> |
||||
<shape |
||||
android:innerRadius="0dp" |
||||
android:shape="ring" |
||||
android:thickness="4dp" |
||||
android:useLevel="false"> |
||||
<solid android:color="?iconColor"/> |
||||
</shape> |
||||
</item> |
||||
</layer-list> |
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> |
||||
<item> |
||||
<shape |
||||
android:innerRadius="0dp" |
||||
android:shape="ring" |
||||
android:thickness="4dp" |
||||
android:useLevel="false"> |
||||
<solid android:color="@color/colorAccent" /> |
||||
</shape> |
||||
</item> |
||||
</layer-list> |
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android"> |
||||
<item android:drawable="@drawable/dot_selected" |
||||
android:state_selected="true"/> |
||||
<item android:drawable="@drawable/dot_default"/> |
||||
</selector> |
@ -0,0 +1,50 @@
|
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" |
||||
xmlns:app="http://schemas.android.com/apk/res-auto" |
||||
xmlns:tools="http://schemas.android.com/tools" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="match_parent"> |
||||
|
||||
<androidx.viewpager2.widget.ViewPager2 |
||||
android:id="@+id/viewPager" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="match_parent"> |
||||
</androidx.viewpager2.widget.ViewPager2> |
||||
|
||||
<com.google.android.material.tabs.TabLayout |
||||
android:id="@+id/tab_layout" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="wrap_content" |
||||
android:layout_alignParentBottom="true" |
||||
android:layout_gravity="bottom" |
||||
android:layout_marginBottom="0dp" |
||||
android:background="@android:color/transparent" |
||||
app:tabBackground="@drawable/dot_tab_selector" |
||||
app:tabGravity="center" |
||||
app:tabIndicatorHeight="0dp" |
||||
app:tabPaddingStart="6dp" |
||||
app:tabPaddingEnd="6dp"/> |
||||
|
||||
<Button |
||||
android:id="@+id/button_next" |
||||
android:layout_width="wrap_content" |
||||
android:layout_height="wrap_content" |
||||
android:layout_alignParentEnd="true" |
||||
android:layout_alignParentBottom="true" |
||||
android:background="@null" |
||||
android:onClick="btnNextClick" |
||||
android:text="@string/next" |
||||
android:visibility="gone" /> |
||||
|
||||
<Button |
||||
android:id="@+id/button_skip" |
||||
android:layout_width="wrap_content" |
||||
android:layout_height="wrap_content" |
||||
android:layout_alignParentStart="true" |
||||
android:layout_alignParentBottom="true" |
||||
android:background="@null" |
||||
android:onClick="btnSkipClick" |
||||
android:text="@string/skip" |
||||
tools:visibility="gone" /> |
||||
|
||||
</RelativeLayout> |
@ -0,0 +1,90 @@
|
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" |
||||
xmlns:app="http://schemas.android.com/apk/res-auto" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="match_parent" |
||||
android:background="?themePrimary"> |
||||
|
||||
<ImageView |
||||
android:id="@+id/image_login" |
||||
android:layout_width="128dp" |
||||
android:layout_height="128dp" |
||||
android:contentDescription="@string/app_name" |
||||
android:scaleType="fitCenter" |
||||
app:layout_constraintEnd_toEndOf="parent" |
||||
app:layout_constraintHorizontal_bias="0.5" |
||||
app:layout_constraintStart_toStartOf="parent" |
||||
app:layout_constraintTop_toTopOf="parent" |
||||
app:srcCompat="@drawable/ic_launcher_foreground" |
||||
app:tint="?buttonBackground" /> |
||||
|
||||
<LinearLayout |
||||
android:id="@+id/linear_login" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="0dp" |
||||
android:gravity="center_horizontal" |
||||
android:orientation="vertical" |
||||
android:padding="10dp" |
||||
app:layout_constraintBottom_toBottomOf="parent" |
||||
app:layout_constraintEnd_toEndOf="parent" |
||||
app:layout_constraintStart_toStartOf="parent" |
||||
app:layout_constraintTop_toBottomOf="@+id/image_login"> |
||||
|
||||
<TextView |
||||
android:id="@+id/text_login_heading" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="wrap_content" |
||||
android:text="@string/on_login_heading" |
||||
android:textAlignment="center" |
||||
android:textSize="26sp" |
||||
android:textStyle="bold" /> |
||||
|
||||
<TextView |
||||
android:id="@+id/text_login_desc" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="wrap_content" |
||||
android:layout_margin="7dp" |
||||
android:text="@string/on_login_desc" |
||||
android:textAlignment="center" |
||||
android:textSize="18sp" /> |
||||
|
||||
<EditText |
||||
android:id="@+id/edit_text_login" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="wrap_content" |
||||
android:layout_margin="7dp" |
||||
android:ems="10" |
||||
android:hint="@string/login" |
||||
android:importantForAutofill="no" |
||||
android:inputType="textEmailAddress" /> |
||||
|
||||
<EditText |
||||
android:id="@+id/edit_text_password" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="wrap_content" |
||||
android:layout_margin="7dp" |
||||
android:ems="10" |
||||
android:hint="@string/password" |
||||
android:importantForAutofill="no" |
||||
android:inputType="textPassword" /> |
||||
|
||||
<com.google.android.material.button.MaterialButton |
||||
android:id="@+id/button_login" |
||||
style="@style/Widget.AppCompat.Button.Colored" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="wrap_content" |
||||
android:layout_gravity="center" |
||||
android:layout_marginStart="7dp" |
||||
android:layout_marginTop="7dp" |
||||
android:layout_marginEnd="7dp" |
||||
android:text="@string/login" |
||||
android:textAllCaps="false" |
||||
android:textColor="#FFFFFFFF" |
||||
android:textStyle="bold" |
||||
app:layout_constraintEnd_toEndOf="parent" |
||||
app:layout_constraintStart_toStartOf="parent" /> |
||||
|
||||
|
||||
</LinearLayout> |
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout> |
@ -0,0 +1,74 @@
|
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
||||
xmlns:app="http://schemas.android.com/apk/res-auto" |
||||
xmlns:tools="http://schemas.android.com/tools" |
||||
android:orientation="vertical" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="match_parent" |
||||
android:background="?themePrimary"> |
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout |
||||
android:layout_width="match_parent" |
||||
android:layout_height="match_parent"> |
||||
|
||||
<ImageView |
||||
android:id="@+id/image_logo" |
||||
android:layout_width="128dp" |
||||
android:layout_height="128dp" |
||||
android:contentDescription="@string/app_name" |
||||
android:scaleType="fitCenter" |
||||
app:layout_constraintEnd_toEndOf="parent" |
||||
app:layout_constraintHorizontal_bias="0.5" |
||||
app:layout_constraintStart_toStartOf="parent" |
||||
app:layout_constraintTop_toTopOf="parent" |
||||
app:srcCompat="@drawable/ic_launcher_foreground" |
||||
app:tint="?buttonBackground" /> |
||||
|
||||
<LinearLayout |
||||
android:id="@+id/linearLayout3" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="wrap_content" |
||||
android:orientation="vertical" |
||||
android:padding="10dp" |
||||
app:layout_constraintEnd_toEndOf="parent" |
||||
app:layout_constraintStart_toStartOf="parent" |
||||
app:layout_constraintTop_toBottomOf="@+id/image_logo"> |
||||
|
||||
<TextView |
||||
android:id="@+id/text_app_name" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="wrap_content" |
||||
android:text="@string/app_name" |
||||
android:textAlignment="center" |
||||
android:textSize="26sp" |
||||
android:textStyle="bold" /> |
||||
|
||||
<TextView |
||||
android:id="@+id/text_welcome" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="wrap_content" |
||||
android:layout_margin="7dp" |
||||
android:text="@string/on_welcome" |
||||
android:textAlignment="center" |
||||
android:textSize="18sp" /> |
||||
|
||||
</LinearLayout> |
||||
|
||||
<com.google.android.material.button.MaterialButton |
||||
android:id="@+id/button_get_started" |
||||
style="@style/Widget.AppCompat.Button.Colored" |
||||
android:layout_width="wrap_content" |
||||
android:layout_height="wrap_content" |
||||
android:layout_gravity="center" |
||||
android:layout_marginBottom="40dp" |
||||
android:text="@string/on_get_started" |
||||
android:textAllCaps="false" |
||||
android:textColor="#FFFFFFFF" |
||||
android:textStyle="bold" |
||||
app:layout_constraintBottom_toBottomOf="parent" |
||||
app:layout_constraintEnd_toEndOf="parent" |
||||
app:layout_constraintStart_toStartOf="parent" /> |
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout> |
||||
|
||||
</LinearLayout> |
Loading…
Reference in new issue