Compare commits

..

2 commits

Author SHA1 Message Date
999462c294 ui: Hide spinner when no eSIM is found
All checks were successful
/ build-debug (push) Successful in 4m42s
2024-03-17 14:19:07 -04:00
2061e6fea3 ui: Better placeholder for the no-eSIM case 2024-03-17 14:02:38 -04:00
12 changed files with 132 additions and 16 deletions

View file

@ -1,9 +1,13 @@
package im.angry.openeuicc.di package im.angry.openeuicc.di
import androidx.fragment.app.Fragment
import im.angry.openeuicc.core.EuiccChannel import im.angry.openeuicc.core.EuiccChannel
import im.angry.openeuicc.ui.EuiccManagementFragment import im.angry.openeuicc.ui.EuiccManagementFragment
import im.angry.openeuicc.ui.NoEuiccPlaceholderFragment
open class DefaultUiComponentFactory : UiComponentFactory { open class DefaultUiComponentFactory : UiComponentFactory {
override fun createEuiccManagementFragment(channel: EuiccChannel): EuiccManagementFragment = override fun createEuiccManagementFragment(channel: EuiccChannel): EuiccManagementFragment =
EuiccManagementFragment.newInstance(channel.slotId, channel.portId) EuiccManagementFragment.newInstance(channel.slotId, channel.portId)
override fun createNoEuiccPlaceholderFragment(): Fragment = NoEuiccPlaceholderFragment()
} }

View file

@ -1,8 +1,10 @@
package im.angry.openeuicc.di package im.angry.openeuicc.di
import androidx.fragment.app.Fragment
import im.angry.openeuicc.core.EuiccChannel import im.angry.openeuicc.core.EuiccChannel
import im.angry.openeuicc.ui.EuiccManagementFragment import im.angry.openeuicc.ui.EuiccManagementFragment
interface UiComponentFactory { interface UiComponentFactory {
fun createEuiccManagementFragment(channel: EuiccChannel): EuiccManagementFragment fun createEuiccManagementFragment(channel: EuiccChannel): EuiccManagementFragment
fun createNoEuiccPlaceholderFragment(): Fragment
} }

View file

@ -25,12 +25,11 @@ open class MainActivity : AppCompatActivity(), OpenEuiccContextMarker {
} }
private lateinit var spinnerAdapter: ArrayAdapter<String> private lateinit var spinnerAdapter: ArrayAdapter<String>
private lateinit var spinnerItem: MenuItem
private lateinit var spinner: Spinner private lateinit var spinner: Spinner
private val fragments = arrayListOf<EuiccManagementFragment>() private val fragments = arrayListOf<EuiccManagementFragment>()
private lateinit var noEuiccPlaceholder: View
protected lateinit var tm: TelephonyManager protected lateinit var tm: TelephonyManager
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@ -38,7 +37,10 @@ open class MainActivity : AppCompatActivity(), OpenEuiccContextMarker {
setContentView(R.layout.activity_main) setContentView(R.layout.activity_main)
setSupportActionBar(requireViewById(R.id.toolbar)) setSupportActionBar(requireViewById(R.id.toolbar))
noEuiccPlaceholder = requireViewById(R.id.no_euicc_placeholder) supportFragmentManager.beginTransaction().replace(
R.id.fragment_root,
appContainer.uiComponentFactory.createNoEuiccPlaceholderFragment()
).commit()
tm = telephonyManager tm = telephonyManager
@ -53,7 +55,11 @@ open class MainActivity : AppCompatActivity(), OpenEuiccContextMarker {
menuInflater.inflate(R.menu.activity_main, menu) menuInflater.inflate(R.menu.activity_main, menu)
if (!this::spinner.isInitialized) { if (!this::spinner.isInitialized) {
spinner = menu.findItem(R.id.spinner).actionView as Spinner spinnerItem = menu.findItem(R.id.spinner)
spinner = spinnerItem.actionView as Spinner
if (spinnerAdapter.isEmpty) {
spinnerItem.isVisible = false
}
spinner.adapter = spinnerAdapter spinner.adapter = spinnerAdapter
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected( override fun onItemSelected(
@ -108,7 +114,9 @@ open class MainActivity : AppCompatActivity(), OpenEuiccContextMarker {
} }
if (fragments.isNotEmpty()) { if (fragments.isNotEmpty()) {
noEuiccPlaceholder.visibility = View.GONE if (this@MainActivity::spinner.isInitialized) {
spinnerItem.isVisible = true
}
supportFragmentManager.beginTransaction().replace(R.id.fragment_root, fragments.first()).commit() supportFragmentManager.beginTransaction().replace(R.id.fragment_root, fragments.first()).commit()
} }
} }

View file

@ -0,0 +1,18 @@
package im.angry.openeuicc.ui
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import im.angry.openeuicc.common.R
class NoEuiccPlaceholderFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_no_euicc_placeholder, container, false)
}
}

View file

@ -21,15 +21,6 @@
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/toolbar"> app:layout_constraintTop_toBottomOf="@id/toolbar"/>
<TextView
android:id="@+id/no_euicc_placeholder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="40dp"
android:layout_marginEnd="40dp"
android:gravity="center"
android:text="@string/no_euicc" />
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/no_euicc_placeholder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="40dp"
android:layout_marginEnd="40dp"
android:gravity="center"
android:text="@string/no_euicc" />
</FrameLayout>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="no_euicc">No eUICC card on this device is accessible by this app.\nInsert a supported eUICC card, or try out the privileged OpenEUICC app instead.</string> <string name="no_euicc">No removable eUICC card accessible by this app is detected on this device.</string>
<string name="unknown">Unknown</string> <string name="unknown">Unknown</string>
<string name="help">Help</string> <string name="help">Help</string>

View file

@ -1,12 +1,17 @@
package im.angry.openeuicc package im.angry.openeuicc
import android.content.Intent import android.content.Intent
import im.angry.openeuicc.di.UnprivilegedAppContainer
import im.angry.openeuicc.ui.LogsActivity import im.angry.openeuicc.ui.LogsActivity
import im.angry.openeuicc.util.* import im.angry.openeuicc.util.*
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlin.system.exitProcess import kotlin.system.exitProcess
class UnprivilegedOpenEuiccApplication : OpenEuiccApplication() { class UnprivilegedOpenEuiccApplication : OpenEuiccApplication() {
override val appContainer by lazy {
UnprivilegedAppContainer(this)
}
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()

View file

@ -0,0 +1,9 @@
package im.angry.openeuicc.di
import android.content.Context
class UnprivilegedAppContainer(context: Context) : DefaultAppContainer(context) {
override val uiComponentFactory by lazy {
UnprivilegedUiComponentFactory()
}
}

View file

@ -0,0 +1,9 @@
package im.angry.openeuicc.di
import androidx.fragment.app.Fragment
import im.angry.openeuicc.ui.UnprivilegedNoEuiccPlaceholderFragment
class UnprivilegedUiComponentFactory : DefaultUiComponentFactory() {
override fun createNoEuiccPlaceholderFragment(): Fragment =
UnprivilegedNoEuiccPlaceholderFragment()
}

View file

@ -0,0 +1,29 @@
package im.angry.openeuicc.ui
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import im.angry.easyeuicc.R
class UnprivilegedNoEuiccPlaceholderFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(
R.layout.fragment_no_euicc_placeholder_unprivileged,
container,
false
)
view.findViewById<View>(R.id.compatibility_check).setOnClickListener {
startActivity(Intent(requireContext(), CompatibilityCheckActivity::class.java))
}
return view
}
}

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:id="@+id/no_euicc_placeholder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="40dp"
android:layout_marginEnd="40dp"
android:gravity="center"
android:text="@string/no_euicc"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
<com.google.android.material.button.MaterialButton
android:id="@+id/compatibility_check"
android:text="@string/compatibility_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
app:layout_constraintTop_toBottomOf="@id/no_euicc_placeholder"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>