ソースを参照

feat: Add a basic settings activity

Peter Cai 2 年 前
コミット
9330265490

+ 1 - 0
app-common/build.gradle

@@ -35,6 +35,7 @@ dependencies {
     implementation 'androidx.appcompat:appcompat:1.6.1'
     implementation 'com.google.android.material:material:1.10.0'
     implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+    implementation "androidx.preference:preference-ktx:1.2.1"
     implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.2'
     implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
     implementation "androidx.cardview:cardview:1.0.0"

+ 4 - 0
app-common/src/main/AndroidManifest.xml

@@ -8,6 +8,10 @@
 
     <application
         android:networkSecurityConfig="@xml/network_security_config">
+        <activity
+            android:name="im.angry.openeuicc.ui.SettingsActivity"
+            android:label="@string/pref_settings" />
+
         <activity
             android:name="com.journeyapps.barcodescanner.CaptureActivity"
             android:screenOrientation="fullSensor"

+ 12 - 0
app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt

@@ -1,9 +1,11 @@
 package im.angry.openeuicc.ui
 
+import android.content.Intent
 import android.os.Bundle
 import android.telephony.TelephonyManager
 import android.util.Log
 import android.view.Menu
+import android.view.MenuItem
 import android.view.View
 import android.widget.AdapterView
 import android.widget.ArrayAdapter
@@ -73,6 +75,16 @@ open class MainActivity : AppCompatActivity() {
         return true
     }
 
+    override fun onOptionsItemSelected(item: MenuItem): Boolean =
+        when (item.itemId) {
+            R.id.settings -> {
+                startActivity(Intent(this, SettingsActivity::class.java));
+                true
+            }
+            else -> super.onOptionsItemSelected(item)
+        }
+
+
     protected open fun createEuiccManagementFragment(channel: EuiccChannel): EuiccManagementFragment =
         EuiccManagementFragment.newInstance(channel.slotId, channel.portId)
 

+ 24 - 0
app-common/src/main/java/im/angry/openeuicc/ui/SettingsActivity.kt

@@ -0,0 +1,24 @@
+package im.angry.openeuicc.ui
+
+import android.os.Bundle
+import android.view.MenuItem
+import androidx.appcompat.app.AppCompatActivity
+
+class SettingsActivity: AppCompatActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        supportActionBar!!.setDisplayHomeAsUpEnabled(true)
+        supportFragmentManager.beginTransaction()
+            .replace(android.R.id.content, SettingsFragment())
+            .commit()
+    }
+
+    override fun onOptionsItemSelected(item: MenuItem): Boolean =
+        when (item.itemId) {
+            android.R.id.home -> {
+                finish()
+                true
+            }
+            else -> super.onOptionsItemSelected(item)
+        }
+}

+ 24 - 0
app-common/src/main/java/im/angry/openeuicc/ui/SettingsFragment.kt

@@ -0,0 +1,24 @@
+package im.angry.openeuicc.ui
+
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import androidx.preference.Preference
+import androidx.preference.PreferenceFragmentCompat
+import im.angry.openeuicc.common.R
+import im.angry.openeuicc.util.*
+
+class SettingsFragment: PreferenceFragmentCompat() {
+    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+        setPreferencesFromResource(R.xml.pref_settings, rootKey)
+
+        findPreference<Preference>("pref_info_app_version")
+            ?.summary = requireContext().selfAppVersion
+
+        findPreference<Preference>("pref_info_source_code")
+            ?.setOnPreferenceClickListener {
+                startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(it.summary.toString())))
+                true
+            }
+    }
+}

+ 14 - 0
app-common/src/main/java/im/angry/openeuicc/util/Utils.kt

@@ -0,0 +1,14 @@
+package im.angry.openeuicc.util
+
+import android.content.Context
+import android.content.pm.PackageManager
+import java.lang.RuntimeException
+
+val Context.selfAppVersion: String
+    get() =
+        try {
+            val pInfo = packageManager.getPackageInfo(packageName, 0)
+            pInfo.versionName
+        } catch (e: PackageManager.NameNotFoundException) {
+            throw RuntimeException(e)
+        }

+ 5 - 0
app-common/src/main/res/menu/activity_main.xml

@@ -7,4 +7,9 @@
         app:actionViewClass="android.widget.Spinner"
         android:background="?android:attr/colorPrimary"
         app:showAsAction="always" />
+
+    <item
+        android:id="@+id/settings"
+        android:title="@string/pref_settings"
+        app:showAsAction="never" />
 </menu>

+ 6 - 0
app-common/src/main/res/values/strings.xml

@@ -32,4 +32,10 @@
     <string name="profile_rename_new_name">New nickname</string>
 
     <string name="profile_delete_confirm">Are you sure you want to delete the profile %s? This operation is irreversible.</string>
+
+    <string name="pref_settings">Settings</string>
+    <string name="pref_info">Info</string>
+    <string name="pref_info_app_version">App Version</string>
+    <string name="pref_info_source_code">Source Code</string>
+    <string name="pref_info_source_code_url" translatable="false">https://gitea.angry.im/PeterCxy/OpenEUICC</string>
 </resources>

+ 14 - 0
app-common/src/main/res/xml/pref_settings.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
+    <PreferenceCategory
+        app:title="@string/pref_info">
+        <Preference
+            app:title="@string/pref_info_app_version"
+            app:key="pref_info_app_version" />
+
+        <Preference
+            app:title="@string/pref_info_source_code"
+            app:summary="@string/pref_info_source_code_url"
+            app:key="pref_info_source_code"/>
+    </PreferenceCategory>
+</PreferenceScreen>